Sfoglia il codice sorgente

Merge branch 'REDESIGN'

Iñigo Valentin 7 anni fa
parent
commit
8faaf079fd
100 ha cambiato i file con 5499 aggiunte e 650 eliminazioni
  1. 25 21
      .gitignore
  2. 89 0
      application/Controller.php
  3. 8 0
      application/config/auth.php
  4. 45 0
      application/config/config.php
  5. 58 0
      application/entity/Cv.php
  6. 35 0
      application/entity/Entity.php
  7. 56 0
      application/entity/Lang.php
  8. 72 0
      application/entity/License.php
  9. 150 0
      application/entity/Project.php
  10. 62 0
      application/entity/Project_Image.php
  11. 41 0
      application/entity/Project_Tag.php
  12. 57 0
      application/entity/Project_Type.php
  13. 64 0
      application/entity/Project_Url.php
  14. 65 0
      application/entity/Project_Url_Type.php
  15. 27 0
      application/helper/db.php
  16. 117 0
      application/helper/net.php
  17. 236 0
      application/helper/text.php
  18. 46 0
      application/page/Error_Page.php
  19. 58 0
      application/page/Help_Page.php
  20. 48 0
      application/page/Home_Page.php
  21. 93 0
      application/page/Page.php
  22. 45 0
      application/page/Profile_Page.php
  23. 45 0
      application/page/Project_Page.php
  24. 46 0
      application/page/Projects_Page.php
  25. 56 0
      application/view/error.php
  26. 59 0
      application/view/help.php
  27. 102 0
      application/view/home.php
  28. 48 0
      application/view/inc/footer.php
  29. 20 0
      application/view/inc/header.php
  30. 92 0
      application/view/profile.php
  31. 136 0
      application/view/project.php
  32. 77 0
      application/view/projects.php
  33. 0 0
      application/view/string/LICENSE_CC-BY-SA_SUMMARY__EN
  34. 0 0
      application/view/string/LICENSE_CC-BY-SA_SUMMARY__ES
  35. 0 0
      application/view/string/LICENSE_CC-BY-SA_SUMMARY__EU
  36. 0 0
      application/view/string/LICENSE_CC-BY-SA__EN
  37. 0 0
      application/view/string/LICENSE_CC-BY-SA__ES
  38. 0 0
      application/view/string/LICENSE_CC-BY-SA__EU
  39. 0 0
      application/view/string/LICENSE_GPLV3_SUMMARY__EN
  40. 0 0
      application/view/string/LICENSE_GPLV3_SUMMARY__ES
  41. 0 0
      application/view/string/LICENSE_GPLV3_SUMMARY__EU
  42. 0 0
      application/view/string/LICENSE_GPLV3__EN
  43. 0 0
      application/view/string/LICENSE_GPLV3__ES
  44. 0 0
      application/view/string/LICENSE_GPLV3__EU
  45. 87 0
      public/.htaccess
  46. 50 0
      public/css/error.css
  47. 29 0
      public/css/help.css
  48. 64 0
      public/css/home.css
  49. 110 0
      public/css/profile.css
  50. 124 0
      public/css/project.css
  51. 51 0
      public/css/projects.css
  52. 254 159
      public/css/ui.css
  53. BIN
      public/fonts/Latin-Modern-Mono-Light-Bold.otf
  54. 0 0
      public/fonts/Nunito-Bold.ttf
  55. 0 0
      public/fonts/Nunito-Light.ttf
  56. 0 0
      public/fonts/Nunito-Regular.ttf
  57. 0 0
      public/fonts/OFL.txt
  58. 9 0
      public/img/content/resizer
  59. 61 0
      public/img/layout/control/close.svg
  60. 56 0
      public/img/layout/control/slid_d.svg
  61. 56 0
      public/img/layout/control/slid_l.svg
  62. 56 0
      public/img/layout/control/slid_r.svg
  63. 56 0
      public/img/layout/control/slid_u.svg
  64. 80 0
      public/img/layout/icon/home.svg
  65. 79 0
      public/img/layout/icon/profile.svg
  66. 104 0
      public/img/layout/icon/project.svg
  67. 85 0
      public/img/layout/lang/en.svg
  68. 60 0
      public/img/layout/lang/es.svg
  69. 86 0
      public/img/layout/lang/eu.svg
  70. 98 0
      public/img/layout/license/CC-0.svg
  71. 92 0
      public/img/layout/license/CC-BY-NC-ND.svg
  72. 84 0
      public/img/layout/license/CC-BY-NC-SA.svg
  73. 81 0
      public/img/layout/license/CC-BY-NC.svg
  74. 84 0
      public/img/layout/license/CC-BY-ND.svg
  75. 107 0
      public/img/layout/license/CC-BY.svg
  76. 5 0
      public/img/layout/license/GPLV3.svg
  77. 61 0
      public/img/layout/logo/logo.svg
  78. 488 0
      public/img/layout/social/app_store.svg
  79. 17 0
      public/img/layout/social/email.svg
  80. 54 0
      public/img/layout/social/facebook.svg
  81. 3 0
      public/img/layout/social/github.svg
  82. 21 0
      public/img/layout/social/google_play.svg
  83. 209 0
      public/img/layout/social/google_plus.svg
  84. 37 0
      public/img/layout/social/linkedin.svg
  85. 17 0
      public/img/layout/social/telegram.svg
  86. 21 0
      public/img/layout/social/twitter.svg
  87. 46 0
      public/img/layout/social/www.svg
  88. 7 0
      public/index.php
  89. 16 0
      public/js/help.js
  90. 0 0
      public/js/profile.js
  91. 4 3
      public/js/project.js
  92. 0 0
      public/js/ui.js
  93. 0 239
      sql/00_STRUCTURE.SQL
  94. 3 3
      sql/00_setup.sql
  95. 0 37
      sql/01_PERMISSIONS.SQL
  96. 119 0
      sql/01_structure.sql
  97. 18 0
      sql/02_security.sql
  98. 69 161
      sql/03_data.sql
  99. 3 3
      sql/README.md
  100. 0 24
      utils/imagescaler

+ 25 - 21
.gitignore

@@ -1,7 +1,3 @@
-#Kate files
-.kateproject.d/
-.kateproject
-
 #OS files
 .directory
 .DS_Store
@@ -10,25 +6,33 @@
 .Trashes
 ehthumbs.db
 Thumbs.db
+*.swp
+
+#IDE files
+.kateproject.d/
+.kateproject
+.project
+.settings
+.externalToolBuilders
 
-#Utility folders
-3rdparty/
-pending/
-utils-local/
-copy
-remotecopy
-remoteadmin
-www-admin/redirect_s.php
+#Local server and deploy tools
+deploy
+server_*
+.php_pid
 
-#SQL data
-sql/CUSTOM_ROWS.SQL
-sql/DEBUG_ROWS.SQL
+#SQL custom data
+sql/DES/
+sql/PRE/
+sql/DBG/
 
 #Passwords file
-www/.htpasswd
-www-admin/.htpasswd
-www/.htaccess_local
-www-admin/.htaccess_local
+.htpasswd*
+application/config/auth.php_*
 
-#3rd party software
-www-admin/script/ckeditor
+#Content images
+public/img/content/*.png
+public/img/content/*.svg
+public/img/content/*/*.png
+public/img/content/*/*.svg
+public/img/content/*/*/*.png
+public/img/content/*/*/*.svg

+ 89 - 0
application/Controller.php

@@ -0,0 +1,89 @@
+<?php
+
+    require_once(__DIR__ . "/config/config.php");
+    require_once($path["helper"] . "db.php");
+    require_once($path["helper"] . "text.php");
+    require_once($path["helper"] . "net.php");
+    foreach (glob($path["page"] . "*.php") as $pagename){
+        require_once($pagename);
+    }
+
+
+    /**
+     * Application controller.
+     *
+     * Handles every request, creating the required models and selecting the
+     * view.
+     */
+    class Controller {
+
+        /**
+         * Constructor.
+         *
+         * Handles every request, creating the required models and selecting the
+         * view.
+         */
+        public function __construct($params){
+
+            global $path;
+            global $base_url;
+            global $static;
+            global $static_url;
+            global $base_dir;
+            $page;
+
+            $db = start_db();
+
+            // Parse parameters, get lang and build the route.
+            $pars = [];
+            foreach($params as $p){
+                if (strlen($p) > 0){
+                    array_push($pars, $p);
+                }
+            }
+            $route = [];
+            if (sizeof($pars) > 0 && preg_match("/^[a-zA-Z]{2}$/", $pars[0])){
+                $lang = $pars[0];
+                array_splice($pars, 0, 1);
+                // Override global to include language in URL
+                $base_url = get_protocol() . $_SERVER["HTTP_HOST"] . "/" . $lang;
+            }
+            else{
+                $lang = select_language($db);
+            }
+            foreach($pars as $p){
+                array_push($route, $p);
+            }
+
+            // Select the model to load.
+            if (sizeof($route) == 0){
+                $page = new Home_Page($db, $lang);
+            }
+            else{
+                if (strtoupper($route[0]) == "HELP"){
+                    $page = new Help_Page($db, $lang);
+                }
+                if (strtoupper($route[0]) == "PROFILE"){
+                    $page = new Profile_Page($db, $lang);
+                }
+                elseif (strtoupper($route[0]) == "PROJECT"){
+                    if (sizeof($route) > 1){
+                        // Project page
+                        $page = new Project_Page($db, $lang, $route[1]);
+                    }
+                    else{
+                        // Project list page
+                        $page = new Projects_Page($db, $lang);
+                    }
+                }
+            }
+
+            // Load the view, or set an error code.
+            if (!isset($page)){
+                http_response_code(404);
+                $page = new Error_Page($db, $lang);
+            }
+            require_once($page->view);
+        }
+    }
+?>

+ 8 - 0
application/config/auth.php

@@ -0,0 +1,8 @@
+<?php
+    $auth = [
+        "host" => "localhost",
+        "name" => "web",
+        "user" => "web",
+        "pass" => "XXX"
+    ];
+?>

+ 45 - 0
application/config/config.php

@@ -0,0 +1,45 @@
+<?php
+
+    require_once(__DIR__ . "/auth.php");
+    require_once(__DIR__ . "/../helper/net.php");
+
+    /**
+     * Server base url, including protocol, without language indicator.
+     * It may be overwritten by the controller to add the language.
+     */
+    $base_url = get_protocol() . $_SERVER["HTTP_HOST"];
+    $static_url = get_protocol() . $_SERVER["HTTP_HOST"];
+
+    /**
+     * Static url, absolute, language independant.
+     */
+    $static = [
+        "layout" => $static_url . "/img/layout/",
+        "content" => $static_url . "/img/content/",
+        "fonts" => $static_url . "/fonts/",
+        "css" => $static_url . "/css/",
+        "demo" => $static_url . "/demo/",
+        "js" => $static_url . "/js/",
+        "cv" => $static_url . "/cv/"
+    ];
+
+    /**
+     * Server document root.
+     */
+    $base_dir = $_SERVER["DOCUMENT_ROOT"];
+
+    /**
+     * Paths within the server.
+     */
+    $path = [
+        "application" => $base_dir . "/../application/",
+        "controller" => $base_dir . "/../application/Controller.php",
+        "entity" => $base_dir . "/../application/entity/",
+        "page" => $base_dir . "/../application/page/",
+        "helper" => $base_dir . "/../application/helper/",
+        "view" => $base_dir . "/../application/view/",
+        "inc" => $base_dir . "/../application/view/inc/",
+        "string" => $base_dir . "/../application/view/string/"
+    ];
+
+?>

+ 58 - 0
application/entity/Cv.php

@@ -0,0 +1,58 @@
+<?php
+
+    require_once($path["entity"] . "Entity.php");
+    require_once($path["entity"] . "Lang.php");
+
+
+    /**
+     * CV file.
+     *
+     * Represents an object from the table 'cv'.
+     */
+    class Cv extends Entity{
+
+        /**
+         * CV file identifier.
+         */
+        public $id;
+
+        /**
+         * CV {@see Lang}.
+         */
+        public $lang;
+
+        /**
+         * Filename.
+         */
+        public $file;
+
+
+        /**
+         * Constructor.
+         *
+         * Searches the database and retrieves the information about the
+         * object, populating it.
+         *
+         * @param MySQL_connection $db Connection to the database.
+         * @param int $id Database identifier of the language.
+         */
+        public function __construct($db, $id){
+            parent::__construct($db, null);
+            $s =
+              "SELECT " .
+              "  lang, " .
+              "  file " .
+              "FROM cv " .
+              "WHERE " .
+              "  id = '$id'; ";
+            error_log($s);
+            $q = mysqli_query($this->db, $s);
+            if (mysqli_num_rows($q) > 0){
+                $r = mysqli_fetch_array($q);
+                $this->id = $id;
+                $this->lang = new Lang($this->db, $r["lang"]);
+                $this->file = $r["file"];
+            }
+        }
+    }
+?>

+ 35 - 0
application/entity/Entity.php

@@ -0,0 +1,35 @@
+<?php
+
+    /**
+     * Entity superclass.
+     *
+     * Every other entity must inherit from this one. It represents a database
+     * entity.
+     */
+    abstract class Entity{
+
+        /**
+         * Database connection.
+         */
+        public $db;
+
+        /**
+         * The language of the class's text fields (lowercase, two-letter
+         * language code).
+         */
+        public $lang;
+
+        /**
+         * Constructor.
+         *
+         * Sets the database conection and the language.
+         *
+         * @param MySQL_connection $db Connection to the database.
+         * @param string $lang Lowercase, two-letter language code.
+         */
+        public function __construct($db, $lang){
+            $this->db = $db;
+            $this->lang = $lang;
+        }
+    }
+?>

+ 56 - 0
application/entity/Lang.php

@@ -0,0 +1,56 @@
+<?php
+
+    require_once($path["entity"] . "Entity.php");
+
+
+    /**
+     * Language.
+     *
+     * Represents an object from the table 'lang'.
+     */
+    class Lang extends Entity{
+
+        /**
+         * Lowercase, two-letter language code.
+         */
+        public $code;
+
+        /**
+         * Language name, in it's own language.
+         */
+        public $name;
+
+        /**
+         * Indictes wether the language is offered in this language.
+         */
+        public $active;
+
+        /**
+         * Constructor.
+         *
+         * Searches the database and retrieves the information about the
+         * object, populating it.
+         *
+         * @param MySQL_connection $db Connection to the database.
+         * @param int $id Database identifier of the language.
+         */
+        public function __construct($db, $id){
+            parent::__construct($db, null);
+            $s =
+              "SELECT " .
+              "  code, " .
+              "  name, " .
+              "  active " .
+              "FROM lang " .
+              "WHERE " .
+              "  code = '$id'; ";
+            $q = mysqli_query($this->db, $s);
+            if (mysqli_num_rows($q) > 0){
+                $r = mysqli_fetch_array($q);
+                $this->code = $r["code"];
+                $this->name = $r["name"];
+                $this->active = $r["active"];
+            }
+        }
+    }
+?>

+ 72 - 0
application/entity/License.php

@@ -0,0 +1,72 @@
+<?php
+
+    require_once($path["entity"] . "Entity.php");
+    require_once($path["helper"] . "text.php");
+
+
+    /**
+     * License.
+     *
+     * Represents an object from the table 'license'.
+     */
+    class License extends Entity{
+
+        /**
+         * License identifier. Usually an abbreviation.
+         */
+        public $id;
+
+        /**
+         * Short, easily readable text summarizing the full text of the
+         * license.
+         */
+        public $summary;
+
+        /**
+         * Full text of the license.
+         */
+        public $legal;
+
+        /**
+         * License logo.
+         */
+        public $logo;
+
+        /**
+         * License icon, small.
+         */
+        public $icon;
+
+        /**
+         * Constructor.
+         *
+         * Searches the database and retrieves the information about the
+         * object, populating it.
+         *
+         * @param MySQL_connection $db Connection to the database.
+         * @param string $lang Lowercase, two-letter language code.
+         * @param string $id Database identifier of the license.
+         */
+        public function __construct($db, $lang, $id){
+            parent::__construct($db, $lang);
+            $s =
+              "SELECT " .
+              "  id, " .
+              "  summary, " .
+              "  legal, " .
+              "  logo, " .
+              "  icon " .
+              "FROM license " .
+              "WHERE id = '$id'; ";
+            $q = mysqli_query($this->db, $s);
+            if (mysqli_num_rows($q) > 0){
+                $r = mysqli_fetch_array($q);
+                $this->id = $r["id"];
+                $this->summary = text($this, $r["summary"]);
+                $this->legal = text($this, $r["legal"]);
+                $this->logo = $r["logo"];
+                $this->icon = $r["icon"];
+            }
+        }
+    }
+?>

+ 150 - 0
application/entity/Project.php

@@ -0,0 +1,150 @@
+<?php
+
+    require_once($path["entity"] . "Entity.php");
+    require_once($path["entity"] . "License.php");
+    require_once($path["entity"] . "Project_Type.php");
+    require_once($path["entity"] . "Project_Image.php");
+    require_once($path["entity"] . "Project_Tag.php");
+    require_once($path["entity"] . "Project_Url.php");
+    require_once($path["helper"] . "text.php");
+
+
+    /**
+     * Project.
+     *
+     * Represents an object from the table 'project'.
+     */
+    class Project extends Entity{
+
+        /**
+         * Project identifier.
+         */
+        public $id;
+
+        /**
+         * Permalink for linking the project (relative).
+         */
+        public $permalink;
+
+        /**
+         * Project index for sorting.
+         */
+        public $idx;
+
+        /**
+         * {@see Project_Type} of project.
+         */
+        public $type;
+
+        /**
+         * Project title in the defined language.
+         */
+        public $title;
+
+        /**
+         * Project logo filename.
+         */
+        public $logo;
+
+        /**
+         * Project summary in the defined language.
+         */
+        public $header;
+
+        /**
+         * Project description in the defined language.
+         */
+        public $text;
+
+        /**
+         * Project {@see License}.
+         */
+        public $license;
+
+        /**
+         * Array with the project {@see Project_Image}.
+         */
+        public $image = [];
+
+        /**
+         * Array with the {@see Project_Tag} of the project.
+         */
+        public $tag = [];
+
+        /**
+         * Array with {@see Project_Url} related to the project.
+         */
+        public $url = [];
+
+        /**
+         * Constructor.
+         *
+         * Searches the database and retrieves the information about the
+         * project, populating it and it's items.
+         *
+         * @param MySQL_connection $db Connection to the database.
+         * @param string $lang Lowercase, two-letter language code.
+         * @param string $id Identifier or permalink of the project.
+         */
+        public function __construct($db, $lang, $id){
+            parent::__construct($db, $lang);
+            $s =
+              "SELECT " .
+              "  id, " .
+              "  permalink, " .
+              "  idx, " .
+              "  type, " .
+              "  title, " .
+              "  logo, " .
+              "  header, " .
+              "  text, " .
+              "  license " .
+              "FROM project " .
+              "WHERE " .
+              "  visible = 1 AND " .
+              "  ( " .
+              "    id = '$id' OR " .
+              "    permalink = '$id' " .
+              "  );";
+            $q = mysqli_query($this->db, $s);
+            if (mysqli_num_rows($q) > 0){
+                $r = mysqli_fetch_array($q);
+                $this->id = $r["id"];
+                $this->permalink = $r["permalink"];
+                $this->idx = $r["idx"];
+                $this->title = text($this, $r["title"]);
+                $this->logo = $r["logo"];
+                $this->header = text($this, $r["header"]);
+                $this->text = text($this, $r["text"]);
+                $this->type = new Project_Type($this->db, $this->lang, $r["type"]);
+                $this->license = new License($this->db, $this->lang, $r["license"]);
+            }
+            $s_image =
+              "SELECT id " .
+              "FROM project_image " .
+              "WHERE project = " . $this->id . " " .
+              "ORDER BY idx; ";
+            $q_image = mysqli_query($this->db, $s_image);
+            while($r_image = mysqli_fetch_array($q_image)){
+                array_push($this->image, new Project_Image($this->db, $r_image["id"]));
+            }
+            $s_tag =
+              "SELECT tag " .
+              "FROM project_tag " .
+              "WHERE project = " . $this->id . ";";
+            $q_tag = mysqli_query($this->db, $s_tag);
+            while($r_tag = mysqli_fetch_array($q_tag)){
+                array_push($this->tag, new Project_Tag($this->db, $this->lang, $this->id, $r_tag["tag"]));
+            }
+            $s_url =
+              "SELECT id " .
+              "FROM project_url " .
+              "WHERE project = " . $this->id . ";";
+            error_log($s_url);
+            $q_url = mysqli_query($this->db, $s_url);
+            while($r_url = mysqli_fetch_array($q_url)){
+                array_push($this->url, new Project_Url($this->db, $this->lang, $r_url["id"]));
+            }
+        }
+    }
+?>

+ 62 - 0
application/entity/Project_Image.php

@@ -0,0 +1,62 @@
+<?php
+
+    require_once($path["entity"] . "Entity.php");
+
+
+    /**
+     * Image of a project.
+     *
+     * Represents an object from the table 'project_image'.
+     */
+    class Project_Image extends Entity{
+
+        /**
+         * Image identifier.
+         */
+        public $id;
+
+        /**
+         * Project identifier.
+         */
+        public $project;
+
+        /**
+         * Indicates the order position among other images.
+         */
+        public $idx;
+
+        /**
+         * Filename of the image.
+         */
+        public $image;
+
+        /**
+         * Constructor.
+         *
+         * Searches the database and retrieves the information about the
+         * image, populating it.
+         *
+         * @param MySQL_connection $db Connection to the database.
+         * @param int $id Identifier of the image.
+         */
+        public function __construct($db, $id){
+            parent::__construct($db, null);
+            $s =
+              "SELECT " .
+              "  id, " .
+              "  project, " .
+              "  idx, " .
+              "  image " .
+              "FROM project_image " .
+              "WHERE id = $id ;";
+            $q = mysqli_query($this->db, $s);
+            if (mysqli_num_rows($q) > 0){
+                $r = mysqli_fetch_array($q);
+                $this->id = $r["id"];
+                $this->project = $r["project"];
+                $this->idx = $r["idx"];
+                $this->image = $r["image"];
+            }
+        }
+    }
+?>

+ 41 - 0
application/entity/Project_Tag.php

@@ -0,0 +1,41 @@
+<?php
+
+    require_once($path["entity"] . "Entity.php");
+    require_once($path["helper"] . "text.php");
+
+
+    /**
+     * Tag of a project.
+     *
+     * Represents an object from the table 'project_tag'.
+     */
+    class Project_Tag extends Entity{
+
+        /**
+         * Identifier of the project the tag belongs to.
+         */
+        public $project;
+
+        /**
+         * Tag text.
+         */
+        public $tag;
+
+        /**
+         * Constructor.
+         *
+         * Searches the database and retrieves the information about the
+         * tag, populating it.
+         *
+         * @param MySQL_connection $db Connection to the database.
+         * @param string $lang Lowercase, two-letter language code.
+         * @param int $project Identifier of the project the tag belongs to.
+         * @param string $tag Tag identifier. Same as it's text.
+         */
+        public function __construct($db, $lang, $project, $tag){
+            parent::__construct($db, $lang);
+            $this->project = $project;
+            $this->tag = text($this, $tag);
+        }
+    }
+?>

+ 57 - 0
application/entity/Project_Type.php

@@ -0,0 +1,57 @@
+<?php
+
+    require_once($path["entity"] . "Entity.php");
+    require_once($path["helper"] . "text.php");
+
+
+    /**
+     * Type of a project.
+     *
+     * Represents an object from the table 'project_type'.
+     */
+    class Project_Type extends Entity{
+
+        /**
+         * Identifier of the project type.
+         */
+        public $id;
+
+        /**
+         * Type denomination, in the defined language.
+         */
+        public $title;
+
+        /**
+         * Type description, in the defined language.
+         */
+        public $summary;
+
+        /**
+         * Constructor.
+         *
+         * Searches the database and retrieves the information about the
+         * type, populating it.
+         *
+         * @param MySQL_connection $db Connection to the database.
+         * @param string $lang Lowercase, two-letter language code.
+         * @param string $id Identifier of the project type.
+         */
+        public function __construct($db, $lang, $id){
+            parent::__construct($db, $lang);
+            $s =
+              "SELECT " .
+              "  id, " .
+              "  title, " .
+              "  summary " .
+              "FROM project_type " .
+              "WHERE id = '$id' ;";
+            $q = mysqli_query($this->db, $s);
+            if (mysqli_num_rows($q) > 0){
+                $r = mysqli_fetch_array($q);
+                $this->id = $r["id"];
+                $this->title = text($this, $r["title"]);
+                $this->summary = text($this, $r["summary"]);
+            }
+        }
+    }
+?>

+ 64 - 0
application/entity/Project_Url.php

@@ -0,0 +1,64 @@
+<?php
+
+    require_once($path["entity"] . "Entity.php");
+    require_once($path["entity"] . "Project_Url_Type.php");
+
+
+    /**
+     * URL related to a project.
+     *
+     * Represents an object from the table 'project_url'.
+     */
+    class Project_Url extends Entity{
+
+        /**
+         * Identifier of the url.
+         */
+        public $id;
+
+        /**
+         * Identifier of the project the URL is related to.
+         */
+        public $project;
+
+        /**
+         * URL {@see Project_Url_Type}.
+         */
+        public $type;
+
+        /**
+         * Full URL address.
+         */
+        public $url;
+
+        /**
+         * Constructor.
+         *
+         * Searches the database and retrieves the information about the
+         * url, populating it and its items.
+         *
+         * @param MySQL_connection $db Connection to the database.
+         * @param string $lang Lowercase, two-letter language code.
+         * @param int $id Identifier of the url.
+         */
+        public function __construct($db, $lang, $id){
+            parent::__construct($db, $lang);
+            $s =
+              "SELECT " .
+              "  id, " .
+              "  project, " .
+              "  type, " .
+              "  url " .
+              "FROM project_url " .
+              "WHERE id = $id ;";
+            $q = mysqli_query($this->db, $s);
+            if (mysqli_num_rows($q) > 0){
+                $r = mysqli_fetch_array($q);
+                $this->id = $r["id"];
+                $this->project = $r["project"];
+                $this->url = $r["url"];
+                $this->type = new Project_Url_Type($this->db, $this->lang, $r["type"]);
+            }
+        }
+    }
+?>

+ 65 - 0
application/entity/Project_Url_Type.php

@@ -0,0 +1,65 @@
+<?php
+
+    require_once($path["entity"] . "Entity.php");
+    require_once($path["helper"] . "text.php");
+
+
+    /**
+     * Type of URL.
+     *
+     * Represents an object from the table 'project_url_type'.
+     */
+    class Project_Url_Type extends Entity{
+
+        /**
+         * URL type identifier.
+         */
+        public $id;
+
+        /**
+         * URL denomination, in the defined language.
+         */
+        public $title;
+
+        /**
+         * URL short explanation, in the defined language.
+         */
+        public $summary;
+
+        /**
+         * Filename of the logo of the URL. Usually, the logo of the site it
+         * points to.
+         */
+        public $logo;
+
+        /**
+         * Constructor.
+         *
+         * Searches the database and retrieves the information about the
+         * url type, populating it and its items.
+         *
+         * @param MySQL_connection $db Connection to the database.
+         * @param string $lang Lowercase, two-letter language code.
+         * @param int $id Identifier of the url type.
+         */
+        public function __construct($db, $lang, $id){
+            parent::__construct($db, $lang);
+            $s =
+              "SELECT " .
+              "  id, " .
+              "  title, " .
+              "  summary, " .
+              "  logo " .
+              "FROM project_url_type " .
+              "WHERE id = '$id' ;";
+            $q = mysqli_query($this->db, $s);
+            if (mysqli_num_rows($q) > 0){
+                $r = mysqli_fetch_array($q);
+                $this->id = $r["id"];
+                $this->title = text($this, $r["title"]);
+                $this->summary = text($this, $r["summary"]);
+                $this->logo = $r["logo"];
+            }
+        }
+    }
+?>

+ 27 - 0
application/helper/db.php

@@ -0,0 +1,27 @@
+<?php
+
+
+    /**
+     * Creates a database connection using the data in the config files.
+     * 
+     * @return MySQL_connection Connection to the database.
+     */
+    function start_db(){
+        global $auth;
+        $db = mysqli_connect($auth["host"], $auth["user"], $auth["pass"], $auth["name"]);
+
+        // Check connection
+        if (mysqli_connect_errno()){
+            error_log("Failed to connect to database: " . mysqli_connect_error());
+            return -1;
+        }
+
+        //Set encoding options
+        mysqli_set_charset($db, "utf-8");
+        header("Content-Type: text/html; charset=utf8");
+        mysqli_query($db, "SET NAMES utf8;");
+
+        return $db;
+    }
+
+?>

+ 117 - 0
application/helper/net.php

@@ -0,0 +1,117 @@
+<?php
+
+
+    /**
+     * Finds out the protocol the user is connecting to the site with.
+     *
+     * @return string "http://" or "https://".
+     */
+    function get_protocol(){
+        if (isset($_SERVER["HTTPS"]) && ($_SERVER["HTTPS"] == "on" || $_SERVER["HTTPS"] == 1) || isset($_SERVER["HTTP_X_FORWARDED_PROTO"]) && $_SERVER["HTTP_X_FORWARDED_PROTO"] == "https") {
+            $protocol = "https://";
+        }
+        else {
+            $protocol = "http://";
+        }
+        return $protocol;
+    }
+
+
+    /**
+     * Finds out the IP address of the client.
+     * 
+     * @return string Client IP address.
+     */
+    function get_ip(){
+        $client  = @$_SERVER["HTTP_CLIENT_IP"];
+        $forward = @$_SERVER["HTTP_X_FORWARDED_FOR"];
+        $remote  = $_SERVER["REMOTE_ADDR"];
+        if(filter_var($client, FILTER_VALIDATE_IP)){
+            $ip = $client;
+        }
+        elseif(filter_var($forward, FILTER_VALIDATE_IP)){
+            $ip = $forward;
+        }
+        else{
+            $ip = $remote;
+        }
+        return $ip;
+    }
+
+
+    /**
+     * Registers the page viewed by the user. If it is first page shown in his
+     * visit, it also registers the visit. 
+     * 
+     * @param MySQL_connection $db Connection to the database.
+     * @param string $section Site section being visited.
+     * @param string $id ID of the entry being visited.
+     */
+    function stats($db, $section, $id){
+
+        // Get client data
+        $ip = get_ip();
+        $browser_data = get_browser(null, true);
+        $os = $browser_data["platform"];
+        $browser = $browser_data["browser"];
+        $uagent = $browser_data["browser_name_pattern"];
+
+        //If bot, do nothing
+        $bot_kw = Array();
+        $bot_kw[0] = "bot";
+        $bot_kw[1] = "spider";
+        $bot_kw[2] = "crawl";
+        $bot_kw[3] = ".com";
+        $bot_kw[4] = ".ru";
+        $bot_kw[5] = "baidu";
+        $bot_kw[6] = "survey";
+        $bot_kw[7] = "scan";
+        $bot_kw[8] = "feed";
+        $bot_kw[9] = "bing";
+        $bot_kw[10] = "yahoo";
+        $bot_kw[11] = "engine";
+        $bot_kw[12] = "preview";
+        $bot_kw[13] = "checker";
+        $bot_kw[14] = "catalog";
+        $bot_kw[15] = "accelerator";
+        $bot_kw[16] = "python";
+        $bot_kw[14] = "qt";
+        $bot_kw[15] = "webdav";
+        $bot_kw[16] = "http";
+        $bot_kw[17] = "url";
+        $bot_kw[18] = "fake";
+        $bot_kw[19] = "library";
+        $bot_kw[20] = "commerce";
+        $bot_kw[21] = "htmlbot";
+        $bot_kw[22] = "fetch";
+        $bot_kw[23] = "googleb";
+        $bot_kw[24] = "facebook";
+        $bot_kw[25] = "whatsapp";
+        $bot_kw[26] = "pinterest";
+        $bot_kw[27] = "scrapy";
+        $bot_kw[28] = "libwww";
+        $bot_kw[29] = "java standard library";
+        $bot_kw[30] = "default browser";
+        $bot_kw[31] = "twingly recon";
+        $bot_kw[32] = "siteexplorer";
+        $bot_kw[33] = "yandex";
+        $bot_kw[34] = "wotbox";
+        $bot_kw[35] = "apache synapse";
+        $bot_kw[36] = "catexplorador";
+        $bot_kw[37] = "internet archive";
+        if (in_array(strtolower($uagent), $bot_kw)){
+            return;
+        }
+
+        //Look for a visit with the same IP in the last 30 mins.
+        $q = mysqli_query($db, "SELECT stat_visit.id AS visitid FROM stat_view, stat_visit WHERE visit = stat_visit.id AND stat_view.dtime > DATE_SUB(now(), INTERVAL 30 MINUTE) AND ip = '$ip' AND uagent = '$uagent';");
+        if (mysqli_num_rows($q) == 0){
+            mysqli_query($db, "INSERT INTO stat_visit (ip, uagent, os, browser) VALUES ('$ip', '$uagent', '$os', '$browser');");
+            $q = mysqli_query($db, "SELECT stat_visit.id AS visitid FROM stat_visit WHERE ip = '$ip' AND uagent = '$uagent' ORDER BY stat_visit.id DESC LIMIT 1;");
+        }
+        $r = mysqli_fetch_array($q);
+        $visit = $r['visitid'];
+        mysqli_query($db, "INSERT INTO stat_view (visit, section, entry) VALUES ($visit, '$section', '$id');");
+    }
+
+?>

+ 236 - 0
application/helper/text.php

@@ -0,0 +1,236 @@
+<?php
+
+
+    /**
+     * Selects the language the page will be displayed on.
+     * 
+     * First, it tries to read the language cookie in the client. If none is
+     * set, get the browser language preference list. If none is provided or
+     * they are not supported, it will use the default language.
+     * 
+     * @param MySQL_connection $db Connection to the database.
+     * @return string Lowercase, two-letter language code.
+     */
+    function select_language($db){
+
+        // Get available languages from db
+        $available_languages = array();
+        $q_lang = mysqli_query($db, "SELECT code FROM lang WHERE active = 1;");
+        while ($r_lang = mysqli_fetch_array($q_lang)){
+            array_push($available_languages, $r_lang["code"]);
+        }
+
+        // Is there a language cookie installed on the client?.
+        header("Cache-control: private");
+        if (isSet($_COOKIE["lang"])){
+            $lang = $_COOKIE["lang"];
+            if (in_array($lang, $available_languages)){
+                return $lang;
+            }
+        }
+
+        // If no cookie, select from client browser preferences.
+        $lang = prefered_language($available_languages, $_SERVER["HTTP_ACCEPT_LANGUAGE"]);
+        if (in_array($lang, $available_languages)){
+            return $lang;
+        }
+
+        // If no method was succesfull, default language
+        $lang = $available_languages[0];
+        return $lang;
+    }
+
+
+    /**
+     * Parses the language prefrences of the client broser, comparing them to
+     * the languages offered by the site and selects the prefered one among
+     * the ones supported.
+     * 
+     * @param string[] available_languages List of lowercase, two-letter
+     *                                      language codes allowed by the site.
+     * @param string http_accept_language Raw header with info about client
+     *                                    language preferences.
+     * @return string Lowercase, two-letter code of the prefered available
+     *                language.
+     */
+    function prefered_language(array $available_languages, $http_accept_language) {
+
+        $available_languages = array_flip($available_languages);
+
+        $langs;
+        preg_match_all("~([\w-]+)(?:[^,\d]+([\d.]+))?~", strtolower($http_accept_language), $matches, PREG_SET_ORDER);
+        foreach($matches as $match) {
+
+            list($a, $b) = explode("-", $match[1]) + array("", "");
+            $value = isset($match[2]) ? (float) $match[2] : 1.0;
+
+            if(isset($available_languages[$match[1]])) {
+                $langs[$match[1]] = $value;
+                continue;
+            }
+
+            if(isset($available_languages[$a])) {
+                $langs[$a] = $value - 0.1;
+            }
+
+        }
+        if (count($langs) > 0){
+            arsort($langs);
+            //return $langs[0];
+            array_values($langs)[0];
+        }
+        else{
+            return 'en';
+        }
+    }
+
+
+    /**
+     * Tturns a date string into a human readable string on the specified
+     * language. Only works for spanish, basque and english.
+     * 
+     * @param string $str_date Date string ('yyyy-mm-dd' or 'yyyy-mm-dd HH:MM:SS')
+     * @param string $lang Language code (es, en, eu).
+     * @param string $time Append the time at the end.
+     * @return string Formatted date string.
+     */
+    function format_date($str_date, $lang, $time = true){
+        $date = strtotime($str_date);
+        $year = date("o", $date);
+        $month = date("n", $date);
+        $month --;
+        $day = date("j", $date);
+        $wday = date("N", $date);
+        $wday --;
+        $hour = date("H", $date);
+        $minute = date("i", $date);
+        switch ($lang){
+            case "en":
+                $week = ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"];
+                $months = ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"];
+                if ($time){
+                    $str = "$week[$wday], $months[$month] $day, $year at $hour:$minute";
+                }
+                else{
+                    $str = "$week[$wday], $months[$month] $day, $year";
+                }
+                break;
+            case "eu":
+                $week = ["astelehena", "asteartea", "asteazkena", "osteguna", "ostirala", "larumbata", "igandea"];
+                $months = ["urtarrilaren", "otsailaren", "martxoaren", "apirilaren", "maiatzaren", "ekainaren", "uztailaren", "abuztuaren", "irailaren", "urriaren", "azaroaren", "abenduaren"];
+                if ($time){
+                    $str = $year . "ko $months[$month] $day" . "an, $week[$wday], $hour:$minute";
+                }
+                else{
+                    $str = $year . "ko $months[$month] $day" . "an, $week[$wday]";
+                }
+                break;
+            default:
+                $week = ["Lunes", "Martes", "Mi&eacute;rcoles", "Jueves", "Viernes", "S&aacute;bado", "Domingo"];
+                $months = ["enero", " febrero", "marzo", "abril", "mayo", "junio", "julio", "agosto", "septiembre", "octubre", "noviembre", "diciembre"];
+                if ($time){
+                    $str = "$week[$wday] $day de $months[$month] de $year a las $hour:$minute";
+                }
+                else{
+                    $str = "$week[$wday] $day de $months[$month] de $year";
+                }
+        }
+        return $str;
+    }
+
+
+    /**
+     * Retrieves a text fragment from the database.
+     * 
+     * @param Page|Entity $model An initialized data model.
+     * @param string $id Text identifier.
+     * @returns string The text.
+     */
+    function text($model, $id){
+        global $path;
+        $q = mysqli_query($model->db, "SELECT text, file FROM text WHERE id = '$id' AND lang = '" . $model->lang . "';");
+        $r = mysqli_fetch_array($q);
+        if (strlen($r["file"]) > 0){
+            return file_get_contents($path["string"] . $r["file"]);
+        }
+        else{
+            return $r["text"];
+        }
+    }
+
+
+    /**
+     * This function closes all the opened HTML tags in a given string.
+     * 
+     * @param string html The string with HTML tags.
+     * @return string HTML with closed tags.
+     */
+    function close_tags($html) {
+        $result = [];
+        preg_match_all("#<(?!meta|img|br|hr|input\b)\b([a-z]+)(?: .*)?(?<![/|/ ])>#iU", $html, $result);
+        $openedtags = $result[1];
+        preg_match_all("#</([a-z]+)>#iU", $html, $result);
+        $closedtags = $result[1];
+        $len_opened = count($openedtags);
+        if (count($closedtags) == $len_opened) {
+            return $html;
+        }
+        $openedtags = array_reverse($openedtags);
+        for ($i=0; $i < $len_opened; $i++) {
+            if (!in_array($openedtags[$i], $closedtags)) {
+                $html .= "</".$openedtags[$i].">";
+            } else {
+                unset($closedtags[array_search($openedtags[$i], $closedtags)]);
+            }
+        }
+        return $html;
+    }
+
+
+    /**
+     * Text shortener. Given a string, it trims in the proximity of the
+     * desired string, up to the next white character. If indicated, it will
+     * append a link to the full text.
+     * 
+     * @param string $text The text to shorten.
+     * @param int $length The desired length.
+     * @param string $link_text Text for the link. Optional.
+     * @param string $link URI of the link.
+     * @return string Shortened text.
+     */
+     function cut_text($text, $length, $link_text = "", $link = ""){
+        if (strlen($text) < $length){
+            return $text;
+        }
+        $cut = substr($text, 0, strpos($text, " ", $length));
+        $cut = close_tags($cut);
+        if (strlen($cut) == 0){
+            $cut = $text;
+        }
+        if (strlen($text) != strlen($cut) && strlen($link) > 0 && strlen($link_text) > 0){
+            $cut = $cut . "... <a href='$link'>$link_text</a>";
+        }
+        return $cut;
+    }
+
+    /**
+     * Creates the srcset attribute for content images.
+     * Creates 9 different resolutions, from 100px to 900px.
+     * 
+     * @param string $file Path to the file, relative to $path["img"]["content"]).
+     * @return string srcset atttribute content.
+     */
+    function srcset($file){
+        global $static;
+        $srcset = "";
+        $dir = dirname($file);
+        $name = basename($file);
+        foreach (range(1, 9) as $d) {
+            $srcset = $srcset . $static["content"] . $dir . "/x" . $d . "00/" . $name . " " . $d . "00px, ";
+        }
+        $srcset = rtrim($srcset, ", ");
+        return $srcset;
+    }
+
+?>
+

+ 46 - 0
application/page/Error_Page.php

@@ -0,0 +1,46 @@
+<?php
+
+    require_once($path["page"] . "Page.php");
+    require_once($path["helper"] . "text.php");
+
+
+    /**
+     * Error page model.
+     */
+    class Error_Page extends Page{
+
+        public $code = "";
+        public $error_description = "";
+        public $advice = "";
+        public $solution = [];
+
+        /**
+         * Constructor.
+         *
+         * Retrieves the data and initializes the page.
+         *
+         * @param MySQL_connection $db Connection to the database.
+         * @param string $lang Lowercase, two-letter language code.
+         */
+        public function __construct($db, $lang){
+            global $path;
+            global $base_url;
+            parent::__construct($db, $lang);
+            $this->view = $path["view"] . "error.php";
+            $this->code = http_response_code();
+            if (in_array($this->code, array(400, 401, 403, 404, 500))){
+                $err = $this->code;
+            }
+            else{
+                $err = "XXX";
+            }
+            $this->error_description = text($this, "ERROR_" . $err . "_DESCRIPTION");
+            $this->advice = text($this, "ERROR_" . $err . "_SOLUTION");
+            array_push($this->solution, text($this, "ERROR_" . $err . "_SOLUTION_0"));
+            array_push($this->solution, text($this, "ERROR_" . $err . "_SOLUTION_1"));
+            array_push($this->solution, text($this, "ERROR_" . $err . "_SOLUTION_2"));
+            $this->title = text($this, "ERROR_TITLE") . " " . $this->code . " - " . text($this, "USER_NAME");
+            $this->description = text($this, "ERROR_TITLE") . " " . $this->code . " - " . text($this, "USER_NAME");
+        }
+    }
+?>

+ 58 - 0
application/page/Help_Page.php

@@ -0,0 +1,58 @@
+<?php
+
+    require_once($path["page"] . "Page.php");
+    require_once($path["helper"] . "text.php");
+
+
+    /**
+     * Help page model.
+     */
+    class Help_Page extends Page{
+
+        public $help = [
+            "info" => [
+                "title" => "",
+                "text" => "",
+            ],
+            "license" => [
+                "title" => "",
+                "text" => "",
+            ],
+            "privacy" => [
+                "title" => "",
+                "text" => "",
+            ],
+            "cookies" => [
+                "title" => "",
+                "text" => "",
+            ]
+        ];
+
+        /**
+         * Constructor.
+         *
+         * Retrieves the data and initializes the variables.
+         *
+         * @param MySQL_connection $db Connection to the database.
+         * @param string $lang Lowercase, two-letter language code.
+         */
+        public function __construct($db, $lang){
+            global $path;
+            global $base_url;
+            parent::__construct($db, $lang);
+            $this->view = $path["view"] . "help.php";
+
+            $this->help["info"]["title"] = text($this, "HELP_INFO_TITLE");
+            $this->help["info"]["text"] = text($this, "HELP_INFO_TEXT");
+            $this->help["license"]["title"] = text($this, "HELP_LICENSE_TITLE");
+            $this->help["license"]["text"] = text($this, "HELP_LICENSE_TEXT");
+            $this->help["privacy"]["title"] = text($this, "HELP_PRIVACY_TITLE");
+            $this->help["privacy"]["text"] = text($this, "HELP_PRIVACY_TEXT");
+            $this->help["cookies"]["title"] = text($this, "HELP_COOKIES_TITLE");
+            $this->help["cookies"]["text"] = text($this, "HELP_COOKIES_TEXT");
+            $this->title = text($this, "USER_NAME");
+            $this->description = text($this, "USER_NAME") . " - " . text($this, "USER_TAGLINE");
+            $this->canonical = $base_url . "/help/";
+        }
+    }
+?>

+ 48 - 0
application/page/Home_Page.php

@@ -0,0 +1,48 @@
+<?php
+
+    require_once($path["page"] . "Page.php");
+    require_once($path["entity"] . "Project.php");
+    require_once($path["helper"] . "text.php");
+
+
+    /**
+     * Home page model.
+     */
+    class Home_Page extends Page{
+
+        private $max_projects = 3;
+
+        /**
+         * List of recent projects.
+         */
+        public $project = [];
+
+        /**
+         * Constructor.
+         *
+         * Retrieves the data and initializes the variables.
+         *
+         * @param MySQL_connection $db Connection to the database.
+         * @param string $lang Lowercase, two-letter language code.
+         */
+        public function __construct($db, $lang){
+            global $path;
+            global $base_url;
+            parent::__construct($db, $lang);
+            $this->view = $path["view"] . "home.php";
+            $s_project =
+              "SELECT id " .
+              "FROM project " .
+              "WHERE visible = 1 " .
+              "ORDER BY idx DESC " .
+              "LIMIT " . $this->max_projects . ";";
+            $q_project = mysqli_query($this->db, $s_project);
+            while($r_project = mysqli_fetch_array($q_project)){
+                array_push($this->project, new Project($this->db, $this->lang, $r_project["id"]));
+            }
+            $this->title = text($this, "USER_NAME");
+            $this->description = text($this, "USER_NAME") . " - " . text($this, "USER_TAGLINE");
+            $this->canonical = $base_url . "/";
+        }
+    }
+?>

+ 93 - 0
application/page/Page.php

@@ -0,0 +1,93 @@
+<?php
+
+    /**
+     * Page superclass.
+     *
+     * Every visitable page type must inherit from this one.
+     */
+    abstract class Page{
+
+        /**
+         * Database connection.
+         */
+        public $db;
+
+        /**
+         * View associated with the page.
+         */
+        public $view;
+
+        /**
+         * Language the page will be served on (lowercase, two-letter
+         * language code).
+         */
+        public $lang;
+
+        /**
+         * List of available {@see Lang}uages (lowercase, two-letter language code).
+         */
+        public $available_langs = [];
+
+        /**
+         * Title of the page, in the defined language.
+         */
+        public $title;
+
+        /**
+         * Site name.
+         */
+        public $name;
+
+        /**
+         * Page description, in the defined language.
+         */
+        public $description;
+
+        /**
+         * Path to the site favicon.
+         */
+        public $favicon;
+
+        /**
+         * Path to the page icon or main image.
+         */
+        public $icon;
+
+        /**
+         * Canonical URL.
+         */
+        public $canonical;
+
+        /**
+         * Author URL.
+         */
+        public $author;
+
+
+        /**
+         * Constructor.
+         *
+         * @param MySQL_connection $db Connection to the database.
+         * @param string $lang Lowercase, two-letter language code.
+         */
+        public function __construct($db, $lang){
+            global $static;
+            global $base_url;
+            $this->db = $db;
+            $this->lang = $lang;
+            $s_lang =
+              "SELECT code AS id " .
+              "FROM lang " .
+              "WHERE active = 1; ";
+            $q_lang = mysqli_query($db, $s_lang);
+            while($r_lang = mysqli_fetch_array($q_lang)){
+                array_push($this->available_langs, new Lang($db, $r_lang["id"]));
+            }
+            $this->favicon = $static["layout"] . "logo/logo.svg";
+            $this->icon = $static["layout"] . "logo/logo.svg";
+            $this->name = text($this, "USER_NAME");
+            $this->author = $base_url;
+            $this->name = text($this, "USER_NAME");
+        }
+    }
+?>

+ 45 - 0
application/page/Profile_Page.php

@@ -0,0 +1,45 @@
+<?php
+
+    require_once($path["page"] . "Page.php");
+    require_once($path["entity"] . "Cv.php");
+    require_once($path["helper"] . "text.php");
+
+
+    /**
+     * Profile page model.
+     */
+    class Profile_Page extends Page{
+
+        /**
+         * List of available {@see CV}.
+         */
+        public $cv = [];
+
+        /**
+         * Constructor.
+         *
+         * Retrieves the data and initializes the variables.
+         *
+         * @param MySQL_connection $db Connection to the database.
+         * @param string $lang Lowercase, two-letter language code.
+         */
+        public function __construct($db, $lang){
+            global $path;
+            global $base_url;
+            parent::__construct($db, $lang);
+            $this->view = $path["view"] . "profile.php";
+            $s =
+              "SELECT id " .
+              "FROM cv " .
+              "WHERE visible = 1 " .
+              "ORDER BY lang = '" . $this->lang . "' DESC;";
+            $q = mysqli_query($this->db, $s);
+            while($r = mysqli_fetch_array($q)){
+                array_push($this->cv, new Cv($this->db, $r["id"]));
+            }
+            $this->title = text($this, "USER_NAME");
+            $this->description = text($this, "SECTION_ME") . " - " . text($this, "USER_NAME");
+            $this->canonical = $base_url . "/profile/";
+        }
+    }
+?>

+ 45 - 0
application/page/Project_Page.php

@@ -0,0 +1,45 @@
+<?php
+
+    require_once($path["page"] . "Page.php");
+    require_once($path["entity"] . "Project.php");
+    require_once($path["helper"] . "text.php");
+
+
+    /**
+     * Project page model.
+     */
+    class Project_Page extends Page{
+
+        /**
+         * The selected {@see Project}.
+         */
+        public $project;
+
+        /**
+         * Constructor.
+         *
+         * Retrieves the data and initializes the variables.
+         *
+         * @param MySQL_connection $db Connection to the database.
+         * @param string $lang Lowercase, two-letter language code.
+         * @param string $id Project id or permalink.
+         */
+        public function __construct($db, $lang, $id){
+            global $path;
+            global $base_url;
+            global $static;
+            parent:: __construct($db, $lang);
+            $this->view = $path["view"] . "project.php";
+            $this->project = new Project($this->db, $this->lang, $id);
+            $this->title = $this->project->title . " - " . text($this, "USER_NAME");
+            $this->description = $this->project->header;
+            if (strlen($this->project->logo) > 0){
+                $this->icon = $static["content"] . "project/" . $this->project->logo;
+            }
+            else{
+                $this->icon = $static["layout"] . "logo/logo.svg";
+            }
+            $this->canonical = $base_url . "/project/" . $this->project->permalink . "/";
+        }
+    }
+?>

+ 46 - 0
application/page/Projects_Page.php

@@ -0,0 +1,46 @@
+<?php
+
+    require_once($path["page"] . "Page.php");
+    require_once($path["entity"] . "Project.php");
+    require_once($path["helper"] . "text.php");
+
+
+    /**
+     * Projects list page model.
+     */
+    class Projects_Page extends Page{
+
+        /**
+         * Array with the {@see Project}.
+         */
+        public $project = [];
+
+        /**
+         * Constructor.
+         *
+         * Retrieves the data and initializes the variables.
+         *
+         * @param MySQL_connection $db Connection to the database.
+         * @param string $lang Lowercase, two-letter language code.
+         * @param string $id Project id or permalink.
+         */
+        public function __construct($db, $lang){
+            global $path;
+            global $base_url;
+            parent:: __construct($db, $lang);
+            $this->view = $path["view"] . "projects.php";
+            $s =
+              "SELECT id " .
+              "FROM project " .
+              "WHERE visible = 1 " .
+              "ORDER BY idx;";
+            $q = mysqli_query($this->db, $s);
+            while($r = mysqli_fetch_array($q)){
+                array_push($this->project, new Project($this->db, $this->lang, $r["id"]));
+            }
+            $this->title = text($this, "PROJECT_TITLE") . " - " . text($this, "USER_NAME");
+            $this->description = text($this, "PROJECT_DESCRIPTION");
+            $this->canonical = $base_url . "/project/";
+        }
+    }
+?>

+ 56 - 0
application/view/error.php

@@ -0,0 +1,56 @@
+<!DOCTYPE html>
+<html lang='<?=$lang?>'>
+    <head>
+        <meta content='text/html; charset=utf-8' http-equiv='content-type'/>
+        <meta charset='utf-8'/>
+        <meta name='viewport' content='width=device-width, initial-scale=1, maximum-scale=1, minimum-scale=1'>
+        <title><?=$page->title?></title>
+        <link rel='shortcut icon' href='<?=$static["layout"]?>/layout/logo/logo.svg'/>
+        <!-- CSS files -->
+        <link rel='stylesheet' type='text/css' href='<?=$static["css"]?>ui.css'/>
+        <link rel='stylesheet' type='text/css' href='<?=$static["css"]?>error.css'/>
+        <!-- Script files -->
+        <script type="text/javascript" src="<?=$static["js"]?>ui.js"></script>
+        <!-- No meta -->
+        <meta name="robots" content="noindex follow"/>
+    </head>
+    <body>
+<?php
+        include $path["inc"] . "header.php";
+?>
+        <main>
+            <section>
+                <h3><?=text($page, "ERROR_ERROR");?></h3>
+                <div id='left'>
+                    <p id='code'>
+                        <?=$page->code?>
+                    </p>
+                    <p>
+                        <span><?=text($page, "ERROR_ERROR");?></span>
+                        <span><?=text($page, "ERROR_CODE");?></span>
+                    </p>
+                </div>
+                <div id='right'>
+                    <h4>
+                        <?=$page->error_description?>
+                    </h4>
+                    <?=$page->advice?>
+                    <ul>
+                        <li>
+                            <a href='javascript: location.reload();'><?=$page->solution[0]?></a>
+                        </li>
+                        <li>
+                            <a href='javascript: history.go(-1);'><?=$page->solution[1]?></a>
+                        </li>
+                        <li>
+                            <a href='/'><?=$page->solution[2]?></a>
+                        </li>
+                    </ul>
+                </div>
+            </section>
+        </main>
+<?php
+        include $path["inc"] . "footer.php";
+?>
+    </body>
+</html>

+ 59 - 0
application/view/help.php

@@ -0,0 +1,59 @@
+<!DOCTYPE html>
+<html lang='<?=$page->lang?>'>
+    <head>
+        <meta content='text/html; charset=utf-8' http-equiv='content-type'/>
+        <meta charset='utf-8'/>
+        <meta name='viewport' content='width=device-width, initial-scale=1, maximum-scale=1, minimum-scale=1'/>
+        <title><?=$page->title?></title>
+        <link rel='shortcut icon' href='<?=$page->favicon?>'/>
+        <!-- CSS files -->
+        <link rel='stylesheet' type='text/css' href='<?=$static["css"]?>ui.css'/>
+        <link rel='stylesheet' type='text/css' href='<?=$static["css"]?>help.css'/>
+        <!-- Script files -->
+        <script type="text/javascript" src="<?=$static["js"]?>ui.js"></script>
+        <script type="text/javascript" src="<?=$static["js"]?>help.js"></script>
+        <!-- Meta tags -->
+        <link rel='canonical' href='<?=$page->canonical?>'/>
+        <link rel='author' href='<?=$page->author?>'/>
+        <link rel='publisher' href='<?=$page->author?>'/>
+        <meta name='description' content='<?=$page->description?>'/>
+        <meta property='og:title' content='<?=$page->title?>'/>
+        <meta property='og:url' content='<?=$page->canonical?>'/>
+        <meta property='og:description' content='<?=$page->description?>'/>
+        <meta property='og:image' content='<?=$page->icon?>'/>
+        <meta property='og:site_name' content='<?=$page->name?>'/>
+        <meta property='og:type' content='website'/>
+        <meta property='og:locale' content='<?=$page->lang?>'/>
+        <meta name='twitter:card' content='summary'/>
+        <meta name='twitter:title' content='<?=$page->title?>'/>
+        <meta name='twitter:description' content='<?=$page->description?>'/>
+        <meta name='twitter:image' content='<?=$page->icon?>'/>
+        <meta name='twitter:url' content='<?=$page->canonical?>'/>
+        <meta name='robots' content='index follow'/>
+    </head>
+    <body>
+<?php
+        include $path["inc"] . "header.php";
+?>
+        <main>
+<?php
+            foreach($page->help as $key=>$help) {
+?>
+                <section id='<?=$key?>' class='help'>
+                    <h3 class='pointer' onClick='toggleHelp("<?=$key?>");'>
+                        <img class='slider' src='<?=$static["layout"]?>control/slid_r.svg' alt='>'/>
+                        <?=$help["title"]?>
+                    </h3>
+                    <p>
+                        <?=$help["text"]?>
+                    </p>
+                </section>
+<?php
+            }
+?>
+        </main>
+<?php
+        include $path["inc"] . "footer.php";
+?>
+    </body>
+</html>

+ 102 - 0
application/view/home.php

@@ -0,0 +1,102 @@
+<!DOCTYPE html>
+<html lang='<?=$page->lang?>'>
+    <head>
+        <meta content='text/html; charset=utf-8' http-equiv='content-type'/>
+        <meta charset='utf-8'/>
+        <meta name='viewport' content='width=device-width, initial-scale=1, maximum-scale=1, minimum-scale=1'/>
+        <title><?=$page->title?></title>
+        <link rel='shortcut icon' href='<?=$page->favicon?>'/>
+        <!-- CSS files -->
+        <link rel='stylesheet' type='text/css' href='<?=$static["css"]?>ui.css'/>
+        <link rel='stylesheet' type='text/css' href='<?=$static["css"]?>home.css'/>
+        <!-- Script files -->
+        <script type="text/javascript" src="<?=$static["js"]?>ui.js"></script>
+        <!-- Meta tags -->
+        <link rel='canonical' href='<?=$page->canonical?>'/>
+        <link rel='author' href='<?=$page->author?>'/>
+        <link rel='publisher' href='<?=$page->author?>'/>
+        <meta name='description' content='<?=$page->description?>'/>
+        <meta property='og:title' content='<?=$page->title?>'/>
+        <meta property='og:url' content='<?=$page->canonical?>'/>
+        <meta property='og:description' content='<?=$page->description?>'/>
+        <meta property='og:image' content='<?=$page->icon?>'/>
+        <meta property='og:site_name' content='<?=$page->name?>'/>
+        <meta property='og:type' content='website'/>
+        <meta property='og:locale' content='<?=$page->lang?>'/>
+        <meta name='twitter:card' content='summary'/>
+        <meta name='twitter:title' content='<?=$page->title?>'/>
+        <meta name='twitter:description' content='<?=$page->description?>'/>
+        <meta name='twitter:image' content='<?=$page->icon?>'/>
+        <meta name='twitter:url' content='<?=$page->canonical?>'/>
+        <meta name='robots' content='index follow'/>
+    </head>
+    <body>
+<?php
+        include $path["inc"] . "header.php";
+?>
+        <main>
+            <section id='profile'>
+                <h3>
+                    <?=$page->name?>
+                </h3>
+                <!-- TODO: Profile form model -->
+                <article>
+                    <img id='profile_image' srcset='<?=srcset("profile/profile.png")?>' src='<?=$static["content"]?>profile/x400/profile.png' alt='<?=text($page, "USER_NAME");?>' title='<?=text($page, "USER_NAME");?>' />
+                    <div id='profile_content'>
+                        <h4 id='tagline'><?=text($page, "USER_TAGLINE");?></h4>
+                        <p id='bio'><?=text($page, "USER_BIO");?></p>
+                    </div>
+                    <div class='buttons'>
+                        <a class='a_button' href='<?=$base_url?>/profile/'>
+                            <?=text($page, "INDEX_PROFILE_MORE");?>
+                        </a>
+                    </div>
+                </article>
+            </section>
+            <section id='projects'>
+                <h3>
+                    <?=text($page, "INDEX_PROJECTS");?>
+                </h3>
+<?php
+            foreach ($page->project as $project){
+?>
+                <article class='project'>
+                    <table>
+                        <tr>
+<?php
+                            if (strlen($project->logo) > 0){
+?>
+                                <td>
+                                    <a href='<?=$base_url?>/project/<?=$project->permalink?>'>
+                                        <img class='project_image' alt='<?=text($page, $project->title)?>' title='<?=text($page, $project->title)?>' srcset='<?=srcset("project/" . $project->logo)?>' src='<?=$static["content"]?>project/x200/<?=$project->logo?>'/>
+                                    </a>
+                                </td>
+<?php
+                            }
+?>
+                            <td class='project_details'>
+                                <a href='<?=$base_url?>/project/<?=$project->permalink?>'>
+                                    <h4 class='project_name'><?=$project->title?></h4>
+                                </a>
+                                <span>
+                                    <?=$project->header?>
+                                </span>
+                            </td>
+                        </tr>
+                    </table>
+                </article>
+<?php
+                }
+?>
+                <div class='buttons'>
+                    <a class='a_button' href='<?=$base_url?>/project/'>
+                        <?=text($page, "INDEX_PROJECTS_ALL");?>
+                    </a>
+                </div>
+            </section>
+        </main>
+<?php
+        include $path["inc"] . "footer.php";
+?>
+    </body>
+</html>

+ 48 - 0
application/view/inc/footer.php

@@ -0,0 +1,48 @@
+<footer>
+    <hr id='footer_separator'/>
+    <br/>
+    <table id='footer_table'>
+        <tr>
+            <td id='footer_left'>
+                <span id='footer_follow' class='desktop'>
+                    <?=text($page, "FOOTER_FOLLOW");?>
+                </span>
+                <a target='_blank' title='eMail' href='mailto:i@inigovalentin.com'>
+                    <img class='footer_social_icon' src='<?=$static["layout"]?>social/email.svg' alt='eMail' title='eMail'/>
+                </a>
+                <a target='_blank' title='Telegram' href='https://telegram.me/InigoValentin'>
+                    <img class='footer_social_icon' src='<?=$static["layout"]?>social/telegram.svg' alt='Telegram' title='Telegram'/>
+                </a>
+                <a target='_blank' title='Github' href='https://github.com/InigoValentin'>
+                    <img class='footer_social_icon' src='<?=$static["layout"]?>social/github.svg' alt='Github' title='Github'/>
+                </a>
+                <a target='_blank' title='LinkedIn' href='https://www.linkedin.com/in/ivalentin'>
+                    <img class='footer_social_icon' src='<?=$static["layout"]?>social/linkedin.svg' alt='LinkedIn' title='LinkedIn'/>
+                </a>
+            </td>
+            <td id='footer_center'>
+                <?=str_replace("#YEAR#", date("Y"), text($page, "FOOTER_COPY"));?>
+            </td>
+            <td id='footer_right'>
+                <a id='footer_help' href='<?=$base_url?>/help/'>
+                    <?=text($page, "FOOTER_HELP");?>
+                </a>
+                <br/><br/>
+<?php
+                foreach ($page->available_langs as $lang){
+                    $uri = $_SERVER["REQUEST_URI"];
+                    if (substr($uri, 3, 1) == '/'){
+                        $uri = substr($uri, 3);
+                    }
+                    $dest = $static_url . "/" . $lang->code . $uri;
+?>
+                    <a class='lang' href='<?=$dest?>'>
+                        <img src='<?=$static["layout"]?>lang/<?=$lang->code?>.svg' alt='<?=$lang->name?>' title='<?=$lang->name?>'/>
+                    </a>
+<?php
+                }
+?>
+            </td>
+        </tr>
+    </table>
+</footer>

+ 20 - 0
application/view/inc/header.php

@@ -0,0 +1,20 @@
+<?php global $static?>
+<header>
+    <div id='logo'>
+        inigoValentin
+    </div>
+    <nav>
+        <a href='<?=$base_url?>/'>
+            <img src='<?=$static["layout"]?>icon/home.svg'/>
+            <?=text($page, "SECTION_HOME")?>
+        </a>
+        <a href='<?=$base_url?>/profile/'/>
+            <img src='<?=$static["layout"]?>icon/profile.svg'/>
+            <?=text($page, "SECTION_ME")?>
+        </a>
+        <a href='<?=$base_url?>/project/'>
+            <img src='<?=$static["layout"]?>icon/project.svg'/>
+            <?=text($page, "SECTION_PROJECTS")?>
+        </a>
+    </nav>
+</header>

+ 92 - 0
application/view/profile.php

@@ -0,0 +1,92 @@
+<!DOCTYPE html>
+<html lang='<?=$page->lang?>'>
+    <head>
+        <meta content='text/html; charset=utf-8' http-equiv='content-type'/>
+        <meta charset='utf-8'/>
+        <meta name='viewport' content='width=device-width, initial-scale=1, maximum-scale=1, minimum-scale=1'/>
+        <title><?=$page->title?></title>
+        <link rel='shortcut icon' href='<?=$page->favicon?>'/>
+        <!-- CSS files -->
+        <link rel='stylesheet' type='text/css' href='<?=$static["css"]?>ui.css'/>
+        <link rel='stylesheet' type='text/css' href='<?=$static["css"]?>profile.css'/>
+        <!-- Script files -->
+        <script type="text/javascript" src="<?=$static["js"]?>ui.js"></script>
+        <!-- Meta tags -->
+        <link rel='canonical' href='<?=$page->canonical?>'/>
+        <link rel='author' href='<?=$page->author?>'/>
+        <link rel='publisher' href='<?=$page->author?>'/>
+        <meta name='description' content='<?=$page->description?>'/>
+        <meta property='og:title' content='<?=$page->title?>'/>
+        <meta property='og:url' content='<?=$page->canonical?>'/>
+        <meta property='og:description' content='<?=$page->description?>'/>
+        <meta property='og:image' content='<?=$page->icon?>'/>
+        <meta property='og:site_name' content='<?=$page->name?>'/>
+        <meta property='og:type' content='website'/>
+        <meta property='og:locale' content='<?=$page->lang?>'/>
+        <meta name='twitter:card' content='summary'/>
+        <meta name='twitter:title' content='<?=$page->title?>'/>
+        <meta name='twitter:description' content='<?=$page->description?>'/>
+        <meta name='twitter:image' content='<?=$page->icon?>'/>
+        <meta name='twitter:url' content='<?=$page->canonical?>'/>
+        <meta name='robots' content='index follow'/>
+    </head>
+    <body>
+<?php
+        include $path["inc"] . "header.php";
+?>
+        <main>
+            <section id='info'>
+                <h3>
+                    <?=text($page, "USER_NAME");?>
+                </h3>
+                <img id='profile_image' srcset='<?=srcset("profile/profile.png")?>' src='<?=$static["content"]?>profile/x400/profile.png' alt='<?=text($page, "USER_NAME");?>' title='<?=text($page, "USER_NAME");?>' />
+                <div id='social'>
+                    <a target='_blank' title='eMail' href='mailto:i@inigovalentin.com'>
+                        <img class='footer_social_icon' src='<?=$static["layout"]?>social/email.svg' alt='eMail' title='eMail'/>
+                    </a>
+                    <a target='_blank' title='Telegram' href='https://telegram.me/InigoValentin'>
+                        <img class='footer_social_icon' src='<?=$static["layout"]?>social/telegram.svg' alt='Telegram' title='Telegram'/>
+                    </a>
+                    <a target='_blank' title='Github' href='https://github.com/InigoValentin'>
+                        <img class='footer_social_icon' src='<?=$static["layout"]?>social/github.svg' alt='Github' title='Github'/>
+                    </a>
+                    <a target='_blank' title='LinkedIn' href='https://www.linkedin.com/in/ivalentin'>
+                        <img class='footer_social_icon' src='<?=$static["layout"]?>social/linkedin.svg' alt='LinkedIn' title='LinkedIn'/>
+                    </a>
+                </div>
+            </section>
+            <section id='about'>
+                <h3>
+                    <?=text($page, "PROFILE_DESCRIPTION");?>
+                </h3>
+                <p>
+                    <?=text($page, "USER_TEXT");?>
+                </p>
+                <div id='cv_download'>
+                    <a class='a_button' target='_blank' href='<?=$static["cv"] . $page->cv[0]->file?>'>
+                        <?=text($page, "PROFILE_CV");?>
+                    </a>
+                    <details>
+                        <summary class='pointer'><?=text($page, "PROFILE_CV_LANG");?></summary>
+                        <ul>
+<?php
+                            for ($i = 1; $i < count($page->cv); $i ++) {
+?>
+                                <li>
+                                    <a target='_blank' href='<?=$static["cv"] . $page->cv[$i]->file?>'>
+                                        <?=$page->cv[$i]->lang->name?>
+                                    </a>
+                                </li>
+<?php
+                            }
+?>
+                        </ul>
+                    </details>
+                </div>
+            </section>
+        </main>
+<?php
+        include $path["inc"] . "footer.php";
+?>
+    </body>
+</html>

+ 136 - 0
application/view/project.php

@@ -0,0 +1,136 @@
+<!DOCTYPE html>
+<html lang='<?=$page->lang?>'>
+    <head>
+        <meta content='text/html; charset=utf-8' http-equiv='content-type'/>
+        <meta charset='utf-8'/>
+        <meta name='viewport' content='width=device-width, initial-scale=1, maximum-scale=1, minimum-scale=1'/>
+        <title><?=$page->title?></title>
+        <link rel='shortcut icon' href='<?=$page->favicon?>'/>
+        <!-- CSS files -->
+        <link rel='stylesheet' type='text/css' href='<?=$static["css"]?>ui.css'/>
+        <link rel='stylesheet' type='text/css' href='<?=$static["css"]?>project.css'/>
+        <!-- Script files -->
+        <script type="text/javascript" src="<?=$static["js"]?>ui.js"></script>
+        <script type="text/javascript" src="<?=$static["js"]?>project.js"></script>
+        <!-- Meta tags -->
+        <link rel='canonical' href='<?=$page->canonical?>'/>
+        <link rel='author' href='<?=$page->author?>'/>
+        <link rel='publisher' href='<?=$page->author?>'/>
+        <meta name='description' content='<?=$page->description?>'/>
+        <meta property='og:title' content='<?=$page->title?>'/>
+        <meta property='og:url' content='<?=$page->canonical?>'/>
+        <meta property='og:description' content='<?=$page->description?>'/>
+        <meta property='og:image' content='<?=$page->icon?>'/>
+        <meta property='og:site_name' content='<?=$page->name?>'/>
+        <meta property='og:type' content='website'/>
+        <meta property='og:locale' content='<?=$page->lang?>'/>
+        <meta name='twitter:card' content='summary'/>
+        <meta name='twitter:title' content='<?=$page->title?>'/>
+        <meta name='twitter:description' content='<?=$page->description?>'/>
+        <meta name='twitter:image' content='<?=$page->icon?>'/>
+        <meta name='twitter:url' content='<?=$page->canonical?>'/>
+        <meta name='robots' content='index follow'/>
+    </head>
+    <body>
+<?php
+        include $path["inc"] . "header.php";
+?>
+        <main>
+            <section>
+                <h3>
+                    <?=$page->project->title?>
+                </h3>
+                <article>
+                    <div id='info_summary'>
+                        <h4>
+                            <?=$page->project->header?>
+                        </h4>
+                        <p id='text'>
+<?php
+                            if (strlen($page->project->logo) > 0){
+?>
+                                <img id='logo' src='<?=$static["content"]?>project/<?=$page->project->logo?>' title='<?=$page->project->title?>' alt='<?=$page->project->title?>'/>
+<?php
+                            }
+?>
+                            <?=$page->project->text?>
+                        </p>
+                    </div>
+                    <div id='info_details'>
+                        <div id='tags' class='details'>
+<?php
+                            $str_tag = "";
+                            foreach($page->project->tag as $tag){
+                                $str_tag = $str_tag . $tag->tag . ", ";
+                            }
+                            $str_tag = rtrim($str_tag, ", ");
+?>
+                            <?=text($page, "PROJECT_TAGS")?>: <?=$str_tag?>
+                            <hr class='details_separator'/>
+                        </div> <!-- #tags -->
+<?php
+                        if (sizeof($page->project->url) > 0){
+?>
+                            <div id='links' class='details'>
+<?php
+                                foreach($page->project->url as $url){
+                                    if ($url->type->id != "E"){
+?>
+                                        <td>
+                                            <a target='_blank' class='link' href='<?=$url->url?>'>
+                                                <img class='link' title='<?=$url->type->title?>' alt='<?=$url->type->title?>' src='<?=$static["layout"]?>social/<?=$url->type->logo?>'/>
+                                                <?=$url->type->summary?>
+                                            </a>
+                                        </td>
+<?php
+                                    }
+                                }
+?>
+                                <hr class='details_separator'/>
+                            </div> <!-- #links -->
+<?php
+                        }
+?>
+                        <div id='license' class='details'>
+                            <?=text($page, "PROJECT_LICENSE")?>:
+                            <img src='<?=$static["layout"]?>license/<?=$page->project->license->logo?>' title='<?=$page->project->license->id?>' alt='<?=$page->project->license->id?>'/>
+                        </div> <!-- #license -->
+                    </div> <!-- #info_details -->
+                </article>
+<?php
+                foreach($page->project->url as $embed){
+                    if ($embed->type->id == "E"){
+?>
+                        <iframe id='demo' src='<?=$static["demo"]?><?=$embed->url?>' onload='setTimeout(function(){resizeDemo();}, 500);'></iframe>
+<?php
+                    }
+                }
+?>
+<?php
+                if (sizeof($page->project->image) > 0){
+?>
+                    <div id='image_reel'>
+                        <table>
+                            <tr>
+<?php
+                                foreach($page->project->image as $image){
+?>
+                                    <td>
+                                        <img title='<?=$page->project->title?>' alt='<?=$page->project->title?>' src='<?=$static["content"]?>project/<?=$image->image?>'/>
+                                    </td>
+<?php
+                                }
+?>
+                            </tr>
+                        </table>
+                    </div> <!-- #image_reel -->
+<?php
+                }
+?>
+            </section>
+        </main>
+<?php
+        include $path["inc"] . "footer.php";
+?>
+    </body>
+</html>

+ 77 - 0
application/view/projects.php

@@ -0,0 +1,77 @@
+<!DOCTYPE html>
+<html lang='<?=$page->lang?>'>
+    <head>
+        <meta content='text/html; charset=utf-8' http-equiv='content-type'/>
+        <meta charset='utf-8'/>
+        <meta name='viewport' content='width=device-width, initial-scale=1, maximum-scale=1, minimum-scale=1'/>
+        <title><?=$page->title?></title>
+        <link rel='shortcut icon' href='<?=$page->favicon?>'/>
+        <!-- CSS files -->
+        <link rel='stylesheet' type='text/css' href='<?=$static["css"]?>ui.css'/>
+        <link rel='stylesheet' type='text/css' href='<?=$static["css"]?>projects.css'/>
+        <!-- Script files -->
+        <script type="text/javascript" src="<?=$static["js"]?>ui.js"></script>
+        <!-- Meta tags -->
+        <link rel='canonical' href='<?=$page->canonical?>'/>
+        <link rel='author' href='<?=$page->author?>'/>
+        <link rel='publisher' href='<?=$page->author?>'/>
+        <meta name='description' content='<?=$page->description?>'/>
+        <meta property='og:title' content='<?=$page->title?>'/>
+        <meta property='og:url' content='<?=$page->canonical?>'/>
+        <meta property='og:description' content='<?=$page->description?>'/>
+        <meta property='og:image' content='<?=$page->icon?>'/>
+        <meta property='og:site_name' content='<?=$page->name?>'/>
+        <meta property='og:type' content='website'/>
+        <meta property='og:locale' content='<?=$page->lang?>'/>
+        <meta name='twitter:card' content='summary'/>
+        <meta name='twitter:title' content='<?=$page->title?>'/>
+        <meta name='twitter:description' content='<?=$page->description?>'/>
+        <meta name='twitter:image' content='<?=$page->icon?>'/>
+        <meta name='twitter:url' content='<?=$page->canonical?>'/>
+        <meta name='robots' content='index follow'/>
+    </head>
+    <body>
+<?php
+        include $path["inc"] . "header.php";
+?>
+        <main>
+            <section>
+                <h3><?=$page->title?></h3>
+<?php
+                    foreach ($page->project as $project){
+?>
+                    <article class='project'>
+                        <table>
+                            <tr>
+<?php
+                                    if (strlen($project->logo) > 0){
+?>
+                                    <td>
+                                        <a href='<?=$base_url?>/project/<?=$project->permalink?>'>
+                                            <img class='project_image' alt='<?=$project->title?>' title='<?=$project->title?>' src='<?=$static["content"]?>project/<?=$project->logo?>' srcset='<?=srcset("project/" . $project->logo)?>'/>
+                                        </a>
+                                    </td>
+<?php
+                                    }
+?>
+                                <td class='project_details'>
+                                    <a href='<?=$base_url?>/project/<?=$project->permalink?>'>
+                                        <h4 class='project_name'><?=$project->title?></h4>
+                                    </a>
+                                    <span>
+                                        <?=$project->header?>
+                                    </span>
+                                </td>
+                            </tr>
+                        </table>
+                    </article> <!-- .project -->
+<?php
+                    }
+?>
+            </section>
+        </main>
+<?php
+        include $path["inc"] . "footer.php";
+?>
+    </body>
+</html>

+ 0 - 0
www/string/LICENSE_CC-BY-SA_SUMMARY__EN → application/view/string/LICENSE_CC-BY-SA_SUMMARY__EN


+ 0 - 0
www/string/LICENSE_CC-BY-SA_SUMMARY__ES → application/view/string/LICENSE_CC-BY-SA_SUMMARY__ES


+ 0 - 0
www/string/LICENSE_CC-BY-SA_SUMMARY__EU → application/view/string/LICENSE_CC-BY-SA_SUMMARY__EU


+ 0 - 0
www/string/LICENSE_CC-BY-SA__EN → application/view/string/LICENSE_CC-BY-SA__EN


+ 0 - 0
www/string/LICENSE_CC-BY-SA__ES → application/view/string/LICENSE_CC-BY-SA__ES


+ 0 - 0
www/string/LICENSE_CC-BY-SA__EU → application/view/string/LICENSE_CC-BY-SA__EU


+ 0 - 0
www/string/LICENSE_GPLV3_SUMMARY__EN → application/view/string/LICENSE_GPLV3_SUMMARY__EN


+ 0 - 0
www/string/LICENSE_GPLV3_SUMMARY__ES → application/view/string/LICENSE_GPLV3_SUMMARY__ES


+ 0 - 0
www/string/LICENSE_GPLV3_SUMMARY__EU → application/view/string/LICENSE_GPLV3_SUMMARY__EU


+ 0 - 0
www/string/LICENSE_GPLV3__EN → application/view/string/LICENSE_GPLV3__EN


+ 0 - 0
www/string/LICENSE_GPLV3__ES → application/view/string/LICENSE_GPLV3__ES


+ 0 - 0
www/string/LICENSE_GPLV3__EU → application/view/string/LICENSE_GPLV3__EU


+ 87 - 0
public/.htaccess

@@ -0,0 +1,87 @@
+Options -MultiViews
+
+
+#
+# REWRITES
+#
+# Used to: Force https.
+#
+<IfModule mod_rewrite.c>
+	# Force https
+	RewriteCond %{HTTPS} !=on
+	RewriteRule ^/?(.*) https://%{SERVER_NAME}/$1 [R,L]
+</ifModule>
+
+
+#
+# FALLBACKRESOURCE
+#
+# Used to: all pages to index.php
+#
+FallbackResource /index.php
+
+
+#
+# EXPIRES
+#
+# Used to: control the cache times of the different files on the server.
+#
+<IfModule mod_expires.c>
+        ExpiresActive on
+        ExpiresDefault "access plus 2 days"
+        ExpiresByType application/javascript "access plus 6 days"
+        ExpiresByType image/x-ico "access plus 12 days"
+        ExpiresByType image/jpg "access plus 12 days"
+        ExpiresByType image/jpeg "access plus 12 days"
+        ExpiresByType image/gif "access plus 12 days"
+        ExpiresByType image/png "access plus 12 days"
+        ExpiresByType video/mkv "access plus 12 days"
+        ExpiresByType text/css "access plus 6 days"
+        ExpiresByType text/plain "access plus 6 days"
+</IfModule>
+
+
+#
+# HEADERS
+#
+# Used to: control the cache times of the different files on the client.
+#
+<ifModule mod_headers.c>
+	<filesMatch "\.(ico|jpe?g|png|gif|swf|svg)$">
+		Header set Cache-Control "max-age=86400, public, must-revalidate"
+	</filesMatch>
+	<filesMatch "\.(css)$">
+		Header set Cache-Control "max-age=86400, public, must-revalidate"
+	</filesMatch>
+	<filesMatch "\.(js)$">
+		Header set Cache-Control "max-age=86400, private, must-revalidate"
+	</filesMatch>
+	<filesMatch "\.(x?html?|php)$">
+		Header set Cache-Control "max-age=86400, private, must-revalidate"
+	</filesMatch>
+</ifModule>
+
+AddType image/svg+xml svg svgz
+<ifModule mod_deflate.c>
+	AddOutputFilterByType DEFLATE text/html text/xml text/css text/plain
+	AddOutputFilterByType DEFLATE image/x-icon
+	AddOutputFilterByType DEFLATE image/svg+xml application/xhtml+xml application/xml
+	AddOutputFilterByType DEFLATE application/rdf+xml application/rss+xml application/atom+xml
+	AddOutputFilterByType DEFLATE text/javascript application/javascript application/x-javascript application/json
+	AddOutputFilterByType DEFLATE application/x-font-ttf application/x-font-otf
+	AddOutputFilterByType DEFLATE font/truetype font/opentype
+</ifModule>
+
+
+#
+# ERROR
+#
+# Used to: redirect to nice error pages.
+#
+ErrorDocument 400 /error.php
+ErrorDocument 401 /error.php
+ErrorDocument 403 /error.php
+ErrorDocument 404 /error.php
+ErrorDocument 500 /error.php
+
+

+ 50 - 0
public/css/error.css

@@ -0,0 +1,50 @@
+section{
+    margin: auto;
+    max-width: 60em;
+    border: 0.1em solid #330000;
+}
+
+section h3{
+    color: #ffffff;
+    background-color: #ef3939;
+    border-bottom: 0.1em solid #330000;
+}
+
+section div#left{
+    display: inline-block;
+    vertical-align: middle;
+    width: 15em;
+    height: 6em;
+    margin: 2em;
+    padding-top: 2em;
+    background-color: #ef3939;
+    color: #ffffff;
+    font-weight: bold;
+    border: 0.3em solid #330000;
+    border-radius: 0.5em;
+    text-align: center;
+    text-shadow: 0 0 0.1em #000000;
+    box-shadow: 0 0 0.2em #ef3939;
+}
+section div#left p{
+    display: inline-block;
+    vertical-align: middle;
+    font-weight: bold;
+    font-size: 150%;
+    margin: 0.2em;
+}
+section div#left p#code{
+    font-size: 300%;
+}
+section div#left p span{
+    display: block;
+}
+
+section div#right{
+    display: inline-block;
+    vertical-align: middle;
+    margin: 1.5em 1em 1.5em 0;
+    padding-left: 2em;
+    max-width: 35em;
+    border-left: 0.2em solid #444444
+}

+ 29 - 0
public/css/help.css

@@ -0,0 +1,29 @@
+section{
+    padding: 0;
+    max-height: 2.8em;
+    overflow-y: hidden;
+    border-bottom-right-radius: 0.5em;
+    border-bottom-left-radius: 0.5em;
+    transition: all .5s ease-in-out;
+}
+section.selected{
+    max-height: 15em;
+    border-bottom-right-radius: 1.5em;
+    border-bottom-left-radius: 1.5em;
+}
+section h3{
+    margin: 0;
+}
+section h3 img.slider{
+    width: 1em;
+    height: 1em;
+    transition: all .3s ease-in-out;
+    float: left;
+    margin-left: -2em;
+}
+section.selected h3 img.slider{
+    transform: rotate(90deg);
+}
+section p{
+    margin: 1em 2em;
+}

+ 64 - 0
public/css/home.css

@@ -0,0 +1,64 @@
+section#profile{
+    display: inline-block;
+    vertical-align: top;
+    width: 40%;
+    margin:  auto 2em auto auto;
+}
+@media screen and (max-width : 800px){
+    section#profile{
+        display: block;
+        width: 90%;
+        margin: auto;
+    }
+}
+section#profile article img#profile_image{
+    display: inline-block;
+    vertical-align: top;
+    width: 25%;
+    height: 25%;
+    border: 0.2em solid #446644;
+    border-radius: 1em 5em;
+}
+section#profile article div#profile_content{
+    width: 60%;
+    padding: 0.5em 1.5em;
+    display: inline-block;
+    vertical-align: top;
+}
+section#projects{
+    display: inline-block;
+    vertical-align: top;
+    width: 50%;
+    margin: 0;
+}
+@media screen and (max-width : 800px){
+    section#projects{
+        display: block;
+        width: 90%;
+        margin: 2em auto auto auto;
+    }
+}
+section#projects article.project img.project_image{
+    padding: 0.5em;
+    width: 5em;
+    height: 5em;
+    background-color: #cccccc;
+    border: 0.1em solid #60ae29;
+    box-shadow: inset 0 0 0.5em #00220077;
+    border-radius: 1em;
+}
+@media screen and (max-width : 800px){
+	section#projects article.project img.project_image{
+	    padding: 0.9em;
+	    width: 10em;
+	    height: 10em;
+	}
+}
+section#projects article.project td.project_details{
+    vertical-align: top;
+    padding-left: 1em;
+}
+section div.buttons{
+    text-align: right;
+    padding: 0.5em 2em 0 2em;
+}

+ 110 - 0
public/css/profile.css

@@ -0,0 +1,110 @@
+main{
+    text-align: center;
+}
+
+section#info{
+    text-align: left;
+    display: inline-block;
+    vertical-align: top;
+    width: 30%;
+    margin: auto 2em auto auto;
+}
+@media screen and (max-width : 800px){
+	section#info{
+	    width: 90%;
+	    margin: auto;
+	    text-align: center;
+	}
+	section#info h3{
+	    text-align: left;
+	}
+}
+
+section#info img#profile_image{
+    display: block;
+    margin: 0.5em auto;
+    max-width: 10em;
+    max-height: 10em;
+    border-radius: 1.2em;
+    border: 0.3em solid #000000;
+}
+@media screen and (max-width : 800px){
+	section#info img#profile_image{
+	    display: inline-block;
+	    vertical-align: middle;
+	    width: 30%;
+	    max-width: 12em;
+	    max-height: 12em;
+	}
+}
+section#info div#social{
+    text-align: center;
+    margin: auto;
+}
+@media screen and (max-width : 800px){
+	section#info div#social{
+	    display: inline-block;
+	    vertical-align: middle;
+	    width: 40%;
+	    margin: auto;
+	}
+}
+section#info div#social img{
+    width: 60px;
+    height: 60px;
+    margin: 10px;
+    vertical-align: middle;
+    background-color: #ffffff;
+    border: 0.2em solid #ffffff;
+    border-radius: 0.4em;
+    box-shadow: 0 0 0.3em #003300;
+    transition: all .2s ease-in-out;
+}
+section#info div#social img:hover{
+    width: 70px;
+    height: 70px;
+    margin: 5px;
+    border-radius: 50%;
+    box-shadow: 0 0 0.5em #55aa55;
+}
+
+section#about{
+    text-align: left;
+    display: inline-block;
+    vertical-align: top;
+    width: 50%;
+}
+@media screen and (max-width : 800px){
+	section#about{
+	    width: 90%;
+	    margin: 2em auto auto auto;
+	}
+}
+section#about p{
+    font-style: italic;
+    text-indent: 1em;
+    margin: 2em 4em;
+    color: #335333;
+}
+section#about div#cv_download{
+    text-align: center;
+}
+section#about div#cv_download a.a_button{
+    display: inline-block;
+    vertical-align: top;
+    margin: auto 3em 1.5em auto;
+}
+section#about div#cv_download details{
+    display: inline-block;
+    vertical-align: top;
+    font-style: italic;
+    margin-top: 0.5em;
+}
+section#about div#cv_download details summary{
+    color: #777777;
+    font-size: 90%;
+}
+section#about div#cv_download details ul{
+    text-align: left;
+    margin: 0.1em;
+}

+ 124 - 0
public/css/project.css

@@ -0,0 +1,124 @@
+section{
+	text-align: center;
+}
+section h3{
+	text-align: left;
+}
+div#info_summary{
+    display: inline-block;
+    width: 65%;
+    margin: 0;
+    vertical-align: top;
+    padding: 1em 3em;
+    min-height: 13em;
+    text-align: left;
+}
+@media screen and (max-width : 800px){
+	div#info_summary{
+	    display: block;
+	    width: 95%;
+	    margin: 1em auto;
+	    padding: 1em 2em;
+	}
+}
+
+div#info_summary h4{
+    margin: 1em 2em 0 2em;
+    font-style: italic;
+}
+
+div#info_summary p#text{
+    margin: 2em;
+}
+
+div#info_summary p#text img#logo{
+    padding: 0.5em;
+    width: 7em;
+    height: 7em;
+    background-color: #cccccc;
+    border: 0.1em solid #60ae29;
+    box-shadow: inset 0 0 0.5em #00220077;
+    border-radius: 1em;
+    float: left;
+    margin: 0 2em 1em 0;
+}
+
+div#info_details{
+    display: inline-block;
+    width: 22%;
+    vertical-align: top;
+    margin: 0;
+    border-left: 0.1em solid #aacaaa;
+    border-right: 0.1em solid #aacaaa;
+    background: linear-gradient(to bottom, #e5f0e500 0%, #e5f0e5ff 20%, #e5f0e5ff 80%, #e5f0e500 100%);
+    padding: 1em;
+    text-align: left;
+}
+@media screen and (max-width : 800px){
+	div#info_details{
+		text-align: center;
+	    display: block;
+	    width: 90%;
+	    margin: 1em auto;
+	    border-top: 0.1em solid #aacaaa;
+	    border-bottom: 0.1em solid #aacaaa;
+	    border-left: 0;
+	    border-right: 0;
+	    background: linear-gradient(to right, #e5f0e500 0%, #e5f0e5ff 20%, #e5f0e5ff 80%, #e5f0e500 100%);
+	    padding: 1em;
+	}
+}
+div#info_details div.details{
+    margin: 0.5em 1.5em 0.5em 1.5em;
+}
+
+div#info_details div.details hr.details_separator{
+    margin: 1em -0.5em 0.5em -0.5em;
+}
+
+div#info_details div#tags{
+    font-style: italic;
+    font-size: 90%;
+}
+
+div#info_details div#links a.link{
+    display: block;
+    margin-bottom: 1em;
+    font-size: 70%;
+}
+
+div#info_details div#links a.link img.link{
+    vertical-align: middle;
+    width: 1.5em;
+    height: 1.5em;
+}
+
+div#info_details div#license img{
+    max-width: 8em;
+    max-height: 2em;
+    vertical-align: bottom;
+}
+
+iframe#demo{
+    margin: auto;
+    border: 0.2emsolid #000000;
+    border-radius: 0.5em;
+}
+
+div#image_reel{
+    margin: 2em auto 1em auto;
+    width: 80%;
+    overflow-x: scroll;
+    border: 0.1em solid #000000;
+    background-color: #aaaaaa;
+    text-align: center;
+}
+
+div#image_reel table tr td img{
+    max-height: 7em;
+    max-width: 7em;
+    border: 0.2em solid #777777;
+    border-radius: 0.2em;
+    background-color: #ffffff;
+    margin: 0.5em;
+}

+ 51 - 0
public/css/projects.css

@@ -0,0 +1,51 @@
+/* Projects page */
+section{
+    width: 90%;
+    margin: auto;
+    text-align: center;
+}
+section h3{
+    text-align: left;
+}
+
+section article.project{
+    position: relative;
+    display: inline-block;
+    vertical-align: top;
+    width: 40%;
+    margin: 2em 3%;
+    padding: 1em;
+    text-align: left;
+    border-left: 0.1em solid #aacaaa;
+    border-right: 0.1em solid #aacaaa;
+    background: linear-gradient(to bottom, #e5f0e500 0%, #e5f0e5ff 20%, #e5f0e5ff 80%, #e5f0e500 100%);
+}
+@media screen and (max-width : 800px){
+	section article.project{
+	    width: 90%;
+	    margin: 1em auto;
+	}
+}
+
+section article.project table{
+    width: 100%;
+}
+
+section article.project table img.project_image{
+    padding: 0.5em;
+    width: 7em;
+    height: 7em;
+    background-color: #cccccc;
+    border: 0.1em solid #60ae29;
+    box-shadow: inset 0 0 0.5em #00220077;
+    border-radius: 1em;
+}
+
+div#project_list article.project table td.project_details{
+    padding-left: 1.5em;
+}
+
+div#project_list article.project table span.project_tagline{
+    font-size: 80%;
+    font-style: italic;
+}

+ 254 - 159
www/css/ui.css → public/css/ui.css

@@ -1,62 +1,81 @@
-/**********************************
- * Fonts used across the page     *
- **********************************/
-
-/* Font */
+/* Website fonts. */
 @font-face {
     font-family: 'Nunito'; 
     src:  url('/fonts/Nunito-Regular.ttf'); 
 }
+@font-face {
+    font-family: 'Latin'; 
+    src:  url('/fonts/Latin-Modern-Mono-Light-Bold.otf');
+}
 
-/**********************************
- * Elements that are solely for   *
- * the desktop or mobile          *
- * version.                       *
- **********************************/
-
+/* Elements to be shown only in large screens. */
 .desktop{
     display: initial;
 }
+@media screen and (max-width : 800px){
+    .desktop{
+        display: none;
+    }
+}
 
+/* Elements to be shown only in small screens. */
 .mobile{
     display: none;
 }
+@media screen and (max-width : 800px){
+    .mobile{
+        display: initial !important;
+    }
+}
 
-/**********************************
- * Styles to be applied across    *
- * all the site for all the       *
- * elements of it's type          *
- **********************************/
+/* Styles for the body of the page. */
+html {
+    height: 100%;
+}
 
-/* Styles for the body of the page */
 body{
-    background-color: #111111;
+    height: 100%;
+    padding: 0;
+    margin: 0;
+    background-color: #000000;
+    font-size: 90%;
+    min-height: 100vh;
+	flex-direction: column;
+	display: flex;
+}
+@media screen and (max-width : 800px){
+	body{
+	    font-size: 100%;
+	}
 }
 
-/* Style for all links */
+/* Style for all links. */
 a{
     color: #555555;
     text-shadow: 0 0 0.5em #7777ff;
     text-decoration: none;
 }
 
+/* Styles for elements that look and act as links. */
 .fake_a{
     color: #555555;
     text-shadow: 0 0 0.5em #7777ff;
     text-decoration: none;
+    cursor: pointer;
 }
 
 
-/* Elements fith bold font */
+/* Bold elements. */
 .bold{
     font-weight: bold;
 }
 
+/* Elements that look and act as buttons or links.*/
 .pointer {
     cursor: pointer;
 }
 
-/* Hidden elements */
+/* Hidden elements. */
 .hidden{
     display: none;
 }
@@ -81,153 +100,152 @@ div#cover{
 }
 
 
-/**********************************
- * Toolbar style                  *
- **********************************/
-
-/* Container for the header */
-div#header_parent{
+header{
+    background-color: #000000;
     width: 100%;
     text-align: center;
 }
 
-/* The actual header */
-nav#header{
-    text-align: center;
-    height: 3.4em;
-    display: inline;
-    z-index: 300;
-    margin-left: auto;
-    margin-right: auto;
-    font-weight: bold;
-    font-size: 110%;
+header div#logo{
+    color: #ffffff;
+    font-size: 4em;
+    font-family: 'Latin';
 }
-
-/* Dummy span to use as vertical separator between links */
-nav#header span.link_separator{
-    border-left: 0.077em solid rgba(200, 200, 200, .5);
+header nav{
+	width: 100%;
 }
-
-/* All the links in the bar. Contains the text and the icon */
-nav#header a{
-    margin: auto;
+header nav a{
+    font-size: 1.5em;
+    margin: 0.5em;
+    color: #ffffff;
     text-decoration: none;
-    color: #cccccc;
-    text-shadow: 0 0 0.5em #000000;
-}
-
-/* Contains everithing inside each link (direct and only child of a.header_link) */
-nav#header span.header_container {
-    margin: auto;
-    text-align: center;
-    min-width: 3.125em;
-    margin-right: 0.43em;
-    margin-left: 0.43em;
-    padding-left: 0.625em;
-    padding-top: 0.375em;
-    padding-bottom: 0.375em;
-    padding-right: 2.19em;
-    display: inline-block;
     position: relative;
-    transition: all .3s ease-in-out;
-    box-shadow: 0 0 0.063em #ffffff00;
-    border: 0.06em solid #ffffff00;
-    border-radius: 0.5em;
-}
-
-nav#header span.header_container:hover {
-    border: 0.06em solid #ffffff88;
-    background-color: #ffffff33;
-}
-
-/* Contains the icon for each entry */
-nav#header span.header_icon_container{
-    border-bottom: 0.063em solid #999999;
-    padding-bottom: 0.313em;
 }
-
-/* Icon for each entry of the header */
-nav#header img.header_icon{
-    opacity: 0.3;
-    width: 1.563em;
-    height: 1.563em;
-    vertical-align: middle;
-    transition: opacity 0.4s ease-in-out;
-}
-nav#header span.header_container:hover img.header_icon{
-    opacity: 1;
+header nav a:hover{
+    color: #ffffff;
 }
-
-
-/* A line separating the header from the rest of the page */
-hr#header_separator{
-    width: 70%;
+header nav a:before {
+    content: " ";
+    position: absolute;
+    width: 100%;
+    height: 0.1em;
+    bottom: -0.1em;
+    left: 0;
+    background-color: #ffffff;
+    visibility: hidden;
+    transform: scaleX(0);
+    transition: all 0.3s ease-in-out 0s;
+}
+header nav a:hover:before {
+    visibility: visible;
+    transform: scaleX(1);
+}
+header nav a img{
+    height: 1.5em;
+    vertical-align: bottom;
+}
+@media screen and (max-width : 800px){
+    header nav{
+        overflow: hidden;
+        white-space: nowrap;
+    }
+    header nav a{
+        display: inline-block;
+        width: 32%;
+        margin: 0;
+        padding: 0.5em 0;
+        text-align: center;
+        color: #ffffff;
+        text-decoration: none;
+        border: 0.1em solid #aaaaaa;
+        background-color: #222222;
+    }
+    header nav a img{
+        height: 1.1em;
+        vertical-align: middle;
+    }
 }
 
 
-
-/**********************************
- * Footer style                   *
- **********************************/
-
 /* The actual footer */
-div#footer{
-    display: inline-block;
+footer{
+    background-color: #000000;
     font-size: 80%;
     text-align: center;
-    height: 3.438em;
+    height: 3.5em;
     margin-left: auto;
     margin-right: auto;
-    margin-top: 3.125em;
-    margin-bottom: 3.125em;
+    margin-top: 3em;
+    margin-bottom: 2em;
     color: #dddddd;
+    bottom: 0;
+    left: 0;
+    padding: 1em 2em 3em 2em;
 }
 
 /* A table containing all the elements in the footer */
-div#footer table#footer_table{
+footer table#footer_table{
     margin-left: auto;
     margin-right: auto;
     width: 80%;
     table-layout: fixed;
 }
+@media screen and (max-width : 800px){
+    footer table#footer_table{
+        width: 95%;
+    }
+}
 
-/* An horizontal line separating the page contents from the footer */
-div#footer hr#footer_separator{
-/*  margin-top: 3.125em; */
+/* An horizontal line separating the page contents from the footer. */
+footer table#footer_table hr#footer_separator{
     border: 0;
     background-color: #444444;
     height: 0.1em;
     width: 70%;
 }
 
-/* Left area of the footer */
-div#footer td#footer_left{
+/* Left area of the footer. */
+footer table#footer_table td#footer_left{
     width: 33%;
     text-align: center;
 }
 
+/* Social label. */
+footer table#footer_table td#footer_left span#footer_follow{
+    display: block;
+    margin: 0 0 1em 0;
+}
+
+/* Icons for social media */
+footer table#footer_table td#footer_left img.footer_social_icon{
+    width: 2em;
+    margin: 0.2em;
+    vertical-align: middle;
+    background-color: #ffffff;
+    border: 0.1em solid #ffffff;
+    border-radius: 0.3em;
+}
+
 /* Middle area of the footer */
-div#footer td#footer_center{
+footer table#footer_table td#footer_center{
     width: 33%;
     text-align: center;
 }
 
 /* Right area of the footer */
-div#footer td#footer_right{
+footer table#footer_table td#footer_right{
     width: 33%;
     text-align: center;
 }
 
-/* Icons for social media */
-div#footer img.footer_social_icon{
-    width: 1.875em;
-    vertical-align: middle;
-    background-color: #ffffff;
-    border: 0.1em solid #ffffff;
-    border-radius: 0.3em;
+/* Help link. */
+footer table#footer_table td#footer_right span#footer_help{
+    display: block;
+    margin: 0 0 1em 0;
 }
 
-div#footer a.lang img{
+/* Language flags. */
+footer table#footer_table td#footer_right a.lang img{
     height: 1em;
     margin: 0.5em;
     border-radius: 0.2em;
@@ -236,59 +254,86 @@ div#footer a.lang img{
     box-shadow: 0 0 0.7em #dde;
     transition: all .3s ease-in-out;
 }
-
-div#footer a.lang img:hover{
+footer table#footer_table td#footer_right a.lang img:hover{
     box-shadow: 0 0 1em #111;
 }
-
-
-
-
-/**********************************
- * Styles for the elements that   *
- * compose the basic strucure of  *
- * the site.                      *
- **********************************/
-
-/* The content is everything between the header and the footer */
-div#content{
-    position: relative;
+@media screen and (max-width : 800px){
+    footer table#footer_table td#footer_right a.lang img{
+        height: 1.5em;
+        margin: 0.2em;
+        border-radius: 0.1em;
+        border: 0.1em solid #555555;
+        box-shadow: 0 0 0 #dde;
+    }
+}
+main{
+    background-color: #000000;
     width: 100%;
-    height: 100%;
-    margin-bottom: 1.875em;
+    max-width: 90em;
+    margin: 2em auto;
+    padding: 0;
+    text-align: center;
+    flex: 1;
+}
+@media screen and (max-width : 800px){
+    main{
+        width: 100%;
+        margin: 1em auto;
+    }
 }
 
-div.section{
+section{
+    text-align: left;
     margin: 0.5em;
-    padding: 0;
-    background-color: #ffffff;
-    border: 0.063em solid #005500;
-    border-radius: 1em 1em;
-    box-shadow: 0 0 0.75em #003300;
+    padding: 1em;
+    background-color: #f0f0f0;
+    border: 0.1em solid #003300;
     overflow: hidden;
+    border-top-left-radius: 0.5em;
+    border-top-right-radius: 0.5em;
+    border-bottom-left-radius: 1.5em;
+    border-bottom-right-radius: 1.5em;
+}
+@media screen and (max-width : 800px){
+    section{
+        margin: 1em;
+    }
 }
 
-div.section h3.section_title{
+section h3{
+    position: relative;
     font-weight: bold;
-    color: #ccddff;
-    text_align: left;
-    padding: 0.2em 0.4em 0.2em 0.4em;
-    margin: 0;
-    text-shadow: 0 0 0.4em #000022;
+    color: #ffffff;
+    background-color: #60ae29;
+    border-bottom: 0.1em solid #003300;
     font-size: 150%;
-    background: linear-gradient(to bottom, #1e9957 0%,#29d889 89%,#20ca7c 97%,#7de8b9 100%);
+    padding: 0.5em 2em 0.2em 3em;
+    margin: -0.8em -1em 1em -1em;
+    font-variant: small-caps;
+}
+
+section h3:before {
+    content: " /";
+    opacity: 0.3;
 }
 
 /* .entry is a style only class to show content. Must be allways children os a .lighted element */
-div.section div.entry{
+section article{
     border: 0.1em solid #aaffaa00;
     border-radius: 0.3em;
     padding: 0.5em;
     margin: 0.5em;
     transition: all .4s ease-in-out;
 }
+section article h4{
+    font-variant: small-caps;
+    text-decoration: underline;
+    text-decoration-color: #33553377;
+    font-size: 130%;
+    margin: 0.2em auto 1em auto;
+}
 
-div.section div.entry_list:hover{
+section section_list:hover{
     background-color: #efffef;
     border: 0.1em solid #aaffaaff;
 }
@@ -372,14 +417,41 @@ input[type=submit]{
 
 /* Style forr buttons */
 input[type=button]{
-    font-weight: bold;
+    cursor: pointer;
+    display: inline-block;
     color: #cccccc;
-    background-color: #555555;
-    border: 0.143em solid #bbbbbb;
+    background-color: #278c3a;
+    border: 0.143em solid #66bf38;
     border-radius: 0.429em;
-    padding: 0.5em;
+    padding: 0.5em 0.8em;
     text-shadow: 0 0 0.75em #000000;
-    cursor: pointer;
+    text-decoration: none;
+    font-family: 'Nunito';
+    font-weight: bold;
+    font-variant: small-caps;
+    letter-spacing: 0.07em;
+    font-size: 110%;
+    box-shadow: inset 0 0 0.2em #082400;
+    text-transform: capitalize;
+}
+@media screen and (max-width : 800px){
+	input[type=button]{
+		font-size: 120%;	
+		padding: 0.9em 1.4em;
+	}
+}
+input[type=button]::first-letter{
+    color: #eeeeee;
+}
+input[type=button]:hover{
+    color: #ffffff;
+    background-color: #34b94d;
+    box-shadow: inset 0 0 0.1em #000;
+    border: 0.2em solid #285710;
+}
+input[type=button]:hover::first-letter{
+    color: #ffffff;
+}
 }
 
 /* Style for textboxes */
@@ -459,15 +531,38 @@ textarea.error{
 a.a_button{
     display: inline-block;
     color: #cccccc;
-    background-color: #555555;
-    border: 0.143em solid #bbbbbb;
+    background-color: #278c3a;
+    border: 0.143em solid #66bf38;
     border-radius: 0.429em;
-    padding: 0.5em;
+    padding: 0.5em 0.8em;
     text-shadow: 0 0 0.75em #000000;
     text-decoration: none;
-    font: -webkit-small-control;
     font-family: 'Nunito';
     font-weight: bold;
+    font-variant: small-caps;
+    letter-spacing: 0.07em;
+    font-size: 110%;
+    box-shadow: inset 0 0 0.2em #082400;
+    text-transform: capitalize;
+    transition: all .3s ease-in-out;
+}
+@media screen and (max-width : 800px){
+	a.a_button{
+		font-size: 120%;	
+		padding: 0.9em 1.4em;
+	}
+}
+a.a_button::first-letter{
+    color: #eeeeee;
+}
+a.a_button:hover{
+    color: #ffffff;
+    background-color: #34b94d;
+    box-shadow: inset 0 0 0.1em #000;
+    border: 0.2em solid #285710;
+}
+a.a_button:hover::first-letter{
+    color: #ffffff;
 }
 
 /**********************************

BIN
public/fonts/Latin-Modern-Mono-Light-Bold.otf


+ 0 - 0
www-admin/fonts/Nunito-Bold.ttf → public/fonts/Nunito-Bold.ttf


+ 0 - 0
www-admin/fonts/Nunito-Light.ttf → public/fonts/Nunito-Light.ttf


+ 0 - 0
www-admin/fonts/Nunito-Regular.ttf → public/fonts/Nunito-Regular.ttf


+ 0 - 0
www-admin/fonts/OFL.txt → public/fonts/OFL.txt


+ 9 - 0
public/img/content/resizer

@@ -0,0 +1,9 @@
+for file in */*.png; do
+	for i in $(seq 1 9); do
+		if [ ! -d $(dirname "${file}")/x"$i"00 ]; then
+			mkdir $(dirname "${file}")/x"$i"00
+		fi
+		convert "$file" -resize "$i"00  $(dirname "${file}")/x"$i"00/$(basename "$file")
+	done
+done
+#    convert "$file" -resize 800x800  "view/$file"

+ 61 - 0
public/img/layout/control/close.svg

@@ -0,0 +1,61 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   viewBox="0 0 300 300"
+   version="1.1"
+   id="svg4"
+   sodipodi:docname="close.svg"
+   width="300"
+   height="300"
+   inkscape:version="0.92.3 (2405546, 2018-03-11)">
+  <metadata
+     id="metadata10">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title></dc:title>
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <defs
+     id="defs8" />
+  <sodipodi:namedview
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1"
+     objecttolerance="10"
+     gridtolerance="10"
+     guidetolerance="10"
+     inkscape:pageopacity="0"
+     inkscape:pageshadow="2"
+     inkscape:window-width="1680"
+     inkscape:window-height="964"
+     id="namedview6"
+     showgrid="false"
+     inkscape:zoom="1.2616667"
+     inkscape:cx="195.06917"
+     inkscape:cy="62.644724"
+     inkscape:window-x="0"
+     inkscape:window-y="0"
+     inkscape:window-maximized="1"
+     inkscape:current-layer="svg4" />
+  <path
+     style="fill:none;stroke:#000000;stroke-width:22.47567749;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+     d="M 37.737464,37.779859 262.26254,261.85018"
+     id="path928"
+     inkscape:connector-curvature="0" />
+  <path
+     style="fill:none;stroke:#000000;stroke-width:22.44807053;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+     d="M 37.918082,262.04494 262.46264,38.544112"
+     id="path928-3"
+     inkscape:connector-curvature="0" />
+</svg>

+ 56 - 0
public/img/layout/control/slid_d.svg

@@ -0,0 +1,56 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   viewBox="0 0 300 300"
+   version="1.1"
+   id="svg4"
+   sodipodi:docname="slid_d.svg"
+   width="300"
+   height="300"
+   inkscape:version="0.92.3 (2405546, 2018-03-11)">
+  <metadata
+     id="metadata10">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title></dc:title>
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <defs
+     id="defs8" />
+  <sodipodi:namedview
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1"
+     objecttolerance="10"
+     gridtolerance="10"
+     guidetolerance="10"
+     inkscape:pageopacity="0"
+     inkscape:pageshadow="2"
+     inkscape:window-width="1680"
+     inkscape:window-height="964"
+     id="namedview6"
+     showgrid="false"
+     inkscape:zoom="0.98333333"
+     inkscape:cx="135"
+     inkscape:cy="120"
+     inkscape:window-x="0"
+     inkscape:window-y="0"
+     inkscape:window-maximized="1"
+     inkscape:current-layer="svg4" />
+  <path
+     d="M 33.474582,43.644062 H 266.01694 L 149.74577,254.40678"
+     id="path2"
+     style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:13.4551115;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+     inkscape:connector-curvature="0" />
+</svg>

+ 56 - 0
public/img/layout/control/slid_l.svg

@@ -0,0 +1,56 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   viewBox="0 0 300 300"
+   version="1.1"
+   id="svg4"
+   sodipodi:docname="slid_l.svg"
+   width="300"
+   height="300"
+   inkscape:version="0.92.3 (2405546, 2018-03-11)">
+  <metadata
+     id="metadata10">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title></dc:title>
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <defs
+     id="defs8" />
+  <sodipodi:namedview
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1"
+     objecttolerance="10"
+     gridtolerance="10"
+     guidetolerance="10"
+     inkscape:pageopacity="0"
+     inkscape:pageshadow="2"
+     inkscape:window-width="1680"
+     inkscape:window-height="964"
+     id="namedview6"
+     showgrid="false"
+     inkscape:zoom="0.98333333"
+     inkscape:cx="135"
+     inkscape:cy="120"
+     inkscape:window-x="0"
+     inkscape:window-y="0"
+     inkscape:window-maximized="1"
+     inkscape:current-layer="svg4" />
+  <path
+     d="M 255.12712,32.754242 V 265.2966 L 44.364402,149.02543"
+     id="path2"
+     style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:13.4551115;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+     inkscape:connector-curvature="0" />
+</svg>

+ 56 - 0
public/img/layout/control/slid_r.svg

@@ -0,0 +1,56 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   viewBox="0 0 300 300"
+   version="1.1"
+   id="svg4"
+   sodipodi:docname="slid_r.svg"
+   width="300"
+   height="300"
+   inkscape:version="0.92.3 (2405546, 2018-03-11)">
+  <metadata
+     id="metadata10">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title></dc:title>
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <defs
+     id="defs8" />
+  <sodipodi:namedview
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1"
+     objecttolerance="10"
+     gridtolerance="10"
+     guidetolerance="10"
+     inkscape:pageopacity="0"
+     inkscape:pageshadow="2"
+     inkscape:window-width="1680"
+     inkscape:window-height="964"
+     id="namedview6"
+     showgrid="false"
+     inkscape:zoom="0.98333333"
+     inkscape:cx="135"
+     inkscape:cy="120"
+     inkscape:window-x="0"
+     inkscape:window-y="0"
+     inkscape:window-maximized="1"
+     inkscape:current-layer="svg4" />
+  <path
+     d="M 44.364402,265.2966 V 32.754242 L 255.12712,149.02541"
+     id="path2"
+     style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:13.4551115;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+     inkscape:connector-curvature="0" />
+</svg>

+ 56 - 0
public/img/layout/control/slid_u.svg

@@ -0,0 +1,56 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   viewBox="0 0 300 300"
+   version="1.1"
+   id="svg4"
+   sodipodi:docname="slid_u.svg"
+   width="300"
+   height="300"
+   inkscape:version="0.92.3 (2405546, 2018-03-11)">
+  <metadata
+     id="metadata10">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title></dc:title>
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <defs
+     id="defs8" />
+  <sodipodi:namedview
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1"
+     objecttolerance="10"
+     gridtolerance="10"
+     guidetolerance="10"
+     inkscape:pageopacity="0"
+     inkscape:pageshadow="2"
+     inkscape:window-width="1680"
+     inkscape:window-height="964"
+     id="namedview6"
+     showgrid="false"
+     inkscape:zoom="0.98333333"
+     inkscape:cx="135"
+     inkscape:cy="120"
+     inkscape:window-x="0"
+     inkscape:window-y="0"
+     inkscape:window-maximized="1"
+     inkscape:current-layer="svg4" />
+  <path
+     d="M 266.01694,254.40678 H 33.474582 L 149.74575,43.644062"
+     id="path2"
+     style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:13.4551115;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+     inkscape:connector-curvature="0" />
+</svg>

+ 80 - 0
public/img/layout/icon/home.svg

@@ -0,0 +1,80 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="500mm"
+   height="500mm"
+   viewBox="0 0 500 500"
+   version="1.1"
+   id="svg131"
+   inkscape:version="0.92.3 (2405546, 2018-03-11)"
+   sodipodi:docname="home.svg">
+  <defs
+     id="defs125" />
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="0.175"
+     inkscape:cx="865.65656"
+     inkscape:cy="1130.6199"
+     inkscape:document-units="mm"
+     inkscape:current-layer="layer1"
+     showgrid="false"
+     inkscape:window-width="1680"
+     inkscape:window-height="964"
+     inkscape:window-x="0"
+     inkscape:window-y="0"
+     inkscape:window-maximized="1" />
+  <metadata
+     id="metadata128">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title></dc:title>
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Capa 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(0,203)">
+    <rect
+       style="fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:1.85208333;stroke-linecap:butt;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       id="rect6097"
+       width="529.16669"
+       height="527.65479"
+       x="-12.095284"
+       y="-215.53572" />
+    <rect
+       style="fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:13.22916667;stroke-linecap:butt;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       id="rect133-2"
+       width="448.15552"
+       height="448.15549"
+       x="25.922247"
+       y="-177.07774"
+       ry="24.897526" />
+    <rect
+       style="fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:11.70093155;stroke-linecap:butt;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       id="rect133-2-8"
+       width="308.29907"
+       height="308.29907"
+       x="95.850464"
+       y="-107.14954"
+       ry="17.127728" />
+  </g>
+</svg>

+ 79 - 0
public/img/layout/icon/profile.svg

@@ -0,0 +1,79 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="500mm"
+   height="500mm"
+   viewBox="0 0 500 500"
+   version="1.1"
+   id="svg131"
+   inkscape:version="0.92.3 (2405546, 2018-03-11)"
+   sodipodi:docname="profile.svg">
+  <defs
+     id="defs125" />
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="0.175"
+     inkscape:cx="-388.62915"
+     inkscape:cy="1130.6199"
+     inkscape:document-units="mm"
+     inkscape:current-layer="layer1"
+     showgrid="false"
+     inkscape:window-width="1680"
+     inkscape:window-height="964"
+     inkscape:window-x="0"
+     inkscape:window-y="0"
+     inkscape:window-maximized="1" />
+  <metadata
+     id="metadata128">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Capa 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(0,203)">
+    <rect
+       style="fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:1.85208333;stroke-linecap:butt;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       id="rect6097"
+       width="529.16669"
+       height="527.65479"
+       x="-12.095284"
+       y="-215.53572" />
+    <rect
+       style="fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:13.22916667;stroke-linecap:butt;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       id="rect133-2"
+       width="448.15552"
+       height="448.15549"
+       x="25.922247"
+       y="-177.07774"
+       ry="24.897526" />
+    <ellipse
+       style="fill:#000000;fill-opacity:1;stroke:#ffffff;stroke-width:13.22916667;stroke-linecap:butt;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       id="path6133"
+       cx="249.99998"
+       cy="47"
+       rx="149.30865"
+       ry="149.30867" />
+  </g>
+</svg>

+ 104 - 0
public/img/layout/icon/project.svg

@@ -0,0 +1,104 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="500mm"
+   height="500mm"
+   viewBox="0 0 500 500"
+   version="1.1"
+   id="svg131"
+   inkscape:version="0.92.3 (2405546, 2018-03-11)"
+   sodipodi:docname="project.svg">
+  <defs
+     id="defs125" />
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="0.175"
+     inkscape:cx="-388.62915"
+     inkscape:cy="1130.6199"
+     inkscape:document-units="mm"
+     inkscape:current-layer="layer1"
+     showgrid="false"
+     inkscape:window-width="1680"
+     inkscape:window-height="964"
+     inkscape:window-x="0"
+     inkscape:window-y="0"
+     inkscape:window-maximized="1" />
+  <metadata
+     id="metadata128">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Capa 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(0,203)">
+    <rect
+       style="fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:1.85208333;stroke-linecap:butt;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       id="rect6097"
+       width="529.16669"
+       height="527.65479"
+       x="-12.095284"
+       y="-215.53572" />
+    <rect
+       style="fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:13.22916667;stroke-linecap:butt;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       id="rect133-2"
+       width="448.15552"
+       height="448.15549"
+       x="25.922247"
+       y="-177.07774"
+       ry="24.897526" />
+    <rect
+       style="fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:13.22916667;stroke-linecap:butt;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       id="rect133-2-5"
+       width="149.38516"
+       height="149.38516"
+       x="75.307419"
+       y="72.307419"
+       ry="8.2991762" />
+    <rect
+       style="fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:13.22916667;stroke-linecap:butt;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       id="rect133-2-5-3"
+       width="149.38516"
+       height="149.38516"
+       x="75.307419"
+       y="-127.69258"
+       ry="8.2991762" />
+    <rect
+       style="fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:13.22916667;stroke-linecap:butt;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       id="rect133-2-5-3-9"
+       width="149.38516"
+       height="149.38516"
+       x="275.3074"
+       y="-127.69258"
+       ry="8.2991762" />
+    <rect
+       style="fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:13.22916667;stroke-linecap:butt;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       id="rect133-2-5-3-9-1"
+       width="149.38516"
+       height="149.38516"
+       x="275.3074"
+       y="72.307419"
+       ry="8.2991762" />
+  </g>
+</svg>

+ 85 - 0
public/img/layout/lang/en.svg

@@ -0,0 +1,85 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   viewBox="0 0 750 500"
+   version="1.1"
+   id="svg15"
+   sodipodi:docname="en.svg"
+   width="750"
+   height="500"
+   inkscape:version="0.92.3 (2405546, 2018-03-11)">
+  <metadata
+     id="metadata21">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title></dc:title>
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <defs
+     id="defs19" />
+  <sodipodi:namedview
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1"
+     objecttolerance="10"
+     gridtolerance="10"
+     guidetolerance="10"
+     inkscape:pageopacity="0"
+     inkscape:pageshadow="2"
+     inkscape:window-width="1680"
+     inkscape:window-height="964"
+     id="namedview17"
+     showgrid="false"
+     inkscape:zoom="2.192031"
+     inkscape:cx="316.78481"
+     inkscape:cy="7.8655457"
+     inkscape:window-x="0"
+     inkscape:window-y="0"
+     inkscape:window-maximized="1"
+     inkscape:current-layer="svg15" />
+  <clipPath
+     id="t">
+    <path
+       d="m 30,15 h 30 v 15 z m 0,0 V 30 H 0 Z m 0,0 H 0 V 0 Z m 0,0 V 0 h 30 z"
+       id="path2"
+       inkscape:connector-curvature="0" />
+  </clipPath>
+  <path
+     d="M -1.5363247,-3.0395545 V 501.64287 H 754.29643 V -3.0395545 Z"
+     id="path5"
+     inkscape:connector-curvature="0"
+     style="fill:#00247d;stroke-width:14.55746269" />
+  <path
+     d="M -1.5363247,-3.0395545 754.29643,501.64287 m 0,-504.6824245 L -1.5363247,501.64287"
+     id="path7"
+     inkscape:connector-curvature="0"
+     style="stroke:#ffffff;stroke-width:87.3447876" />
+  <path
+     d="M 0,0 60,30 M 60,0 0,30"
+     clip-path="url(#t)"
+     id="path9"
+     inkscape:connector-curvature="0"
+     style="stroke:#cf142b;stroke-width:4"
+     transform="matrix(12.597213,0,0,16.822748,-1.5363247,-3.0395545)" />
+  <path
+     d="M 376.38005,-3.0395545 V 501.64287 M -1.5363247,249.30166 H 754.29643"
+     id="path11"
+     inkscape:connector-curvature="0"
+     style="stroke:#ffffff;stroke-width:145.574646" />
+  <path
+     d="M 376.38005,-3.0395545 V 501.64287 M -1.5363247,249.30166 H 754.29643"
+     id="path13"
+     inkscape:connector-curvature="0"
+     style="stroke:#cf142b;stroke-width:87.3447876" />
+</svg>

+ 60 - 0
public/img/layout/lang/es.svg

@@ -0,0 +1,60 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   height="500"
+   width="750"
+   version="1.1"
+   id="svg1160"
+   sodipodi:docname="es.svg"
+   inkscape:version="0.92.3 (2405546, 2018-03-11)">
+  <metadata
+     id="metadata1166">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title></dc:title>
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <defs
+     id="defs1164" />
+  <sodipodi:namedview
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1"
+     objecttolerance="10"
+     gridtolerance="10"
+     guidetolerance="10"
+     inkscape:pageopacity="0"
+     inkscape:pageshadow="2"
+     inkscape:window-width="1680"
+     inkscape:window-height="964"
+     id="namedview1162"
+     showgrid="false"
+     inkscape:zoom="0.6675088"
+     inkscape:cx="350.79908"
+     inkscape:cy="526.30887"
+     inkscape:window-x="0"
+     inkscape:window-y="0"
+     inkscape:window-maximized="1"
+     inkscape:current-layer="svg1160" />
+  <path
+     d="M 0,0 H 750 V 500 H 0 Z"
+     id="path2"
+     inkscape:connector-curvature="0"
+     style="fill:#c60b1e" />
+  <path
+     d="M 0,125 H 750 V 375 H 0 Z"
+     id="path4"
+     inkscape:connector-curvature="0"
+     style="fill:#ffc400" />
+</svg>

+ 86 - 0
public/img/layout/lang/eu.svg

@@ -0,0 +1,86 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="750mm"
+   height="500mm"
+   viewBox="0 300 300.00001 200"
+   version="1.1"
+   id="svg8"
+   inkscape:version="0.92.3 (2405546, 2018-03-11)"
+   sodipodi:docname="eu.svg">
+  <defs
+     id="defs2" />
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="0.24748737"
+     inkscape:cx="1732.787"
+     inkscape:cy="869.60957"
+     inkscape:document-units="mm"
+     inkscape:current-layer="layer1"
+     showgrid="false"
+     inkscape:window-width="1680"
+     inkscape:window-height="964"
+     inkscape:window-x="0"
+     inkscape:window-y="0"
+     inkscape:window-maximized="1"
+     scale-x="0.4"
+     viewbox-y="300" />
+  <metadata
+     id="metadata5">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title></dc:title>
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Capa 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(0,203)">
+    <rect
+       style="fill:#ff0000;fill-opacity:1;stroke:none;stroke-width:0.18539347;stroke-linecap:butt;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       id="rect12"
+       width="330.13379"
+       height="211.98421"
+       x="-12.973061"
+       y="89.058723" />
+    <path
+       style="fill:#ffffff;stroke:#00c500;stroke-width:18.53934669;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       d="M -3.7388884,298.44664 304.7922,94.445605"
+       id="path826"
+       inkscape:connector-curvature="0" />
+    <path
+       style="fill:#008000;stroke:#00c500;stroke-width:18.53934669;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       d="M -12.97306,89.058724 320.40004,312.39179"
+       id="path843"
+       inkscape:connector-curvature="0" />
+    <path
+       style="fill:none;stroke:#ffffff;stroke-width:18.53934669;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       d="M -1.3002199,196.97106 H 299.6469"
+       id="path845"
+       inkscape:connector-curvature="0" />
+    <path
+       style="fill:none;stroke:#ffffff;stroke-width:18.53934669;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       d="M 148.84649,96.625909 V 298.01091"
+       id="path877"
+       inkscape:connector-curvature="0" />
+  </g>
+</svg>

+ 98 - 0
public/img/layout/license/CC-0.svg

@@ -0,0 +1,98 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 13.0.2, SVG Export Plug-In . SVG Version: 6.00 Build 14948)  -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+	 width="88px" height="31px" viewBox="-0.5 -0.101 88 31" enable-background="new -0.5 -0.101 88 31" xml:space="preserve">
+<g>
+	<path fill="#FFFFFF" d="M1.803,0.482L84.93,0.631c1.161,0,2.198-0.173,2.198,2.333L87.025,30.52h-87.32V2.862
+		C-0.295,1.626-0.177,0.482,1.803,0.482z"/>
+	<g>
+		<ellipse fill="#FFFFFF" cx="13.887" cy="15.502" rx="11.101" ry="11.174"/>
+	</g>
+	<path d="M23.271,4.061c3.484,2.592,5.754,6.744,5.755,11.44c-0.001,4.272-1.88,8.095-4.842,10.705h62.853V4.061H23.271z"/>
+	<g>
+		<path fill="#FFFFFF" d="M35.739,7.559c0.392,0,0.728,0.059,1.002,0.173c0.276,0.116,0.5,0.268,0.674,0.456
+			c0.173,0.189,0.299,0.405,0.379,0.647c0.079,0.242,0.118,0.494,0.118,0.753c0,0.253-0.039,0.503-0.118,0.749
+			c-0.08,0.244-0.206,0.462-0.379,0.65c-0.174,0.189-0.397,0.341-0.674,0.456c-0.274,0.114-0.61,0.173-1.002,0.173h-1.452v2.267
+			h-1.382V7.559H35.739z M35.36,10.535c0.158,0,0.312-0.012,0.457-0.035c0.147-0.023,0.276-0.069,0.388-0.137
+			c0.112-0.068,0.201-0.164,0.269-0.288s0.101-0.287,0.101-0.487c0-0.2-0.033-0.362-0.101-0.487
+			c-0.067-0.124-0.157-0.221-0.269-0.287c-0.111-0.068-0.24-0.114-0.388-0.138C35.671,8.652,35.518,8.64,35.36,8.64h-1.073v1.896
+			L35.36,10.535L35.36,10.535z"/>
+		<path fill="#FFFFFF" d="M43.751,13.4c-0.476,0.417-1.133,0.625-1.972,0.625c-0.851,0-1.509-0.207-1.976-0.62
+			c-0.466-0.412-0.699-1.052-0.699-1.913V7.559h1.381v3.934c0,0.171,0.016,0.338,0.045,0.505c0.029,0.165,0.091,0.311,0.185,0.439
+			c0.094,0.126,0.225,0.229,0.392,0.309c0.167,0.081,0.392,0.12,0.673,0.12c0.493,0,0.833-0.11,1.021-0.332
+			c0.188-0.222,0.282-0.568,0.282-1.04V7.559h1.382v3.934C44.464,12.348,44.227,12.983,43.751,13.4z"/>
+		<path fill="#FFFFFF" d="M49.07,7.559c0.3,0,0.572,0.027,0.818,0.081c0.244,0.054,0.457,0.14,0.633,0.261
+			c0.177,0.121,0.312,0.282,0.41,0.482c0.096,0.201,0.146,0.45,0.146,0.745c0,0.318-0.072,0.584-0.216,0.796
+			c-0.146,0.212-0.357,0.388-0.639,0.523c0.387,0.112,0.676,0.31,0.865,0.589c0.189,0.281,0.286,0.62,0.286,1.015
+			c0,0.319-0.062,0.595-0.187,0.828c-0.123,0.232-0.289,0.423-0.496,0.571c-0.209,0.148-0.445,0.257-0.713,0.327
+			c-0.269,0.07-0.541,0.105-0.822,0.105h-3.047V7.559H49.07z M48.895,10.119c0.246,0,0.448-0.059,0.607-0.178
+			c0.158-0.118,0.236-0.309,0.236-0.576c0-0.147-0.025-0.269-0.078-0.363c-0.053-0.093-0.123-0.168-0.211-0.221
+			c-0.09-0.053-0.189-0.091-0.305-0.109C49.029,8.65,48.912,8.64,48.789,8.64h-1.294v1.48L48.895,10.119L48.895,10.119
+			L48.895,10.119z M48.975,12.804c0.135,0,0.264-0.014,0.387-0.04c0.123-0.026,0.23-0.072,0.326-0.133
+			c0.092-0.062,0.168-0.147,0.226-0.254c0.056-0.104,0.083-0.241,0.083-0.406c0-0.324-0.092-0.557-0.271-0.695
+			c-0.182-0.138-0.424-0.208-0.723-0.208h-1.505v1.738h1.479v-0.002H48.975z"/>
+		<path fill="#FFFFFF" d="M54.143,7.559v5.156h3.062v1.168H52.76V7.559H54.143z"/>
+		<path fill="#FFFFFF" d="M59.748,7.559v6.324h-1.382V7.559H59.748z"/>
+		<path fill="#FFFFFF" d="M65.451,9.247c-0.082-0.132-0.186-0.249-0.309-0.349c-0.123-0.102-0.263-0.18-0.418-0.236
+			c-0.156-0.057-0.316-0.084-0.488-0.084c-0.312,0-0.574,0.062-0.793,0.183c-0.217,0.12-0.394,0.283-0.525,0.486
+			c-0.136,0.204-0.232,0.436-0.296,0.695c-0.062,0.259-0.093,0.528-0.093,0.806c0,0.267,0.031,0.524,0.093,0.776
+			c0.062,0.251,0.16,0.477,0.296,0.678c0.134,0.201,0.312,0.361,0.525,0.483c0.219,0.12,0.481,0.181,0.793,0.181
+			c0.424,0,0.752-0.13,0.99-0.389c0.236-0.26,0.383-0.602,0.437-1.028H67c-0.034,0.396-0.126,0.753-0.271,1.072
+			c-0.146,0.318-0.342,0.591-0.582,0.815c-0.238,0.225-0.521,0.396-0.845,0.513c-0.323,0.119-0.678,0.178-1.065,0.178
+			c-0.479,0-0.914-0.084-1.297-0.252c-0.385-0.169-0.709-0.398-0.973-0.695c-0.265-0.295-0.468-0.642-0.607-1.04
+			c-0.142-0.399-0.211-0.829-0.211-1.289c0-0.473,0.069-0.911,0.211-1.316c0.141-0.404,0.344-0.758,0.607-1.059
+			c0.264-0.302,0.588-0.536,0.973-0.708c0.384-0.172,0.815-0.258,1.297-0.258c0.348,0,0.676,0.051,0.981,0.15
+			c0.308,0.102,0.583,0.248,0.827,0.44c0.243,0.191,0.443,0.43,0.604,0.712c0.158,0.283,0.259,0.608,0.301,0.975h-1.34
+			C65.586,9.524,65.533,9.377,65.451,9.247z"/>
+		<path fill="#FFFFFF" d="M35.615,16.418c0.405,0,0.782,0.062,1.131,0.192c0.35,0.13,0.651,0.324,0.906,0.585
+			c0.255,0.26,0.455,0.586,0.599,0.975c0.144,0.391,0.216,0.849,0.216,1.371c0,0.463-0.059,0.888-0.176,1.277
+			c-0.118,0.391-0.295,0.727-0.532,1.012c-0.238,0.281-0.534,0.504-0.89,0.668c-0.354,0.16-0.772,0.242-1.254,0.242h-2.71v-6.322
+			H35.615z M35.519,21.572c0.199,0,0.393-0.031,0.581-0.098c0.188-0.062,0.354-0.173,0.502-0.323
+			c0.146-0.151,0.264-0.347,0.352-0.59c0.088-0.241,0.132-0.536,0.132-0.886c0-0.317-0.031-0.606-0.093-0.863
+			c-0.062-0.256-0.162-0.479-0.304-0.659c-0.141-0.183-0.326-0.323-0.559-0.421c-0.231-0.098-0.517-0.146-0.858-0.146h-0.984v3.986
+			H35.519z"/>
+		<path fill="#FFFFFF" d="M39.8,18.289c0.141-0.403,0.344-0.756,0.606-1.059c0.265-0.303,0.589-0.538,0.973-0.709
+			c0.385-0.171,0.816-0.257,1.298-0.257c0.487,0,0.921,0.086,1.303,0.257c0.381,0.171,0.704,0.406,0.969,0.709
+			c0.264,0.303,0.466,0.652,0.605,1.059c0.143,0.404,0.213,0.845,0.213,1.316c0,0.46-0.07,0.891-0.213,1.288
+			c-0.142,0.397-0.344,0.744-0.605,1.04c-0.266,0.295-0.588,0.525-0.969,0.695c-0.382,0.166-0.815,0.252-1.303,0.252
+			c-0.481,0-0.913-0.086-1.298-0.252c-0.384-0.17-0.708-0.4-0.973-0.695c-0.263-0.296-0.466-0.645-0.606-1.04
+			c-0.14-0.397-0.211-0.828-0.211-1.288C39.589,19.134,39.659,18.694,39.8,18.289z M41.062,20.379
+			c0.062,0.252,0.16,0.479,0.295,0.68c0.135,0.2,0.312,0.359,0.527,0.482c0.218,0.121,0.481,0.183,0.792,0.183
+			c0.312,0,0.576-0.062,0.792-0.183c0.218-0.121,0.394-0.281,0.529-0.482c0.134-0.2,0.231-0.428,0.295-0.68
+			c0.062-0.25,0.092-0.508,0.092-0.774c0-0.276-0.03-0.547-0.092-0.806c-0.062-0.262-0.161-0.492-0.295-0.696
+			c-0.136-0.201-0.312-0.365-0.529-0.485c-0.216-0.121-0.48-0.184-0.792-0.184c-0.311,0-0.574,0.062-0.792,0.184
+			c-0.216,0.12-0.393,0.284-0.527,0.485c-0.135,0.204-0.233,0.437-0.295,0.696c-0.062,0.259-0.093,0.527-0.093,0.806
+			C40.97,19.871,41.001,20.129,41.062,20.379z"/>
+		<path fill="#FFFFFF" d="M49.092,16.418l1.471,4.348h0.02l1.393-4.348h1.942v6.322h-1.294v-4.48h-0.02l-1.539,4.48H50l-1.54-4.437
+			h-0.019v4.437h-1.293v-6.322H49.092z"/>
+		<path fill="#FFFFFF" d="M58.764,16.418l2.35,6.322H59.68l-0.476-1.408h-2.351l-0.492,1.408h-1.391l2.377-6.322H58.764z
+			 M58.844,20.297l-0.793-2.322h-0.018l-0.817,2.322H58.844z"/>
+		<path fill="#FFFFFF" d="M63.547,16.418v6.322h-1.382v-6.322H63.547z"/>
+		<path fill="#FFFFFF" d="M66.604,16.418l2.623,4.242h0.018v-4.242h1.294v6.322h-1.384l-2.611-4.234h-0.02v4.234H65.23v-6.322
+			H66.604z"/>
+	</g>
+	<path d="M85.852,0H1.147C0.239,0-0.5,0.744-0.5,1.658v28.969C-0.5,30.834-0.333,31-0.128,31h87.256
+		c0.205,0,0.372-0.166,0.372-0.373V1.658C87.5,0.744,86.762,0,85.852,0z M1.147,0.75h84.705c0.498,0,0.902,0.406,0.902,0.908
+		c0,0,0,20.121,0,28.557H0.245v-8.426c0-8.435,0-20.131,0-20.131C0.245,1.157,0.65,0.75,1.147,0.75z"/>
+	<g>
+		<ellipse fill="#FFFFFF" cx="14.156" cy="15.661" rx="11.004" ry="11.076"/>
+		<path id="text2809_4_" d="M14.22,8.746c-3.862,0-4.834,3.669-4.834,6.779c0,3.111,0.971,6.779,4.834,6.779
+			c3.863,0,4.834-3.67,4.834-6.779C19.054,12.414,18.083,8.746,14.22,8.746z M14.22,11.301c0.157,0,0.3,0.024,0.435,0.06
+			c0.278,0.24,0.414,0.573,0.147,1.038l-2.572,4.76c-0.079-0.603-0.091-1.195-0.091-1.634C12.139,14.155,12.233,11.301,14.22,11.301
+			z M16.146,13.494c0.137,0.731,0.155,1.493,0.155,2.03c0,1.37-0.094,4.223-2.08,4.223c-0.156,0-0.301-0.017-0.435-0.049
+			c-0.025-0.01-0.049-0.019-0.074-0.025c-0.04-0.012-0.084-0.024-0.122-0.041c-0.442-0.188-0.721-0.531-0.319-1.139L16.146,13.494z"
+			/>
+		<path id="path2815_4_" d="M14.195,3.748c-3.245,0-5.98,1.137-8.21,3.422c-1.128,1.135-1.99,2.431-2.589,3.876
+			c-0.585,1.43-0.876,2.921-0.876,4.478c0,1.57,0.291,3.062,0.876,4.479s1.434,2.69,2.548,3.826
+			c1.128,1.121,2.395,1.985,3.802,2.588c1.421,0.59,2.903,0.884,4.449,0.884c1.547,0,3.05-0.304,4.499-0.907
+			c1.448-0.604,2.74-1.471,3.883-2.605c1.101-1.078,1.934-2.317,2.49-3.719c0.571-1.415,0.853-2.932,0.853-4.544
+			c0-1.598-0.281-3.112-0.852-4.528c-0.571-1.429-1.407-2.693-2.507-3.801C20.263,4.895,17.469,3.748,14.195,3.748z M14.244,5.867
+			c2.646,0,4.904,0.944,6.784,2.836c0.906,0.912,1.6,1.954,2.073,3.119c0.473,1.164,0.713,2.398,0.713,3.703
+			c0,2.707-0.92,4.952-2.744,6.746c-0.948,0.927-2.012,1.638-3.196,2.128c-1.17,0.489-2.375,0.732-3.63,0.732
+			c-1.268,0-2.481-0.239-3.638-0.717c-1.156-0.489-2.193-1.191-3.113-2.104c-0.92-0.925-1.629-1.97-2.13-3.135
+			c-0.487-1.178-0.738-2.391-0.738-3.653c0-1.276,0.251-2.497,0.738-3.662c0.501-1.178,1.211-2.235,2.13-3.175
+			C9.317,6.809,11.57,5.867,14.244,5.867z"/>
+	</g>
+</g>
+</svg>

File diff suppressed because it is too large
+ 92 - 0
public/img/layout/license/CC-BY-NC-ND.svg


File diff suppressed because it is too large
+ 84 - 0
public/img/layout/license/CC-BY-NC-SA.svg


File diff suppressed because it is too large
+ 81 - 0
public/img/layout/license/CC-BY-NC.svg


File diff suppressed because it is too large
+ 84 - 0
public/img/layout/license/CC-BY-ND.svg


File diff suppressed because it is too large
+ 107 - 0
public/img/layout/license/CC-BY.svg


File diff suppressed because it is too large
+ 5 - 0
public/img/layout/license/GPLV3.svg


File diff suppressed because it is too large
+ 61 - 0
public/img/layout/logo/logo.svg


File diff suppressed because it is too large
+ 488 - 0
public/img/layout/social/app_store.svg


+ 17 - 0
public/img/layout/social/email.svg

@@ -0,0 +1,17 @@
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 22 22">
+  <defs id="defs3051">
+    <style type="text/css" id="current-color-scheme">
+      .ColorScheme-Text {
+        color:#4d4d4d;
+      }
+      </style>
+  </defs>
+  <g
+     transform="translate(-421.71429,-525.79074)">
+    <path
+       style="opacity:1;fill:currentColor;fill-opacity:1;stroke:none" 
+       d="m 422.71429,528.79074 0,1 0,14 0,0.41406 0,0.58594 1,0 19,0 0,-0.58594 0,-0.41406 0,-1 0,-14 -0.0488,0 -0.95117,0 -17.53711,0 -0.46289,0 -1,0 z m 1,1 0.0488,0 5.97461,5.97656 -6.02344,6.02344 0,-12 z m 1.46289,0 15.07422,0 -7.53711,7.53711 -7.53711,-7.53711 z m 16.48828,0 0.0488,0 0,12 -6.02344,-6.02344 5.97461,-5.97656 z m -11.2207,6.68359 2.26953,2.26758 2.26953,-2.26758 6.26758,6.26758 0.46289,0.46289 0,0.58594 -18,0 0,-0.58594 0.46289,-0.46289 6.26758,-6.26758 z"
+       id="rect4144" 
+        class="ColorScheme-Text"/>
+  </g>
+</svg>

+ 54 - 0
public/img/layout/social/facebook.svg

@@ -0,0 +1,54 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+<svg xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:cc="http://creativecommons.org/ns#" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:svg="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" width="256" height="256" id="svg2" sodipodi:version="0.32" inkscape:version="0.47 r22583" sodipodi:docname="facebook.svg" version="1.0" inkscape:output_extension="org.inkscape.output.svg.inkscape">
+  <title id="title2910">facebook web</title>
+  <defs id="defs4">
+    <linearGradient inkscape:collect="always" id="linearGradient2555">
+      <stop style="stop-color: rgb(255, 255, 255); stop-opacity: 1;" offset="0" id="stop2557"/>
+      <stop style="stop-color: rgb(255, 255, 255); stop-opacity: 0;" offset="1" id="stop2559"/>
+    </linearGradient>
+    <linearGradient inkscape:collect="always" xlink:href="#linearGradient2555" id="linearGradient2449" gradientUnits="userSpaceOnUse" gradientTransform="matrix(-0.5914584,0,0,0.5914584,210.02161,142.23241)" x1="-344.15295" y1="274.711" x2="-395.84943" y2="425.39993"/>
+  </defs>
+  <sodipodi:namedview id="base" pagecolor="#ffffff" bordercolor="#666666" borderopacity="1.0" inkscape:pageopacity="0.0" inkscape:pageshadow="2" inkscape:zoom="0.98994949" inkscape:cx="204.60201" inkscape:cy="64.459739" inkscape:document-units="px" inkscape:current-layer="layer1" inkscape:window-width="682" inkscape:window-height="762" inkscape:window-x="1" inkscape:window-y="193" showgrid="false" inkscape:window-maximized="0"/>
+  <metadata id="metadata7">
+    <rdf:RDF>
+      <cc:Work rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage"/>
+        <dc:title>facebook web</dc:title>
+        <dc:creator>
+          <cc:Agent>
+            <dc:title>User:ZyMOS</dc:title>
+          </cc:Agent>
+        </dc:creator>
+        <dc:subject>
+          <rdf:Bag/>
+        </dc:subject>
+        <cc:license rdf:resource="http://creativecommons.org/licenses/publicdomain/"/>
+        <dc:description/>
+        <dc:contributor>
+          <cc:Agent>
+            <dc:title/>
+          </cc:Agent>
+        </dc:contributor>
+        <dc:publisher>
+          <cc:Agent>
+            <dc:title>Open Icon Library</dc:title>
+          </cc:Agent>
+        </dc:publisher>
+      </cc:Work>
+      <cc:License rdf:about="http://creativecommons.org/licenses/publicdomain/">
+        <cc:permits rdf:resource="http://creativecommons.org/ns#Reproduction"/>
+        <cc:permits rdf:resource="http://creativecommons.org/ns#Distribution"/>
+        <cc:permits rdf:resource="http://creativecommons.org/ns#DerivativeWorks"/>
+      </cc:License>
+    </rdf:RDF>
+  </metadata>
+  <g inkscape:label="Layer 1" inkscape:groupmode="layer" id="layer1" transform="translate(-373.642,-318.344)">
+    <rect inkscape:export-ydpi="7.7063322" inkscape:export-xdpi="7.7063322" inkscape:export-filename="C:\Documents and Settings\Molumen\Desktop\path3511111.png" transform="scale(-1,1)" ry="35.487503" rx="35.487503" y="328.34399" x="-619.64203" height="236" width="236" id="rect1942" style="fill:#0037c1;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.875;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.875, 1.75;stroke-dashoffset:0;stroke-opacity:1"/>
+    <path inkscape:export-ydpi="7.7063322" inkscape:export-xdpi="7.7063322" inkscape:export-filename="C:\Documents and Settings\Molumen\Desktop\path3511111.png" sodipodi:nodetypes="ccccsssc" id="path1950" d="M 557.29062,338.43314 L 445.99327,338.43314 C 416.53255,338.43314 392.81507,362.34527 392.81507,392.04777 L 392.81507,500.64007 C 393.76867,523.8254 397.43678,509.16812 404.41887,483.49194 C 412.53354,453.65102 438.96056,427.56963 471.144,408.02312 C 495.7086,393.10398 523.20395,383.5772 573.25282,382.6709 C 601.63697,382.15694 599.13112,345.83025 557.29062,338.43314 z" style="opacity:0.30042916;fill:url(#linearGradient2449);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.875;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.875, 1.75;stroke-dashoffset:0;stroke-opacity:1"/>
+    <g id="Layer_3" transform="matrix(1.7982054,0,0,1.8129643,376.63343,326.35613)">
+      <path d="M 93.376,117.012 L 72.203,117.012 L 72.203,65.767 L 61.625,65.767 L 61.625,48.107 L 72.203,48.107 L 72.203,37.504 C 72.203,23.097 78.176,14.53 95.146,14.53 L 109.274,14.53 L 109.274,32.192 L 100.443,32.192 C 93.837,32.192 93.4,34.66 93.4,39.266 L 93.376,48.105 L 109.374,48.105 L 107.502,65.765 L 93.376,65.765 L 93.376,117.012 z" id="path3336" style="fill:#ffffff"/>
+    </g>
+  </g>
+</svg>

File diff suppressed because it is too large
+ 3 - 0
public/img/layout/social/github.svg


+ 21 - 0
public/img/layout/social/google_play.svg

@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 19.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
+<svg version="1.1"
+	 id="Layer_2" xmlns:cc="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:svg="http://www.w3.org/2000/svg" sodipodi:docname="Google_Play_logo.svg" inkscape:version="0.48.4 r9939"
+	 xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" viewBox="30 336.7 120.9 129.2"
+	 style="enable-background:new 30 336.7 120.9 129.2;" xml:space="preserve">
+<style type="text/css">
+	.st0{fill:#FFD400;}
+	.st1{fill:#FF3333;}
+	.st2{fill:#48FF48;}
+	.st3{fill:#3BCCFF;}
+</style>
+<path id="path16" inkscape:connector-curvature="0" class="st0" d="M119.2,421.2c15.3-8.4,27-14.8,28-15.3c3.2-1.7,6.5-6.2,0-9.7
+	c-2.1-1.1-13.4-7.3-28-15.3l-20.1,20.2L119.2,421.2z"/>
+<path id="path23" inkscape:connector-curvature="0" class="st1" d="M99.1,401.1l-64.2,64.7c1.5,0.2,3.2-0.2,5.2-1.3
+	c4.2-2.3,48.8-26.7,79.1-43.3L99.1,401.1L99.1,401.1z"/>
+<path id="path30" inkscape:connector-curvature="0" class="st2" d="M99.1,401.1l20.1-20.2c0,0-74.6-40.7-79.1-43.1
+	c-1.7-1-3.6-1.3-5.3-1L99.1,401.1z"/>
+<path id="path37" inkscape:connector-curvature="0" class="st3" d="M99.1,401.1l-64.3-64.3c-2.6,0.6-4.8,2.9-4.8,7.6
+	c0,7.5,0,107.5,0,113.8c0,4.3,1.7,7.4,4.9,7.7L99.1,401.1z"/>
+</svg>

+ 209 - 0
public/img/layout/social/google_plus.svg

@@ -0,0 +1,209 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 16.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+	 width="300.537px" height="300px" viewBox="0 0 300.537 300" enable-background="new 0 0 300.537 300" xml:space="preserve">
+<g id="Background_2_">
+</g>
+<g id="Circle_1_">
+	<g id="Ellipse_1__x2B__Shape_1_2_" enable-background="new    ">
+		<defs>
+			<circle id="SVGID_1_" enable-background="new    " cx="150.269" cy="150" r="147.47"/>
+		</defs>
+		<clipPath id="SVGID_2_">
+			<use xlink:href="#SVGID_1_"  overflow="visible"/>
+		</clipPath>
+		<g transform="matrix(1 0 0 1 -1.891906e-007 -5.580137e-008)" clip-path="url(#SVGID_2_)">
+			
+				<image overflow="visible" width="560" height="559" id="Ellipse_1__x2B__Shape_1_xA0_影像" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAjEAAAIxCAYAAAC8b+n0AAAACXBIWXMAABTqAAAU6gFxlYZXAAAA
+GXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAJmlJREFUeNrs3Q1640Z2sG2U1J5x
+9pUFZEdJFpp1uNvdJEJQkq2WpRZ/UMA5de57vrlmvuSNLBVJ1MNCAZgmAICE2v/913/+z+k//9tQ
+AACJ/O+DMQAAMhIxAICIAQAQMQAAIgYAEDEAACIGAEDEAAAiBgBAxAAAiBgAABEDAIgYAAARAwAg
+YgAAEQMAIGIAAEQMACBiAABEDACAiAEAEDEAgIgBABAxAAAiBgAQMQAAIgYAQMQAACIGAEDEAACI
+GAAAEQMAiBgAABEDACBiAAARAwAgYgAARAwAIGIAAEQMAICIAQAQMQCAiAEAEDEAACIGABAxAAAi
+BgBAxAAAIgYAQMQAAIgYAAARAwCIGAAAEQMAIGIAABEDACBiAABEDAAgYgAARAwAgIgBABAxAICI
+AQAQMQAAIgYAEDEAACIGAEDEAACIGABAxAAAiBgAABEDAIgYAAARAwAgYgAAEQMAIGIAAEQMAICI
+AQBEDACAiAEAEDEAgIgBABAxAAAiBgAQMQAAIgYAQMQAAIgYAEDEAACIGAAAEQMAiBgAABEDACBi
+AAARAwAgYgAARAwAgIgBAEQMAICIAQAQMQCAiAEAEDEAACIGABAxAAAiBgBAxAAAiBgAQMQAAIgY
+AAARAwCIGAAAEQMAIGIAABEDACBiAABEDACAiAEARAwAgIgBABAxAICIAQAQMQAAIgYAEDEAACIG
+AEDEAACIGABAxAAAiBgAABEDAIgYAAARAwAgYgAARAwAIGIAAEQMAICIAQBEDACAiAEAEDEAgIgB
+ABAxAAAiBgBAxAAAIgYAQMQAAIgYAEDEAACIGAAAEQMAiBgAABEDACBiAABEDAAgYgAARAwAgIgB
+AEQMAICIAQAQMQCAiAEAEDEAACIGAEDEAAAiBgBAxAAAiBgAQMQAAIgYAAARAwCIGAAAEQMAIGIA
+AEQMACBiAABEDACAiAEARAwAgIgBABAxAICIAQAQMQAAIgYAQMQAACIGAEDEAABc7YshgL7ml3/P
+89//s/nlfzc//+/e/L+dXv0PXv3P5jf//69/1qK1Nj2007eT5T+np//+eP7vT/+75uUARAyIis+i
+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" transform="matrix(0.5295 0 0 0.5295 2.0034 2)">
+			</image>
+		</g>
+	</g>
+</g>
+<g id="Logo_1_">
+	<g id="G_x2B_">
+		<g>
+			<path fill-rule="evenodd" clip-rule="evenodd" fill="#FFFFFF" d="M173.723,136.102h-25.044h-33.227v24.653h33.227
+				c-4.974,13.099-17.637,22.412-32.48,22.412c-19.186,0-34.74-15.554-34.74-34.739s15.554-34.739,34.74-34.739
+				c8.548,0,16.369,3.096,22.42,8.217l17.394-17.032c-10.496-9.601-24.468-15.466-39.814-15.466
+				c-32.596,0-59.02,26.424-59.02,59.019c0,32.596,26.424,59.02,59.02,59.02c32.595,0,59.019-26.424,59.019-59.02
+				c0-4.228-0.448-8.35-1.293-12.326H173.723z M222.657,137.968v-20.544h-14.941v20.544h-20.545v14.942h20.545v20.544h14.941V152.91
+				h20.545v-14.942H222.657z"/>
+		</g>
+	</g>
+</g>
+</svg>

+ 37 - 0
public/img/layout/social/linkedin.svg

@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 15.0.1, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1"
+	 id="svg2" sodipodi:version="0.32" inkscape:version="0.47 r22583" sodipodi:docname="linkedin.svg" inkscape:output_extension="org.inkscape.output.svg.inkscape" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:svg="http://www.w3.org/2000/svg" xmlns:cc="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/"
+	 xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="256px" height="256px"
+	 viewBox="0 0 256 256" enable-background="new 0 0 256 256" xml:space="preserve">
+<sodipodi:namedview  showgrid="false" inkscape:window-maximized="0" pagecolor="#ffffff" bordercolor="#666666" id="base" borderopacity="1.0" inkscape:cx="138.80354" inkscape:pageopacity="0.0" inkscape:pageshadow="2" inkscape:zoom="0.24748737" inkscape:cy="94.798647" inkscape:document-units="px" inkscape:current-layer="layer1" inkscape:window-width="853" inkscape:window-height="674" inkscape:window-x="1" inkscape:window-y="281">
+	</sodipodi:namedview>
+<g id="layer1" transform="translate(-373.642,-318.344)" inkscape:label="Layer 1" inkscape:groupmode="layer">
+	
+		<path id="rect1942" inkscape:export-filename="C:\Documents and Settings\Molumen\Desktop\path3511111.png" inkscape:export-xdpi="7.7063322" inkscape:export-ydpi="7.7063322" fill="#1D8CB5" d="
+		M583.659,328.849H419.625c-19.599,0-35.487,15.888-35.487,35.487v164.015c0,19.599,15.888,35.486,35.487,35.486h164.033
+		c19.599,0,35.487-15.888,35.487-35.486V364.337C619.146,344.738,603.257,328.849,583.659,328.849z"/>
+	
+		<linearGradient id="path1950_1_" gradientUnits="userSpaceOnUse" x1="-808.8727" y1="199.8918" x2="-860.5692" y2="49.2029" gradientTransform="matrix(-0.5915 0 0 -0.5915 -34.5417 412.5453)">
+		<stop  offset="0" style="stop-color:#FFFFFF"/>
+		<stop  offset="1" style="stop-color:#FFFFFF;stop-opacity:0"/>
+	</linearGradient>
+	
+		<path id="path1950" inkscape:export-filename="C:\Documents and Settings\Molumen\Desktop\path3511111.png" inkscape:export-xdpi="7.7063322" sodipodi:nodetypes="ccccsssc" inkscape:export-ydpi="7.7063322" opacity="0.7811" fill="url(#path1950_1_)" enable-background="new    " d="
+		M557.056,338.895H446.227c-29.337,0-52.955,23.81-52.955,53.385v108.127c0.95,23.087,4.603,8.491,11.555-17.075
+		c8.081-29.713,34.396-55.682,66.445-75.145c24.461-14.855,51.84-24.341,101.679-25.244
+		C601.216,382.432,598.721,346.26,557.056,338.895z"/>
+</g>
+<g id="layer1_1_" transform="translate(-200.55198,-393.96227)" inkscape:label="Layer 1" inkscape:groupmode="layer">
+	<g id="g3019" transform="matrix(1.018827,0,0,-1.018827,170.5996,498.03288)">
+		<path id="path28_1_" inkscape:connector-curvature="0" fill="#FFFFFF" d="M109.495-101.774V2.533H74.828v-104.307H109.495z
+			 M92.168,16.775c12.081,0,19.612,8.01,19.612,18.021c-0.224,10.233-7.531,18.021-19.385,18.021
+			c-11.864,0-19.615-7.788-19.615-18.021c0-10.011,7.521-18.021,19.159-18.021H92.168L92.168,16.775z"/>
+		<path id="path30_1_" inkscape:connector-curvature="0" fill="#FFFFFF" d="M128.681-101.774h34.673v58.249
+			c0,3.119,0.226,6.235,1.143,8.462c2.5,6.232,8.209,12.681,17.784,12.681c12.547,0,17.562-9.568,17.562-23.588v-55.804h34.666
+			v59.81c0,32.039-17.1,46.946-39.913,46.946c-18.701,0-26.915-10.45-31.476-17.571h0.234V2.533h-34.673
+			C129.141-7.253,128.681-101.774,128.681-101.774L128.681-101.774z"/>
+	</g>
+</g>
+</svg>

+ 17 - 0
public/img/layout/social/telegram.svg

@@ -0,0 +1,17 @@
+<?xml version="1.0"?>
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 240 240">
+<defs>
+	<linearGradient id="b" x1="0.6667" y1="0.1667" x2="0.4167" y2="0.75">
+		<stop stop-color="#37aee2" offset="0"/>
+		<stop stop-color="#1e96c8" offset="1"/>
+	</linearGradient>
+	<linearGradient id="w" x1="0.6597" y1="0.4369" x2="0.8512" y2="0.8024">
+		<stop stop-color="#eff7fc" offset="0"/>
+		<stop stop-color="#fff" offset="1"/>
+	</linearGradient>
+</defs>
+<circle cx="120" cy="120" r="120" fill="url(#b)"/>
+<path fill="#c8daea" d="m98 175c-3.8876 0-3.227-1.4679-4.5678-5.1695L82 132.2059 170 80"/>
+<path fill="#a9c9dd" d="m98 175c3 0 4.3255-1.372 6-3l16-15.558-19.958-12.035"/>
+<path fill="url(#w)" d="m100.04 144.41 48.36 35.729c5.5185 3.0449 9.5014 1.4684 10.876-5.1235l19.685-92.763c2.0154-8.0802-3.0801-11.745-8.3594-9.3482l-115.59 44.571c-7.8901 3.1647-7.8441 7.5666-1.4382 9.528l29.663 9.2583 68.673-43.325c3.2419-1.9659 6.2173-0.90899 3.7752 1.2584"/>
+</svg>

+ 21 - 0
public/img/layout/social/twitter.svg

@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 20.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
+<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+	 viewBox="0 0 400 400" style="enable-background:new 0 0 400 400;" xml:space="preserve">
+<style type="text/css">
+	.st0{fill:#1DA1F2;}
+	.st1{fill:#FFFFFF;}
+</style>
+<g id="Dark_Blue">
+	<path class="st0" d="M350,400H50c-27.6,0-50-22.4-50-50V50C0,22.4,22.4,0,50,0h300c27.6,0,50,22.4,50,50v300
+		C400,377.6,377.6,400,350,400z"/>
+</g>
+<g id="Logo__x2014__FIXED">
+	<path class="st1" d="M153.6,301.6c94.3,0,145.9-78.2,145.9-145.9c0-2.2,0-4.4-0.1-6.6c10-7.2,18.7-16.3,25.6-26.6
+		c-9.2,4.1-19.1,6.8-29.5,8.1c10.6-6.3,18.7-16.4,22.6-28.4c-9.9,5.9-20.9,10.1-32.6,12.4c-9.4-10-22.7-16.2-37.4-16.2
+		c-28.3,0-51.3,23-51.3,51.3c0,4,0.5,7.9,1.3,11.7c-42.6-2.1-80.4-22.6-105.7-53.6c-4.4,7.6-6.9,16.4-6.9,25.8
+		c0,17.8,9.1,33.5,22.8,42.7c-8.4-0.3-16.3-2.6-23.2-6.4c0,0.2,0,0.4,0,0.7c0,24.8,17.7,45.6,41.1,50.3c-4.3,1.2-8.8,1.8-13.5,1.8
+		c-3.3,0-6.5-0.3-9.6-0.9c6.5,20.4,25.5,35.2,47.9,35.6c-17.6,13.8-39.7,22-63.7,22c-4.1,0-8.2-0.2-12.2-0.7
+		C97.7,293.1,124.7,301.6,153.6,301.6"/>
+</g>
+</svg>

+ 46 - 0
public/img/layout/social/www.svg

@@ -0,0 +1,46 @@
+<?xml version="1.0" encoding="iso-8859-1"?>
+<!-- Generator: Adobe Illustrator 19.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
+<svg version="1.1" id="Capa_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+	 viewBox="0 0 490 490" style="enable-background:new 0 0 490 490;" xml:space="preserve">
+<g>
+	<path d="M245,490c135.31,0,245-109.689,245-245C490,109.69,380.31,0,245,0S0,109.69,0,245C0,380.311,109.69,490,245,490z
+		 M245,30.625c118.206,0,214.375,96.169,214.375,214.375c0,118.207-96.169,214.375-214.375,214.375S30.625,363.207,30.625,245
+		C30.625,126.794,126.794,30.625,245,30.625z"/>
+	<polygon points="128.297,222.899 146.077,289.622 165.188,289.622 186.871,200.378 168.732,200.378 155.034,262.72 
+		139.378,200.378 117.949,200.378 101.635,261.673 88.177,200.378 69.724,200.378 91.033,289.622 110.577,289.622 	"/>
+	<polygon points="228.262,289.622 245.982,222.899 263.762,289.622 282.873,289.622 304.556,200.378 286.417,200.378 
+		272.719,262.72 257.063,200.378 235.634,200.378 219.32,261.673 205.862,200.378 187.409,200.378 208.718,289.622 	"/>
+	<polygon points="345.947,289.622 363.667,222.899 381.447,289.622 400.558,289.622 422.241,200.378 404.102,200.378 
+		390.404,262.72 374.748,200.378 353.319,200.378 337.005,261.673 323.547,200.378 305.094,200.378 326.403,289.622 	"/>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+</svg>

+ 7 - 0
public/index.php

@@ -0,0 +1,7 @@
+<?php
+    include "../application/config/config.php";
+    include_once($path["controller"]);
+    $request = $_SERVER['REQUEST_URI'];
+    $params = explode('/', $request);
+    $controller = new Controller($params);
+?>

+ 16 - 0
public/js/help.js

@@ -0,0 +1,16 @@
+function toggleHelp(id){
+    var helps = document.getElementsByClassName("help");
+    for (var i = 0; i < helps.length; i++) {
+        if (helps[i].id == id){
+            if (helps[i].classList.contains("selected")){
+                helps[i].classList.remove("selected");
+            }
+            else{
+                helps[i].classList.add("selected");
+            }
+        }
+        else{
+            helps[i].classList.remove("selected");
+        }
+    }
+}

+ 0 - 0
www-admin/css/m/ui.css → public/js/profile.js


+ 4 - 3
www/script/project.js → public/js/project.js

@@ -3,9 +3,10 @@
  *
  * @param obj The iframe.
  */
-function resizeIframe(obj) {
-    obj.style.height = (obj.contentWindow.document.body.scrollHeight + 100) + 'px';
-    obj.style.width = (obj.contentWindow.document.body.scrollWidth + 100) + 'px';
+function resizeDemo() {
+	var obj = document.getElementById('demo');
+    obj.style.height = (obj.contentWindow.document.body.scrollHeight + 50) + 'px';
+    obj.style.width = (obj.contentWindow.document.body.scrollWidth + 20) + 'px';
 }
 
 

+ 0 - 0
www/script/ui.js → public/js/ui.js


+ 0 - 239
sql/00_STRUCTURE.SQL

@@ -1,239 +0,0 @@
-DROP DATABASE IF EXISTS iv;
-CREATE DATABASE iv CHARACTER SET utf8 COLLATE utf8_bin;
-
-SET NAMES utf8;
-
-CONNECT iv;
-
-CREATE TABLE lang (
-    code    VARCHAR(2)   PRIMARY KEY,
-    name    VARCHAR(16)  NOT NULL,
-    active  BOOLEAN      DEFAULT 0
-);
-
-CREATE TABLE text (
-    id       VARCHAR(32),
-    lang     VARCHAR(2)     REFERENCES lang.code,
-    section  VARCHAR(32),
-    text     VARCHAR(5000),
-    file     VARCHAR(32),
-    PRIMARY KEY(id, lang)
-);
-CREATE INDEX i_text ON text(id, lang);
-
-CREATE TABLE user (
-    id        INT            AUTO_INCREMENT  PRIMARY KEY,
-    username  VARCHAR(64)    NOT NULL,
-    email     VARCHAR(128)   NOT NULL,
-    password  CHAR(128)      NOT NULL,
-    salt      CHAR(128)      NOT NULL,
-    fname     VARCHAR(64),
-    lname     VARCHAR(64),
-    picture   VARCHAR(100),
-    phone     VARCHAR(16),
-    cp        VARCHAR(6),
-    admin     BOOLEAN        NOT NULL        DEFAULT 0,
-    active    BOOLEAN        NOT NULL        DEFAULT 0
-);
-
-CREATE TABLE login_attempts (
-    user     INT          NOT NULL  REFERENCES user.id,
-    dtime    VARCHAR(30)  NOT NULL,
-    success  BOOLEAN      NOT NULL  DEFAULT 0
-);
-
-CREATE TABLE permissions(
-    user        INT          REFERENCES user.id,
-    permission  VARCHAR(32)  NOT NULL,
-    PRIMARY KEY(user, permission)
-);
-
-CREATE TABLE social(
-    id       INT           AUTO_INCREMENT  PRIMARY KEY,
-    idx      INT           NOT NULL        UNIQUE,
-    visible  BOOLEAN       NOT NULL        DEFAULT 1,
-    title    VARCHAR(32)   NOT NULL        UNIQUE       REFERENCES text.id,
-    icon     VARCHAR(16)   NOT NULL,
-    url      VARCHAR(256)  NOT NULL
-);
-
-CREATE TABLE share(
-    id       INT           AUTO_INCREMENT      PRIMARY KEY,
-    idx      INT           NOT NULL            UNIQUE,
-    visible  BOOLEAN       NOT NULL            DEFAULT 1,
-    title    VARCHAR(32)   NOT NULL            UNIQUE       REFERENCES text.id,
-    text     VARCHAR(32)   REFERENCES text.id,
-    icon     VARCHAR(16)   NOT NULL,
-    url      VARCHAR(256)  NOT NULL
-);
-
-CREATE TABLE post (
-    id         INT           AUTO_INCREMENT  PRIMARY KEY,
-    permalink  VARCHAR(300)  NOT NULL,
-    title      VARCHAR(32)   NOT NULL        REFERENCES text.id,
-    text       VARCHAR(32)   NOT NULL        REFERENCES text.id,
-    user       INT           NOT NULL        REFERENCES user.id,
-    dtime      TIMESTAMP     NOT NULL        DEFAULT now(),
-    visible    BOOLEAN       NOT NULL        DEFAULT 1,
-    comments   BOOLEAN       NOT NULL        DEFAULT 1
-);
-
-CREATE TABLE post_tag (
-    post    INT          NOT NULL  REFERENCES post.id,
-    tag     VARCHAR(32)  NOT NULL  REFERENCES text.id,
-    PRIMARY KEY (post, tag)
-);
-
-CREATE TABLE post_image (
-    id     INT           AUTO_INCREMENT  PRIMARY KEY,
-    post   INT           NOT NULL        REFERENCES post.id,
-    idx    INT           NOT NULL,
-    image  VARCHAR(200)  NOT NULL
-);
-
-CREATE TABLE post_comment (
-    id        INT            AUTO_INCREMENT            PRIMARY KEY,
-    post      INT            NOT NULL                  REFERENCES post(id),
-    text      VARCHAR(5000)  NOT NULL,
-    dtime     TIMESTAMP      NOT NULL                  DEFAULT now(),
-    user      INT            REFERENCES user.id,
-    username  VARCHAR(200),
-    lang      VARCHAR(10),
-    approved  BOOLEAN        NOT NULL                  DEFAULT 1,
-    visit     INT            REFERENCES stat_visit.id
-);
-
-CREATE TABLE license (
-    id       VARCHAR(32)  PRIMARY KEY,
-    summary  VARCHAR(32)  NOT NULL     REFERENCES text.id,
-    legal    VARCHAR(32)  NOT NULL     REFERENCES text.id,
-    logo     VARCHAR(32),
-    icon     VARCHAR(32)
-);
-
-CREATE TABLE project_type (
-    id       VARCHAR(1)   NOT NULL  PRIMARY KEY,
-    title    VARCHAR(32)  NOT NULL  REFERENCES text.id,
-    summary  VARCHAR(32)  NOT NULL  REFERENCES text.id
-);
-
-CREATE TABLE project (
-    id         INT           AUTO_INCREMENT         PRIMARY KEY,
-    permalink  VARCHAR(300)  NOT NULL,
-    type       VARCHAR(1)    NOT NULL               REFERENCES project_type.id,
-    title      VARCHAR(32)   NOT NULL               REFERENCES text.id,
-    logo       VARCHAR(32),
-    header     VARCHAR(32)   REFERENCES text.id,
-    text       VARCHAR(32)   REFERENCES text.id,
-    license    VARCHAR(32)   REFERENCES license.id,
-    user       INT           NOT NULL               REFERENCES user.id,
-    visible    BOOLEAN       NOT NULL               DEFAULT 1,
-    comments   BOOLEAN       NOT NULL               DEFAULT 1
-);
-
-CREATE TABLE project_version_type (
-    id       VARCHAR(1)   NOT NULL  PRIMARY KEY,
-    title    VARCHAR(32)  NOT NULL  REFERENCES text.id,
-    summary  VARCHAR(32)  NOT NULL  REFERENCES text.id,
-    color    VARCHAR(7)
-);
-
-CREATE TABLE project_version (
-    project       INT          NOT NULL,
-    version_code  INT          NOT NULL,
-    version_name  VARCHAR(16)  NOT NULL,
-    type          VARCHAR(1)   NOT NULL            REFERENCES project_version_type.id,
-    summary       VARCHAR(32)  NOT NULL            REFERENCES text.id,
-    changelog     VARCHAR(32)  REFERENCES text.id,
-    dtime         DATETIME     NOT NULL            DEFAULT now(),
-    visible       BOOLEAN      NOT NULL            DEFAULT 1,
-    PRIMARY KEY (project, version_code)
-);
-
-CREATE TABLE project_url_type (
-    id       VARCHAR(1)   NOT NULL            PRIMARY KEY,
-    title    VARCHAR(32)  REFERENCES text.id,
-    summary  VARCHAR(32)  REFERENCES text.id,
-    logo     VARCHAR(32)
-);
-
-CREATE TABLE project_url (
-    id       INT            AUTO_INCREMENT  PRIMARY KEY,
-    project  INT            NOT NULL        REFERENCES project.id,
-    type     VARCHAR(1)     NOT NULL        REFERENCES project_url_type,
-    url      VARCHAR(1024)  NOT NULL
-);
-
-CREATE TABLE project_image (
-    id       INT           AUTO_INCREMENT  PRIMARY KEY,
-    project  INT           NOT NULL        REFERENCES project.id,
-    idx      INT           NOT NULL,
-    image    VARCHAR(200)  NOT NULL
-);
-
-CREATE TABLE project_tag (
-    project  INT          NOT NULL  REFERENCES project.id,
-    tag      VARCHAR(32)  NOT NULL  REFERENCES text.id,
-    PRIMARY KEY (project, tag)
-);
-
-CREATE TABLE project_comment (
-    id        INT            AUTO_INCREMENT            PRIMARY KEY,
-    project   INT            NOT NULL                  REFERENCES project(id),
-    version   INT            NOT NULL                  REFERENCES project_version(version_code),
-    text      VARCHAR(5000)  NOT NULL,
-    dtime     TIMESTAMP      NOT NULL                  DEFAULT now(),
-    user      INT            REFERENCES user.id,
-    username  VARCHAR(200),
-    lang      VARCHAR(10),
-    approved  BOOLEAN        NOT NULL                  DEFAULT 1,
-    visit     INT            REFERENCES stat_visit.id
-);
-
-CREATE TABLE cv_category (
-    id        INT          AUTO_INCREMENT      PRIMARY KEY,
-    title     VARCHAR(32)  REFERENCES text.id,
-    summary   VARCHAR(32)  REFERENCES text.id,
-    visible   BOOLEAN      NOT NULL            DEFAULT 1,
-    priority  INT          NOT NULL            UNIQUE
-);
-
-CREATE TABLE cv_entry (
-    id               INT          AUTO_INCREMENT  PRIMARY KEY,
-    category         INT          NOT NULL        REFERENCES cv_category.id,
-    role             VARCHAR(32)  NOT NULL        REFERENCES text.id,
-    company          VARCHAR(64)  NOT NULL,
-    city             VARCHAR(32)  NOT NULL        REFERENCES text.id,
-    start            DATETIME     NOT NULL,
-    end              DATETIME,
-    date_precission  VARCHAR(1)   NOT NULL        DEFAULT 'M',
-    summary          VARCHAR(32)  NOT NULL        REFERENCES text.id,
-    visible          BOOLEAN      NOT NULL        DEFAULT 1
-);
-
-CREATE TABLE settings (
-    name     VARCHAR(64)  PRIMARY KEY,
-    value    VARCHAR(64)  NOT NULL,
-    user     INT          REFERENCES user.id,
-    changed  TIMESTAMP    NOT NULL            DEFAULT now()
-);
-
-CREATE TABLE stat_visit (
-    id       INT           AUTO_INCREMENT  PRIMARY KEY,
-    ip       VARCHAR(50),
-    uagent   VARCHAR(400),
-    os       VARCHAR(150),
-    browser  VARCHAR(150),
-    dtime    TIMESTAMP     NOT NULL  DEFAULT now()
-);
-
-CREATE TABLE stat_view (
-    id       INT           NOT NULL  AUTO_INCREMENT            PRIMARY KEY,
-    visit    INT           NOT NULL  REFERENCES stat_visit.id,
-    section  VARCHAR(80)   NOT NULL,
-    entry    VARCHAR(100)  NOT NULL,
-    dtime    TIMESTAMP     NOT NULL  DEFAULT now()
-);
-CREATE INDEX i_visit ON stat_view(visit, dtime);
-
-

+ 3 - 3
sql/__SETUP.SQL → sql/00_setup.sql

@@ -1,8 +1,8 @@
 -- DB structure.
-SOURCE 00_STRUCTURE.SQL;
+SOURCE 01_structure.sql;
 
 -- DB permissions. Entries are commented by default.
-SOURCE 01_PERMISSIONS.SQL;
+SOURCE 02_security.sql;
 
 -- Initial data.
-SOURCE 02_DATA.SQL;
+SOURCE 03_data.sql;

+ 0 - 37
sql/01_PERMISSIONS.SQL

@@ -1,37 +0,0 @@
--- Replace all instances of XXX with the external site db password (same one as in www/.htaccess).
--- Uncomment all entries.
-
---GRANT SELECT ON         iv.cv_category          TO 'ivext'@'localhost' IDENTIFIED BY 'XXX';
---GRANT SELECT ON         iv.cv_entry             TO 'ivext'@'localhost' IDENTIFIED BY 'XXX';
---GRANT SELECT ON         iv.lang                 TO 'ivext'@'localhost' IDENTIFIED BY 'XXX';
---GRANT SELECT ON         iv.license              TO 'ivext'@'localhost' IDENTIFIED BY 'XXX';
---GRANT SELECT ON         iv.text                 TO 'ivext'@'localhost' IDENTIFIED BY 'XXX';
---GRANT SELECT ON         iv.user                 TO 'ivext'@'localhost' IDENTIFIED BY 'XXX';
---GRANT SELECT ON         iv.post                 TO 'ivext'@'localhost' IDENTIFIED BY 'XXX';
---GRANT SELECT ON         iv.post_tag             TO 'ivext'@'localhost' IDENTIFIED BY 'XXX';
---GRANT SELECT ON         iv.post_image           TO 'ivext'@'localhost' IDENTIFIED BY 'XXX';
---GRANT SELECT, INSERT ON iv.post_comment         TO 'ivext'@'localhost' IDENTIFIED BY 'XXX';
---GRANT SELECT ON         iv.project              TO 'ivext'@'localhost' IDENTIFIED BY 'XXX';
---GRANT SELECT ON         iv.project_type         TO 'ivext'@'localhost' IDENTIFIED BY 'XXX';
---GRANT SELECT ON         iv.project_tag          TO 'ivext'@'localhost' IDENTIFIED BY 'XXX';
---GRANT SELECT ON         iv.project_url          TO 'ivext'@'localhost' IDENTIFIED BY 'XXX';
---GRANT SELECT ON         iv.project_url_type     TO 'ivext'@'localhost' IDENTIFIED BY 'XXX';
---GRANT SELECT ON         iv.project_image        TO 'ivext'@'localhost' IDENTIFIED BY 'XXX';
---GRANT SELECT ON         iv.project_tag          TO 'ivext'@'localhost' IDENTIFIED BY 'XXX';
---GRANT SELECT ON         iv.project_version      TO 'ivext'@'localhost' IDENTIFIED BY 'XXX';
---GRANT SELECT ON         iv.project_version_type TO 'ivext'@'localhost' IDENTIFIED BY 'XXX';
---GRANT SELECT, INSERT ON iv.project_comment      TO 'ivext'@'localhost' IDENTIFIED BY 'XXX';
---GRANT SELECT ON         iv.settings             TO 'ivext'@'localhost' IDENTIFIED BY 'XXX';
---GRANT SELECT ON         iv.share                TO 'ivext'@'localhost' IDENTIFIED BY 'XXX';
---GRANT SELECT, INSERT ON iv.stat_view            TO 'ivext'@'localhost' IDENTIFIED BY 'XXX';
---GRANT SELECT, INSERT ON iv.stat_visit           TO 'ivext'@'localhost' IDENTIFIED BY 'XXX';
---GRANT SELECT ON         iv.social               TO 'ivext'@'localhost' IDENTIFIED BY 'XXX';
-
-
-
-
-
--- Replace YYY with the internal site db password (same one as in www-admin/.htaccess).
--- Uncomment entry.
-
---GRANT SELECT, INSERT, DELETE, UPDATE, SHOW VIEW ON iv.* TO 'ivint'@'localhost' IDENTIFIED BY 'YYY';

+ 119 - 0
sql/01_structure.sql

@@ -0,0 +1,119 @@
+DROP DATABASE IF EXISTS web;
+CREATE DATABASE web CHARACTER SET utf8 COLLATE utf8_bin;
+
+SET NAMES utf8;
+
+CONNECT web;
+
+CREATE TABLE lang (
+    code    VARCHAR(2)   PRIMARY KEY,
+    name    VARCHAR(16)  NOT NULL,
+    active  BOOLEAN      DEFAULT 0
+);
+
+CREATE TABLE text (
+    id       VARCHAR(32),
+    lang     VARCHAR(2)     REFERENCES lang.code,
+    section  VARCHAR(32),
+    text     VARCHAR(5000),
+    file     VARCHAR(32),
+    PRIMARY KEY(id, lang)
+);
+CREATE INDEX i_text ON text(id, lang);
+
+CREATE TABLE share(
+    id       INT           AUTO_INCREMENT PRIMARY KEY,
+    idx      INT           NOT NULL UNIQUE,
+    visible  BOOLEAN       NOT NULL DEFAULT 1,
+    title    VARCHAR(32)   NOT NULL UNIQUE REFERENCES text.id,
+    text     VARCHAR(32)   REFERENCES text.id,
+    icon     VARCHAR(16)   NOT NULL,
+    url      VARCHAR(256)  NOT NULL
+);
+
+CREATE TABLE license (
+    id       VARCHAR(32)  PRIMARY KEY,
+    summary  VARCHAR(32)  NOT NULL REFERENCES text.id,
+    legal    VARCHAR(32)  NOT NULL REFERENCES text.id,
+    logo     VARCHAR(32),
+    icon     VARCHAR(32)
+);
+
+CREATE TABLE project_type (
+    id       VARCHAR(1)   NOT NULL PRIMARY KEY,
+    title    VARCHAR(32)  NOT NULL REFERENCES text.id,
+    summary  VARCHAR(32)  NOT NULL REFERENCES text.id
+);
+
+CREATE TABLE project (
+    id         INT           AUTO_INCREMENT PRIMARY KEY,
+    permalink  VARCHAR(300)  NOT NULL,
+    idx        INT           NOT NULL UNIQUE,
+    type       VARCHAR(1)    NOT NULL REFERENCES project_type.id,
+    title      VARCHAR(32)   NOT NULL REFERENCES text.id,
+    logo       VARCHAR(32),
+    header     VARCHAR(32)   REFERENCES text.id,
+    text       VARCHAR(32)   REFERENCES text.id,
+    license    VARCHAR(32)   REFERENCES license.id,
+    user       INT           NOT NULL REFERENCES user.id,
+    visible    BOOLEAN       NOT NULL DEFAULT 1
+);
+
+CREATE TABLE project_url_type (
+    id       VARCHAR(1)   NOT NULL PRIMARY KEY,
+    title    VARCHAR(32)  REFERENCES text.id,
+    summary  VARCHAR(32)  REFERENCES text.id,
+    logo     VARCHAR(32)
+);
+
+CREATE TABLE project_url (
+    id       INT            AUTO_INCREMENT PRIMARY KEY,
+    project  INT            NOT NULL REFERENCES project.id,
+    type     VARCHAR(1)     NOT NULL REFERENCES project_url_type,
+    url      VARCHAR(1024)  NOT NULL
+);
+
+CREATE TABLE project_image (
+    id       INT           AUTO_INCREMENT PRIMARY KEY,
+    project  INT           NOT NULL REFERENCES project.id,
+    idx      INT           NOT NULL,
+    image    VARCHAR(200)  NOT NULL
+);
+
+CREATE TABLE project_tag (
+    project  INT          NOT NULL REFERENCES project.id,
+    tag      VARCHAR(32)  NOT NULL REFERENCES text.id,
+    PRIMARY KEY (project, tag)
+);
+
+CREATE TABLE cv (
+    id         INT           AUTO_INCREMENT PRIMARY KEY,
+    lang       VARCHAR(2)    REFERENCES lang.code,
+    file       VARCHAR(300)  NOT NULL,
+    visible    BOOLEAN       NOT NULL DEFAULT 1
+);
+
+CREATE TABLE settings (
+    name     VARCHAR(64)  PRIMARY KEY,
+    value    VARCHAR(64)  NOT NULL,
+    changed  TIMESTAMP    NOT NULL DEFAULT now()
+);
+
+CREATE TABLE stat_visit (
+    id       INT           AUTO_INCREMENT PRIMARY KEY,
+    ip       VARCHAR(50),
+    uagent   VARCHAR(400),
+    os       VARCHAR(150),
+    browser  VARCHAR(150),
+    dtime    TIMESTAMP     NOT NULL DEFAULT now()
+);
+
+CREATE TABLE stat_view (
+    id       INT           NOT NULL AUTO_INCREMENT PRIMARY KEY,
+    visit    INT           NOT NULL REFERENCES stat_visit.id,
+    section  VARCHAR(80)   NOT NULL,
+    entry    VARCHAR(100)  NOT NULL,
+    dtime    TIMESTAMP     NOT NULL DEFAULT now()
+);
+CREATE INDEX i_visit ON stat_view(visit, dtime);
+

+ 18 - 0
sql/02_security.sql

@@ -0,0 +1,18 @@
+-- Replace all instances of XXX with the external site db password (same one as in ../application/config/auth.php).
+-- Uncomment all entries.
+
+--GRANT SELECT ON         web.lang             TO 'w'@'localhost' IDENTIFIED BY 'XXX';
+--GRANT SELECT ON         web.license          TO 'w'@'localhost' IDENTIFIED BY 'XXX';
+--GRANT SELECT ON         web.text             TO 'w'@'localhost' IDENTIFIED BY 'XXX';
+--GRANT SELECT ON         web.cv               TO 'w'@'localhost' IDENTIFIED BY 'XXX';
+--GRANT SELECT ON         web.project          TO 'w'@'localhost' IDENTIFIED BY 'XXX';
+--GRANT SELECT ON         web.project_type     TO 'w'@'localhost' IDENTIFIED BY 'XXX';
+--GRANT SELECT ON         web.project_tag      TO 'w'@'localhost' IDENTIFIED BY 'XXX';
+--GRANT SELECT ON         web.project_url      TO 'w'@'localhost' IDENTIFIED BY 'XXX';
+--GRANT SELECT ON         web.project_url_type TO 'w'@'localhost' IDENTIFIED BY 'XXX';
+--GRANT SELECT ON         web.project_image    TO 'w'@'localhost' IDENTIFIED BY 'XXX';
+--GRANT SELECT ON         web.project_tag      TO 'w'@'localhost' IDENTIFIED BY 'XXX';
+--GRANT SELECT ON         web.settings         TO 'w'@'localhost' IDENTIFIED BY 'XXX';
+--GRANT SELECT ON         web.share            TO 'w'@'localhost' IDENTIFIED BY 'XXX';
+--GRANT SELECT, INSERT ON web.stat_view        TO 'w'@'localhost' IDENTIFIED BY 'XXX';
+--GRANT SELECT, INSERT ON web.stat_visit       TO 'w'@'localhost' IDENTIFIED BY 'XXX';

+ 69 - 161
sql/02_DATA.SQL → sql/03_data.sql

@@ -1,7 +1,7 @@
 -- AVAILABLE LANGUAGES
 INSERT INTO lang VALUES ('es', 'Castellano', '1');
 INSERT INTO lang VALUES ('en', 'English', '1');
-INSERT INTO lang VALUES ('eu', 'Euskara', '1');
+INSERT INTO lang VALUES ('eu', 'Euskara', '0');
 
 -- DATE ELEMENTS
 INSERT INTO text VALUES ('MONTH_01', 'es', 'DATE', 'enero', null);
@@ -61,27 +61,17 @@ INSERT INTO text VALUES ('DAY_6', 'eu', 'DATE', 'larunbata', null);
 INSERT INTO text VALUES ('DAY_7', 'es', 'DATE', 'domingo', null);
 INSERT INTO text VALUES ('DAY_7', 'en', 'DATE', 'Sunday', null);
 INSERT INTO text VALUES ('DAY_7', 'eu', 'DATE', 'igandea', null);
-INSERT INTO text VALUES ('CV_DATE_FROM_YEAR', 'es', 'DATE', 'Desde #YEAR_START#', null);
-INSERT INTO text VALUES ('CV_DATE_FROM_YEAR', 'en', 'DATE', 'Since #YEAR_START#', null);
-INSERT INTO text VALUES ('CV_DATE_FROM_YEAR', 'eu', 'DATE', '#YEAR_START#tik', null);
-INSERT INTO text VALUES ('CV_DATE_DURING_YEAR', 'es', 'DATE', '#YEAR_START#', null);
-INSERT INTO text VALUES ('CV_DATE_DURING_YEAR', 'en', 'DATE', '#YEAR_START#', null);
-INSERT INTO text VALUES ('CV_DATE_DURING_YEAR', 'eu', 'DATE', '#YEAR_START#n', null);
-INSERT INTO text VALUES ('CV_DATE_FROM_TO_YEAR', 'es', 'DATE', 'Desde #YEAR_START# hasta #YEAR_END#', null);
-INSERT INTO text VALUES ('CV_DATE_FROM_TO_YEAR', 'en', 'DATE', 'From #YEAR_START# until #YEAR_END#', null);
-INSERT INTO text VALUES ('CV_DATE_FROM_TO_YEAR', 'eu', 'DATE', '#YEAR_START#tik #YEAR_END#ra', null);
-INSERT INTO text VALUES ('CV_DATE_FROM_MONTH', 'es', 'DATE', 'Desde #MONTH_START# de #YEAR_START#', null);
-INSERT INTO text VALUES ('CV_DATE_FROM_MONTH', 'en', 'DATE', 'Since #MONTH_START# #YEAR_START#', null);
-INSERT INTO text VALUES ('CV_DATE_FROM_MONTH', 'eu', 'DATE', '#YEAR_START#ko #MONTH_START#tik', null);
-INSERT INTO text VALUES ('CV_DATE_DURING_MONTH', 'es', 'DATE', '#MONTH_START# de #YEAR_START#', null);
-INSERT INTO text VALUES ('CV_DATE_DURING_MONTH', 'en', 'DATE', '#MONTH_START# #YEAR_START#', null);
-INSERT INTO text VALUES ('CV_DATE_DURING_MONTH', 'eu', 'DATE', '#YEAR_START#ko #MONTH_START#n', null);
-INSERT INTO text VALUES ('CV_DATE_FROM_TO_MONTH', 'es', 'DATE', 'Desde #MONTH_START# de #YEAR_START# hasta #MONTH_END# de #YEAR_END#', null);
-INSERT INTO text VALUES ('CV_DATE_FROM_TO_MONTH', 'en', 'DATE', 'From #MONTH_START# #YEAR_START# until #MONTH_END# #YEAR_END#', null);
-INSERT INTO text VALUES ('CV_DATE_FROM_TO_MONTH', 'eu', 'DATE', '#YEAR_START#ko #MONTH_START#tik #YEAR_END#ko #MONTH_END#ra', null);
-INSERT INTO text VALUES ('CV_DATE_FROM_TO_MONTH_YEAR', 'es', 'DATE', 'Desde #MONTH_START# hasta #MONTH_END# de #YEAR_START#', null);
-INSERT INTO text VALUES ('CV_DATE_FROM_TO_MONTH_YEAR', 'en', 'DATE', 'From #MONTH_START# until #MONTH_END# #YEAR_START#', null);
-INSERT INTO text VALUES ('CV_DATE_FROM_TO_MONTH_YEAR', 'eu', 'DATE', '#YEAR_START#ko #MONTH_START#tik #MONTH_START#ra', null);
+
+-- SECTIONS
+INSERT INTO text VALUES ('SECTION_HOME', 'es', 'SECTION', 'Inicio', null);
+INSERT INTO text VALUES ('SECTION_HOME', 'en', 'SECTION', 'Home', null);
+INSERT INTO text VALUES ('SECTION_HOME', 'eu', 'SECTION', 'Hasiera', null);
+INSERT INTO text VALUES ('SECTION_ME', 'es', 'SECTION', 'Yo', null);
+INSERT INTO text VALUES ('SECTION_ME', 'en', 'SECTION', 'Me', null);
+INSERT INTO text VALUES ('SECTION_ME', 'eu', 'SECTION', 'Ni', null);
+INSERT INTO text VALUES ('SECTION_PROJECTS', 'es', 'SECTION', 'Proyectos', null);
+INSERT INTO text VALUES ('SECTION_PROJECTS', 'en', 'SECTION', 'Projects', null);
+INSERT INTO text VALUES ('SECTION_PROJECTS', 'eu', 'SECTION', 'Proiektuak', null);
 
 -- SOCIAL
 INSERT INTO text VALUES ('SOCIAL_GITHUB', 'es', 'SOCIAL', 'Github', null);
@@ -163,22 +153,20 @@ INSERT INTO text VALUES ('TAG_SWIFT',   'eu', 'TAG', 'Swift', null);
 INSERT INTO text VALUES ('TAG_WEB',     'es', 'TAG', 'Web', null);
 INSERT INTO text VALUES ('TAG_WEB',     'en', 'TAG', 'Web', null);
 INSERT INTO text VALUES ('TAG_WEB',     'eu', 'TAG', 'Web', null);
+INSERT INTO text VALUES ('TAG_CSS',     'es', 'TAG', 'CSS', null);
+INSERT INTO text VALUES ('TAG_CSS',     'en', 'TAG', 'CSS', null);
+INSERT INTO text VALUES ('TAG_CSS',     'eu', 'TAG', 'CSS', null);
+INSERT INTO text VALUES ('TAG_PHP',     'es', 'TAG', 'PHP', null);
+INSERT INTO text VALUES ('TAG_PHP',     'en', 'TAG', 'PHP', null);
+INSERT INTO text VALUES ('TAG_PHP',     'eu', 'TAG', 'PHP', null);
+INSERT INTO text VALUES ('TAG_MYSQL',   'es', 'TAG', 'MySQL', null);
+INSERT INTO text VALUES ('TAG_MYSQL',   'en', 'TAG', 'MySQL', null);
+INSERT INTO text VALUES ('TAG_MYSQL',   'eu', 'TAG', 'MySQL', null);
+INSERT INTO text VALUES ('TAG_SQLITE',  'es', 'TAG', 'SQLite', null);
+INSERT INTO text VALUES ('TAG_SQLITE',  'en', 'TAG', 'SQLite', null);
+INSERT INTO text VALUES ('TAG_SQLITE',  'eu', 'TAG', 'SQLite', null);
 
 
--- PAGE Header
-INSERT INTO text VALUES ('HEADER_HOME',     'es', 'HEADER', 'Inicio', null);
-INSERT INTO text VALUES ('HEADER_PROFILE',  'es', 'HEADER', 'Yo', null);
-INSERT INTO text VALUES ('HEADER_PROJECTS', 'es', 'HEADER', 'Proyectos', null);
-INSERT INTO text VALUES ('HEADER_BLOG',     'es', 'HEADER', 'Blog', null);
-INSERT INTO text VALUES ('HEADER_HOME',     'en', 'HEADER', 'Home', null);
-INSERT INTO text VALUES ('HEADER_PROFILE',  'en', 'HEADER', 'Me', null);
-INSERT INTO text VALUES ('HEADER_PROJECTS', 'en', 'HEADER', 'Projects', null);
-INSERT INTO text VALUES ('HEADER_BLOG',     'en', 'HEADER', 'Blog', null);
-INSERT INTO text VALUES ('HEADER_HOME',     'eu', 'HEADER', 'Hasiera', null);
-INSERT INTO text VALUES ('HEADER_PROFILE',  'eu', 'HEADER', 'Ni', null);
-INSERT INTO text VALUES ('HEADER_PROJECTS', 'eu', 'HEADER', 'Proiektuak', null);
-INSERT INTO text VALUES ('HEADER_BLOG',     'eu', 'HEADER', 'Blog', null);
-
 
 -- PAGE footer
 INSERT INTO text VALUES ('FOOTER_FOLLOW', 'es', 'FOOTER', 'S&iacute;gueme', null);
@@ -193,12 +181,21 @@ INSERT INTO text VALUES ('FOOTER_HELP',   'eu', 'FOOTER', 'Laguntza', null);
 
 
 -- PAGE index
-INSERT INTO text VALUES ('INDEX_LATEST_PROJECTS', 'es', 'INDEX', '&Uacute;ltimos proyectos', null);
-INSERT INTO text VALUES ('INDEX_LATEST_PROJECTS', 'en', 'INDEX', 'Latest projects', null);
-INSERT INTO text VALUES ('INDEX_LATEST_PROJECTS', 'eu', 'INDEX', 'Asken projektuak', null);
-INSERT INTO text VALUES ('INDEX_LATEST_POSTS', 'es', 'INDEX', '&Uacute;ltimos posts', null);
-INSERT INTO text VALUES ('INDEX_LATEST_POSTS', 'en', 'INDEX', 'Latest posts', null);
-INSERT INTO text VALUES ('INDEX_LATEST_POSTS', 'eu', 'INDEX', 'Asken postak', null);
+INSERT INTO text VALUES ('INDEX_PROFILE',      'es', 'INDEX', 'Yo', null);
+INSERT INTO text VALUES ('INDEX_PROFILE',      'en', 'INDEX', 'Me', null);
+INSERT INTO text VALUES ('INDEX_PROFILE',      'eu', 'INDEX', 'Ni', null);
+INSERT INTO text VALUES ('INDEX_PROFILE_MORE', 'es', 'INDEX', 'M&aacute;s sobre mi', null);
+INSERT INTO text VALUES ('INDEX_PROFILE_MORE', 'en', 'INDEX', 'More about me', null);
+INSERT INTO text VALUES ('INDEX_PROFILE_MORE', 'eu', 'INDEX', 'Ni', null);
+INSERT INTO text VALUES ('INDEX_PROFILE_CV',   'es', 'INDEX', 'CV', null);
+INSERT INTO text VALUES ('INDEX_PROFILE_CV',   'en', 'INDEX', 'R&eacute;sum&eacute;', null);
+INSERT INTO text VALUES ('INDEX_PROFILE_CV',   'eu', 'INDEX', 'CV', null);
+INSERT INTO text VALUES ('INDEX_PROJECTS',     'es', 'INDEX', 'Proyectos', null);
+INSERT INTO text VALUES ('INDEX_PROJECTS',     'en', 'INDEX', 'Projects', null);
+INSERT INTO text VALUES ('INDEX_PROJECTS',     'eu', 'INDEX', 'Proiektuak', null);
+INSERT INTO text VALUES ('INDEX_PROJECTS_ALL', 'es', 'INDEX', 'Ver todos', null);
+INSERT INTO text VALUES ('INDEX_PROJECTS_ALL', 'en', 'INDEX', 'See all projects', null);
+INSERT INTO text VALUES ('INDEX_PROJECTS_ALL', 'eu', 'INDEX', 'Ver todos', null);
 
 
 -- PAGE project
@@ -226,6 +223,15 @@ INSERT INTO text VALUES ('PROJECT_VERSION',         'eu', 'PROJECT', 'Versi&oacu
 INSERT INTO text VALUES ('PROJECT_CLOSE',           'es', 'PROJECT', 'Cerrar', null);
 INSERT INTO text VALUES ('PROJECT_CLOSE',           'en', 'PROJECT', 'Close', null);
 INSERT INTO text VALUES ('PROJECT_CLOSE',           'eu', 'PROJECT', 'Itxali', null);
+INSERT INTO text VALUES ('PROJECT_INFO',            'es', 'PROJECT', 'Detalles', null);
+INSERT INTO text VALUES ('PROJECT_INFO',            'en', 'PROJECT', 'Details', null);
+INSERT INTO text VALUES ('PROJECT_INFO',            'eu', 'PROJECT', 'Informazioa', null);
+INSERT INTO text VALUES ('PROJECT_TAGS',            'es', 'PROJECT', 'Tags', null);
+INSERT INTO text VALUES ('PROJECT_TAGS',            'en', 'PROJECT', 'Tags', null);
+INSERT INTO text VALUES ('PROJECT_TAGS',            'eu', 'PROJECT', 'Tags', null);
+INSERT INTO text VALUES ('PROJECT_LICENSE',         'es', 'PROJECT', 'License', null);
+INSERT INTO text VALUES ('PROJECT_LICENSE',         'en', 'PROJECT', 'Licencia', null);
+INSERT INTO text VALUES ('PROJECT_LICENSE',         'eu', 'PROJECT', 'Lizentzia', null);
 INSERT INTO text VALUES ('PROJECT_LICENSE_SUMMARY', 'es', 'PROJECT', 'En resumen:', null);
 INSERT INTO text VALUES ('PROJECT_LICENSE_SUMMARY', 'en', 'PROJECT', 'In a few words:', null);
 INSERT INTO text VALUES ('PROJECT_LICENSE_SUMMARY', 'eu', 'PROJECT', 'En resumen:', null);
@@ -234,54 +240,6 @@ INSERT INTO text VALUES ('PROJECT_LICENSE_LEGAL',   'en', 'PROJECT', 'Full legal
 INSERT INTO text VALUES ('PROJECT_LICENSE_LEGAL',   'eu', 'PROJECT', 'Textu osoa:', null);
 
 
--- PAGE blog
-INSERT INTO text VALUES ('BLOG_TITLE',         'es', 'BLOG', 'Blog', null);
-INSERT INTO text VALUES ('BLOG_TITLE',         'en', 'BLOG', 'Blog', null);
-INSERT INTO text VALUES ('BLOG_TITLE',         'eu', 'BLOG', 'Blog', null);
-INSERT INTO text VALUES ('BLOG_DESCRIPTION',   'es', 'BLOG', '', null); --TODO
-INSERT INTO text VALUES ('BLOG_DESCRIPTION',   'en', 'BLOG', '', null); --TODO
-INSERT INTO text VALUES ('BLOG_DESCRIPTION',   'eu', 'BLOG', '', null); --TODO
-INSERT INTO text VALUES ('BLOG_MORE',          'es', 'BLOG', 'leer m&aacute;s', null);
-INSERT INTO text VALUES ('BLOG_MORE',          'en', 'BLOG', 'read more', null);
-INSERT INTO text VALUES ('BLOG_MORE',          'eu', 'BLOG', 'gehiago irakurri', null);
-INSERT INTO text VALUES ('BLOG_TAGS',          'es', 'BLOG', 'Tags', null);
-INSERT INTO text VALUES ('BLOG_TAGS',          'en', 'BLOG', 'Tags', null);
-INSERT INTO text VALUES ('BLOG_TAGS',          'eu', 'BLOG', 'Tags', null);
-INSERT INTO text VALUES ('BLOG_SEARCH',        'es', 'BLOG', 'Buscar', null);
-INSERT INTO text VALUES ('BLOG_SEARCH',        'en', 'BLOG', 'Search', null);
-INSERT INTO text VALUES ('BLOG_SEARCH',        'eu', 'BLOG', 'Bilatu', null);
-INSERT INTO text VALUES ('BLOG_DETAILS',       'es', 'BLOG', 'Detalles', null);
-INSERT INTO text VALUES ('BLOG_DETAILS',       'en', 'BLOG', 'Details', null);
-INSERT INTO text VALUES ('BLOG_DETAILS',       'eu', 'BLOG', 'Xehentasunak', null);
-INSERT INTO text VALUES ('BLOG_ARCHIVE',       'es', 'BLOG', 'Archivo', null);
-INSERT INTO text VALUES ('BLOG_ARCHIVE',       'en', 'BLOG', 'Archive', null);
-INSERT INTO text VALUES ('BLOG_ARCHIVE',       'eu', 'BLOG', 'Archibo', null);
-INSERT INTO text VALUES ('BLOG_RELATED',       'es', 'BLOG', 'Posts relacionados', null);
-INSERT INTO text VALUES ('BLOG_RELATED',       'en', 'BLOG', 'Related posts', null);
-INSERT INTO text VALUES ('BLOG_RELATED',       'eu', 'BLOG', 'Harramenak', null);
-INSERT INTO text VALUES ('BLOG_SHARE',         'es', 'BLOG', 'Comparte este post', null);
-INSERT INTO text VALUES ('BLOG_SHARE',         'en', 'BLOG', 'Shate this post', null);
-INSERT INTO text VALUES ('BLOG_SHARE',         'eu', 'BLOG', 'Banatu', null);
-INSERT INTO text VALUES ('BLOG_TAG_CLOUD',     'es', 'BLOG', 'Nube de tags', null);
-INSERT INTO text VALUES ('BLOG_TAG_CLOUD',     'en', 'BLOG', 'Tag Cloud', null);
-INSERT INTO text VALUES ('BLOG_TAG_CLOUD',     'eu', 'BLOG', 'Tag Cloud', null);
-INSERT INTO text VALUES ('BLOG_COMMENTS',      'es', 'BLOG', 'Comentarios', null);
-INSERT INTO text VALUES ('BLOG_COMMENTS',      'en', 'BLOG', 'Comments', null);
-INSERT INTO text VALUES ('BLOG_COMMENTS',      'eu', 'BLOG', 'Comentarios', null);
-INSERT INTO text VALUES ('BLOG_COMMENTS_0',    'es', 'BLOG', 'No hay comentarios a&uacute;n.', null);
-INSERT INTO text VALUES ('BLOG_COMMENTS_0',    'en', 'BLOG', 'No comments yet.', null);
-INSERT INTO text VALUES ('BLOG_COMMENTS_0',    'eu', 'BLOG', 'No hay comentarios a&uacute;n.', null);
-INSERT INTO text VALUES ('BLOG_COMMENTS_1',    'es', 'BLOG', 'comentario.', null);
-INSERT INTO text VALUES ('BLOG_COMMENTS_1',    'en', 'BLOG', 'comment.', null);
-INSERT INTO text VALUES ('BLOG_COMMENTS_1',    'eu', 'BLOG', 'comantario.', null);
-INSERT INTO text VALUES ('BLOG_COMMENTS_X',    'es', 'BLOG', 'comentarios.', null);
-INSERT INTO text VALUES ('BLOG_COMMENTS_X',    'en', 'BLOG', 'comments.', null);
-INSERT INTO text VALUES ('BLOG_COMMENTS_X',    'eu', 'BLOG', 'comentarios.', null);
-INSERT INTO text VALUES ('BLOG_COMMENTS_YOUR', 'es', 'BLOG', 'Tu comentario...', null);
-INSERT INTO text VALUES ('BLOG_COMMENTS_YOUR', 'en', 'BLOG', 'Your comment...', null);
-INSERT INTO text VALUES ('BLOG_COMMENTS_YOUR', 'eu', 'BLOG', 'Tu comentario...', null);
-
-
 -- PAGE profile
 INSERT INTO text VALUES ('PROFILE_TITLE',            'es', 'PROFILE', 'Yo', null);
 INSERT INTO text VALUES ('PROFILE_TITLE',            'en', 'PROFILE', 'Me', null);
@@ -295,6 +253,18 @@ INSERT INTO text VALUES ('PROFILE_DOWNLOAD_CURRENT', 'eu', 'PROFILE', 'Euzkaraz
 INSERT INTO text VALUES ('PROFILE_DOWNLOAD_OTHER',   'es', 'PROFILE', 'Descargar en otros idiomas', null);
 INSERT INTO text VALUES ('PROFILE_DOWNLOAD_OTHER',   'en', 'PROFILE', 'Download in other languages', null);
 INSERT INTO text VALUES ('PROFILE_DOWNLOAD_OTHER',   'eu', 'PROFILE', 'Beste hizkuntzetan deskargatu', null);
+INSERT INTO text VALUES ('PROFILE_CV',               'es', 'PROFILE', 'CV', null);
+INSERT INTO text VALUES ('PROFILE_CV',               'en', 'PROFILE', 'R&eacute;sum&eacute;', null);
+INSERT INTO text VALUES ('PROFILE_CV',               'eu', 'PROFILE', 'R&eacute;sum&eacute;', null);
+INSERT INTO text VALUES ('PROFILE_CV_PRINTABLE',     'es', 'PROFILE', 'Ver en formato imprimible', null);
+INSERT INTO text VALUES ('PROFILE_CV_PRINTABLE',     'en', 'PROFILE', 'View printable format', null);
+INSERT INTO text VALUES ('PROFILE_CV_PRINTABLE',     'eu', 'PROFILE', 'R&eacute;sum&eacute;', null);
+INSERT INTO text VALUES ('PROFILE_CV_LANG',          'es', 'PROFILE', 'Otros idiomas', null);
+INSERT INTO text VALUES ('PROFILE_CV_LANG',          'en', 'PROFILE', 'Other languages', null);
+INSERT INTO text VALUES ('PROFILE_CV_LANG',          'eu', 'PROFILE', 'Beste hizkuntzak', null);
+INSERT INTO text VALUES ('PROFILE_SKILLS',           'es', 'PROFILE', 'Habilidades', null);
+INSERT INTO text VALUES ('PROFILE_SKILLS',           'en', 'PROFILE', 'Skills', null);
+INSERT INTO text VALUES ('PROFILE_SKILLS',           'eu', 'PROFILE', 'Habilitateak', null);
 
 
 -- PAGE error
@@ -438,8 +408,8 @@ INSERT INTO project_type VALUES ('S', 'PROJECT_TYPE_S', 'PROJECT_TYPE_S_SUMMARY'
 INSERT INTO text VALUES ('URL_TYPE_W',         'es', 'DB_URL_TYPE', 'Ver sitio web', null);
 INSERT INTO text VALUES ('URL_TYPE_W',         'en', 'DB_URL_TYPE', 'Go to web site', null);
 INSERT INTO text VALUES ('URL_TYPE_W',         'eu', 'DB_URL_TYPE', 'Horrialdera', null);
-INSERT INTO text VALUES ('URL_TYPE_W_SUMMARY', 'es', 'DB_URL_TYPE', 'Ver sitio wew de este proyecto en funcionamiento.', null);
-INSERT INTO text VALUES ('URL_TYPE_W_SUMMARY', 'en', 'DB_URL_TYPE', 'See production web site.', null);
+INSERT INTO text VALUES ('URL_TYPE_W_SUMMARY', 'es', 'DB_URL_TYPE', 'Ver el sitio web.', null);
+INSERT INTO text VALUES ('URL_TYPE_W_SUMMARY', 'en', 'DB_URL_TYPE', 'See web site.', null);
 INSERT INTO text VALUES ('URL_TYPE_W_SUMMARY', 'eu', 'DB_URL_TYPE', 'Horrialdera.', null);
 INSERT INTO text VALUES ('URL_TYPE_P',         'es', 'DB_URL_TYPE', 'Google Play', null);
 INSERT INTO text VALUES ('URL_TYPE_P',         'en', 'DB_URL_TYPE', 'Google Play', null);
@@ -466,35 +436,12 @@ INSERT INTO text VALUES ('URL_TYPE_M_SUMMARY', 'es', 'DB_URL_TYPE', 'Ver', null)
 INSERT INTO text VALUES ('URL_TYPE_M_SUMMARY', 'en', 'DB_URL_TYPE', 'See', null);
 INSERT INTO text VALUES ('URL_TYPE_M_SUMMARY', 'eu', 'DB_URL_TYPE', 'Ikusi', null);
 INSERT INTO project_url_type VALUES ('E', null, null, null);
-INSERT INTO project_url_type VALUES ('W', 'URL_TYPE_W', 'URL_TYPE_W_SUMMARY', 'web.png');
-INSERT INTO project_url_type VALUES ('P', 'URL_TYPE_P', 'URL_TYPE_P_SUMMARY', 'googleplay.png');
-INSERT INTO project_url_type VALUES ('A', 'URL_TYPE_A', 'URL_TYPE_A_SUMMARY', 'appstore.png');
-INSERT INTO project_url_type VALUES ('G', 'URL_TYPE_G', 'URL_TYPE_G_SUMMARY', 'github.png');
-INSERT INTO project_url_type VALUES ('M', 'URL_TYPE_M', 'URL_TYPE_M_SUMMARY', 'misc.png');
-
+INSERT INTO project_url_type VALUES ('W', 'URL_TYPE_W', 'URL_TYPE_W_SUMMARY', 'www.svg');
+INSERT INTO project_url_type VALUES ('P', 'URL_TYPE_P', 'URL_TYPE_P_SUMMARY', 'google_play.svg');
+INSERT INTO project_url_type VALUES ('A', 'URL_TYPE_A', 'URL_TYPE_A_SUMMARY', 'app_store.svg');
+INSERT INTO project_url_type VALUES ('G', 'URL_TYPE_G', 'URL_TYPE_G_SUMMARY', 'github.svg');
+INSERT INTO project_url_type VALUES ('M', 'URL_TYPE_M', 'URL_TYPE_M_SUMMARY', 'misc.svg');
 
--- TABLE project_version_type
-INSERT INTO text VALUES ('VERSION_TYPE_ALPHA',         'es', 'VERSION_TYPE', 'Alfa', null);
-INSERT INTO text VALUES ('VERSION_TYPE_ALPHA',         'en', 'VERSION_TYPE', 'Alpha', null);
-INSERT INTO text VALUES ('VERSION_TYPE_ALPHA',         'eu', 'VERSION_TYPE', 'Alpha', null);
-INSERT INTO text VALUES ('VERSION_TYPE_ALPHA_SUMMARY', 'es', 'VERSION_TYPE', 'En sesarrollo. Inestable.', null);
-INSERT INTO text VALUES ('VERSION_TYPE_ALPHA_SUMMARY', 'en', 'VERSION_TYPE', 'In development. Unstable.', null);
-INSERT INTO text VALUES ('VERSION_TYPE_ALPHA_SUMMARY', 'eu', 'VERSION_TYPE', 'En desarrollo. Inestable', null);
-INSERT INTO text VALUES ('VERSION_TYPE_BETA',          'es', 'VERSION_TYPE', 'Beta', null);
-INSERT INTO text VALUES ('VERSION_TYPE_BETA',          'en', 'VERSION_TYPE', 'Beta', null);
-INSERT INTO text VALUES ('VERSION_TYPE_BETA',          'eu', 'VERSION_TYPE', 'Beta', null);
-INSERT INTO text VALUES ('VERSION_TYPE_BETA_SUMMARY',  'es', 'VERSION_TYPE', 'En pruebas. Parcialmente estable.', null);
-INSERT INTO text VALUES ('VERSION_TYPE_BETA_SUMMARY',  'en', 'VERSION_TYPE', 'Under testing. Stability not guaranteed.', null);
-INSERT INTO text VALUES ('VERSION_TYPE_BETA_SUMMARY',  'eu', 'VERSION_TYPE', 'En pruebas. Parcialmente estable.', null);
-INSERT INTO text VALUES ('VERSION_TYPE_PRO',           'es', 'VERSION_TYPE', 'Estable', null);
-INSERT INTO text VALUES ('VERSION_TYPE_PRO',           'en', 'VERSION_TYPE', 'Stable', null);
-INSERT INTO text VALUES ('VERSION_TYPE_PRO',           'eu', 'VERSION_TYPE', 'Estable', null);
-INSERT INTO text VALUES ('VERSION_TYPE_PRO_SUMMARY',   'es', 'VERSION_TYPE', 'Listo para uso en entorno de producci&oacute;n.', null);
-INSERT INTO text VALUES ('VERSION_TYPE_PRO_SUMMARY',   'en', 'VERSION_TYPE', 'Ready for production.', null);
-INSERT INTO text VALUES ('VERSION_TYPE_PRO_SUMMARY',   'eu', 'VERSION_TYPE', 'Listo para uso en entorno de producci&oacute;n.', null);
-INSERT INTO project_version_type VALUES ('A', 'VERSION_TYPE_ALPHA', 'VERSION_TYPE_ALPHA_SUMMARY', '#ff0000');
-INSERT INTO project_version_type VALUES ('B', 'VERSION_TYPE_BETA',  'VERSION_TYPE_BETA_SUMMARY',  '#ffaa00');
-INSERT INTO project_version_type VALUES ('P', 'VERSION_TYPE_PRO',   'VERSION_TYPE_PRO_SUMMARY',   '#00ff00');
 
 
 -- TABLE license
@@ -510,44 +457,5 @@ INSERT INTO text VALUES ('LICENSE_GPLV3_SUMMARY',    'eu', 'LICENSE', null, 'LIC
 INSERT INTO text VALUES ('LICENSE_GPLV3',            'es', 'LICENSE', null, 'LICENSE_GPLV3__ES');
 INSERT INTO text VALUES ('LICENSE_GPLV3',            'en', 'LICENSE', null, 'LICENSE_GPLV3__EN');
 INSERT INTO text VALUES ('LICENSE_GPLV3',            'eu', 'LICENSE', null, 'LICENSE_GPLV3__EU');
-INSERT INTO license VALUES ('CC-BY-SA', 'LICENSE_CC-BY-SA_SUMMARY', 'LICENSE_CC-BY-SA', 'CC-BY-SA.png', 'CC-BY-SA.png');
-INSERT INTO license VALUES ('GPLv3',    'LICENSE_GPLV3_SUMMARY',    'LICENSE_GPLV3',    'GPLV3.png',    'GPLV3.png');
-
-
--- TABLE cv_category
-INSERT INTO text VALUES ('CV_CATEGORY_WORK',             'es', 'DB_CV', 'Experiencia', null);
-INSERT INTO text VALUES ('CV_CATEGORY_WORK',             'en', 'DB_CV', 'Experience', null);
-INSERT INTO text VALUES ('CV_CATEGORY_WORK',             'eu', 'DB_CV', 'Experiencia', null);
-INSERT INTO text VALUES ('CV_CATEGORY_EDUCATION',        'es', 'DB_CV', 'Formaci&oacute;n', null);
-INSERT INTO text VALUES ('CV_CATEGORY_EDUCATION',        'en', 'DB_CV', 'Hezkuntza', null);
-INSERT INTO text VALUES ('CV_CATEGORY_EDUCATION',        'eu', 'DB_CV', 'Education', null);
-INSERT INTO text VALUES ('CV_CATEGORY_PROJECTS',         'es', 'DB_CV', 'Otros proyectos', null);
-INSERT INTO text VALUES ('CV_CATEGORY_PROJECTS',         'en', 'DB_CV', 'Other projects', null);
-INSERT INTO text VALUES ('CV_CATEGORY_PROJECTS',         'eu', 'DB_CV', 'Beste projecktuak', null);
-INSERT INTO text VALUES ('CV_CATEGORY_PROJECTS_SUMMARY', 'es', 'DB_CV', 'Proyectos de software eralizados por cuenta propia', null);
-INSERT INTO text VALUES ('CV_CATEGORY_PROJECTS_SUMMARY', 'en', 'DB_CV', 'Proyectos de software eralizados por cuenta propia', null);
-INSERT INTO text VALUES ('CV_CATEGORY_PROJECTS_SUMMARY', 'eu', 'DB_CV', 'Proyectos de software eralizados por cuenta propia', null);
-INSERT INTO text VALUES ('CV_CATEGORY_OTHER',            'es', 'DB_CV', 'Otra experiencia laboral', null);
-INSERT INTO text VALUES ('CV_CATEGORY_OTHER',            'en', 'DB_CV', 'Otra experiencia laboral', null);
-INSERT INTO text VALUES ('CV_CATEGORY_OTHER',            'eu', 'DB_CV', 'Otra experiencia laboral', null);
-INSERT INTO text VALUES ('CV_CATEGORY_OTHER_SUMMARY',    'es', 'DB_CV', 'Experiencia laboral fuera del &aacute;mbito de IT', null);
-INSERT INTO text VALUES ('CV_CATEGORY_OTHER_SUMMARY',    'en', 'DB_CV', 'Experiencia laboral fuera del &aacute;mbito de IT', null);
-INSERT INTO text VALUES ('CV_CATEGORY_OTHER_SUMMARY',    'eu', 'DB_CV', 'Experiencia laboral fuera del &aacute;mbito de IT', null);
-INSERT INTO cv_category VALUES (1, 'CV_CATEGORY_WORK',      null,                          1 , 1);
-INSERT INTO cv_category VALUES (2, 'CV_CATEGORY_EDUCATION', null,                          1 , 3);
-INSERT INTO cv_category VALUES (3, 'CV_CATEGORY_PROJECTS', 'CV_CATEGORY_PROJECTS_SUMMARY', 0 , 2);
-INSERT INTO cv_category VALUES (4, 'CV_CATEGORY_OTHER',    'CV_CATEGORY_OTHER_SUMMARY',    1 , 4);
-
-
--- To be filled before installing
-INSERT INTO text VALUES ('USER_NAME', 'es', 'USER', '', null);
-INSERT INTO text VALUES ('USER_NAME', 'en', 'USER', '', null);
-INSERT INTO text VALUES ('USER_NAME', 'eu', 'USER', '', null);
-INSERT INTO text VALUES ('USER_TAGLINE', 'es', 'USER', '', null);
-INSERT INTO text VALUES ('USER_TAGLINE', 'en', 'USER', '', null);
-INSERT INTO text VALUES ('USER_TAGLINE', 'eu', 'USER', '', null);
-INSERT INTO text VALUES ('USER_BIO', 'es', 'USER', '', null);
-INSERT INTO text VALUES ('USER_BIO', 'en', 'USER', '', null);
-INSERT INTO text VALUES ('USER_BIO', 'eu', 'USER', '', null);
-
--- ADD MORE ROWS AS YOU SEE FIT:
+INSERT INTO license VALUES ('CC-BY-SA', 'LICENSE_CC-BY-SA_SUMMARY', 'LICENSE_CC-BY-SA', 'CC-BY-SA.svg', 'CC-BY-SA.svg');
+INSERT INTO license VALUES ('GPLv3',    'LICENSE_GPLV3_SUMMARY',    'LICENSE_GPLV3',    'GPLV3.svg',    'GPLV3.svg');

+ 3 - 3
sql/README.md

@@ -1,7 +1,7 @@
 To create de database:
 
-1) Edit the file 01_STRUCTURE.SQL. Replace both passwords with two of your own. Uncomment all GRANT entries.
+1) Edit the file 01_structure.sql. Replace both passwords with two of your own. Uncomment all GRANT entries.
 
-2) Modify the file 02_DATA.SQL at will to fit your needs.
+2) Modify the file 03_data.sql at will to fit your needs.
 
-3) Run the __SETUP.SQL script.
+3) Run the 00_setup.sql script.

+ 0 - 24
utils/imagescaler

@@ -1,24 +0,0 @@
-#!/bin/bash
-for folder in www/img/*; do
-	if [[ -d $folder ]]; then
-		for file in $folder/*; do
-			if [[ -f $file ]]; then
-				echo $file;
-				for i in {1..32}; do
-					if [ -d $folder/x$i ]; then
-						d=$((i*33))
-						convert "$file" -resize ${d}x${d}  $folder/x$i/${file:${#folder}+1:100}
-					fi
-				done
-			fi
-		done
-	fi
-done;
-
-#for file in *.jpg;do
-#    convert "$file" -resize 800x800  "view/$file"
-#    convert "$file" -resize 600x600  "preview/$file"
-#    convert "$file" -resize 340x340  "miniature/$file"
-#    convert "$file" -resize 180x180  "thumb/$file"
-#done
-

Some files were not shown because too many files changed in this diff