Browse Source

Added Julio changes over exercise_attempt().

Conflicts:
  main/inc/lib/events.lib.inc.php
    Use Julio's version, except for one documentation string.
Marco Villegas 11 years ago
parent
commit
bec64e9e43
100 changed files with 4155 additions and 4732 deletions
  1. 7 1
      .gitignore
  2. 6 2
      .htaccess
  3. 20 15
      composer.json
  4. 306 175
      composer.lock
  5. 0 0
      config/auth.conf.dist.php
  6. 154 0
      config/configuration.dist.php
  7. 45 0
      config/configuration.dist.yml.php
  8. 66 0
      config/events.conf.dist.php
  9. 16 0
      config/mail.conf.dist.php
  10. 0 0
      config/portfolio.conf.dist.php
  11. 0 0
      config/profile.conf.dist.php
  12. 74 53
      console.php
  13. 6 1
      documentation/installation_guide.html
  14. 6 2
      htaccess-dist
  15. 2 2
      main/admin/access_url_edit_courses_to_url.php
  16. 21 21
      main/admin/access_url_edit_users_to_url.php
  17. 34 33
      main/admin/access_urls.php
  18. 0 2
      main/admin/calendar.lib.php
  19. 5 5
      main/admin/configure_extensions.php
  20. 16 25
      main/admin/course_create_content.php
  21. 14 7
      main/admin/course_list.php
  22. 3 3
      main/admin/extra_field_workflow.php
  23. 7 7
      main/admin/extra_fields.php
  24. 3 3
      main/admin/session_course_list.php
  25. 1 0
      main/admin/settings.php
  26. 7 6
      main/admin/special_exports.php
  27. 6 5
      main/admin/subscribe_user2course.php
  28. 2 2
      main/admin/user_fields.php
  29. 2 2
      main/admin/user_list.php
  30. 5 5
      main/admin/user_move_stats.php
  31. 2 2
      main/auth/shibboleth/init.php
  32. 3 3
      main/calendar/agenda.inc.php
  33. 64 10
      main/calendar/agenda.lib.php
  34. 7 7
      main/calendar/myagenda.inc.php
  35. 17 17
      main/calendar/myagenda.php
  36. 62 62
      main/course_description/course_description.class.php
  37. 3 2
      main/course_progress/index.php
  38. 19 10
      main/course_progress/thematic_controller.php
  39. 6 3
      main/coursecopy/classes/CourseBuilder.class.php
  40. 1 1
      main/coursecopy/classes/CourseRestorer.class.php
  41. 1 1
      main/coursecopy/classes/DummyCourseCreator.class.php
  42. 1 0
      main/css/base.css
  43. BIN
      main/css/font/FontAwesome.otf
  44. BIN
      main/css/font/fontawesome-webfont.eot
  45. 0 195
      main/css/font/fontawesome-webfont.svg
  46. BIN
      main/css/font/fontawesome-webfont.ttf
  47. BIN
      main/css/font/fontawesome-webfont.woff
  48. 983 0
      main/css/font_awesome/css/font-awesome-ie7.css
  49. 23 0
      main/css/font_awesome/css/font-awesome-ie7.min.css
  50. 1268 0
      main/css/font_awesome/css/font-awesome.css
  51. 23 0
      main/css/font_awesome/css/font-awesome.min.css
  52. 0 1063
      main/css/font_awesome/font-awesome-ie7.min.css
  53. 0 1322
      main/css/font_awesome/font-awesome.css
  54. 0 1230
      main/css/font_awesome/font-awesome.min.css
  55. BIN
      main/css/font_awesome/font/FontAwesome.otf
  56. BIN
      main/css/font_awesome/font/fontawesome-webfont.eot
  57. 195 0
      main/css/font_awesome/font/fontawesome-webfont.svg
  58. BIN
      main/css/font_awesome/font/fontawesome-webfont.ttf
  59. BIN
      main/css/font_awesome/font/fontawesome-webfont.woff
  60. 2 2
      main/dropbox/dropbox_functions.inc.php
  61. 1 1
      main/dropbox/dropbox_init.inc.php
  62. 11 12
      main/exercice/admin.php
  63. 6 2
      main/exercice/exercice.php
  64. 162 63
      main/exercice/exercise.class.php
  65. 2 2
      main/exercice/exercise_history.php
  66. 1 1
      main/exercice/exercise_reminder.php
  67. 32 41
      main/exercice/exercise_report.php
  68. 7 7
      main/exercice/exercise_result.class.php
  69. 1 1
      main/exercice/exercise_result.php
  70. 2 2
      main/exercice/exercise_show.php
  71. 22 23
      main/exercice/exercise_submit.php
  72. 3 3
      main/exercice/hotpotatoes_exercise_report.php
  73. 4 4
      main/exercice/hotpotatoes_exercise_result.class.php
  74. 1 1
      main/exercice/hotspot_answers.as.php
  75. 1 1
      main/exercice/hotspot_savescore.inc.php
  76. 1 1
      main/exercice/hotspot_updatescore.inc.php
  77. 1 1
      main/exercice/mark_free_answer.php
  78. 1 0
      main/exercice/media.php
  79. 1 1
      main/exercice/overview.php
  80. 55 23
      main/exercice/question.class.php
  81. 0 2
      main/exercice/question_admin.inc.php
  82. 5 3
      main/exercice/question_list_admin.inc.php
  83. 2 2
      main/exercice/question_list_pagination_admin.inc.php
  84. 2 2
      main/exercice/savescores.php
  85. 18 16
      main/exercice/testcategory.class.php
  86. 6 6
      main/exercice/tests_category.php
  87. 1 1
      main/forum/forumfunction.inc.php
  88. 1 1
      main/gradebook/exercise_jump.php
  89. 3 3
      main/gradebook/gradebook_result.class.php
  90. 1 1
      main/gradebook/index.php
  91. 262 179
      main/gradebook/lib/be/category.class.php
  92. 2 2
      main/gradebook/lib/be/exerciselink.class.php
  93. 2 2
      main/gradebook/lib/fe/displaygradebook.php
  94. 2 2
      main/gradebook/lib/fe/gradebooktable.class.php
  95. BIN
      main/img/icons/22/dropbox.png
  96. BIN
      main/img/icons/32/dropbox.png
  97. 1 1
      main/inc/ajax/agenda.ajax.php
  98. 7 5
      main/inc/ajax/exercise.ajax.php
  99. 2 2
      main/inc/ajax/message.ajax.php
  100. 9 5
      main/inc/ajax/thematic.ajax.php

+ 7 - 1
.gitignore

@@ -1,7 +1,13 @@
 # Chamilo
 
 main/inc/conf
-config/*
+config/auth.conf.php
+config/configuration.php
+config/events.conf.php
+config/mail.conf.php
+config/portfolio.conf.php
+config/profile.conf.php
+
 temp/*
 data/*
 !data/upload/users

+ 6 - 2
.htaccess

@@ -15,10 +15,14 @@
     RewriteRule ^courses/(.*)/index.php$ web/courses/$1? [R,L]
     RewriteRule ^courses/(.*)/$ web/courses/$1? [R,L]
 
-   # Courses documents
-    # courses/MATHS/document/folder1/picture.jpg --> courses/MATHS/document/?file=folder1/picture.jpg
+    # Courses documents
+    # courses/MATHS/document/folder1/picture.jpg --> web/data/courses/MATHS/document/folder1/picture.jpg
     RewriteRule ^courses/(.*)/document/(.*)$ web/data/courses/$1/document/$2 [R,L]
 
+    # SCORM documents
+    # courses/MATHS/scorm/folder1/picture.jpg --> web/data/courses/MATHS/scorm/folder1/picture.jpg
+    RewriteRule ^courses/(.*)/scorm/(.*)$ web/data/courses/$1/scorm/$2 [R,L]
+
     # Certificates
     # Redirection: certificates/index.php?id=123 -> web/certificates/123
     RewriteCond %{QUERY_STRING} ^id=([0-9]*)

+ 20 - 15
composer.json

@@ -1,7 +1,8 @@
 {
-    "name" : "chamilo/chamilo-lms",
-    "homepage" : "www.chamilo.org",
-    "license" : "GPL-3.0",
+    "name": "chamilo/chamilo-lms",
+    "type": "project",
+    "homepage": "www.chamilo.org",
+    "license": "GPL-3.0",
     "support": {
         "forum": "http://www.chamilo.org/forum",
         "irc": "irc://irc.freenode.org/chamilo"
@@ -34,22 +35,24 @@
         {
             "type": "vcs",
             "url": "https://github.com/jmontoyaa/silex-pagerfanta-provider"
+        },
+        {
+            "type": "vcs",
+            "url": "https://github.com/ThePixelDeveloper/ConsoleServiceProvider"
         }
     ],
     "require": {
         "php": ">=5.3.2",
         "silex/silex": "~1.0",
-        "symfony/config": "2.2.*@dev",
-        "symfony/yaml": "2.1.*@dev",
-        "symfony/console"  : "2.3.*@dev",
-        "symfony/twig-bridge": "2.2.*@dev",
+        "symfony/console"  : "~2.3",
+        "symfony/twig-bridge": "~2.3",
         "symfony/doctrine-bridge": "2.3.*@dev",
-        "symfony/security": "2.3.*@dev",
-        "symfony/form": "2.2.*@dev",
+        "symfony/security": "~2.3",
+        "symfony/form": "~2.3",
         "symfony/property-access": "2.3.*@dev",
-        "symfony/validator": "2.3.*@dev",
-        "symfony/translation": "2.3.*@dev",
-        "symfony/dependency-injection": "2.3.*@dev",
+        "symfony/validator": "~2.3",
+        "symfony/translation": "~2.3",
+        "symfony/dependency-injection": "~2.3",
         "monolog/monolog" : ">=1.0.0",
         "twig/twig": ">=1.8,<2.0-dev",
         "dflydev/doctrine-orm-service-provider": "1.0.*@dev",
@@ -59,16 +62,17 @@
         "swiftmailer/swiftmailer": ">=4.1.2,<4.2-dev",
         "pagerfanta/pagerfanta": "dev-master",
         "franmomu/silex-pagerfanta-provider": "2.3.*@dev",
-        "knplabs/knp-menu": "2.0.*@dev",
         "igorw/config-service-provider": "1.0.*@dev",
         "mpdf/mpdf": "v5.6.1",
         "ezyang/htmlpurifier": "v4.5.0",
         "realityking/pchart": "dev-master",
         "imagine/imagine": "dev-develop",
         "grom/silex-service-provider": "dev-master",
+        "knplabs/knp-menu": "2.0.*@dev",
         "knplabs/knp-snappy": "dev-master",
-        "jmontoyaa/phpqrcode": "dev-master",
+        "knplabs/console-service-provider": "dev-master",
         "knplabs/gaufrette": "0.2.*@dev",
+        "jmontoyaa/phpqrcode": "dev-master",
         "bt51/gaufrette-serviceprovider": "dev-master",
         "neutron/silex-filesystem-provider": "dev-master",
         "jbroadway/urlify": "dev-master"
@@ -79,7 +83,8 @@
         "silex/web-profiler": "1.0.x-dev",
         "natxet/CssMin": "dev-master",
         "leafo/lessphp": "dev-master",
-        "mheap/silex-assetic": "dev-master"
+        "mheap/silex-assetic": "1.0.*@dev",
+        "filp/whoops": "dev-master"
     },
     "scripts": {
         "post-install-cmd": "ChamiloLMS\\Composer\\Tasks::postInstall",

File diff suppressed because it is too large
+ 306 - 175
composer.lock


+ 0 - 0
main/inc/conf/auth.conf.dist.php → config/auth.conf.dist.php


+ 154 - 0
config/configuration.dist.php

@@ -0,0 +1,154 @@
+<?php
+// Chamilo version {NEW_VERSION}
+// File generated by /install/index.php script - {DATE_GENERATED}
+/* For licensing terms, see /license.txt */
+/**
+ *		Chamilo configuration
+ *
+ * This file contains a list of variables that can be modified by the campus
+ * site's server administrator. Pay attention when changing these variables,
+ * some changes may cause Chamilo to stop working.
+ * If you changed some settings and want to restore them, please have a look at
+ * configuration.dist.php. That file is an exact copy of the config file at
+ * install time.
+ */
+
+/**
+ * $_configuration define only the bare essential variables
+ * for configuring the platform (paths, database connections, ...).
+ * Changing a $_configuration variable CAN generally break the installation.
+ * Besides the $_configuration, a $_settings array also exists, that
+ * contains variables that can be changed and will not break the platform.
+ * These optional settings are defined in the database, now (table settings_current).
+ */
+
+/**
+ * Database settings
+ */
+// Host
+$_configuration['db_host']     = '{DATABASE_HOST}';
+// Username
+$_configuration['db_user']     = '{DATABASE_USER}';
+// Password
+$_configuration['db_password'] = '{DATABASE_PASSWORD}';
+// Driver
+$_configuration['db_driver']   = '{DATABASE_DRIVER}';
+// Database name
+$_configuration['main_database'] = '{DATABASE_MAIN}';
+
+/** Directory settings */
+// URL to the root of your Chamilo installation, e.g.: http://www.mychamilo.com/
+$_configuration['root_web']    = '{ROOT_WEB}';
+
+/** Chamilo will automatically manage all this paths */
+
+// Path to the webroot of system, example: /var/www/chamilo
+//$_configuration['root_sys'] = '{ROOT_SYS}';
+
+// Path to the data folder, example /var/www/chamilo/data
+//$_configuration['sys_data_path'] = null;
+
+// Path to the config folder, example /var/www/chamilo/config
+//$_configuration['sys_config_path'] = null;
+
+// Path to the temp folder, example /var/www/chamilo/temp
+//$_configuration['sys_temp_path'] = null;
+
+// Path to the logs folder, example /var/www/chamilo/logs
+//$_configuration['sys_log_path'] = null;
+
+// URL to your phpMyAdmin installation.
+// If not empty, a link will be available in the Platform Administration
+$_configuration['db_admin_path']  = '';
+
+/** Login modules settings */
+// CAS IMPLEMENTATION
+// -> Go to your portal Chamilo > Administration > CAS to activate CAS
+// You can leave these lines uncommented even if you don't use CAS authentification
+//$extAuthSource["cas"]["login"] = $_configuration['root_sys'].$_configuration['code_append']."auth/cas/login.php";
+//$extAuthSource["cas"]["newUser"] = $_configuration['root_sys'].$_configuration['code_append']."auth/cas/newUser.php";
+//
+// NEW LDAP IMPLEMENTATION BASED ON external_login info
+// -> Uncomment the two lines bellow to activate LDAP AND edit main/auth/external_login/ldap.conf.php for configuration
+// $extAuthSource["extldap"]["login"] = $_configuration['root_sys'].$_configuration['code_append']."auth/external_login/login.ldap.php";
+// $extAuthSource["extldap"]["newUser"] = $_configuration['root_sys'].$_configuration['code_append']."auth/external_login/newUser.ldap.php";
+//
+// FACEBOOK IMPLEMENTATION BASED ON external_login info
+// -> Uncomment the line bellow to activate Facebook Auth AND edit main/auth/external_login/ldap.conf.php for configuration
+// $_configuration['facebook_auth'] = 1;
+//
+// OTHER EXTERNAL LOGIN INFORMATION
+// To fetch external login information, uncomment those 2 lines and modify  files auth/external_login/newUser.php and auth/external_login/updateUser.php files
+// $extAuthSource["external_login"]["newUser"] = $_configuration['root_sys'].$_configuration['code_append']."auth/external_login/newUser.php";
+// $extAuthSource["external_login"]["updateUser"] = $_configuration['root_sys'].$_configuration['code_append']."auth/external_login/updateUser.php";
+
+/**
+ *
+ * Hosting settings - Allows you to set limits to the Chamilo portal when
+ * hosting it for a third party. These settings can be overwritten by an
+ * optionally-loaded extension file with only the settings (no comments).
+ * The settings use an index at the first level to represent the ID of the
+ * URL in case you use multi-url (otherwise it will always use 1, which is
+ * the ID of the only URL inside the access_url table).
+ */
+// Set a maximum number of users. Default (0) = no limit
+$_configuration[1]['hosting_limit_users'] = 0;
+// Set a maximum number of teachers. Default (0) = no limit
+$_configuration[1]['hosting_limit_teachers'] = 0;
+// Set a maximum number of courses. Default (0) = no limit
+$_configuration[1]['hosting_limit_courses'] = 0;
+// Set a maximum number of sessions. Default (0) = no limit
+$_configuration[1]['hosting_limit_sessions'] = 0;
+// Set a maximum disk space used, in MB (set to 1024 for 1GB, 5120 for 5GB).
+// Default (0) = no limit
+$_configuration[1]['hosting_limit_disk_space'] = 0;
+
+/**
+ * Content Delivery Network (CDN) settings. Only use if you need a separate
+ * server to serve your static data. If you don't know what a CDN is, you
+ * don't need it. These settings are for simple Origin Pull CDNs and are
+ * experimental. Enable only if you really know what you're doing.
+ * This might conflict with multiple-access urls.
+ */
+// Set the following setting to true to start using the CDN
+$_configuration['cdn_enable'] = false;
+// The following setting will be ignored if the previous one is set to false
+$_configuration['cdn'] = array(
+  //You can define several CDNs and split them by extensions
+  //Replace the following by your full CDN URL, which should point to
+  // your Chamilo's root directory. DO NOT INCLUDE a final slash! (won't work)
+  'http://cdn.chamilo.org' => array('.css','.js','.jpg','.jpeg','.png','.gif','.avi','.flv'),
+  // copy the line above and modify following your needs
+);
+
+/**
+ * Session settings
+ */
+// You may have to restart your web server if you change this
+$_configuration['session_stored_in_db'] = false;
+// Session lifetime
+$_configuration['session_lifetime'] = SESSION_LIFETIME;
+
+/** Security */
+// Security word for password recovery
+$_configuration['security_key'] = '{SECURITY_KEY}';
+// Hash function method
+$_configuration['password_encryption'] = '{ENCRYPT_PASSWORD}';
+//Deny the elimination of users
+$_configuration['deny_delete_users'] = false;
+//Prevent all admins from using the "login_as" feature
+$_configuration['login_as_forbidden_globally'] = false;
+
+/** Multiple URL */
+// Activation for multi-url access
+//$_configuration['multiple_access_urls'] = true;
+
+/** Chamilo version settings */
+$_configuration['system_version']    = '{NEW_VERSION}';
+$_configuration['system_stable']     = NEW_VERSION_STABLE;
+$_configuration['software_name']     = 'Chamilo';
+$_configuration['software_url']	     = 'http://www.chamilo.org/';
+
+/** Chamilo dev settings */
+$_configuration['debug']             = false;
+$_configuration['show_profiler']     = false;

+ 45 - 0
config/configuration.dist.yml.php

@@ -0,0 +1,45 @@
+<?php
+/** This script is only use when using the console.php chamilo:install command */
+/**
+ * Database settings
+ */
+// Your MySQL server
+$_configuration['db_host']     = 'localhost';
+// Your MySQL username
+$_configuration['db_user']     = 'root';
+// Your MySQL password
+$_configuration['db_password'] = 'root';
+
+// Prefix for course tables (IF NOT EMPTY, can be replaced by another prefix, else leave empty)
+/*$_configuration['table_prefix']          = '';
+// prefix all created bases (for courses) with this string
+$_configuration['db_prefix']             = '';*/
+// main Chamilo database
+$_configuration['main_database']         = 'chamilo';
+
+/**
+ * Directory settings
+ */
+// URL to the root of your Chamilo installation, e.g.: http://www.mychamilo.com/
+$_configuration['root_web']       = 'http://localhost/chamilo';
+$_configuration['root_sys']       = '/var/www/chamilo';
+
+/**
+ * Misc. settings
+ */
+// Security word for password recovery
+$_configuration['security_key']      = md5(uniqid(rand().time()));
+// Hash function method
+$_configuration['password_encryption']      = 'sha1';
+// You may have to restart your web server if you change this
+$_configuration['session_stored_in_db']     = false;
+// Session lifetime
+$_configuration['session_lifetime']         = 3600;
+// Activation for multi-url access
+//$_configuration['multiple_access_urls']   = true;
+//Deny the elimination of users
+$_configuration['deny_delete_users']        = false;
+//Prevent all admins from using the "login_as" feature
+$_configuration['login_as_forbidden_globally'] = false;
+// Version settings
+$_configuration['system_version']           = '1.10.0';

+ 66 - 0
config/events.conf.dist.php

@@ -0,0 +1,66 @@
+<?php
+/* For licensing terms, see /license.txt */
+
+/**
+ * Events' configuration
+ * Used to configure each event and to link them to functions the event'll fire.
+ * The flow is like the following :
+ * 1. somewhere in the application an event is fired
+ * 2. that event is intercepted by the switch EventsDispatcher
+ * 3. that switch will go all over the "actions" in the event_config initialized beneath us according to the event
+ * 4. that switch will see if the function actually exists (if not, we get dont do anything)
+ * 5. then it will see if a filter for that function exists (if it does, the filter is executed)
+ * 6. if the filter says it's ok, the function linked to the event is executed
+ * 7. and that function will actually call the truly interesting function with the good require_once
+ */
+global $event_config;
+
+$event_config = array(
+    'portal_homepage_edited' => array( // key for "user registration" event
+        'actions' => array( // we link this event to a bunch of functions that will be triggered when the event is fired
+            'event_send_mail' // don't forget to actually write this function in the events.lib.php file
+        ),
+        'self_sent' => false, // this key states that we can't add user to this event through the admin panel
+        'name_lang_var' => 'PortalHomepageEdited',
+        'desc_lang_var' => 'PortalHomepageEdited',
+        'available_keyvars' => array (// keys used for the mail template
+            'url'           => 'portal',
+            'sitename'      => 'sitename',
+            'firstname'     => 'firstname',
+            'lastname'      => 'lastname',
+            'username'      => 'username',
+            'usermail'      => 'usermail',
+            'password'      => 'password',
+            'user_lang'     => 'language',
+            'admin_name'    => 'administrator_name',
+            'admin_surname' => 'administrator_surname',
+            'admin_phone'   => 'administrator_phone',
+            'admin_email'   => 'administrator_email',
+        )
+    ),
+    'user_registration' => array( // key for "user registration" event
+        'actions' => array( // we link this event to a bunch of functions that will be triggered when the event is fired
+            'event_send_mail' // don't forget to actually write this function in the events.lib.php file
+        ),
+        'self_sent' => true, // this key states that we can't add user to this event through the admin panel
+        'name_lang_var' => 'UserRegistrationTitle',
+        'desc_lang_var' => 'UserRegistrationComment',
+        'available_keyvars' => array (// keys used for the mail template
+            'url'           => 'portal',
+            'sitename'      => 'sitename',
+            'firstname'     => 'firstname',
+            'lastname'      => 'lastname',
+            'username'      => 'username',
+            'usermail'      => 'usermail',
+            'password'      => 'password',
+            'user_lang'     => 'language',
+            'admin_name'    => 'administrator_name',
+            'admin_surname' => 'administrator_surname',
+            'admin_phone'   => 'administrator_phone',
+            'admin_email'   => 'administrator_email',
+        )
+    ),
+);
+
+
+//@include 'events.conf.local.php';

+ 16 - 0
config/mail.conf.dist.php

@@ -0,0 +1,16 @@
+<?php
+
+/**
+ *	This file holds the email configuration settings
+ *	@package chamilo.configuration
+ */
+
+$platform_email['SMTP_FROM_EMAIL']   = (isset($administrator['email'])?$administrator['email']:'admin@example.com');
+$platform_email['SMTP_FROM_NAME']    = (isset($administrator['name'])?$administrator['name']:'Admin');
+$platform_email['SMTP_HOST']         = 'localhost';
+$platform_email['SMTP_PORT']         = 25;
+$platform_email['SMTP_MAILER']       = 'mail'; // mail, sendmail or smtp
+$platform_email['SMTP_AUTH']         = 0;
+$platform_email['SMTP_USER']         = '';
+$platform_email['SMTP_PASS']         = '';
+$platform_email['SMTP_CHARSET']      = 'UTF-8';

+ 0 - 0
main/inc/conf/portfolio.conf.dist.php → config/portfolio.conf.dist.php


+ 0 - 0
main/inc/conf/profile.conf.dist.php → config/profile.conf.dist.php


+ 74 - 53
console.php

@@ -8,67 +8,88 @@ if (PHP_SAPI != 'cli') {
     die("Cannot be called by any other method than the command line.");
 }
 
-require_once dirname(__FILE__).'/main/inc/global.inc.php';
+$app = require_once dirname(__FILE__).'/main/inc/global.inc.php';
+
+use Knp\Provider\ConsoleServiceProvider;
+
+$app->register(
+    new ConsoleServiceProvider(),
+    array(
+        'console.name'              => 'Chamilo CLI',
+        'console.version'           => '1.0.0',
+        'console.project_directory' => __DIR__.'/..'
+    )
+);
+
 
 // Variable $helperSet is defined inside cli-config.php
-require __DIR__.'/console-config.php';
+//require __DIR__.'/console-config.php';
+//$cli = new \Symfony\Component\Console\Application('Chamilo CLI');
+
+// Adding commands.
+/** @var Knp\Console\Application $cli */
+$cli = $app['console'];
 
-$cli = new \Symfony\Component\Console\Application('Chamilo CLI');
 $cli->setCatchExceptions(true);
 
+$helpers = array(
+    'configuration' => new Chash\Helpers\ConfigurationHelper()
+);
 $helperSet = $cli->getHelperSet();
 foreach ($helpers as $name => $helper) {
     $helperSet->set($helper, $name);
 }
 
-$cli->addCommands(array(
-    // DBAL Commands
-    new \Doctrine\DBAL\Tools\Console\Command\RunSqlCommand(),
-    new \Doctrine\DBAL\Tools\Console\Command\ImportCommand(),
-
-    // ORM Commands
-    new \Doctrine\ORM\Tools\Console\Command\ClearCache\MetadataCommand(),
-    new \Doctrine\ORM\Tools\Console\Command\ClearCache\ResultCommand(),
-    new \Doctrine\ORM\Tools\Console\Command\ClearCache\QueryCommand(),
-    new \Doctrine\ORM\Tools\Console\Command\SchemaTool\CreateCommand(),
-    new \Doctrine\ORM\Tools\Console\Command\SchemaTool\UpdateCommand(),
-    new \Doctrine\ORM\Tools\Console\Command\SchemaTool\DropCommand(),
-    new \Doctrine\ORM\Tools\Console\Command\EnsureProductionSettingsCommand(),
-    new \Doctrine\ORM\Tools\Console\Command\ConvertDoctrine1SchemaCommand(),
-    new \Doctrine\ORM\Tools\Console\Command\GenerateRepositoriesCommand(),
-    new \Doctrine\ORM\Tools\Console\Command\GenerateEntitiesCommand(),
-    new \Doctrine\ORM\Tools\Console\Command\GenerateProxiesCommand(),
-    new \Doctrine\ORM\Tools\Console\Command\ConvertMappingCommand(),
-    new \Doctrine\ORM\Tools\Console\Command\RunDqlCommand(),
-    new \Doctrine\ORM\Tools\Console\Command\ValidateSchemaCommand(),
-
-    // Migrations Commands
-    new \Doctrine\DBAL\Migrations\Tools\Console\Command\DiffCommand(),
-    new \Doctrine\DBAL\Migrations\Tools\Console\Command\ExecuteCommand(),
-    new \Doctrine\DBAL\Migrations\Tools\Console\Command\GenerateCommand(),
-    new \Doctrine\DBAL\Migrations\Tools\Console\Command\MigrateCommand(),
-    new \Doctrine\DBAL\Migrations\Tools\Console\Command\StatusCommand(),
-    new \Doctrine\DBAL\Migrations\Tools\Console\Command\VersionCommand(),
-
-    //Chamilo commands
-    new ChamiloLMS\Command\Database\UpgradeCommand(),
-    new ChamiloLMS\Command\Database\InstallCommand(),
-    //new ChamiloLMS\Command\Database\InstallExtendCommand(),
-    new ChamiloLMS\Command\Database\StatusCommand(),
-    new ChamiloLMS\Command\Database\SetupCommand(),
-
-    //new ChamiloLMS\Command\Template\AsseticDumpCommand(),
-
-    // Chash commands
-    new Chash\Command\Database\RunSQLCommand(),
-    new Chash\Command\Database\DumpCommand(),
-    new Chash\Command\Database\RestoreCommand(),
-    new Chash\Command\Database\SQLCountCommand(),
-    new Chash\Command\Database\FullBackupCommand(),
-    new Chash\Command\Database\DropDatabaseCommand(),
-    new Chash\Command\Files\CleanTempFolderCommand(),
-    new Chash\Command\Files\CleanConfigFiles(),
-    new Chash\Command\Translation\ExportLanguageCommand(),
-    new Chash\Command\Translation\ImportLanguageCommand()
-));
+$cli->addCommands(
+    array(
+        // DBAL Commands.
+        new \Doctrine\DBAL\Tools\Console\Command\RunSqlCommand(),
+        new \Doctrine\DBAL\Tools\Console\Command\ImportCommand(),
+
+        // ORM Commands.
+        new \Doctrine\ORM\Tools\Console\Command\ClearCache\MetadataCommand(),
+        new \Doctrine\ORM\Tools\Console\Command\ClearCache\ResultCommand(),
+        new \Doctrine\ORM\Tools\Console\Command\ClearCache\QueryCommand(),
+        new \Doctrine\ORM\Tools\Console\Command\SchemaTool\CreateCommand(),
+        new \Doctrine\ORM\Tools\Console\Command\SchemaTool\UpdateCommand(),
+        new \Doctrine\ORM\Tools\Console\Command\SchemaTool\DropCommand(),
+        new \Doctrine\ORM\Tools\Console\Command\EnsureProductionSettingsCommand(),
+        new \Doctrine\ORM\Tools\Console\Command\ConvertDoctrine1SchemaCommand(),
+        new \Doctrine\ORM\Tools\Console\Command\GenerateRepositoriesCommand(),
+        new \Doctrine\ORM\Tools\Console\Command\GenerateEntitiesCommand(),
+        new \Doctrine\ORM\Tools\Console\Command\GenerateProxiesCommand(),
+        new \Doctrine\ORM\Tools\Console\Command\ConvertMappingCommand(),
+        new \Doctrine\ORM\Tools\Console\Command\RunDqlCommand(),
+        new \Doctrine\ORM\Tools\Console\Command\ValidateSchemaCommand(),
+
+        // Migrations Commands.
+        new \Doctrine\DBAL\Migrations\Tools\Console\Command\DiffCommand(),
+        new \Doctrine\DBAL\Migrations\Tools\Console\Command\ExecuteCommand(),
+        new \Doctrine\DBAL\Migrations\Tools\Console\Command\GenerateCommand(),
+        new \Doctrine\DBAL\Migrations\Tools\Console\Command\MigrateCommand(),
+        new \Doctrine\DBAL\Migrations\Tools\Console\Command\StatusCommand(),
+        new \Doctrine\DBAL\Migrations\Tools\Console\Command\VersionCommand(),
+
+        // Chamilo commands.
+        new ChamiloLMS\Command\Database\UpgradeCommand(),
+        new ChamiloLMS\Command\Database\InstallCommand(),
+        //new ChamiloLMS\Command\Database\InstallExtendCommand(),
+        new ChamiloLMS\Command\Database\StatusCommand(),
+        new ChamiloLMS\Command\Database\SetupCommand(),
+
+        new ChamiloLMS\Command\Template\AsseticDumpCommand(),
+
+        // Chash commands.
+        new Chash\Command\Database\RunSQLCommand(),
+        new Chash\Command\Database\DumpCommand(),
+        new Chash\Command\Database\RestoreCommand(),
+        new Chash\Command\Database\SQLCountCommand(),
+        new Chash\Command\Database\FullBackupCommand(),
+        new Chash\Command\Database\DropDatabaseCommand(),
+        new Chash\Command\Files\CleanTempFolderCommand(),
+        new Chash\Command\Files\CleanConfigFiles(),
+        new Chash\Command\Translation\ExportLanguageCommand(),
+        new Chash\Command\Translation\ImportLanguageCommand()
+    )
+);
 $cli->run();

+ 6 - 1
documentation/installation_guide.html

@@ -120,8 +120,13 @@ If you are using Apache, and due to new friendly URL features added in 1.10, you
     allow from all
   &lt;/Directory&gt;
 </pre>
+<p>
 In particular, the "AllowOverride All" clause is the one that matters. This will allow PHP to send the user from one page to another freely, thus allowing for more user-friendly URLs.<br />
-Once you've made sure "AllowOverride" says "All", you can safely save the file, get out of it and reload the web server (<i>sudo service apache2 reload</i> under Debian/Ubuntu, or click right on the WAMP/XAMP/EasyPHP icon and "reload web server" under Windows).
+Once you've made sure "AllowOverride" says "All", you can safely save the file, get out of it and reload the web server (<i>sudo service apache2 reload</i> under Debian/Ubuntu, or click right on the WAMP/XAMP/EasyPHP icon and "reload web server" under Windows).</p>
+<p>
+Please note that, if you are using Chamilo in a subdirectory (for example, you load it in your browser as http://localhost/chamilo/ or http://yoursite.com/chamilo/, you will also need to alter the .htaccess file in the root directory of Chamilo, <b>before</b> you proceed with the installation.<br />
+On the RewriteBase line, where it normally says "/", change it to whatever subdirectory you are using. In the same case as above, your RewriteBase will have to say "chamilo/" (without the quotes).
+</p>
 <h3>Downloading and installing Chamilo</h3>
 <ol>
   <li><a href="http://www.chamilo.org/download">Download Chamilo LMS</a></li>

+ 6 - 2
htaccess-dist

@@ -15,10 +15,14 @@
     RewriteRule ^courses/(.*)/index.php$ web/courses/$1? [R,L]
     RewriteRule ^courses/(.*)/$ web/courses/$1? [R,L]
 
-   # Courses documents
-    # courses/MATHS/document/folder1/picture.jpg --> courses/MATHS/document/?file=folder1/picture.jpg
+    # Courses documents
+    # courses/MATHS/document/folder1/picture.jpg --> web/data/courses/MATHS/document/folder1/picture.jpg
     RewriteRule ^courses/(.*)/document/(.*)$ web/data/courses/$1/document/$2 [R,L]
 
+    # SCORM documents
+    # courses/MATHS/scorm/folder1/picture.jpg --> web/data/courses/MATHS/scorm/folder1/picture.jpg
+    RewriteRule ^courses/(.*)/scorm/(.*)$ web/data/courses/$1/scorm/$2 [R,L]
+
     # Certificates
     # Redirection: certificates/index.php?id=123 -> web/certificates/123
     RewriteCond %{QUERY_STRING} ^id=([0-9]*)

+ 2 - 2
main/admin/access_url_edit_courses_to_url.php

@@ -177,7 +177,7 @@ $url_list = UrlManager::get_url_data();
 		if (!empty($access_url_id)) {
 			if ($url_obj['id']==$access_url_id) {
 			$checked = 'selected=true';
-			$url_selected = $url_obj['id'];
+			$url_selected = $url_obj['url'];
 			}
 		}
 		if ($url_obj['active']==1) {
@@ -330,4 +330,4 @@ function makepost(select){
 }
 </script>
 <?php
-Display::display_footer();
+Display::display_footer();

+ 21 - 21
main/admin/access_url_edit_users_to_url.php

@@ -161,33 +161,33 @@ if (isset($_GET['action']) && $_GET['action'] == 'show_message') {
 $nosessionUsersList = $sessionUsersList = array();
 $ajax_search = $add_type == 'unique' ? true : false;
 
-if($ajax_search) {
-	$Users=UrlManager::get_url_rel_user_data($access_url_id);
-	foreach($Users as $user) {
+if ($ajax_search) {
+	$Users = UrlManager::get_url_rel_user_data($access_url_id);
+	foreach ($Users as $user) {
 		$sessionUsersList[$user['user_id']] = $user ;
 	}
 } else {
-	$Users=UrlManager::get_url_rel_user_data();
-	foreach($Users as $user) {
-		if($user['access_url_id'] == $access_url_id) {
+	$Users = UrlManager::get_url_rel_user_data();
+	foreach ($Users as $user) {
+		if ($user['access_url_id'] == $access_url_id) {
 			$sessionUsersList[$user['user_id']] = $user ;
 		}
 	}
 	$order_clause = api_sort_by_first_name() ? ' ORDER BY firstname, lastname, username' : ' ORDER BY lastname, firstname, username';
-	$sql="SELECT u.user_id, lastname, firstname, username
-	  	  	FROM $tbl_user u WHERE status <> ".ANONYMOUS." ".
+	$sql = "SELECT u.user_id, lastname, firstname, username ".
+	  	  	" FROM $tbl_user u WHERE status <> ".ANONYMOUS." ".
 			$order_clause;
-	$result=Database::query($sql);
-	$Users=Database::store_result($result);
+	$result = Database::query($sql);
+	$Users = Database::store_result($result);
 	$user_list_leys = array_keys($sessionUsersList);
-	foreach($Users as $user) {
+	foreach ($Users as $user) {
 		if (!in_array($user['user_id'],$user_list_leys))
 			$nosessionUsersList[$user['user_id']] = $user ;
 	}
 }
 
 
-if($add_type == 'multiple') {
+if ($add_type == 'multiple') {
 	$link_add_type_unique = '<a href="'.api_get_self().'?add_type=unique&access_url_id='.$access_url_id.'">'.get_lang('SessionAddTypeUnique').'</a>';
 	$link_add_type_multiple = get_lang('SessionAddTypeMultiple');
 } else {
@@ -208,14 +208,14 @@ $url_list = UrlManager::get_url_data();
 <select name="access_url_id" onchange="javascript:send();">
 <option value="0"> <?php echo get_lang('SelectUrl')?></option>
 	<?php
-	$url_selected='';
+	$url_selected = '';
 	foreach ($url_list as $url_obj) {
 
 		$checked = '';
 		if (!empty($access_url_id)) {
 			if ($url_obj['id'] == $access_url_id) {
 			    $checked = 'selected=true';
-			    $url_selected =	$url_obj['id'];
+			    $url_selected = $url_obj['url'];
 			}
 		}
 		if ($url_obj['active']==1) {
@@ -231,7 +231,7 @@ $url_list = UrlManager::get_url_data();
 <input type="hidden" name="add_type" value = "<?php echo $add_type ?>" />
 
 <?php
-if(!empty($errorMsg)) {
+if (!empty($errorMsg)) {
 	Display::display_normal_message($errorMsg); //main API
 }
 ?>
@@ -258,7 +258,7 @@ if(!empty($errorMsg)) {
   <td align="center">
   <div id="content_source">
   	  <?php
-  	  if($ajax_search) {
+  	  if ($ajax_search) {
   	  	?>
 		<input type="text" id="user_to_add" onkeyup="xajax_search_users(this.value,document.formulaire.access_url_id.options[document.formulaire.access_url_id.selectedIndex].value)" />
 		<div id="ajax_list_users"></div>
@@ -267,7 +267,7 @@ if(!empty($errorMsg)) {
   	  ?>
 	  <select id="origin_users" name="nosessionUsersList[]" multiple="multiple" size="15" style="width:380px;">
 		<?php
-		foreach($nosessionUsersList as $enreg) {
+		foreach ($nosessionUsersList as $enreg) {
 		?>
 			<option value="<?php echo $enreg['user_id']; ?>"><?php echo api_get_person_name($enreg['firstname'], $enreg['lastname']).' ('.$enreg['username'].')'; ?></option>
 			<?php
@@ -283,7 +283,7 @@ if(!empty($errorMsg)) {
   </td>
   <td width="10%" valign="middle" align="center">
   <?php
-  if($ajax_search) {
+  if ($ajax_search) {
 	?>
 	<button class="arrowl" type="button" onclick="remove_item(document.getElementById('destination_users'))"> </button>
   	<?php
@@ -301,7 +301,7 @@ if(!empty($errorMsg)) {
   <select id="destination_users" name="sessionUsersList[]" multiple="multiple" size="15" style="width:380px;">
 
 <?php
-foreach($sessionUsersList as $enreg) {
+foreach ($sessionUsersList as $enreg) {
 ?>
 	<option value="<?php echo $enreg['user_id']; ?>"><?php echo api_get_person_name($enreg['firstname'], $enreg['lastname']).' ('.$enreg['username'].')'; ?></option>
 
@@ -317,7 +317,7 @@ unset($sessionUsersList);
 	<td colspan="3" align="center">
 		<br />
 		<?php
-		if(isset($_GET['add']))
+		if (isset($_GET['add']))
 			echo '<button class="save" type="button" onclick="valide()" >'.get_lang('AddUsersToURL').'</button>';
 		else
 			echo '<button class="save" type="button" onclick="valide()" >'.get_lang('EditUsersToURL').'</button>';
@@ -381,4 +381,4 @@ function makepost(select){
 }
 </script>
 <?php
-Display::display_footer();
+Display::display_footer();

+ 34 - 33
main/admin/access_urls.php

@@ -36,43 +36,44 @@ $url_list = UrlManager::get_url_data();
 if (isset ($_GET['action'])) {
     if ($_GET['action'] == 'show_message') {
         Display :: display_normal_message(Security::remove_XSS(stripslashes($_GET['message'])));
-    }
-    $check = Security::check_token('get');
-    if ($check) {
-        $url_id=Database::escape_string($_GET['url_id']);
+    } else {
+        $check = Security::check_token('get');
+        if ($check) {
+            $url_id = Database::escape_string($_GET['url_id']);
 
-        switch ($_GET['action']) {
-            case 'delete_url' :
-                $result = UrlManager::delete($url_id);
-                if ($result) {
-                    Display :: display_normal_message(get_lang('URLDeleted'));
-                } else {
-                    Display :: display_error_message(get_lang('CannotDeleteURL'));
-                }
-                break;
-            case 'lock' :
-                UrlManager::set_url_status('lock',$url_id);
-                Display :: display_normal_message(get_lang('URLInactive'));
-                break;
-            case 'unlock';
-                UrlManager::set_url_status('unlock',$url_id);
-                Display :: display_normal_message(get_lang('URLActive'));
-                break;
-            case 'register';
-                // we are going to register the admin
-                if(api_is_platform_admin()) {
-                    if($current_access_url_id!=-1) {
-                        $url_str = '';
-                        foreach($url_list as $my_url) {
-                            if (!in_array($my_url['id'],$my_user_url_list)){
-                                UrlManager::add_user_to_url(api_get_user_id(),$my_url['id']);
-                                $url_str.=$my_url['url'].' <br />';
+            switch ($_GET['action']) {
+                case 'delete_url' :
+                    $result = UrlManager::delete($url_id);
+                    if ($result) {
+                        Display :: display_normal_message(get_lang('URLDeleted'));
+                    } else {
+                        Display :: display_error_message(get_lang('CannotDeleteURL'));
+                    }
+                    break;
+                case 'lock' :
+                    UrlManager::set_url_status('lock',$url_id);
+                    Display :: display_normal_message(get_lang('URLInactive'));
+                    break;
+                case 'unlock';
+                    UrlManager::set_url_status('unlock',$url_id);
+                    Display :: display_normal_message(get_lang('URLActive'));
+                    break;
+                case 'register';
+                    // we are going to register the admin
+                    if(api_is_platform_admin()) {
+                        if($current_access_url_id!=-1) {
+                            $url_str = '';
+                            foreach($url_list as $my_url) {
+                                if (!in_array($my_url['id'],$my_user_url_list)){
+                                    UrlManager::add_user_to_url(api_get_user_id(),$my_url['id']);
+                                    $url_str.=$my_url['url'].' <br />';
+                                }
                             }
+                            Display :: display_normal_message(get_lang('AdminUserRegisteredToThisURL').': '.$url_str.'<br />',false);
                         }
-                        Display :: display_normal_message(get_lang('AdminUserRegisteredToThisURL').': '.$url_str.'<br />',false);
                     }
-                }
-                break;
+                    break;
+            }
         }
     }
     Security::clear_token();

+ 0 - 2
main/admin/calendar.lib.php

@@ -1637,9 +1637,7 @@ function get_agendaitems($month, $year)
 
     //databases of the courses
     $TABLEAGENDA = Database :: get_main_table(TABLE_MAIN_SYSTEM_CALENDAR);
-    //$TABLE_ITEMPROPERTY = Database :: get_course_table(TABLE_ITEM_PROPERTY);
 
-    //$group_memberships = GroupManager :: get_group_ids(Database::get_current_course_database(), $_user['user_id']);
     // if the user is administrator of that course we show all the agenda items
     //if (api_is_allowed_to_edit())
     //{

+ 5 - 5
main/admin/configure_extensions.php

@@ -26,7 +26,7 @@ if (isset($_POST['activeExtension'])) {
 					WHERE variable="service_visio"
 					AND subkey="active"';
 			$rs = Database::query($sql);
-			if(Database::affected_rows()>0) {
+			if (Database::affected_rows($rs)>0) {
 				// select all the courses and insert the tool inside
 				$sql = 'SELECT id FROM '.Database::get_main_table(TABLE_MAIN_COURSE);
 				$rs = Database::query($sql);
@@ -105,7 +105,7 @@ if (isset($_POST['activeExtension'])) {
 
 			$rs = Database::query($sql);
 
-			if(Database::affected_rows()>0){
+			if (Database::affected_rows($rs)>0){
 				$message = get_lang('ServiceActivated');
 			}
 
@@ -299,7 +299,7 @@ Display::display_header($nameTool);
 	</div>
 
  */ ?>
-    
+
 	<!-- PPT2LP -->
 	<div id="main_ppt2lp">
 		<div id="extension_header_ppt2lp" class="accordion_header">
@@ -441,8 +441,8 @@ Display::display_header($nameTool);
 	</div>
 	*/
     /*
-	
-    
+
+
 	<!-- SEARCH -->
 	<div id="main_search">
 		<div id="extension_header_search" class="accordion_header">

+ 16 - 25
main/admin/course_create_content.php

@@ -7,39 +7,30 @@
  * @package chamilo.admin
  */
 /**
- *		INIT SECTION
+ *        INIT SECTION
  */
 
 // name of the language file that needs to be included
 $language_file = 'admin';
-include ('../inc/global.inc.php');
-$this_section=SECTION_PLATFORM_ADMIN;
+include('../inc/global.inc.php');
+$this_section = SECTION_PLATFORM_ADMIN;
 
 api_protect_admin_script();
 $tool_name = get_lang('DummyCourseCreator');
-$interbreadcrumb[] = array ("url" => 'index.php', "name" => get_lang('PlatformAdmin'));
+$interbreadcrumb[] = array("url" => 'index.php', "name" => get_lang('PlatformAdmin'));
 Display::display_header($tool_name);
 //api_display_tool_title($tool_name);
-if(api_get_setting('server_type') != 'test')
-{
-	echo get_lang('DummyCourseOnlyOnTestServer');
+if (api_get_setting('server_type') != 'test') {
+    echo get_lang('DummyCourseOnlyOnTestServer');
+} elseif (isset($_POST['action'])) {
+    require_once('../coursecopy/classes/DummyCourseCreator.class.php');
+    $dcc = new DummyCourseCreator();
+    $dcc->create_dummy_course($_POST['course_code']);
+    echo get_lang('Done');
+} else {
+    echo get_lang('DummyCourseDescription');
+    echo '<form method="post"><input type="hidden" name="course_code" value="'.Security::remove_XSS(
+            $_GET['course_code']
+        ).'"/><input type="submit" name="action" value="'.get_lang('Ok').'"/></form>';
 }
-elseif( isset($_POST['action']))
-{
-	require_once('../coursecopy/classes/DummyCourseCreator.class.php');
-	$dcc = new DummyCourseCreator();
-	$dcc->create_dummy_course($_POST['course_code']);
-	echo get_lang('Done');
-}
-else
-{
-	echo get_lang('DummyCourseDescription');
-	echo '<form method="post"><input type="hidden" name="course_code" value="'.Security::remove_XSS($_GET['course_code']).'"/><input type="submit" name="action" value="'.get_lang('Ok').'"/></form>';
-}
-/*
-==============================================================================
-		FOOTER
-==============================================================================
-*/
 Display::display_footer();
-?>

+ 14 - 7
main/admin/course_list.php

@@ -24,11 +24,11 @@ require_once '../gradebook/lib/be/category.class.php';
  */
 function get_number_of_courses() {
     $course_table = Database :: get_main_table(TABLE_MAIN_COURSE);
-    $sql = "SELECT COUNT(code) AS total_number_of_items FROM $course_table";
+    $sql = "SELECT COUNT(code) AS total_number_of_items FROM $course_table course";
 
     if ((api_is_platform_admin() || api_is_session_admin()) && api_is_multiple_url_enabled() && api_get_current_access_url_id() != -1) {
         $access_url_rel_course_table = Database :: get_main_table(TABLE_MAIN_ACCESS_URL_REL_COURSE);
-        $sql.= " INNER JOIN $access_url_rel_course_table url_rel_course ON (id = url_rel_course.c_id)";
+        $sql.= " INNER JOIN $access_url_rel_course_table url_rel_course ON (course.id = url_rel_course.c_id)";
     }
 
     if (isset ($_GET['keyword'])) {
@@ -42,7 +42,13 @@ function get_number_of_courses() {
         $keyword_visibility = Database::escape_string($_GET['keyword_visibility']);
         $keyword_subscribe = Database::escape_string($_GET['keyword_subscribe']);
         $keyword_unsubscribe = Database::escape_string($_GET['keyword_unsubscribe']);
-        $sql .= " WHERE (code LIKE '%".$keyword_code."%' OR visual_code LIKE '%".$keyword_code."%') AND title LIKE '%".$keyword_title."%' AND category_code LIKE '%".$keyword_category."%'  AND course_language LIKE '%".$keyword_language."%'   AND visibility LIKE '%".$keyword_visibility."%'    AND subscribe LIKE '".$keyword_subscribe."'AND unsubscribe LIKE '".$keyword_unsubscribe."'";
+        $sql .= " WHERE (code LIKE '%".$keyword_code."%' OR visual_code LIKE '%".$keyword_code."%') AND
+                        title LIKE '%".$keyword_title."%' AND
+                        category_code LIKE '%".$keyword_category."%' AND
+                        course_language LIKE '%".$keyword_language."%'  AND
+                        visibility LIKE '%".$keyword_visibility."%'    AND
+                        subscribe LIKE '".$keyword_subscribe."'AND
+                        unsubscribe LIKE '".$keyword_unsubscribe."'";
     }
 
      // adding the filter to see the user's only of the current access_url
@@ -72,11 +78,11 @@ function get_course_data($from, $number_of_items, $column, $direction) {
                     visibility AS col8,
                     directory as col9,
                     visual_code
-    		FROM $course_table";
+    		FROM $course_table course";
 
     if ((api_is_platform_admin() || api_is_session_admin()) && api_is_multiple_url_enabled() && api_get_current_access_url_id() != -1) {
         $access_url_rel_course_table = Database :: get_main_table(TABLE_MAIN_ACCESS_URL_REL_COURSE);
-        $sql.= " INNER JOIN $access_url_rel_course_table url_rel_course ON (id = url_rel_course.c_id)";
+        $sql.= " INNER JOIN $access_url_rel_course_table url_rel_course ON (course.id = url_rel_course.c_id)";
     }
 
     if (isset ($_GET['keyword'])) {
@@ -104,6 +110,7 @@ function get_course_data($from, $number_of_items, $column, $direction) {
     $res = Database::query($sql);
     $courses = array ();
     while ($course = Database::fetch_array($res)) {
+
         // Place colour icons in front of courses.
         $show_visual_code = $course['visual_code'] != $course[2] ? Display::label($course['visual_code'], 'info') : null;
         $course[1] = get_course_visibility_icon($course[8]).'<a href="'.api_get_path(WEB_COURSE_PATH).$course[9].'/index.php">'.$course[1].'</a> '.$show_visual_code;
@@ -160,7 +167,7 @@ if (isset ($_POST['action'])) {
             $course_codes = $_POST['course'];
             if (count($course_codes) > 0) {
                 foreach ($course_codes as $course_code) {
-                    CourseManager :: delete_course($course_code);
+                    CourseManager::delete_course($course_code);
                     $obj_cat = new Category();
                     $obj_cat->update_category_delete($course_code);
                 }
@@ -224,7 +231,7 @@ if (isset ($_GET['search']) && $_GET['search'] == 'advanced') {
                 break;
         }
     }
-    if (isset ($_GET['delete_course'])) {
+    if (isset($_GET['delete_course'])) {
         CourseManager::delete_course($_GET['delete_course']);
         $obj_cat = new Category();
         $obj_cat->update_category_delete($_GET['delete_course']);

+ 3 - 3
main/admin/extra_field_workflow.php

@@ -198,18 +198,18 @@ if ($form->validate()) {
                         $extraFieldOptionRelFieldOption->setFieldOptionId($subItemId);
                         $extraFieldOptionRelFieldOption->setRelatedFieldOptionId($id);
                         $extraFieldOptionRelFieldOption->setRoleId($roleId);
-                        $app['orm.em']->persist($extraFieldOptionRelFieldOption);
+                        $app['orm.ems']['db_write']->persist($extraFieldOptionRelFieldOption);
                     }
                 } else {
 
                     if ($extraFieldOptionRelFieldOption) {
-                        $app['orm.em']->remove($extraFieldOptionRelFieldOption);
+                        $app['orm.ems']['db_write']->remove($extraFieldOptionRelFieldOption);
                     }
                 }
 
             }
         }
-        $app['orm.em']->flush();
+        $app['orm.ems']['db_write']->flush();
         header('Location:'.api_get_self().'?'.$params);
         exit;
     }

+ 7 - 7
main/admin/extra_fields.php

@@ -134,13 +134,13 @@ switch ($action) {
 
         // The validation or display
         if ($form->validate()) {
-            if ($check) {
+            //if ($check) {
                 $values = $form->exportValues();
                 $res    = $obj->save($values);
                 if ($res) {
                     Display::display_confirmation_message(get_lang('ItemAdded'));
                 }
-            }
+            //}
             $obj->display();
         } else {
             echo '<div class="actions">';
@@ -158,11 +158,11 @@ switch ($action) {
 
         // The validation or display
         if ($form->validate()) {
-            if ($check) {
+            //if ($check) {
                 $values = $form->exportValues();
                 $res    = $obj->update($values);
-                Display::display_confirmation_message(sprintf(get_lang('ItemUpdated'), $values['name']), false);
-            }
+                Display::display_confirmation_message(sprintf(get_lang('ItemUpdated'), $values['field_variable']), false);
+            //}
             $obj->display();
         } else {
             echo '<div class="actions">';
@@ -175,12 +175,12 @@ switch ($action) {
         break;
     case 'delete':
         // Action handling: delete
-        if ($check) {
+        //if ($check) {
             $res = $obj->delete($_GET['id']);
             if ($res) {
                 Display::display_confirmation_message(get_lang('ItemDeleted'));
             }
-        }
+        //}
         $obj->display();
         break;
     default:

+ 3 - 3
main/admin/session_course_list.php

@@ -47,8 +47,8 @@ if ($action == 'delete') {
 		}
 		$idChecked = $my_temp;
 		$idChecked="'".implode("','", $idChecked)."'";
-		Database::query("DELETE FROM $tbl_session_rel_course WHERE id_session='$id_session' AND c_id IN($idChecked)");
-		$nbr_affected_rows=Database::affected_rows();
+		$result = Database::query("DELETE FROM $tbl_session_rel_course WHERE id_session='$id_session' AND c_id IN($idChecked)");
+		$nbr_affected_rows = Database::affected_rows($result);
 		Database::query("DELETE FROM $tbl_session_rel_course_rel_user WHERE id_session='$id_session' AND c_id IN($idChecked)");
 		Database::query("UPDATE $tbl_session SET nbr_courses=nbr_courses-$nbr_affected_rows WHERE id='$id_session'");
 	}
@@ -99,4 +99,4 @@ echo '<select name="action">
 	</select>
 	<button class="save" type="submit">'.get_lang('Ok').'</button>
 	</form>';
-Display::display_footer();
+Display::display_footer();

+ 1 - 0
main/admin/settings.php

@@ -41,6 +41,7 @@ api_protect_admin_script();
 // Settings to avoid
 $settings_to_avoid = array(
     'stylesheets' => '', // handled by the handle_stylesheet() function
+    'server_type',
     'use_session_mode' => 'true',
     'gradebook_enable' => 'false',
     'example_material_course_creation' => 'true' // ON by default - now we have this option when we create a course

+ 7 - 6
main/admin/special_exports.php

@@ -68,7 +68,7 @@ if ((isset ($_POST['action']) && $_POST['action'] == 'course_select_form') || (i
 			$Resource = $_POST['resource'];
 
 			foreach ($Resource as $Code_course => $Sessions) {
-				$_course 		= Database::get_course_info($Code_course);
+				$_course 		= api_get_course_info($Code_course);
 				$tbl_document 	= Database::get_course_table(TABLE_DOCUMENT);
 				$tbl_property 	= Database::get_course_table(TABLE_ITEM_PROPERTY);
 				$course_id 		= $_course['real_id'];
@@ -103,10 +103,11 @@ if ((isset ($_POST['action']) && $_POST['action'] == 'course_select_form') || (i
 							AND props.to_group_id= $to_group_id AND docs.c_id = $course_id AND props.c_id = $course_id";
 					$query_session_doc = Database::query($sql_session_doc);
 					while ($rows_course_session_file = Database::fetch_assoc($query_session_doc)) {
-						$zip_folder->add($FileZip['PATH_COURSE'].$_course['directory'].'/document'.$rows_course_session_file['path'],
-										 PCLZIP_OPT_ADD_PATH, $_course['directory']."/".$ListSession[$session_id],
-										 PCLZIP_OPT_REMOVE_PATH, $FileZip['PATH_COURSE'].$_course['directory'].'/document'.$FileZip['PATH_REMOVE']
-										);
+						$zip_folder->add(
+                            $FileZip['PATH_COURSE'].$_course['directory'].'/document'.$rows_course_session_file['path'],
+                            PCLZIP_OPT_ADD_PATH, $_course['directory']."/".$ListSession[$session_id],
+                            PCLZIP_OPT_REMOVE_PATH, $FileZip['PATH_COURSE'].$_course['directory'].'/document'.$FileZip['PATH_REMOVE']
+                        );
 					}
 				}
 			}
@@ -209,7 +210,7 @@ function fullexportspecial(){
     $code_course = '';
     $list_course = array();
     $zip_folder = new PclZip($FileZip['TEMP_FILE_ZIP']);
-    $list_course = Database::get_course_list();
+    $list_course = CourseManager::get_course_list();
 
     $tbl_document = Database::get_course_table(TABLE_DOCUMENT);
     $tbl_property = Database::get_course_table(TABLE_ITEM_PROPERTY);

+ 6 - 5
main/admin/subscribe_user2course.php

@@ -70,10 +70,10 @@ if (is_array($extra_field_list)) {
 }
 
 /* React on POSTed request */
-if ($_POST['form_sent']) {
+if (!empty($_POST['form_sent'])) {
     $form_sent = $_POST['form_sent'];
-    $users = is_array($_POST['UserList']) ? $_POST['UserList'] : array() ;
-    $courses = is_array($_POST['CourseList']) ? $_POST['CourseList'] : array() ;
+    $users = (isset($_POST['UserList']) && is_array($_POST['UserList']) ? $_POST['UserList'] : array());
+    $courses = (isset($_POST['CourseList']) && is_array($_POST['CourseList']) ? $_POST['CourseList'] : array());
     $first_letter_user = $_POST['firstLetterUser'];
     $first_letter_course = $_POST['firstLetterCourse'];
 
@@ -125,6 +125,7 @@ if (is_array($extra_field_list)) {
     }
 }
 
+$where_filter ='';
 if ($use_extra_fields) {
     $final_result = array();
     if (count($extra_field_result)>1) {
@@ -137,7 +138,6 @@ if ($use_extra_fields) {
         $final_result = $extra_field_result[0];
     }
 
-    $where_filter ='';
     if ($_configuration['multiple_access_urls']) {
         if (is_array($final_result) && count($final_result)>0) {
             $where_filter = " AND u.user_id IN  ('".implode("','",$final_result)."') ";
@@ -198,7 +198,8 @@ $db_courses = Database::store_result($result);
 unset($result);
 
 if (api_is_multiple_url_enabled()) {
-    $tbl_course_rel_access_url= Database::get_main_table(TABLE_MAIN_ACCESS_URL_REL_COURSE);
+    $tbl_course_user = Database::get_main_table(TABLE_MAIN_COURSE_USER);
+    $tbl_course_rel_access_url = Database::get_main_table(TABLE_MAIN_ACCESS_URL_REL_COURSE);
     $access_url_id = api_get_current_access_url_id();
     if ($access_url_id != -1){
         $sqlNbCours = "	SELECT course_rel_user.course_code, course.title

+ 2 - 2
main/admin/user_fields.php

@@ -343,7 +343,7 @@ function delete_user_fields($field_id) {
     // delete the fields
     $sql = "DELETE FROM $table_user_field WHERE id = '" . Database::escape_string($field_id) . "'";
     $result = Database::query($sql);
-    if (Database::affected_rows() == 1) {
+    if (Database::affected_rows($result) == 1) {
         // delete the field options
         $sql = "DELETE FROM $table_user_field_options WHERE field_id = '" . Database::escape_string($field_id) . "'";
         $result = Database::query($sql);
@@ -369,4 +369,4 @@ function delete_user_fields($field_id) {
         // the field was not deleted so we return false
         return false;
     }
-}
+}

+ 2 - 2
main/admin/user_list.php

@@ -167,7 +167,7 @@ function login_user($user_id) {
 
 	$main_user_table      = Database::get_main_table(TABLE_MAIN_USER);
 	$main_admin_table     = Database::get_main_table(TABLE_MAIN_ADMIN);
-	$track_e_login_table  = Database::get_statistic_table(TABLE_STATISTIC_TRACK_E_LOGIN);
+	$track_e_login_table  = Database::get_main_table(TABLE_STATISTIC_TRACK_E_LOGIN);
 
 	unset($_user['user_id']); // uid not in session ? prevent any hacking
 
@@ -906,4 +906,4 @@ $tpl = $app['template'];
 $tpl->assign('actions', $actions);
 $tpl->assign('message', $message);
 $tpl->assign('content', $form.$table_result.$extra_search_options);
-$tpl->display_one_col_template();
+$tpl->display_one_col_template();

+ 5 - 5
main/admin/user_move_stats.php

@@ -118,10 +118,10 @@ if (isset($_REQUEST['load_ajax'])) {
 
                 //Begin with the import process
 
-                $TABLETRACK_EXERCICES       = Database::get_statistic_table(TABLE_STATISTIC_TRACK_E_EXERCICES);
-                $TBL_TRACK_ATTEMPT          = Database::get_statistic_table(TABLE_STATISTIC_TRACK_E_ATTEMPT);
-                $TBL_TRACK_E_COURSE_ACCESS  = Database::get_statistic_table(TABLE_STATISTIC_TRACK_E_COURSE_ACCESS);
-                $TBL_TRACK_E_LAST_ACCESS    = Database::get_statistic_table(TABLE_STATISTIC_TRACK_E_LASTACCESS);
+                $TABLETRACK_EXERCICES       = Database::get_main_table(TABLE_STATISTIC_TRACK_E_EXERCICES);
+                $TBL_TRACK_ATTEMPT          = Database::get_main_table(TABLE_STATISTIC_TRACK_E_ATTEMPT);
+                $TBL_TRACK_E_COURSE_ACCESS  = Database::get_main_table(TABLE_STATISTIC_TRACK_E_COURSE_ACCESS);
+                $TBL_TRACK_E_LAST_ACCESS    = Database::get_main_table(TABLE_STATISTIC_TRACK_E_LASTACCESS);
 
                 $TBL_LP_VIEW                = Database::get_course_table(TABLE_LP_VIEW);
                 $TBL_NOTEBOOK               = Database::get_course_table(TABLE_NOTEBOOK);
@@ -588,7 +588,7 @@ $htmlHeadXtra[] = '<script type="text/javascript">
  </script>';
 
 function get_courses_list_by_user_id_based_in_exercises($user_id) {
-    $TABLETRACK_EXERCICES       = Database::get_statistic_table(TABLE_STATISTIC_TRACK_E_EXERCICES);
+    $TABLETRACK_EXERCICES       = Database::get_main_table(TABLE_STATISTIC_TRACK_E_EXERCICES);
     $user_id = intval($user_id);
     $sql = "SELECT DISTINCT exe_user_id, c_id, session_id as id_session
     FROM $TABLETRACK_EXERCICES WHERE exe_user_id = $user_id

+ 2 - 2
main/auth/shibboleth/init.php

@@ -16,10 +16,10 @@ include_once($__dir . '/../../inc/global.inc.php');
 
 require_once $__dir . 'config.php';
 
-if (api_get_setting('server_type') == 'test')
+if ($app['debug'])
 {
     include_once $__dir . '/test/shibboleth_test_helper.class.php';
     include_once $__dir . '/test/shibboleth_test.class.php';
 }
 
-$language_files[] = 'shibboleth';
+$language_files[] = 'shibboleth';

+ 3 - 3
main/calendar/agenda.inc.php

@@ -34,7 +34,7 @@ $(function() {
         } else {
             url = String(window.location)+temp;
             window.location.replace(url);
-        }    
+        }
     });
 });
 </script>';
@@ -289,7 +289,7 @@ function get_calendar_items($select_month, $select_year, $select_day = false)
 
     //Check my personal calendar items
     if (api_get_setting('allow_personal_agenda') == 'true' && empty($_SESSION['user']) && empty($_SESSION['group'])) {
-        $tbl_personal_agenda = Database :: get_user_personal_table(TABLE_PERSONAL_AGENDA);
+        $tbl_personal_agenda = Database :: get_main_table(TABLE_PERSONAL_AGENDA);
         // 1. creating the SQL statement for getting the personal agenda items in MONTH view
         $sql = "SELECT id, title, text as content , date as start_date, enddate as end_date, parent_event_id FROM ".$tbl_personal_agenda."
                 WHERE user='".api_get_user_id()."' ".$show_all_current_personal;
@@ -1120,7 +1120,7 @@ function construct_to_select_form($group_list = null, $user_list = null, $filter
         }
         $result .= "</optgroup>";
     }
-    
+
     // adding the individual users to the select form
     if (!empty($user_list)) {
         $result .= '<optgroup label="'.get_lang('FilterByUser').'">';

+ 64 - 10
main/calendar/agenda.lib.php

@@ -2,22 +2,26 @@
 /* For licensing terms, see /license.txt */
 
 /**
- * @author: Julio Montoya <gugli100@gmail.com> Implementing a real agenda lib
+ * @author: Julio Montoya <gugli100@gmail.com>
+ * Class Agenda
+ * @todo move this in main/inc/lib and update composer autoload
  */
-
 class Agenda
 {
     public $events = array();
-    public $type = 'personal'; // personal, admin or course
+    public $type = 'personal';
 
+    /**
+     *
+     */
     public function __construct()
     {
         //Table definitions
         $this->tbl_global_agenda   = Database::get_main_table(TABLE_MAIN_SYSTEM_CALENDAR);
-        $this->tbl_personal_agenda = Database::get_user_personal_table(TABLE_PERSONAL_AGENDA);
+        $this->tbl_personal_agenda = Database::get_main_table(TABLE_PERSONAL_AGENDA);
         $this->tbl_course_agenda   = Database::get_course_table(TABLE_AGENDA);
 
-        //Setting the course object if we are in a course
+        // Setting the course object if we are in a course
         $this->course = null;
         $course_info  = api_get_course_info();
         if (!empty($course_info)) {
@@ -34,6 +38,19 @@ class Agenda
         $this->event_personal_color = 'steel blue'; //steel blue
     }
 
+    /**
+     * Agenda type: personal, admin or course
+     * @param string $type
+     */
+    public function setType($type)
+    {
+        $this->type = $type;
+    }
+
+    /**
+     * Sets course info
+     * @param array $course_info
+     */
     public function set_course($course_info)
     {
         $this->course = $course_info;
@@ -168,8 +185,8 @@ class Agenda
 
 
     /**
-     * @param agenda_id
-     * @sent agenda event to
+     * @param int id
+     * @param array sent to
      **/
 
     public function store_agenda_item_as_announcement($item_id, $sent_to = array())
@@ -270,6 +287,9 @@ class Agenda
         }
     }
 
+    /**
+     * @param int $id
+     */
     public function delete_event($id)
     {
         switch ($this->type) {
@@ -363,6 +383,12 @@ class Agenda
         return '';
     }
 
+    /**
+     * @param int $id
+     * @param int $day_delta
+     * @param int $minute_delta
+     * @return int
+     */
     public function resize_event($id, $day_delta, $minute_delta)
     {
         // we convert the hour delta into minutes and add the minute delta
@@ -394,6 +420,12 @@ class Agenda
 
     }
 
+    /**
+     * @param int $id
+     * @param int $day_delta
+     * @param int $minute_delta
+     * @return int
+     */
     public function move_event($id, $day_delta, $minute_delta)
     {
         // we convert the hour delta into minutes and add the minute delta
@@ -524,6 +556,15 @@ class Agenda
         return $my_events;
     }
 
+    /**
+     * @param int $start
+     * @param int $end
+     * @param array $course_info
+     * @param int $group_id
+     * @param int $session_id
+     * @param int $user_id
+     * @return array
+     */
     public function get_course_events($start, $end, $course_info, $group_id = 0, $session_id = 0, $user_id = 0)
     {
         $course_id  = $course_info['real_id'];
@@ -749,6 +790,11 @@ class Agenda
         return $this->events;
     }
 
+    /**
+     * @param int $start
+     * @param int $end
+     * @return array
+     */
     public function get_platform_events($start, $end)
     {
         $start = intval($start);
@@ -801,6 +847,7 @@ class Agenda
     /**
      * Format needed for the Fullcalendar js lib
      * @param string UTC time
+     * @return string
      */
     public function format_event_date($utc_time)
     {
@@ -810,7 +857,7 @@ class Agenda
     /**
      * this function shows the form with the user that were not selected
      * @author: Patrick Cool <patrick.cool@UGent.be>, Ghent University
-     * @return html code
+     * @return string html code
      */
     static function construct_not_selected_select_form(
         $group_list = null,
@@ -926,7 +973,8 @@ class Agenda
      * This public function separates the users from the groups
      * users have a value USER:XXX (with XXX the dokeos id
      * groups have a value GROUP:YYY (with YYY the group id)
-     * @author: Patrick Cool <patrick.cool@UGent.be>, Ghent University
+     * @author Patrick Cool <patrick.cool@UGent.be>, Ghent University
+     * @param array
      * @return array
      */
     public function separate_users_groups($to)
@@ -960,6 +1008,9 @@ class Agenda
         return $send_to;
     }
 
+    /**
+     * @param array $params
+     */
     static function show_form($params = array())
     {
         $form = new FormValidator('add_event', 'POST', api_get_self().'?'.api_get_cidreq(), null, array('enctype' => 'multipart/form-data'));
@@ -1031,7 +1082,10 @@ class Agenda
         $form->display();
     }
 
-
+    /**
+     * @param array $form
+     * @param $to_already_selected
+     */
     public static function show_to_form($form, $to_already_selected)
     {
         $order = 'lastname';

+ 7 - 7
main/calendar/myagenda.inc.php

@@ -327,7 +327,7 @@ function display_myminimonthcalendar($agendaitems, $month, $year, $monthName) {
 function show_new_personal_item_form($id = "") {
 	global $year, $MonthsLong;
 
-	$tbl_personal_agenda = Database :: get_user_personal_table(TABLE_PERSONAL_AGENDA);
+	$tbl_personal_agenda = Database :: get_main_table(TABLE_PERSONAL_AGENDA);
 
 	// we construct the default time and date data (used if we are not editing a personal agenda item)
 	//$today = getdate();
@@ -517,7 +517,7 @@ function show_new_personal_item_form($id = "") {
  */
 function store_personal_item($day, $month, $year, $hour, $minute, $title, $content, $id = "") {
 
-	$tbl_personal_agenda = Database :: get_user_personal_table(TABLE_PERSONAL_AGENDA);
+	$tbl_personal_agenda = Database :: get_main_table(TABLE_PERSONAL_AGENDA);
 
 	//constructing the date
 	$date = $year."-".$month."-".$day." ".$hour.":".$minute.":00";
@@ -598,7 +598,7 @@ function get_courses_of_user() {
  * This function retrieves all the personal agenda items and add them to the agenda items found by the other functions.
  */
 function get_personal_agenda_items($user_id, $agendaitems, $day = "", $month = "", $year = "", $week = "", $type) {
-	$tbl_personal_agenda = Database :: get_user_personal_table(TABLE_PERSONAL_AGENDA);
+	$tbl_personal_agenda = Database :: get_main_table(TABLE_PERSONAL_AGENDA);
 	$user_id = intval($user_id);
 
 	// 1. creating the SQL statement for getting the personal agenda items in MONTH view
@@ -700,7 +700,7 @@ function get_personal_agenda_items($user_id, $agendaitems, $day = "", $month = "
  * @return 	array	The results of the database query, or null if not found
  */
 function get_personal_agenda_item($id) {
-	$tbl_personal_agenda = Database :: get_user_personal_table(TABLE_PERSONAL_AGENDA);
+	$tbl_personal_agenda = Database :: get_main_table(TABLE_PERSONAL_AGENDA);
 	$id = Database::escape_string($id);
 	// make sure events of the personal agenda can only be seen by the user himself
 	$user = api_get_user_id();
@@ -720,7 +720,7 @@ function get_personal_agenda_item($id) {
 function show_personal_agenda() {
 	global $MonthsLong, $charset;
 
-	$tbl_personal_agenda = Database :: get_user_personal_table(TABLE_PERSONAL_AGENDA);
+	$tbl_personal_agenda = Database :: get_main_table(TABLE_PERSONAL_AGENDA);
 
 	// The SQL statement that retrieves all the personal agenda items of this user
 	$sql = "SELECT * FROM ".$tbl_personal_agenda." WHERE user='".api_get_user_id()."' ORDER BY date DESC";
@@ -824,7 +824,7 @@ function show_personal_agenda() {
 function show_simple_personal_agenda($user_id) {
 	global $MonthsLong, $charset;
 
-	$tbl_personal_agenda = Database :: get_user_personal_table(TABLE_PERSONAL_AGENDA);
+	$tbl_personal_agenda = Database :: get_main_table(TABLE_PERSONAL_AGENDA);
 
 	// The SQL statement that retrieves all the personal agenda items of this user
 	$sql = "SELECT * FROM ".$tbl_personal_agenda." WHERE user='".$user_id."' ORDER BY date DESC";
@@ -885,7 +885,7 @@ function show_simple_personal_agenda($user_id) {
  * does not belong to him/her
  */
 function delete_personal_agenda($id) {
-	$tbl_personal_agenda = Database :: get_user_personal_table(TABLE_PERSONAL_AGENDA);
+	$tbl_personal_agenda = Database :: get_main_table(TABLE_PERSONAL_AGENDA);
 
 	if ($id != strval(intval($id))) {
 		return false; //potential SQL injection

+ 17 - 17
main/calendar/myagenda.php

@@ -31,11 +31,11 @@ if (!empty ($course_path)) {
 $htmlHeadXtra[] = to_javascript();
 $htmlHeadXtra[] = "<script src=\"tbl_change.js\" type=\"text/javascript\" language=\"javascript\"></script>";
 $htmlHeadXtra[] = "<script>
-$(function() {  
-    $(\".dialog\").dialog(\"destroy\");        
+$(function() {
+    $(\".dialog\").dialog(\"destroy\");
     $(\".dialog\").dialog({
             autoOpen: false,
-            show: \"blind\",                
+            show: \"blind\",
             resizable: false,
             height:300,
             width:550,
@@ -62,7 +62,7 @@ $TABLECOURS 		= Database :: get_main_table(TABLE_MAIN_COURSE);
 $TABLECOURSUSER 	= Database :: get_main_table(TABLE_MAIN_COURSE_USER);
 $TABLEAGENDA 		= Database :: get_course_table(TABLE_AGENDA);
 $TABLE_ITEMPROPERTY = Database :: get_course_table(TABLE_ITEM_PROPERTY);
-$tbl_personal_agenda= Database :: get_user_personal_table(TABLE_PERSONAL_AGENDA);
+$tbl_personal_agenda= Database :: get_main_table(TABLE_PERSONAL_AGENDA);
 
 // the variables for the days and the months
 // Defining the shorts for the days
@@ -141,7 +141,7 @@ if (isset($_user['user_id'])) {
 	// getting all the courses that this user is subscribed to
 	//$courses_dbs = get_all_courses_of_user();
 	$my_course_list = CourseManager::get_courses_list_by_user_id(api_get_user_id(), true);
-	
+
 	if (!is_array($my_course_list)) {
 		// this is for the special case if the user has no courses (otherwise you get an error)
 		$my_course_list = array();
@@ -178,13 +178,13 @@ if (isset($_user['user_id'])) {
 	}
 	echo "</div>";
 
-	$agendaitems = get_myagendaitems(api_get_user_id(), $my_course_list, $month, $year);	
+	$agendaitems = get_myagendaitems(api_get_user_id(), $my_course_list, $month, $year);
 	$agendaitems = get_global_agenda_items($agendaitems, $day, $month, $year, $week, "month_view");
-	
+
 	if (api_get_setting('allow_personal_agenda') == 'true') {
 		$agendaitems = get_personal_agenda_items(api_get_user_id(), $agendaitems, $day, $month, $year, $week, "month_view");
 	}
-	
+
 	if ($process != 'month_view') {
 	    echo "<table width=\"100%\" border=\"0\" cellspacing=\"0\" cellpadding=\"0\">";
     	echo "<tr>";
@@ -196,26 +196,26 @@ if (isset($_user['user_id'])) {
     	// OlivierB : the image has a white background, which causes trouble if the portal has another background color. Image should be transparent. ----> echo "<td width=\"20\" background=\"../img/verticalruler.gif\">&nbsp;</td>";
     	echo "<td width=\"8\">&nbsp;</td>";
     	// the main area: day, week, month view
-    	echo "<td valign=\"top\">";   
+    	echo "<td valign=\"top\">";
 	}
-	
+
 	switch ($process) {
-		case 'month_view' :			
+		case 'month_view' :
 			display_mymonthcalendar(api_get_user_id(), $agendaitems, $month, $year, array(), $monthName);
 			break;
 		case 'week_view' :
-			$agendaitems = get_week_agendaitems($my_course_list, $month, $year, $week);						
-			$agendaitems = get_global_agenda_items($agendaitems, $day, $month, $year, $week, "week_view");			
+			$agendaitems = get_week_agendaitems($my_course_list, $month, $year, $week);
+			$agendaitems = get_global_agenda_items($agendaitems, $day, $month, $year, $week, "week_view");
 			if (api_get_setting("allow_personal_agenda") == "true") {
 				$agendaitems = get_personal_agenda_items(api_get_user_id(), $agendaitems, $day, $month, $year, $week, "week_view");
 			}
 			display_weekcalendar($agendaitems, $month, $year, array(), $monthName);
 			break;
 		case 'day_view' :
-			$agendaitems = get_day_agendaitems($my_course_list, $month, $year, $day);								
-			$agendaitems = get_global_agenda_items($agendaitems, $day, $month, $year, $week, "day_view");			
+			$agendaitems = get_day_agendaitems($my_course_list, $month, $year, $day);
+			$agendaitems = get_global_agenda_items($agendaitems, $day, $month, $year, $week, "day_view");
 			if (api_get_setting('allow_personal_agenda') == 'true') {
-				$agendaitems = get_personal_agenda_items(api_get_user_id(), $agendaitems, $day, $month, $year, $week, "day_view");				
+				$agendaitems = get_personal_agenda_items(api_get_user_id(), $agendaitems, $day, $month, $year, $week, "day_view");
 			}
 			display_daycalendar($agendaitems, $day, $month, $year, array(), $monthName);
 			break;
@@ -250,4 +250,4 @@ if (isset($_user['user_id'])) {
 if ($process != 'month_view') {
     echo '</td></tr></table>';
 }
-Display :: display_footer();
+Display :: display_footer();

+ 62 - 62
main/course_description/course_description.class.php

@@ -3,42 +3,42 @@
 namespace CourseDescription;
 
 /**
- * Object Model for the "Course Description" database table. Allows to 
- * 
+ * Object Model for the "Course Description" database table. Allows to
+ *
  *      - query database
  *      - create/insert new course descriptions
  *      - update/edit course descriptions
  *      - delete course descriptions
- * 
- * Course descriptions used to provide descriptions for course/sessions. 
+ *
+ * Course descriptions used to provide descriptions for course/sessions.
  * A course/session can have several descriptions associated to it from various types.
  * Course descriptions are primarily made primarily of
- * 
+ *
  *      - a title
  *      - some content
  *      - a type (for ex: info, objectives, etc)
- * 
+ *
  * Usage:
- *      
+ *
  *      Create
- * 
+ *
  *      $des = new CourseDescription();
  *      $des->set_title('...');
  *      $des->set_content('...');
  *      $des->set_description_type(...);
  *      $des->insert();
- * 
+ *
  *      Update
- * 
+ *
  *      $des = CourseDescription::get_by_id(..., ...);
  *      $des->set_title('...');
  *      $des->update();
- * 
+ *
  *      Delete
- * 
+ *
  *      $des = CourseDescription::get_by_id(..., ...);
  *      $des->delete();
- * 
+ *
  * @package chamilo.course_description
  * @author Christian Fasanando <christian1827@gmail.com>
  * @author Laurent Opprecht <laurent@opprecht.info> for the University of Geneva
@@ -49,8 +49,8 @@ class CourseDescription
 
     /**
      * Return the repository.
-     * 
-     * @return \CourseDescription\CourseDescriptionRepository 
+     *
+     * @return \CourseDescription\CourseDescriptionRepository
      */
     public static function repository()
     {
@@ -59,7 +59,7 @@ class CourseDescription
 
     /**
      * Returns the list of all available types
-     * 
+     *
      * @return array
      */
     public static function get_types()
@@ -69,7 +69,7 @@ class CourseDescription
 
 //    /**
 //     * Deprecated (still used by web services)
-//     * 
+//     *
 //     * @param int Course id
 //     * @deprecated use get_descriptions_by_course
 //     * @return array Array of CourseDescriptions
@@ -153,7 +153,7 @@ class CourseDescription
 
 //    /**
 //     * Insert the course description object into the course_description table.
-//     * 
+//     *
 //     * @return bool True on success, false on failure
 //     */
 //    public function insert()
@@ -168,11 +168,11 @@ class CourseDescription
 //
 //        $table = Database::get_course_table(TABLE_COURSE_DESCRIPTION);
 //        $sql = "INSERT IGNORE INTO $table SET
-//				c_id 				= $course_id, 
-//				description_type	= $description_type, 
-//				title 				= '$title', 
-//				content 			= '$content', 
-//				progress 			= $progress, 
+//				c_id 				= $course_id,
+//				description_type	= $description_type,
+//				title 				= '$title',
+//				content 			= '$content',
+//				progress 			= $progress,
 //				session_id          = $session_id";
 //
 //        Database::query($sql);
@@ -184,7 +184,7 @@ class CourseDescription
 //        $this->id = $id;
 //
 //        /**
-//         * @todo: course info should come from c_id 
+//         * @todo: course info should come from c_id
 //         */
 //        api_item_property_update(api_get_course_info(), TOOL_COURSE_DESCRIPTION, $id, 'CourseDescriptionAdded', api_get_user_id());
 //
@@ -192,13 +192,13 @@ class CourseDescription
 //    }
 //    /**
 //     * Insert a row like history inside track_e_item_property table
-//     * 
+//     *
 //     * @param 	int 	description type
 //     * @return  int		affected rows
 //     */
 //    public function insert_stats($description_type)
 //    {
-//        $tbl_stats_item_property = Database::get_statistic_table(TABLE_STATISTIC_TRACK_E_ITEM_PROPERTY);
+//        $tbl_stats_item_property = Database::get_main_table(TABLE_STATISTIC_TRACK_E_ITEM_PROPERTY);
 //        $description_id = $this->get_id_by_description_type($description_type);
 //        $course_id = api_get_real_course_id();
 //        $course_code = api_get_course_id();
@@ -219,7 +219,7 @@ class CourseDescription
 //    }
 //    /**
 //     * Update a course description object to the database.
-//     * 
+//     *
 //     * @return bool True on success, false on failure.
 //     */
 //    public function update()
@@ -234,11 +234,11 @@ class CourseDescription
 //        $session_id = $this->get_session_id();
 //
 //        $table = Database::get_course_table(TABLE_COURSE_DESCRIPTION);
-//        $sql = "UPDATE $table SET  
-//						title       = '$title', 
-//						content     = '$content', 
-//						progress    = $progress 
-//				WHERE 	id          = $id AND 
+//        $sql = "UPDATE $table SET
+//						title       = '$title',
+//						content     = '$content',
+//						progress    = $progress
+//				WHERE 	id          = $id AND
 //						c_id = $course_id ";
 //
 //        Database::query($sql);
@@ -247,7 +247,7 @@ class CourseDescription
 //        if ($result) {
 //            //insert into item_property
 //            /**
-//             * @todo: course info should come from c_id 
+//             * @todo: course info should come from c_id
 //             */
 //            api_item_property_update(api_get_course_info(), TOOL_COURSE_DESCRIPTION, $this->id, 'CourseDescriptionUpdated', api_get_user_id());
 //        }
@@ -255,7 +255,7 @@ class CourseDescription
 //    }
 //    /**
 //     * Delete a course description object from the database.
-//     * 
+//     *
 //     * @return bool True on success false on failure
 //     */
 //    public function delete()
@@ -269,7 +269,7 @@ class CourseDescription
 //        $result = (bool) Database::affected_rows();
 //        if ($result) {
 //            /**
-//             * @todo: should get course info from $this->c_id 
+//             * @todo: should get course info from $this->c_id
 //             */
 //            api_item_property_update(api_get_course_info(), TOOL_COURSE_DESCRIPTION, $this->id, 'CourseDescriptionDeleted', api_get_user_id());
 //        }
@@ -341,8 +341,8 @@ class CourseDescription
 //    }
 
     /**
-     * The course id. 
-     * 
+     * The course id.
+     *
      * @see get_course() property to get access to the course object
      * @return int
      */
@@ -361,7 +361,7 @@ class CourseDescription
 
     /**
      * The id of the object.
-     * 
+     *
      * @return int
      */
     public function get_id()
@@ -370,7 +370,7 @@ class CourseDescription
     }
 
     /**
-     * 
+     *
      * @return void
      */
     public function set_id($value)
@@ -380,7 +380,7 @@ class CourseDescription
 
     /**
      * The title of the course description.
-     * 
+     *
      * @return string
      */
     public function get_title()
@@ -389,7 +389,7 @@ class CourseDescription
     }
 
     /**
-     * 
+     *
      * @return void
      */
     public function set_title($title)
@@ -407,7 +407,7 @@ class CourseDescription
     }
 
     /**
-     * 
+     *
      * @return void
      */
     public function set_content($content)
@@ -417,7 +417,7 @@ class CourseDescription
 
     /**
      * The session id the object is associated with.
-     * 
+     *
      * @return int
      */
     public function get_session_id()
@@ -426,7 +426,7 @@ class CourseDescription
     }
 
     /**
-     * 
+     *
      * @return void
      */
     public function set_session_id($value)
@@ -437,7 +437,7 @@ class CourseDescription
     /**
      * The type of the course description. Should match one of the id returns
      * by CourseDescription::get_types().
-     * 
+     *
      * @return int
      */
     public function get_description_type()
@@ -446,7 +446,7 @@ class CourseDescription
     }
 
     /**
-     * 
+     *
      * @return void
      */
     public function set_description_type($value)
@@ -464,7 +464,7 @@ class CourseDescription
     }
 
     /**
-     * 
+     *
      * @return void
      */
     public function set_progress($value)
@@ -474,8 +474,8 @@ class CourseDescription
 
     /**
      * Return one type from its id
-     * 
-     * @return \CourseDescription\CourseDescriptionType 
+     *
+     * @return \CourseDescription\CourseDescriptionType
      */
     public function get_type()
     {
@@ -504,7 +504,7 @@ class CourseDescription
 
     /**
      * The item property this object is associated with.
-     * 
+     *
      * @return \Model\ItemProperty
      */
     public function get_item_property()
@@ -521,12 +521,12 @@ class CourseDescription
 
 //
 ///**
-// * The common routes (urls) for course description objects: 
-// * 
+// * The common routes (urls) for course description objects:
+// *
 // *      - create new course description
 // *      - edit course description
-// *      - delete course description 
-// * 
+// *      - delete course description
+// *
 // * @author Laurent Opprecht <laurent@opprecht.info> for the University of Geneva
 // * @licence /license.txt
 // */
@@ -535,7 +535,7 @@ class CourseDescription
 //
 //    /**
 //     *
-//     * @return CourseDescriptionRoutes 
+//     * @return CourseDescriptionRoutes
 //     */
 //    public static function instance()
 //    {
@@ -553,7 +553,7 @@ class CourseDescription
 //
 //    /**
 //     * Returns the url used to create a new course description from a specific type.
-//     * 
+//     *
 //     * @param CourseDescriptionType $type
 //     * @param bool $html True to html escape the url, false otherwise.
 //     * @return string
@@ -573,10 +573,10 @@ class CourseDescription
 //
 //    /**
 //     * The url to edit a course description object
-//     * 
+//     *
 //     * @param CourseDescription $description
 //     * @param bool $html True to html escape the url, false otherwise.
-//     * @return string  
+//     * @return string
 //     */
 //    function edit($description, $html = true)
 //    {
@@ -592,9 +592,9 @@ class CourseDescription
 //
 //    /**
 //     * The index route to list all course descriptions for the current course/session
-//     * 
+//     *
 //     * @param bool $html True to html escape the url, false otherwise.
-//     * @return type 
+//     * @return type
 //     */
 //    function index($html = true)
 //    {
@@ -605,10 +605,10 @@ class CourseDescription
 //
 //    /**
 //     * Url to delete a course description object.
-//     * 
+//     *
 //     * @param CourseDescription $description
 //     * @param bool $html True to html escape the url, false otherwise.
-//     * @return string  
+//     * @return string
 //     */
 //    function delete($description, $html = true)
 //    {

+ 3 - 2
main/course_progress/index.php

@@ -60,9 +60,10 @@ if (isset($_GET['thematic_id'])) {
 if (isset($_GET['description_type'])) {
 	$description_type = intval($_GET['description_type']);
 }
+$courseInfo = api_get_course_info();
 
 // instance thematic object for using like library here
-$thematic = new Thematic();
+$thematic = new Thematic($courseInfo);
 
 // thematic controller object
 $thematic_controller = new ThematicController();
@@ -328,4 +329,4 @@ switch ($action) {
     case 'thematic_advance_list'    :
         $thematic_controller->thematic_advance($action);
         break;
-}
+}

+ 19 - 10
main/course_progress/thematic_controller.php

@@ -15,14 +15,17 @@
 /**
  * Thematic Controller script. Prepares the common background variables to give to the scripts corresponding to
  * the requested action
+ * @todo use a proper controller in src/ChamiloLMS
  * @package chamilo.course_progress
  */
-class ThematicController {
+class ThematicController
+{
 
     /**
      * Constructor
      */
-    public function __construct() {
+    public function __construct()
+    {
         $this->toolname = 'course_progress';
         $this->view = new View($this->toolname);
     }
@@ -32,8 +35,10 @@ class ThematicController {
      * @param 	string	Action
      * render to thematic.php
      */
-    public function thematic($action) {
-        $thematic = new Thematic();
+    public function thematic($action)
+    {
+        $courseInfo = api_get_course_info();
+        $thematic = new Thematic($courseInfo);
         $data = array();
         $error = false;
 
@@ -222,7 +227,7 @@ class ThematicController {
                 }
                 $data['total_average_of_advances'] = $thematic->get_average_of_advances_by_thematic($thematic_id);
             } else {
-                $thematic_data = $thematic->get_thematic_list(null, api_get_course_id(), api_get_session_id());
+                $thematic_data = $thematic->get_thematic_list(null, null, api_get_session_id());
                 $data['max_thematic_item'] = $thematic->get_max_thematic_item();
                 $data['last_done_thematic_advance'] = $thematic->get_last_done_thematic_advance();
                 $data['total_average_of_advances'] = $thematic->get_total_average_of_thematic_advances();
@@ -258,8 +263,10 @@ class ThematicController {
      * @param 	string	Action
      * render to thematic_plan.php
      */
-    public function thematic_plan($action) {
-        $thematic = new Thematic();
+    public function thematic_plan($action)
+    {
+        $courseInfo = api_get_course_info();
+        $thematic = new Thematic($courseInfo);
 
         $data = array();
         $error = false;
@@ -361,8 +368,10 @@ class ThematicController {
      * @param 	string	Action
      * render to thematic_advance.php
      */
-    public function thematic_advance($action) {
-        $thematic = new Thematic();
+    public function thematic_advance($action)
+    {
+        $courseInfo = api_get_course_info();
+        $thematic = new Thematic($courseInfo);
         $attendance = new Attendance();
         $data = array();
 
@@ -475,4 +484,4 @@ class ThematicController {
         $this->view->render();
     }
 
-}
+}

+ 6 - 3
main/coursecopy/classes/CourseBuilder.class.php

@@ -925,7 +925,7 @@ class CourseBuilder
 	function build_session_course(){
 		$tbl_session = Database::get_main_table(TABLE_MAIN_SESSION);
 		$tbl_session_course = Database::get_main_table(TABLE_MAIN_SESSION_COURSE);
-		$list_course = Database::get_course_list();
+		$list_course = CourseManager::get_course_list();
 		$list = array();
 		foreach($list_course as $_course) {
 			$this->course = new Course();
@@ -977,7 +977,8 @@ class CourseBuilder
 	/**
 	* Build the Surveys
 	*/
-	function build_thematic($session_id = 0, $course_code = '', $with_base_content = false, $id_list = array()) {
+	function build_thematic($session_id = 0, $course_code = '', $with_base_content = false, $id_list = array())
+    {
 		$table_thematic			= Database :: get_course_table(TABLE_THEMATIC);
 		$table_thematic_advance = Database :: get_course_table(TABLE_THEMATIC_ADVANCE);
 		$table_thematic_plan    = Database :: get_course_table(TABLE_THEMATIC_PLAN);
@@ -991,10 +992,12 @@ class CourseBuilder
 
 		$course_id = api_get_course_int_id();
 
+        $courseInfo = api_get_course_info();
+
 		$sql = "SELECT * FROM $table_thematic WHERE c_id = $course_id $session_condition ";
 		$db_result = Database::query($sql);
 		while ($row = Database::fetch_array($db_result,'ASSOC')) {
-			$thematic = new Thematic($row);
+			$thematic = new Thematic($courseInfo);
 			$sql = 'SELECT * FROM '.$table_thematic_advance.' WHERE c_id = '.$course_id.' AND thematic_id = '.$row['id'];
 
 			$result = Database::query($sql);

+ 1 - 1
main/coursecopy/classes/CourseRestorer.class.php

@@ -2447,7 +2447,7 @@ class CourseRestorer
                     $glossary->description
                 )."', display_order='".self::DBUTF8escapestring($glossary->display_order)."' $condition_session ";
                 Database::query($sql);
-                $my_id = Database::get_last_insert_id();
+                $my_id = Database::insert_id();
                 api_item_property_update(
                     $this->destination_course_info,
                     TOOL_GLOSSARY,

+ 1 - 1
main/coursecopy/classes/DummyCourseCreator.class.php

@@ -48,7 +48,7 @@ class DummyCourseCreator
 		$this->default_property['start_visible'] = '0000-00-00 00:00:00';
 		$this->default_property['end_visible'] =  '0000-00-00 00:00:00';
 
-		$course = Database::get_course_info($course_code);
+		$course = api_get_course_info($course_code);
 		$this->course = new Course();
 		$tmp_path = api_get_path(SYS_COURSE_PATH).$course['directory'].'/document/tmp_'.uniqid('');
 		@mkdir($tmp_path, api_get_permissions_for_new_directories(), true);

+ 1 - 0
main/css/base.css

@@ -4348,6 +4348,7 @@ a.forum_group_link {
 .new_actions .nav-tabs > li > a, .new_actions .nav-pills > li > a {
     padding-left: 6px;
     padding-right: 6px;
+    line-height: 18px;
 }
 
 .subnav .nav > li > .logout {

BIN
main/css/font/FontAwesome.otf


BIN
main/css/font/fontawesome-webfont.eot


File diff suppressed because it is too large
+ 0 - 195
main/css/font/fontawesome-webfont.svg


BIN
main/css/font/fontawesome-webfont.ttf


BIN
main/css/font/fontawesome-webfont.woff


+ 983 - 0
main/css/font_awesome/css/font-awesome-ie7.css

@@ -0,0 +1,983 @@
+/*!
+ *  Font Awesome 3.1.0
+ *  the iconic font designed for Bootstrap
+ *  -------------------------------------------------------
+ *  The full suite of pictographic icons, examples, and documentation
+ *  can be found at: http://fontawesome.io
+ *
+ *  License
+ *  -------------------------------------------------------
+ *  - The Font Awesome font is licensed under the SIL Open Font License v1.1 -
+ *    http://scripts.sil.org/OFL
+ *  - Font Awesome CSS, LESS, and SASS files are licensed under the MIT License -
+ *    http://opensource.org/licenses/mit-license.html
+ *  - Font Awesome documentation licensed under CC BY 3.0 License -
+ *    http://creativecommons.org/licenses/by/3.0/
+ *  - Attribution is no longer required in Font Awesome 3.0, but much appreciated:
+ *    "Font Awesome by Dave Gandy - http://fontawesome.io"
+
+ *  Contact
+ *  -------------------------------------------------------
+ *  Email: dave@fontawesome.io
+ *  Twitter: http://twitter.com/fortaweso_me
+ *  Work: Lead Product Designer @ http://kyruus.com
+ */
+.icon-large {
+  font-size: 1.3333333333333333em;
+  margin-top: -4px;
+  padding-top: 3px;
+  margin-bottom: -4px;
+  padding-bottom: 3px;
+  vertical-align: middle;
+}
+.nav [class^="icon-"],
+.nav [class*=" icon-"] {
+  vertical-align: inherit;
+  margin-top: -4px;
+  padding-top: 3px;
+  margin-bottom: -4px;
+  padding-bottom: 3px;
+}
+.nav [class^="icon-"].icon-large,
+.nav [class*=" icon-"].icon-large {
+  vertical-align: -25%;
+}
+.nav-pills [class^="icon-"].icon-large,
+.nav-tabs [class^="icon-"].icon-large,
+.nav-pills [class*=" icon-"].icon-large,
+.nav-tabs [class*=" icon-"].icon-large {
+  line-height: .75em;
+  margin-top: -7px;
+  padding-top: 5px;
+  margin-bottom: -5px;
+  padding-bottom: 4px;
+}
+ul.icons-ul {
+  text-indent: -1em;
+  margin-left: 2.142857142857143em;
+}
+ul.icons-ul > li .icon-li {
+  width: 1em;
+  margin-right: 0;
+}
+.btn [class^="icon-"].pull-left,
+.btn [class*=" icon-"].pull-left,
+.btn [class^="icon-"].pull-right,
+.btn [class*=" icon-"].pull-right {
+  vertical-align: inherit;
+}
+.btn [class^="icon-"].icon-large,
+.btn [class*=" icon-"].icon-large {
+  margin-top: -0.5em;
+}
+a [class^="icon-"],
+a [class*=" icon-"] {
+  cursor: pointer;
+}
+.icon-glass {
+  *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf000;');
+}
+.icon-music {
+  *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf001;');
+}
+.icon-search {
+  *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf002;');
+}
+.icon-envelope {
+  *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf003;');
+}
+.icon-heart {
+  *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf004;');
+}
+.icon-star {
+  *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf005;');
+}
+.icon-star-empty {
+  *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf006;');
+}
+.icon-user {
+  *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf007;');
+}
+.icon-film {
+  *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf008;');
+}
+.icon-th-large {
+  *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf009;');
+}
+.icon-th {
+  *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf00a;');
+}
+.icon-th-list {
+  *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf00b;');
+}
+.icon-ok {
+  *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf00c;');
+}
+.icon-remove {
+  *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf00d;');
+}
+.icon-zoom-in {
+  *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf00e;');
+}
+.icon-zoom-out {
+  *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf010;');
+}
+.icon-off {
+  *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf011;');
+}
+.icon-signal {
+  *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf012;');
+}
+.icon-cog {
+  *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf013;');
+}
+.icon-trash {
+  *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf014;');
+}
+.icon-home {
+  *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf015;');
+}
+.icon-file {
+  *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf016;');
+}
+.icon-time {
+  *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf017;');
+}
+.icon-road {
+  *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf018;');
+}
+.icon-download-alt {
+  *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf019;');
+}
+.icon-download {
+  *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf01a;');
+}
+.icon-upload {
+  *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf01b;');
+}
+.icon-inbox {
+  *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf01c;');
+}
+.icon-play-circle {
+  *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf01d;');
+}
+.icon-repeat {
+  *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf01e;');
+}
+.icon-refresh {
+  *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf021;');
+}
+.icon-list-alt {
+  *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf022;');
+}
+.icon-lock {
+  *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf023;');
+}
+.icon-flag {
+  *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf024;');
+}
+.icon-headphones {
+  *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf025;');
+}
+.icon-volume-off {
+  *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf026;');
+}
+.icon-volume-down {
+  *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf027;');
+}
+.icon-volume-up {
+  *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf028;');
+}
+.icon-qrcode {
+  *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf029;');
+}
+.icon-barcode {
+  *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf02a;');
+}
+.icon-tag {
+  *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf02b;');
+}
+.icon-tags {
+  *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf02c;');
+}
+.icon-book {
+  *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf02d;');
+}
+.icon-bookmark {
+  *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf02e;');
+}
+.icon-print {
+  *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf02f;');
+}
+.icon-camera {
+  *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf030;');
+}
+.icon-font {
+  *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf031;');
+}
+.icon-bold {
+  *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf032;');
+}
+.icon-italic {
+  *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf033;');
+}
+.icon-text-height {
+  *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf034;');
+}
+.icon-text-width {
+  *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf035;');
+}
+.icon-align-left {
+  *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf036;');
+}
+.icon-align-center {
+  *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf037;');
+}
+.icon-align-right {
+  *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf038;');
+}
+.icon-align-justify {
+  *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf039;');
+}
+.icon-list {
+  *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf03a;');
+}
+.icon-indent-left {
+  *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf03b;');
+}
+.icon-indent-right {
+  *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf03c;');
+}
+.icon-facetime-video {
+  *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf03d;');
+}
+.icon-picture {
+  *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf03e;');
+}
+.icon-pencil {
+  *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf040;');
+}
+.icon-map-marker {
+  *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf041;');
+}
+.icon-adjust {
+  *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf042;');
+}
+.icon-tint {
+  *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf043;');
+}
+.icon-edit {
+  *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf044;');
+}
+.icon-share {
+  *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf045;');
+}
+.icon-check {
+  *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf046;');
+}
+.icon-move {
+  *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf047;');
+}
+.icon-step-backward {
+  *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf048;');
+}
+.icon-fast-backward {
+  *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf049;');
+}
+.icon-backward {
+  *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf04a;');
+}
+.icon-play {
+  *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf04b;');
+}
+.icon-pause {
+  *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf04c;');
+}
+.icon-stop {
+  *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf04d;');
+}
+.icon-forward {
+  *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf04e;');
+}
+.icon-fast-forward {
+  *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf050;');
+}
+.icon-step-forward {
+  *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf051;');
+}
+.icon-eject {
+  *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf052;');
+}
+.icon-chevron-left {
+  *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf053;');
+}
+.icon-chevron-right {
+  *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf054;');
+}
+.icon-plus-sign {
+  *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf055;');
+}
+.icon-minus-sign {
+  *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf056;');
+}
+.icon-remove-sign {
+  *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf057;');
+}
+.icon-ok-sign {
+  *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf058;');
+}
+.icon-question-sign {
+  *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf059;');
+}
+.icon-info-sign {
+  *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf05a;');
+}
+.icon-screenshot {
+  *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf05b;');
+}
+.icon-remove-circle {
+  *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf05c;');
+}
+.icon-ok-circle {
+  *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf05d;');
+}
+.icon-ban-circle {
+  *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf05e;');
+}
+.icon-arrow-left {
+  *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf060;');
+}
+.icon-arrow-right {
+  *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf061;');
+}
+.icon-arrow-up {
+  *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf062;');
+}
+.icon-arrow-down {
+  *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf063;');
+}
+.icon-share-alt {
+  *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf064;');
+}
+.icon-resize-full {
+  *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf065;');
+}
+.icon-resize-small {
+  *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf066;');
+}
+.icon-plus {
+  *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf067;');
+}
+.icon-minus {
+  *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf068;');
+}
+.icon-asterisk {
+  *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf069;');
+}
+.icon-exclamation-sign {
+  *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf06a;');
+}
+.icon-gift {
+  *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf06b;');
+}
+.icon-leaf {
+  *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf06c;');
+}
+.icon-fire {
+  *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf06d;');
+}
+.icon-eye-open {
+  *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf06e;');
+}
+.icon-eye-close {
+  *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf070;');
+}
+.icon-warning-sign {
+  *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf071;');
+}
+.icon-plane {
+  *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf072;');
+}
+.icon-calendar {
+  *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf073;');
+}
+.icon-random {
+  *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf074;');
+}
+.icon-comment {
+  *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf075;');
+}
+.icon-magnet {
+  *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf076;');
+}
+.icon-chevron-up {
+  *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf077;');
+}
+.icon-chevron-down {
+  *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf078;');
+}
+.icon-retweet {
+  *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf079;');
+}
+.icon-shopping-cart {
+  *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf07a;');
+}
+.icon-folder-close {
+  *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf07b;');
+}
+.icon-folder-open {
+  *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf07c;');
+}
+.icon-resize-vertical {
+  *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf07d;');
+}
+.icon-resize-horizontal {
+  *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf07e;');
+}
+.icon-bar-chart {
+  *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf080;');
+}
+.icon-twitter-sign {
+  *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf081;');
+}
+.icon-facebook-sign {
+  *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf082;');
+}
+.icon-camera-retro {
+  *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf083;');
+}
+.icon-key {
+  *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf084;');
+}
+.icon-cogs {
+  *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf085;');
+}
+.icon-comments {
+  *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf086;');
+}
+.icon-thumbs-up {
+  *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf087;');
+}
+.icon-thumbs-down {
+  *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf088;');
+}
+.icon-star-half {
+  *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf089;');
+}
+.icon-heart-empty {
+  *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf08a;');
+}
+.icon-signout {
+  *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf08b;');
+}
+.icon-linkedin-sign {
+  *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf08c;');
+}
+.icon-pushpin {
+  *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf08d;');
+}
+.icon-external-link {
+  *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf08e;');
+}
+.icon-signin {
+  *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf090;');
+}
+.icon-trophy {
+  *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf091;');
+}
+.icon-github-sign {
+  *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf092;');
+}
+.icon-upload-alt {
+  *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf093;');
+}
+.icon-lemon {
+  *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf094;');
+}
+.icon-phone {
+  *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf095;');
+}
+.icon-check-empty {
+  *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf096;');
+}
+.icon-bookmark-empty {
+  *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf097;');
+}
+.icon-phone-sign {
+  *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf098;');
+}
+.icon-twitter {
+  *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf099;');
+}
+.icon-facebook {
+  *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf09a;');
+}
+.icon-github {
+  *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf09b;');
+}
+.icon-unlock {
+  *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf09c;');
+}
+.icon-credit-card {
+  *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf09d;');
+}
+.icon-rss {
+  *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf09e;');
+}
+.icon-hdd {
+  *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0a0;');
+}
+.icon-bullhorn {
+  *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0a1;');
+}
+.icon-bell {
+  *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0a2;');
+}
+.icon-certificate {
+  *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0a3;');
+}
+.icon-hand-right {
+  *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0a4;');
+}
+.icon-hand-left {
+  *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0a5;');
+}
+.icon-hand-up {
+  *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0a6;');
+}
+.icon-hand-down {
+  *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0a7;');
+}
+.icon-circle-arrow-left {
+  *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0a8;');
+}
+.icon-circle-arrow-right {
+  *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0a9;');
+}
+.icon-circle-arrow-up {
+  *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0aa;');
+}
+.icon-circle-arrow-down {
+  *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0ab;');
+}
+.icon-globe {
+  *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0ac;');
+}
+.icon-wrench {
+  *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0ad;');
+}
+.icon-tasks {
+  *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0ae;');
+}
+.icon-filter {
+  *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0b0;');
+}
+.icon-briefcase {
+  *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0b1;');
+}
+.icon-fullscreen {
+  *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0b2;');
+}
+.icon-group {
+  *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0c0;');
+}
+.icon-link {
+  *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0c1;');
+}
+.icon-cloud {
+  *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0c2;');
+}
+.icon-beaker {
+  *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0c3;');
+}
+.icon-cut {
+  *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0c4;');
+}
+.icon-copy {
+  *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0c5;');
+}
+.icon-paper-clip {
+  *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0c6;');
+}
+.icon-save {
+  *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0c7;');
+}
+.icon-sign-blank {
+  *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0c8;');
+}
+.icon-reorder {
+  *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0c9;');
+}
+.icon-list-ul {
+  *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0ca;');
+}
+.icon-list-ol {
+  *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0cb;');
+}
+.icon-strikethrough {
+  *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0cc;');
+}
+.icon-underline {
+  *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0cd;');
+}
+.icon-table {
+  *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0ce;');
+}
+.icon-magic {
+  *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0d0;');
+}
+.icon-truck {
+  *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0d1;');
+}
+.icon-pinterest {
+  *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0d2;');
+}
+.icon-pinterest-sign {
+  *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0d3;');
+}
+.icon-google-plus-sign {
+  *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0d4;');
+}
+.icon-google-plus {
+  *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0d5;');
+}
+.icon-money {
+  *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0d6;');
+}
+.icon-caret-down {
+  *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0d7;');
+}
+.icon-caret-up {
+  *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0d8;');
+}
+.icon-caret-left {
+  *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0d9;');
+}
+.icon-caret-right {
+  *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0da;');
+}
+.icon-columns {
+  *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0db;');
+}
+.icon-sort {
+  *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0dc;');
+}
+.icon-sort-down {
+  *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0dd;');
+}
+.icon-sort-up {
+  *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0de;');
+}
+.icon-envelope-alt {
+  *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0e0;');
+}
+.icon-linkedin {
+  *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0e1;');
+}
+.icon-undo {
+  *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0e2;');
+}
+.icon-legal {
+  *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0e3;');
+}
+.icon-dashboard {
+  *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0e4;');
+}
+.icon-comment-alt {
+  *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0e5;');
+}
+.icon-comments-alt {
+  *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0e6;');
+}
+.icon-bolt {
+  *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0e7;');
+}
+.icon-sitemap {
+  *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0e8;');
+}
+.icon-umbrella {
+  *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0e9;');
+}
+.icon-paste {
+  *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0ea;');
+}
+.icon-lightbulb {
+  *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0eb;');
+}
+.icon-exchange {
+  *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0ec;');
+}
+.icon-cloud-download {
+  *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0ed;');
+}
+.icon-cloud-upload {
+  *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0ee;');
+}
+.icon-user-md {
+  *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0f0;');
+}
+.icon-stethoscope {
+  *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0f1;');
+}
+.icon-suitcase {
+  *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0f2;');
+}
+.icon-bell-alt {
+  *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0f3;');
+}
+.icon-coffee {
+  *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0f4;');
+}
+.icon-food {
+  *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0f5;');
+}
+.icon-file-alt {
+  *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0f6;');
+}
+.icon-building {
+  *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0f7;');
+}
+.icon-hospital {
+  *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0f8;');
+}
+.icon-ambulance {
+  *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0f9;');
+}
+.icon-medkit {
+  *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0fa;');
+}
+.icon-fighter-jet {
+  *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0fb;');
+}
+.icon-beer {
+  *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0fc;');
+}
+.icon-h-sign {
+  *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0fd;');
+}
+.icon-plus-sign-alt {
+  *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0fe;');
+}
+.icon-double-angle-left {
+  *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf100;');
+}
+.icon-double-angle-right {
+  *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf101;');
+}
+.icon-double-angle-up {
+  *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf102;');
+}
+.icon-double-angle-down {
+  *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf103;');
+}
+.icon-angle-left {
+  *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf104;');
+}
+.icon-angle-right {
+  *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf105;');
+}
+.icon-angle-up {
+  *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf106;');
+}
+.icon-angle-down {
+  *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf107;');
+}
+.icon-desktop {
+  *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf108;');
+}
+.icon-laptop {
+  *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf109;');
+}
+.icon-tablet {
+  *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf10a;');
+}
+.icon-mobile-phone {
+  *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf10b;');
+}
+.icon-circle-blank {
+  *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf10c;');
+}
+.icon-quote-left {
+  *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf10d;');
+}
+.icon-quote-right {
+  *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf10e;');
+}
+.icon-spinner {
+  *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf110;');
+}
+.icon-circle {
+  *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf111;');
+}
+.icon-reply {
+  *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf112;');
+}
+.icon-folder-close-alt {
+  *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf114;');
+}
+.icon-folder-open-alt {
+  *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf115;');
+}
+.icon-expand-alt {
+  *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf116;');
+}
+.icon-collapse-alt {
+  *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf117;');
+}
+.icon-smile {
+  *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf118;');
+}
+.icon-frown {
+  *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf119;');
+}
+.icon-meh {
+  *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf11a;');
+}
+.icon-gamepad {
+  *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf11b;');
+}
+.icon-keyboard {
+  *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf11c;');
+}
+.icon-flag-alt {
+  *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf11d;');
+}
+.icon-flag-checkered {
+  *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf11e;');
+}
+.icon-terminal {
+  *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf120;');
+}
+.icon-code {
+  *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf121;');
+}
+.icon-reply-all {
+  *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf122;');
+}
+.icon-mail-reply-all {
+  *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf122;');
+}
+.icon-star-half-full,
+.icon-star-half-empty {
+  *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf123;');
+}
+.icon-location-arrow {
+  *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf124;');
+}
+.icon-crop {
+  *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf125;');
+}
+.icon-code-fork {
+  *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf126;');
+}
+.icon-unlink {
+  *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf127;');
+}
+.icon-question {
+  *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf128;');
+}
+.icon-info {
+  *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf129;');
+}
+.icon-exclamation {
+  *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf12a;');
+}
+.icon-superscript {
+  *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf12b;');
+}
+.icon-subscript {
+  *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf12c;');
+}
+.icon-eraser {
+  *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf12d;');
+}
+.icon-puzzle-piece {
+  *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf12e;');
+}
+.icon-microphone {
+  *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf130;');
+}
+.icon-microphone-off {
+  *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf131;');
+}
+.icon-shield {
+  *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf132;');
+}
+.icon-calendar-empty {
+  *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf133;');
+}
+.icon-fire-extinguisher {
+  *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf134;');
+}
+.icon-rocket {
+  *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf135;');
+}
+.icon-maxcdn {
+  *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf136;');
+}
+.icon-chevron-sign-left {
+  *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf137;');
+}
+.icon-chevron-sign-right {
+  *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf138;');
+}
+.icon-chevron-sign-up {
+  *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf139;');
+}
+.icon-chevron-sign-down {
+  *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf13a;');
+}
+.icon-html5 {
+  *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf13b;');
+}
+.icon-css3 {
+  *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf13c;');
+}
+.icon-anchor {
+  *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf13d;');
+}
+.icon-unlock-alt {
+  *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf13e;');
+}
+.icon-bullseye {
+  *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf140;');
+}
+.icon-ellipsis-horizontal {
+  *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf141;');
+}
+.icon-ellipsis-vertical {
+  *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf142;');
+}
+.icon-rss-sign {
+  *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf143;');
+}
+.icon-play-sign {
+  *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf144;');
+}
+.icon-ticket {
+  *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf145;');
+}
+.icon-minus-sign-alt {
+  *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf146;');
+}
+.icon-check-minus {
+  *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf147;');
+}
+.icon-level-up {
+  *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf148;');
+}
+.icon-level-down {
+  *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf149;');
+}
+.icon-check-sign {
+  *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf14a;');
+}
+.icon-edit-sign {
+  *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf14b;');
+}
+.icon-external-link-sign {
+  *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf14c;');
+}
+.icon-share-sign {
+  *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf14d;');
+}

File diff suppressed because it is too large
+ 23 - 0
main/css/font_awesome/css/font-awesome-ie7.min.css


+ 1268 - 0
main/css/font_awesome/css/font-awesome.css

@@ -0,0 +1,1268 @@
+/*!
+ *  Font Awesome 3.1.0
+ *  the iconic font designed for Bootstrap
+ *  -------------------------------------------------------
+ *  The full suite of pictographic icons, examples, and documentation
+ *  can be found at: http://fontawesome.io
+ *
+ *  License
+ *  -------------------------------------------------------
+ *  - The Font Awesome font is licensed under the SIL Open Font License v1.1 -
+ *    http://scripts.sil.org/OFL
+ *  - Font Awesome CSS, LESS, and SASS files are licensed under the MIT License -
+ *    http://opensource.org/licenses/mit-license.html
+ *  - Font Awesome documentation licensed under CC BY 3.0 License -
+ *    http://creativecommons.org/licenses/by/3.0/
+ *  - Attribution is no longer required in Font Awesome 3.0, but much appreciated:
+ *    "Font Awesome by Dave Gandy - http://fontawesome.io"
+
+ *  Contact
+ *  -------------------------------------------------------
+ *  Email: dave@fontawesome.io
+ *  Twitter: http://twitter.com/fortaweso_me
+ *  Work: Lead Product Designer @ http://kyruus.com
+ */
+/* FONT PATH
+ * -------------------------- */
+@font-face {
+  font-family: 'FontAwesome';
+  src: url('../font/fontawesome-webfont.eot?v=3.1.0');
+  src: url('../font/fontawesome-webfont.eot?#iefix&v=3.1.0') format('embedded-opentype'), url('../font/fontawesome-webfont.woff?v=3.1.0') format('woff'), url('../font/fontawesome-webfont.ttf?v=3.1.0') format('truetype'), url('../font/fontawesome-webfont.svg#fontawesomeregular?v=3.1.0') format('svg');
+  font-weight: normal;
+  font-style: normal;
+}
+/* FONT AWESOME CORE
+ * -------------------------- */
+[class^="icon-"],
+[class*=" icon-"] {
+  font-family: FontAwesome;
+  font-weight: normal;
+  font-style: normal;
+  text-decoration: inherit;
+  -webkit-font-smoothing: antialiased;
+  *margin-right: .3em;
+}
+[class^="icon-"]:before,
+[class*=" icon-"]:before {
+  text-decoration: inherit;
+  display: inline-block;
+  speak: none;
+}
+/* makes the font 33% larger relative to the icon container */
+.icon-large:before {
+  vertical-align: -10%;
+  font-size: 1.3333333333333333em;
+}
+/* makes sure icons active on rollover in links */
+a [class^="icon-"],
+a [class*=" icon-"],
+a [class^="icon-"]:before,
+a [class*=" icon-"]:before {
+  display: inline;
+}
+/* increased font size for icon-large */
+[class^="icon-"].icon-fixed-width,
+[class*=" icon-"].icon-fixed-width {
+  display: inline-block;
+  width: 1.2857142857142858em;
+  text-align: center;
+}
+[class^="icon-"].icon-fixed-width.icon-large,
+[class*=" icon-"].icon-fixed-width.icon-large {
+  width: 1.5714285714285714em;
+}
+ul.icons-ul {
+  list-style-type: none;
+  text-indent: -0.7142857142857143em;
+  margin-left: 2.142857142857143em;
+}
+ul.icons-ul > li .icon-li {
+  width: 0.7142857142857143em;
+  display: inline-block;
+  text-align: center;
+}
+[class^="icon-"].hide,
+[class*=" icon-"].hide {
+  display: none;
+}
+.icon-muted {
+  color: #eeeeee;
+}
+.icon-light {
+  color: #ffffff;
+}
+.icon-dark {
+  color: #333333;
+}
+.icon-border {
+  border: solid 1px #eeeeee;
+  padding: .2em .25em .15em;
+  -webkit-border-radius: 3px;
+  -moz-border-radius: 3px;
+  border-radius: 3px;
+}
+.icon-2x {
+  font-size: 2em;
+}
+.icon-2x.icon-border {
+  border-width: 2px;
+  -webkit-border-radius: 4px;
+  -moz-border-radius: 4px;
+  border-radius: 4px;
+}
+.icon-3x {
+  font-size: 3em;
+}
+.icon-3x.icon-border {
+  border-width: 3px;
+  -webkit-border-radius: 5px;
+  -moz-border-radius: 5px;
+  border-radius: 5px;
+}
+.icon-4x {
+  font-size: 4em;
+}
+.icon-4x.icon-border {
+  border-width: 4px;
+  -webkit-border-radius: 6px;
+  -moz-border-radius: 6px;
+  border-radius: 6px;
+}
+.icon-5x {
+  font-size: 5em;
+}
+.icon-5x.icon-border {
+  border-width: 5px;
+  -webkit-border-radius: 7px;
+  -moz-border-radius: 7px;
+  border-radius: 7px;
+}
+.pull-right {
+  float: right;
+}
+.pull-left {
+  float: left;
+}
+[class^="icon-"].pull-left,
+[class*=" icon-"].pull-left {
+  margin-right: .3em;
+}
+[class^="icon-"].pull-right,
+[class*=" icon-"].pull-right {
+  margin-left: .3em;
+}
+/* BOOTSTRAP SPECIFIC CLASSES
+ * -------------------------- */
+/* Bootstrap 2.0 sprites.less reset */
+[class^="icon-"],
+[class*=" icon-"] {
+  display: inline;
+  width: auto;
+  height: auto;
+  line-height: normal;
+  vertical-align: baseline;
+  background-image: none;
+  background-position: 0% 0%;
+  background-repeat: repeat;
+  margin-top: 0;
+}
+/* more sprites.less reset */
+.icon-white,
+.nav-pills > .active > a > [class^="icon-"],
+.nav-pills > .active > a > [class*=" icon-"],
+.nav-list > .active > a > [class^="icon-"],
+.nav-list > .active > a > [class*=" icon-"],
+.navbar-inverse .nav > .active > a > [class^="icon-"],
+.navbar-inverse .nav > .active > a > [class*=" icon-"],
+.dropdown-menu > li > a:hover > [class^="icon-"],
+.dropdown-menu > li > a:hover > [class*=" icon-"],
+.dropdown-menu > .active > a > [class^="icon-"],
+.dropdown-menu > .active > a > [class*=" icon-"],
+.dropdown-submenu:hover > a > [class^="icon-"],
+.dropdown-submenu:hover > a > [class*=" icon-"] {
+  background-image: none;
+}
+/* keeps Bootstrap styles with and without icons the same */
+.btn [class^="icon-"].icon-large,
+.nav [class^="icon-"].icon-large,
+.btn [class*=" icon-"].icon-large,
+.nav [class*=" icon-"].icon-large {
+  line-height: .9em;
+}
+.btn [class^="icon-"].icon-spin,
+.nav [class^="icon-"].icon-spin,
+.btn [class*=" icon-"].icon-spin,
+.nav [class*=" icon-"].icon-spin {
+  display: inline-block;
+}
+.nav-tabs [class^="icon-"],
+.nav-pills [class^="icon-"],
+.nav-tabs [class*=" icon-"],
+.nav-pills [class*=" icon-"],
+.nav-tabs [class^="icon-"].icon-large,
+.nav-pills [class^="icon-"].icon-large,
+.nav-tabs [class*=" icon-"].icon-large,
+.nav-pills [class*=" icon-"].icon-large {
+  line-height: .9em;
+}
+.btn [class^="icon-"].pull-left.icon-2x,
+.btn [class*=" icon-"].pull-left.icon-2x,
+.btn [class^="icon-"].pull-right.icon-2x,
+.btn [class*=" icon-"].pull-right.icon-2x {
+  margin-top: .18em;
+}
+.btn [class^="icon-"].icon-spin.icon-large,
+.btn [class*=" icon-"].icon-spin.icon-large {
+  line-height: .8em;
+}
+.btn.btn-small [class^="icon-"].pull-left.icon-2x,
+.btn.btn-small [class*=" icon-"].pull-left.icon-2x,
+.btn.btn-small [class^="icon-"].pull-right.icon-2x,
+.btn.btn-small [class*=" icon-"].pull-right.icon-2x {
+  margin-top: .25em;
+}
+.btn.btn-large [class^="icon-"],
+.btn.btn-large [class*=" icon-"] {
+  margin-top: 0;
+}
+.btn.btn-large [class^="icon-"].pull-left.icon-2x,
+.btn.btn-large [class*=" icon-"].pull-left.icon-2x,
+.btn.btn-large [class^="icon-"].pull-right.icon-2x,
+.btn.btn-large [class*=" icon-"].pull-right.icon-2x {
+  margin-top: .05em;
+}
+.btn.btn-large [class^="icon-"].pull-left.icon-2x,
+.btn.btn-large [class*=" icon-"].pull-left.icon-2x {
+  margin-right: .2em;
+}
+.btn.btn-large [class^="icon-"].pull-right.icon-2x,
+.btn.btn-large [class*=" icon-"].pull-right.icon-2x {
+  margin-left: .2em;
+}
+/* EXTRAS
+ * -------------------------- */
+/* Stacked and layered icon */
+.icon-stack {
+  position: relative;
+  display: inline-block;
+  width: 2em;
+  height: 2em;
+  line-height: 2em;
+  vertical-align: -35%;
+}
+.icon-stack [class^="icon-"],
+.icon-stack [class*=" icon-"] {
+  display: block;
+  text-align: center;
+  position: absolute;
+  width: 100%;
+  height: 100%;
+  font-size: 1em;
+  line-height: inherit;
+  *line-height: 2em;
+}
+.icon-stack .icon-stack-base {
+  font-size: 2em;
+  *line-height: 1em;
+}
+/* Animated rotating icon */
+.icon-spin {
+  display: inline-block;
+  -moz-animation: spin 2s infinite linear;
+  -o-animation: spin 2s infinite linear;
+  -webkit-animation: spin 2s infinite linear;
+  animation: spin 2s infinite linear;
+}
+@-moz-keyframes spin {
+  0% {
+    -moz-transform: rotate(0deg);
+  }
+  100% {
+    -moz-transform: rotate(359deg);
+  }
+}
+@-webkit-keyframes spin {
+  0% {
+    -webkit-transform: rotate(0deg);
+  }
+  100% {
+    -webkit-transform: rotate(359deg);
+  }
+}
+@-o-keyframes spin {
+  0% {
+    -o-transform: rotate(0deg);
+  }
+  100% {
+    -o-transform: rotate(359deg);
+  }
+}
+@-ms-keyframes spin {
+  0% {
+    -ms-transform: rotate(0deg);
+  }
+  100% {
+    -ms-transform: rotate(359deg);
+  }
+}
+@keyframes spin {
+  0% {
+    transform: rotate(0deg);
+  }
+  100% {
+    transform: rotate(359deg);
+  }
+}
+/* Icon rotations and mirroring */
+.icon-rotate-90:before {
+  -webkit-transform: rotate(90deg);
+  -moz-transform: rotate(90deg);
+  -ms-transform: rotate(90deg);
+  -o-transform: rotate(90deg);
+  transform: rotate(90deg);
+  filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=1);
+}
+.icon-rotate-180:before {
+  -webkit-transform: rotate(180deg);
+  -moz-transform: rotate(180deg);
+  -ms-transform: rotate(180deg);
+  -o-transform: rotate(180deg);
+  transform: rotate(180deg);
+  filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=2);
+}
+.icon-rotate-270:before {
+  -webkit-transform: rotate(270deg);
+  -moz-transform: rotate(270deg);
+  -ms-transform: rotate(270deg);
+  -o-transform: rotate(270deg);
+  transform: rotate(270deg);
+  filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=3);
+}
+.icon-flip-horizontal:before {
+  -webkit-transform: scale(-1, 1);
+  -moz-transform: scale(-1, 1);
+  -ms-transform: scale(-1, 1);
+  -o-transform: scale(-1, 1);
+  transform: scale(-1, 1);
+}
+.icon-flip-vertical:before {
+  -webkit-transform: scale(1, -1);
+  -moz-transform: scale(1, -1);
+  -ms-transform: scale(1, -1);
+  -o-transform: scale(1, -1);
+  transform: scale(1, -1);
+}
+/* Font Awesome uses the Unicode Private Use Area (PUA) to ensure screen
+   readers do not read off random characters that represent icons */
+.icon-glass:before {
+  content: "\f000";
+}
+.icon-music:before {
+  content: "\f001";
+}
+.icon-search:before {
+  content: "\f002";
+}
+.icon-envelope:before {
+  content: "\f003";
+}
+.icon-heart:before {
+  content: "\f004";
+}
+.icon-star:before {
+  content: "\f005";
+}
+.icon-star-empty:before {
+  content: "\f006";
+}
+.icon-user:before {
+  content: "\f007";
+}
+.icon-film:before {
+  content: "\f008";
+}
+.icon-th-large:before {
+  content: "\f009";
+}
+.icon-th:before {
+  content: "\f00a";
+}
+.icon-th-list:before {
+  content: "\f00b";
+}
+.icon-ok:before {
+  content: "\f00c";
+}
+.icon-remove:before {
+  content: "\f00d";
+}
+.icon-zoom-in:before {
+  content: "\f00e";
+}
+.icon-zoom-out:before {
+  content: "\f010";
+}
+.icon-off:before {
+  content: "\f011";
+}
+.icon-signal:before {
+  content: "\f012";
+}
+.icon-cog:before {
+  content: "\f013";
+}
+.icon-trash:before {
+  content: "\f014";
+}
+.icon-home:before {
+  content: "\f015";
+}
+.icon-file:before {
+  content: "\f016";
+}
+.icon-time:before {
+  content: "\f017";
+}
+.icon-road:before {
+  content: "\f018";
+}
+.icon-download-alt:before {
+  content: "\f019";
+}
+.icon-download:before {
+  content: "\f01a";
+}
+.icon-upload:before {
+  content: "\f01b";
+}
+.icon-inbox:before {
+  content: "\f01c";
+}
+.icon-play-circle:before {
+  content: "\f01d";
+}
+.icon-repeat:before,
+.icon-rotate-right:before {
+  content: "\f01e";
+}
+/* F020 doesn't work in Safari. all shifted one down */
+.icon-refresh:before {
+  content: "\f021";
+}
+.icon-list-alt:before {
+  content: "\f022";
+}
+.icon-lock:before {
+  content: "\f023";
+}
+.icon-flag:before {
+  content: "\f024";
+}
+.icon-headphones:before {
+  content: "\f025";
+}
+.icon-volume-off:before {
+  content: "\f026";
+}
+.icon-volume-down:before {
+  content: "\f027";
+}
+.icon-volume-up:before {
+  content: "\f028";
+}
+.icon-qrcode:before {
+  content: "\f029";
+}
+.icon-barcode:before {
+  content: "\f02a";
+}
+.icon-tag:before {
+  content: "\f02b";
+}
+.icon-tags:before {
+  content: "\f02c";
+}
+.icon-book:before {
+  content: "\f02d";
+}
+.icon-bookmark:before {
+  content: "\f02e";
+}
+.icon-print:before {
+  content: "\f02f";
+}
+.icon-camera:before {
+  content: "\f030";
+}
+.icon-font:before {
+  content: "\f031";
+}
+.icon-bold:before {
+  content: "\f032";
+}
+.icon-italic:before {
+  content: "\f033";
+}
+.icon-text-height:before {
+  content: "\f034";
+}
+.icon-text-width:before {
+  content: "\f035";
+}
+.icon-align-left:before {
+  content: "\f036";
+}
+.icon-align-center:before {
+  content: "\f037";
+}
+.icon-align-right:before {
+  content: "\f038";
+}
+.icon-align-justify:before {
+  content: "\f039";
+}
+.icon-list:before {
+  content: "\f03a";
+}
+.icon-indent-left:before {
+  content: "\f03b";
+}
+.icon-indent-right:before {
+  content: "\f03c";
+}
+.icon-facetime-video:before {
+  content: "\f03d";
+}
+.icon-picture:before {
+  content: "\f03e";
+}
+.icon-pencil:before {
+  content: "\f040";
+}
+.icon-map-marker:before {
+  content: "\f041";
+}
+.icon-adjust:before {
+  content: "\f042";
+}
+.icon-tint:before {
+  content: "\f043";
+}
+.icon-edit:before {
+  content: "\f044";
+}
+.icon-share:before {
+  content: "\f045";
+}
+.icon-check:before {
+  content: "\f046";
+}
+.icon-move:before {
+  content: "\f047";
+}
+.icon-step-backward:before {
+  content: "\f048";
+}
+.icon-fast-backward:before {
+  content: "\f049";
+}
+.icon-backward:before {
+  content: "\f04a";
+}
+.icon-play:before {
+  content: "\f04b";
+}
+.icon-pause:before {
+  content: "\f04c";
+}
+.icon-stop:before {
+  content: "\f04d";
+}
+.icon-forward:before {
+  content: "\f04e";
+}
+.icon-fast-forward:before {
+  content: "\f050";
+}
+.icon-step-forward:before {
+  content: "\f051";
+}
+.icon-eject:before {
+  content: "\f052";
+}
+.icon-chevron-left:before {
+  content: "\f053";
+}
+.icon-chevron-right:before {
+  content: "\f054";
+}
+.icon-plus-sign:before {
+  content: "\f055";
+}
+.icon-minus-sign:before {
+  content: "\f056";
+}
+.icon-remove-sign:before {
+  content: "\f057";
+}
+.icon-ok-sign:before {
+  content: "\f058";
+}
+.icon-question-sign:before {
+  content: "\f059";
+}
+.icon-info-sign:before {
+  content: "\f05a";
+}
+.icon-screenshot:before {
+  content: "\f05b";
+}
+.icon-remove-circle:before {
+  content: "\f05c";
+}
+.icon-ok-circle:before {
+  content: "\f05d";
+}
+.icon-ban-circle:before {
+  content: "\f05e";
+}
+.icon-arrow-left:before {
+  content: "\f060";
+}
+.icon-arrow-right:before {
+  content: "\f061";
+}
+.icon-arrow-up:before {
+  content: "\f062";
+}
+.icon-arrow-down:before {
+  content: "\f063";
+}
+.icon-share-alt:before,
+.icon-mail-forward:before {
+  content: "\f064";
+}
+.icon-resize-full:before {
+  content: "\f065";
+}
+.icon-resize-small:before {
+  content: "\f066";
+}
+.icon-plus:before {
+  content: "\f067";
+}
+.icon-minus:before {
+  content: "\f068";
+}
+.icon-asterisk:before {
+  content: "\f069";
+}
+.icon-exclamation-sign:before {
+  content: "\f06a";
+}
+.icon-gift:before {
+  content: "\f06b";
+}
+.icon-leaf:before {
+  content: "\f06c";
+}
+.icon-fire:before {
+  content: "\f06d";
+}
+.icon-eye-open:before {
+  content: "\f06e";
+}
+.icon-eye-close:before {
+  content: "\f070";
+}
+.icon-warning-sign:before {
+  content: "\f071";
+}
+.icon-plane:before {
+  content: "\f072";
+}
+.icon-calendar:before {
+  content: "\f073";
+}
+.icon-random:before {
+  content: "\f074";
+}
+.icon-comment:before {
+  content: "\f075";
+}
+.icon-magnet:before {
+  content: "\f076";
+}
+.icon-chevron-up:before {
+  content: "\f077";
+}
+.icon-chevron-down:before {
+  content: "\f078";
+}
+.icon-retweet:before {
+  content: "\f079";
+}
+.icon-shopping-cart:before {
+  content: "\f07a";
+}
+.icon-folder-close:before {
+  content: "\f07b";
+}
+.icon-folder-open:before {
+  content: "\f07c";
+}
+.icon-resize-vertical:before {
+  content: "\f07d";
+}
+.icon-resize-horizontal:before {
+  content: "\f07e";
+}
+.icon-bar-chart:before {
+  content: "\f080";
+}
+.icon-twitter-sign:before {
+  content: "\f081";
+}
+.icon-facebook-sign:before {
+  content: "\f082";
+}
+.icon-camera-retro:before {
+  content: "\f083";
+}
+.icon-key:before {
+  content: "\f084";
+}
+.icon-cogs:before {
+  content: "\f085";
+}
+.icon-comments:before {
+  content: "\f086";
+}
+.icon-thumbs-up:before {
+  content: "\f087";
+}
+.icon-thumbs-down:before {
+  content: "\f088";
+}
+.icon-star-half:before {
+  content: "\f089";
+}
+.icon-heart-empty:before {
+  content: "\f08a";
+}
+.icon-signout:before {
+  content: "\f08b";
+}
+.icon-linkedin-sign:before {
+  content: "\f08c";
+}
+.icon-pushpin:before {
+  content: "\f08d";
+}
+.icon-external-link:before {
+  content: "\f08e";
+}
+.icon-signin:before {
+  content: "\f090";
+}
+.icon-trophy:before {
+  content: "\f091";
+}
+.icon-github-sign:before {
+  content: "\f092";
+}
+.icon-upload-alt:before {
+  content: "\f093";
+}
+.icon-lemon:before {
+  content: "\f094";
+}
+.icon-phone:before {
+  content: "\f095";
+}
+.icon-check-empty:before {
+  content: "\f096";
+}
+.icon-bookmark-empty:before {
+  content: "\f097";
+}
+.icon-phone-sign:before {
+  content: "\f098";
+}
+.icon-twitter:before {
+  content: "\f099";
+}
+.icon-facebook:before {
+  content: "\f09a";
+}
+.icon-github:before {
+  content: "\f09b";
+}
+.icon-unlock:before {
+  content: "\f09c";
+}
+.icon-credit-card:before {
+  content: "\f09d";
+}
+.icon-rss:before {
+  content: "\f09e";
+}
+.icon-hdd:before {
+  content: "\f0a0";
+}
+.icon-bullhorn:before {
+  content: "\f0a1";
+}
+.icon-bell:before {
+  content: "\f0a2";
+}
+.icon-certificate:before {
+  content: "\f0a3";
+}
+.icon-hand-right:before {
+  content: "\f0a4";
+}
+.icon-hand-left:before {
+  content: "\f0a5";
+}
+.icon-hand-up:before {
+  content: "\f0a6";
+}
+.icon-hand-down:before {
+  content: "\f0a7";
+}
+.icon-circle-arrow-left:before {
+  content: "\f0a8";
+}
+.icon-circle-arrow-right:before {
+  content: "\f0a9";
+}
+.icon-circle-arrow-up:before {
+  content: "\f0aa";
+}
+.icon-circle-arrow-down:before {
+  content: "\f0ab";
+}
+.icon-globe:before {
+  content: "\f0ac";
+}
+.icon-wrench:before {
+  content: "\f0ad";
+}
+.icon-tasks:before {
+  content: "\f0ae";
+}
+.icon-filter:before {
+  content: "\f0b0";
+}
+.icon-briefcase:before {
+  content: "\f0b1";
+}
+.icon-fullscreen:before {
+  content: "\f0b2";
+}
+.icon-group:before {
+  content: "\f0c0";
+}
+.icon-link:before {
+  content: "\f0c1";
+}
+.icon-cloud:before {
+  content: "\f0c2";
+}
+.icon-beaker:before {
+  content: "\f0c3";
+}
+.icon-cut:before {
+  content: "\f0c4";
+}
+.icon-copy:before {
+  content: "\f0c5";
+}
+.icon-paper-clip:before {
+  content: "\f0c6";
+}
+.icon-save:before {
+  content: "\f0c7";
+}
+.icon-sign-blank:before {
+  content: "\f0c8";
+}
+.icon-reorder:before {
+  content: "\f0c9";
+}
+.icon-list-ul:before {
+  content: "\f0ca";
+}
+.icon-list-ol:before {
+  content: "\f0cb";
+}
+.icon-strikethrough:before {
+  content: "\f0cc";
+}
+.icon-underline:before {
+  content: "\f0cd";
+}
+.icon-table:before {
+  content: "\f0ce";
+}
+.icon-magic:before {
+  content: "\f0d0";
+}
+.icon-truck:before {
+  content: "\f0d1";
+}
+.icon-pinterest:before {
+  content: "\f0d2";
+}
+.icon-pinterest-sign:before {
+  content: "\f0d3";
+}
+.icon-google-plus-sign:before {
+  content: "\f0d4";
+}
+.icon-google-plus:before {
+  content: "\f0d5";
+}
+.icon-money:before {
+  content: "\f0d6";
+}
+.icon-caret-down:before {
+  content: "\f0d7";
+}
+.icon-caret-up:before {
+  content: "\f0d8";
+}
+.icon-caret-left:before {
+  content: "\f0d9";
+}
+.icon-caret-right:before {
+  content: "\f0da";
+}
+.icon-columns:before {
+  content: "\f0db";
+}
+.icon-sort:before {
+  content: "\f0dc";
+}
+.icon-sort-down:before {
+  content: "\f0dd";
+}
+.icon-sort-up:before {
+  content: "\f0de";
+}
+.icon-envelope-alt:before {
+  content: "\f0e0";
+}
+.icon-linkedin:before {
+  content: "\f0e1";
+}
+.icon-undo:before,
+.icon-rotate-left:before {
+  content: "\f0e2";
+}
+.icon-legal:before {
+  content: "\f0e3";
+}
+.icon-dashboard:before {
+  content: "\f0e4";
+}
+.icon-comment-alt:before {
+  content: "\f0e5";
+}
+.icon-comments-alt:before {
+  content: "\f0e6";
+}
+.icon-bolt:before {
+  content: "\f0e7";
+}
+.icon-sitemap:before {
+  content: "\f0e8";
+}
+.icon-umbrella:before {
+  content: "\f0e9";
+}
+.icon-paste:before {
+  content: "\f0ea";
+}
+.icon-lightbulb:before {
+  content: "\f0eb";
+}
+.icon-exchange:before {
+  content: "\f0ec";
+}
+.icon-cloud-download:before {
+  content: "\f0ed";
+}
+.icon-cloud-upload:before {
+  content: "\f0ee";
+}
+.icon-user-md:before {
+  content: "\f0f0";
+}
+.icon-stethoscope:before {
+  content: "\f0f1";
+}
+.icon-suitcase:before {
+  content: "\f0f2";
+}
+.icon-bell-alt:before {
+  content: "\f0f3";
+}
+.icon-coffee:before {
+  content: "\f0f4";
+}
+.icon-food:before {
+  content: "\f0f5";
+}
+.icon-file-alt:before {
+  content: "\f0f6";
+}
+.icon-building:before {
+  content: "\f0f7";
+}
+.icon-hospital:before {
+  content: "\f0f8";
+}
+.icon-ambulance:before {
+  content: "\f0f9";
+}
+.icon-medkit:before {
+  content: "\f0fa";
+}
+.icon-fighter-jet:before {
+  content: "\f0fb";
+}
+.icon-beer:before {
+  content: "\f0fc";
+}
+.icon-h-sign:before {
+  content: "\f0fd";
+}
+.icon-plus-sign-alt:before {
+  content: "\f0fe";
+}
+.icon-double-angle-left:before {
+  content: "\f100";
+}
+.icon-double-angle-right:before {
+  content: "\f101";
+}
+.icon-double-angle-up:before {
+  content: "\f102";
+}
+.icon-double-angle-down:before {
+  content: "\f103";
+}
+.icon-angle-left:before {
+  content: "\f104";
+}
+.icon-angle-right:before {
+  content: "\f105";
+}
+.icon-angle-up:before {
+  content: "\f106";
+}
+.icon-angle-down:before {
+  content: "\f107";
+}
+.icon-desktop:before {
+  content: "\f108";
+}
+.icon-laptop:before {
+  content: "\f109";
+}
+.icon-tablet:before {
+  content: "\f10a";
+}
+.icon-mobile-phone:before {
+  content: "\f10b";
+}
+.icon-circle-blank:before {
+  content: "\f10c";
+}
+.icon-quote-left:before {
+  content: "\f10d";
+}
+.icon-quote-right:before {
+  content: "\f10e";
+}
+.icon-spinner:before {
+  content: "\f110";
+}
+.icon-circle:before {
+  content: "\f111";
+}
+.icon-reply:before,
+.icon-mail-reply:before {
+  content: "\f112";
+}
+.icon-folder-close-alt:before {
+  content: "\f114";
+}
+.icon-folder-open-alt:before {
+  content: "\f115";
+}
+.icon-expand-alt:before {
+  content: "\f116";
+}
+.icon-collapse-alt:before {
+  content: "\f117";
+}
+.icon-smile:before {
+  content: "\f118";
+}
+.icon-frown:before {
+  content: "\f119";
+}
+.icon-meh:before {
+  content: "\f11a";
+}
+.icon-gamepad:before {
+  content: "\f11b";
+}
+.icon-keyboard:before {
+  content: "\f11c";
+}
+.icon-flag-alt:before {
+  content: "\f11d";
+}
+.icon-flag-checkered:before {
+  content: "\f11e";
+}
+.icon-terminal:before {
+  content: "\f120";
+}
+.icon-code:before {
+  content: "\f121";
+}
+.icon-reply-all:before {
+  content: "\f122";
+}
+.icon-mail-reply-all:before {
+  content: "\f122";
+}
+.icon-star-half-full:before,
+.icon-star-half-empty:before {
+  content: "\f123";
+}
+.icon-location-arrow:before {
+  content: "\f124";
+}
+.icon-crop:before {
+  content: "\f125";
+}
+.icon-code-fork:before {
+  content: "\f126";
+}
+.icon-unlink:before {
+  content: "\f127";
+}
+.icon-question:before {
+  content: "\f128";
+}
+.icon-info:before {
+  content: "\f129";
+}
+.icon-exclamation:before {
+  content: "\f12a";
+}
+.icon-superscript:before {
+  content: "\f12b";
+}
+.icon-subscript:before {
+  content: "\f12c";
+}
+.icon-eraser:before {
+  content: "\f12d";
+}
+.icon-puzzle-piece:before {
+  content: "\f12e";
+}
+.icon-microphone:before {
+  content: "\f130";
+}
+.icon-microphone-off:before {
+  content: "\f131";
+}
+.icon-shield:before {
+  content: "\f132";
+}
+.icon-calendar-empty:before {
+  content: "\f133";
+}
+.icon-fire-extinguisher:before {
+  content: "\f134";
+}
+.icon-rocket:before {
+  content: "\f135";
+}
+.icon-maxcdn:before {
+  content: "\f136";
+}
+.icon-chevron-sign-left:before {
+  content: "\f137";
+}
+.icon-chevron-sign-right:before {
+  content: "\f138";
+}
+.icon-chevron-sign-up:before {
+  content: "\f139";
+}
+.icon-chevron-sign-down:before {
+  content: "\f13a";
+}
+.icon-html5:before {
+  content: "\f13b";
+}
+.icon-css3:before {
+  content: "\f13c";
+}
+.icon-anchor:before {
+  content: "\f13d";
+}
+.icon-unlock-alt:before {
+  content: "\f13e";
+}
+.icon-bullseye:before {
+  content: "\f140";
+}
+.icon-ellipsis-horizontal:before {
+  content: "\f141";
+}
+.icon-ellipsis-vertical:before {
+  content: "\f142";
+}
+.icon-rss-sign:before {
+  content: "\f143";
+}
+.icon-play-sign:before {
+  content: "\f144";
+}
+.icon-ticket:before {
+  content: "\f145";
+}
+.icon-minus-sign-alt:before {
+  content: "\f146";
+}
+.icon-check-minus:before {
+  content: "\f147";
+}
+.icon-level-up:before {
+  content: "\f148";
+}
+.icon-level-down:before {
+  content: "\f149";
+}
+.icon-check-sign:before {
+  content: "\f14a";
+}
+.icon-edit-sign:before {
+  content: "\f14b";
+}
+.icon-external-link-sign:before {
+  content: "\f14c";
+}
+.icon-share-sign:before {
+  content: "\f14d";
+}

File diff suppressed because it is too large
+ 23 - 0
main/css/font_awesome/css/font-awesome.min.css


+ 0 - 1063
main/css/font_awesome/font-awesome-ie7.min.css

@@ -1,1063 +0,0 @@
-/*!
- *  Font Awesome 3.0.2
- *  the iconic font designed for use with Twitter Bootstrap
- *  -------------------------------------------------------
- *  The full suite of pictographic icons, examples, and documentation
- *  can be found at: http://fortawesome.github.com/Font-Awesome/
- *
- *  License
- *  -------------------------------------------------------
- *  - The Font Awesome font is licensed under the SIL Open Font License - http://scripts.sil.org/OFL
- *  - Font Awesome CSS, LESS, and SASS files are licensed under the MIT License -
- *    http://opensource.org/licenses/mit-license.html
- *  - The Font Awesome pictograms are licensed under the CC BY 3.0 License - http://creativecommons.org/licenses/by/3.0/
- *  - Attribution is no longer required in Font Awesome 3.0, but much appreciated:
- *    "Font Awesome by Dave Gandy - http://fortawesome.github.com/Font-Awesome"
-
- *  Contact
- *  -------------------------------------------------------
- *  Email: dave@davegandy.com
- *  Twitter: http://twitter.com/fortaweso_me
- *  Work: Lead Product Designer @ http://kyruus.com
- */
-.icon-large {
-    font-size: 1.3333333333333333em;
-    margin-top: -4px;
-    padding-top: 3px;
-    margin-bottom: -4px;
-    padding-bottom: 3px;
-    vertical-align: middle
-}
-
-.nav [class^="icon-"], .nav [class*=" icon-"] {
-    vertical-align: inherit;
-    margin-top: -4px;
-    padding-top: 3px;
-    margin-bottom: -4px;
-    padding-bottom: 3px
-}
-
-.nav [class^="icon-"].icon-large, .nav [class*=" icon-"].icon-large {
-    vertical-align: -25%
-}
-
-.nav-pills [class^="icon-"].icon-large, .nav-tabs [class^="icon-"].icon-large, .nav-pills [class*=" icon-"].icon-large, .nav-tabs [class*=" icon-"].icon-large {
-    line-height: .75em;
-    margin-top: -7px;
-    padding-top: 5px;
-    margin-bottom: -5px;
-    padding-bottom: 4px
-}
-
-.btn [class^="icon-"].pull-left, .btn [class*=" icon-"].pull-left, .btn [class^="icon-"].pull-right, .btn [class*=" icon-"].pull-right {
-    vertical-align: inherit
-}
-
-.btn [class^="icon-"].icon-large, .btn [class*=" icon-"].icon-large {
-    margin-top: -0.5em
-}
-
-a [class^="icon-"], a [class*=" icon-"] {
-    cursor: pointer
-}
-
-ul.icons {
-    text-indent: -1.5em;
-    margin-left: 3em
-}
-
-.icon-glass {
-    *zoom: expression(this.runtimeStyle['zoom'] = '1',this.innerHTML = '&#xf000;')
-}
-
-.icon-music {
-    *zoom: expression(this.runtimeStyle['zoom'] = '1',this.innerHTML = '&#xf001;')
-}
-
-.icon-search {
-    *zoom: expression(this.runtimeStyle['zoom'] = '1',this.innerHTML = '&#xf002;')
-}
-
-.icon-envelope {
-    *zoom: expression(this.runtimeStyle['zoom'] = '1',this.innerHTML = '&#xf003;')
-}
-
-.icon-heart {
-    *zoom: expression(this.runtimeStyle['zoom'] = '1',this.innerHTML = '&#xf004;')
-}
-
-.icon-star {
-    *zoom: expression(this.runtimeStyle['zoom'] = '1',this.innerHTML = '&#xf005;')
-}
-
-.icon-star-empty {
-    *zoom: expression(this.runtimeStyle['zoom'] = '1',this.innerHTML = '&#xf006;')
-}
-
-.icon-user {
-    *zoom: expression(this.runtimeStyle['zoom'] = '1',this.innerHTML = '&#xf007;')
-}
-
-.icon-film {
-    *zoom: expression(this.runtimeStyle['zoom'] = '1',this.innerHTML = '&#xf008;')
-}
-
-.icon-th-large {
-    *zoom: expression(this.runtimeStyle['zoom'] = '1',this.innerHTML = '&#xf009;')
-}
-
-.icon-th {
-    *zoom: expression(this.runtimeStyle['zoom'] = '1',this.innerHTML = '&#xf00a;')
-}
-
-.icon-th-list {
-    *zoom: expression(this.runtimeStyle['zoom'] = '1',this.innerHTML = '&#xf00b;')
-}
-
-.icon-ok {
-    *zoom: expression(this.runtimeStyle['zoom'] = '1',this.innerHTML = '&#xf00c;')
-}
-
-.icon-remove {
-    *zoom: expression(this.runtimeStyle['zoom'] = '1',this.innerHTML = '&#xf00d;')
-}
-
-.icon-zoom-in {
-    *zoom: expression(this.runtimeStyle['zoom'] = '1',this.innerHTML = '&#xf00e;')
-}
-
-.icon-zoom-out {
-    *zoom: expression(this.runtimeStyle['zoom'] = '1',this.innerHTML = '&#xf010;')
-}
-
-.icon-off {
-    *zoom: expression(this.runtimeStyle['zoom'] = '1',this.innerHTML = '&#xf011;')
-}
-
-.icon-signal {
-    *zoom: expression(this.runtimeStyle['zoom'] = '1',this.innerHTML = '&#xf012;')
-}
-
-.icon-cog {
-    *zoom: expression(this.runtimeStyle['zoom'] = '1',this.innerHTML = '&#xf013;')
-}
-
-.icon-trash {
-    *zoom: expression(this.runtimeStyle['zoom'] = '1',this.innerHTML = '&#xf014;')
-}
-
-.icon-home {
-    *zoom: expression(this.runtimeStyle['zoom'] = '1',this.innerHTML = '&#xf015;')
-}
-
-.icon-file {
-    *zoom: expression(this.runtimeStyle['zoom'] = '1',this.innerHTML = '&#xf016;')
-}
-
-.icon-time {
-    *zoom: expression(this.runtimeStyle['zoom'] = '1',this.innerHTML = '&#xf017;')
-}
-
-.icon-road {
-    *zoom: expression(this.runtimeStyle['zoom'] = '1',this.innerHTML = '&#xf018;')
-}
-
-.icon-download-alt {
-    *zoom: expression(this.runtimeStyle['zoom'] = '1',this.innerHTML = '&#xf019;')
-}
-
-.icon-download {
-    *zoom: expression(this.runtimeStyle['zoom'] = '1',this.innerHTML = '&#xf01a;')
-}
-
-.icon-upload {
-    *zoom: expression(this.runtimeStyle['zoom'] = '1',this.innerHTML = '&#xf01b;')
-}
-
-.icon-inbox {
-    *zoom: expression(this.runtimeStyle['zoom'] = '1',this.innerHTML = '&#xf01c;')
-}
-
-.icon-play-circle {
-    *zoom: expression(this.runtimeStyle['zoom'] = '1',this.innerHTML = '&#xf01d;')
-}
-
-.icon-repeat {
-    *zoom: expression(this.runtimeStyle['zoom'] = '1',this.innerHTML = '&#xf01e;')
-}
-
-.icon-refresh {
-    *zoom: expression(this.runtimeStyle['zoom'] = '1',this.innerHTML = '&#xf021;')
-}
-
-.icon-list-alt {
-    *zoom: expression(this.runtimeStyle['zoom'] = '1',this.innerHTML = '&#xf022;')
-}
-
-.icon-lock {
-    *zoom: expression(this.runtimeStyle['zoom'] = '1',this.innerHTML = '&#xf023;')
-}
-
-.icon-flag {
-    *zoom: expression(this.runtimeStyle['zoom'] = '1',this.innerHTML = '&#xf024;')
-}
-
-.icon-headphones {
-    *zoom: expression(this.runtimeStyle['zoom'] = '1',this.innerHTML = '&#xf025;')
-}
-
-.icon-volume-off {
-    *zoom: expression(this.runtimeStyle['zoom'] = '1',this.innerHTML = '&#xf026;')
-}
-
-.icon-volume-down {
-    *zoom: expression(this.runtimeStyle['zoom'] = '1',this.innerHTML = '&#xf027;')
-}
-
-.icon-volume-up {
-    *zoom: expression(this.runtimeStyle['zoom'] = '1',this.innerHTML = '&#xf028;')
-}
-
-.icon-qrcode {
-    *zoom: expression(this.runtimeStyle['zoom'] = '1',this.innerHTML = '&#xf029;')
-}
-
-.icon-barcode {
-    *zoom: expression(this.runtimeStyle['zoom'] = '1',this.innerHTML = '&#xf02a;')
-}
-
-.icon-tag {
-    *zoom: expression(this.runtimeStyle['zoom'] = '1',this.innerHTML = '&#xf02b;')
-}
-
-.icon-tags {
-    *zoom: expression(this.runtimeStyle['zoom'] = '1',this.innerHTML = '&#xf02c;')
-}
-
-.icon-book {
-    *zoom: expression(this.runtimeStyle['zoom'] = '1',this.innerHTML = '&#xf02d;')
-}
-
-.icon-bookmark {
-    *zoom: expression(this.runtimeStyle['zoom'] = '1',this.innerHTML = '&#xf02e;')
-}
-
-.icon-print {
-    *zoom: expression(this.runtimeStyle['zoom'] = '1',this.innerHTML = '&#xf02f;')
-}
-
-.icon-camera {
-    *zoom: expression(this.runtimeStyle['zoom'] = '1',this.innerHTML = '&#xf030;')
-}
-
-.icon-font {
-    *zoom: expression(this.runtimeStyle['zoom'] = '1',this.innerHTML = '&#xf031;')
-}
-
-.icon-bold {
-    *zoom: expression(this.runtimeStyle['zoom'] = '1',this.innerHTML = '&#xf032;')
-}
-
-.icon-italic {
-    *zoom: expression(this.runtimeStyle['zoom'] = '1',this.innerHTML = '&#xf033;')
-}
-
-.icon-text-height {
-    *zoom: expression(this.runtimeStyle['zoom'] = '1',this.innerHTML = '&#xf034;')
-}
-
-.icon-text-width {
-    *zoom: expression(this.runtimeStyle['zoom'] = '1',this.innerHTML = '&#xf035;')
-}
-
-.icon-align-left {
-    *zoom: expression(this.runtimeStyle['zoom'] = '1',this.innerHTML = '&#xf036;')
-}
-
-.icon-align-center {
-    *zoom: expression(this.runtimeStyle['zoom'] = '1',this.innerHTML = '&#xf037;')
-}
-
-.icon-align-right {
-    *zoom: expression(this.runtimeStyle['zoom'] = '1',this.innerHTML = '&#xf038;')
-}
-
-.icon-align-justify {
-    *zoom: expression(this.runtimeStyle['zoom'] = '1',this.innerHTML = '&#xf039;')
-}
-
-.icon-list {
-    *zoom: expression(this.runtimeStyle['zoom'] = '1',this.innerHTML = '&#xf03a;')
-}
-
-.icon-indent-left {
-    *zoom: expression(this.runtimeStyle['zoom'] = '1',this.innerHTML = '&#xf03b;')
-}
-
-.icon-indent-right {
-    *zoom: expression(this.runtimeStyle['zoom'] = '1',this.innerHTML = '&#xf03c;')
-}
-
-.icon-facetime-video {
-    *zoom: expression(this.runtimeStyle['zoom'] = '1',this.innerHTML = '&#xf03d;')
-}
-
-.icon-picture {
-    *zoom: expression(this.runtimeStyle['zoom'] = '1',this.innerHTML = '&#xf03e;')
-}
-
-.icon-pencil {
-    *zoom: expression(this.runtimeStyle['zoom'] = '1',this.innerHTML = '&#xf040;')
-}
-
-.icon-map-marker {
-    *zoom: expression(this.runtimeStyle['zoom'] = '1',this.innerHTML = '&#xf041;')
-}
-
-.icon-adjust {
-    *zoom: expression(this.runtimeStyle['zoom'] = '1',this.innerHTML = '&#xf042;')
-}
-
-.icon-tint {
-    *zoom: expression(this.runtimeStyle['zoom'] = '1',this.innerHTML = '&#xf043;')
-}
-
-.icon-edit {
-    *zoom: expression(this.runtimeStyle['zoom'] = '1',this.innerHTML = '&#xf044;')
-}
-
-.icon-share {
-    *zoom: expression(this.runtimeStyle['zoom'] = '1',this.innerHTML = '&#xf045;')
-}
-
-.icon-check {
-    *zoom: expression(this.runtimeStyle['zoom'] = '1',this.innerHTML = '&#xf046;')
-}
-
-.icon-move {
-    *zoom: expression(this.runtimeStyle['zoom'] = '1',this.innerHTML = '&#xf047;')
-}
-
-.icon-step-backward {
-    *zoom: expression(this.runtimeStyle['zoom'] = '1',this.innerHTML = '&#xf048;')
-}
-
-.icon-fast-backward {
-    *zoom: expression(this.runtimeStyle['zoom'] = '1',this.innerHTML = '&#xf049;')
-}
-
-.icon-backward {
-    *zoom: expression(this.runtimeStyle['zoom'] = '1',this.innerHTML = '&#xf04a;')
-}
-
-.icon-play {
-    *zoom: expression(this.runtimeStyle['zoom'] = '1',this.innerHTML = '&#xf04b;')
-}
-
-.icon-pause {
-    *zoom: expression(this.runtimeStyle['zoom'] = '1',this.innerHTML = '&#xf04c;')
-}
-
-.icon-stop {
-    *zoom: expression(this.runtimeStyle['zoom'] = '1',this.innerHTML = '&#xf04d;')
-}
-
-.icon-forward {
-    *zoom: expression(this.runtimeStyle['zoom'] = '1',this.innerHTML = '&#xf04e;')
-}
-
-.icon-fast-forward {
-    *zoom: expression(this.runtimeStyle['zoom'] = '1',this.innerHTML = '&#xf050;')
-}
-
-.icon-step-forward {
-    *zoom: expression(this.runtimeStyle['zoom'] = '1',this.innerHTML = '&#xf051;')
-}
-
-.icon-eject {
-    *zoom: expression(this.runtimeStyle['zoom'] = '1',this.innerHTML = '&#xf052;')
-}
-
-.icon-chevron-left {
-    *zoom: expression(this.runtimeStyle['zoom'] = '1',this.innerHTML = '&#xf053;')
-}
-
-.icon-chevron-right {
-    *zoom: expression(this.runtimeStyle['zoom'] = '1',this.innerHTML = '&#xf054;')
-}
-
-.icon-plus-sign {
-    *zoom: expression(this.runtimeStyle['zoom'] = '1',this.innerHTML = '&#xf055;')
-}
-
-.icon-minus-sign {
-    *zoom: expression(this.runtimeStyle['zoom'] = '1',this.innerHTML = '&#xf056;')
-}
-
-.icon-remove-sign {
-    *zoom: expression(this.runtimeStyle['zoom'] = '1',this.innerHTML = '&#xf057;')
-}
-
-.icon-ok-sign {
-    *zoom: expression(this.runtimeStyle['zoom'] = '1',this.innerHTML = '&#xf058;')
-}
-
-.icon-question-sign {
-    *zoom: expression(this.runtimeStyle['zoom'] = '1',this.innerHTML = '&#xf059;')
-}
-
-.icon-info-sign {
-    *zoom: expression(this.runtimeStyle['zoom'] = '1',this.innerHTML = '&#xf05a;')
-}
-
-.icon-screenshot {
-    *zoom: expression(this.runtimeStyle['zoom'] = '1',this.innerHTML = '&#xf05b;')
-}
-
-.icon-remove-circle {
-    *zoom: expression(this.runtimeStyle['zoom'] = '1',this.innerHTML = '&#xf05c;')
-}
-
-.icon-ok-circle {
-    *zoom: expression(this.runtimeStyle['zoom'] = '1',this.innerHTML = '&#xf05d;')
-}
-
-.icon-ban-circle {
-    *zoom: expression(this.runtimeStyle['zoom'] = '1',this.innerHTML = '&#xf05e;')
-}
-
-.icon-arrow-left {
-    *zoom: expression(this.runtimeStyle['zoom'] = '1',this.innerHTML = '&#xf060;')
-}
-
-.icon-arrow-right {
-    *zoom: expression(this.runtimeStyle['zoom'] = '1',this.innerHTML = '&#xf061;')
-}
-
-.icon-arrow-up {
-    *zoom: expression(this.runtimeStyle['zoom'] = '1',this.innerHTML = '&#xf062;')
-}
-
-.icon-arrow-down {
-    *zoom: expression(this.runtimeStyle['zoom'] = '1',this.innerHTML = '&#xf063;')
-}
-
-.icon-share-alt {
-    *zoom: expression(this.runtimeStyle['zoom'] = '1',this.innerHTML = '&#xf064;')
-}
-
-.icon-resize-full {
-    *zoom: expression(this.runtimeStyle['zoom'] = '1',this.innerHTML = '&#xf065;')
-}
-
-.icon-resize-small {
-    *zoom: expression(this.runtimeStyle['zoom'] = '1',this.innerHTML = '&#xf066;')
-}
-
-.icon-plus {
-    *zoom: expression(this.runtimeStyle['zoom'] = '1',this.innerHTML = '&#xf067;')
-}
-
-.icon-minus {
-    *zoom: expression(this.runtimeStyle['zoom'] = '1',this.innerHTML = '&#xf068;')
-}
-
-.icon-asterisk {
-    *zoom: expression(this.runtimeStyle['zoom'] = '1',this.innerHTML = '&#xf069;')
-}
-
-.icon-exclamation-sign {
-    *zoom: expression(this.runtimeStyle['zoom'] = '1',this.innerHTML = '&#xf06a;')
-}
-
-.icon-gift {
-    *zoom: expression(this.runtimeStyle['zoom'] = '1',this.innerHTML = '&#xf06b;')
-}
-
-.icon-leaf {
-    *zoom: expression(this.runtimeStyle['zoom'] = '1',this.innerHTML = '&#xf06c;')
-}
-
-.icon-fire {
-    *zoom: expression(this.runtimeStyle['zoom'] = '1',this.innerHTML = '&#xf06d;')
-}
-
-.icon-eye-open {
-    *zoom: expression(this.runtimeStyle['zoom'] = '1',this.innerHTML = '&#xf06e;')
-}
-
-.icon-eye-close {
-    *zoom: expression(this.runtimeStyle['zoom'] = '1',this.innerHTML = '&#xf070;')
-}
-
-.icon-warning-sign {
-    *zoom: expression(this.runtimeStyle['zoom'] = '1',this.innerHTML = '&#xf071;')
-}
-
-.icon-plane {
-    *zoom: expression(this.runtimeStyle['zoom'] = '1',this.innerHTML = '&#xf072;')
-}
-
-.icon-calendar {
-    *zoom: expression(this.runtimeStyle['zoom'] = '1',this.innerHTML = '&#xf073;')
-}
-
-.icon-random {
-    *zoom: expression(this.runtimeStyle['zoom'] = '1',this.innerHTML = '&#xf074;')
-}
-
-.icon-comment {
-    *zoom: expression(this.runtimeStyle['zoom'] = '1',this.innerHTML = '&#xf075;')
-}
-
-.icon-magnet {
-    *zoom: expression(this.runtimeStyle['zoom'] = '1',this.innerHTML = '&#xf076;')
-}
-
-.icon-chevron-up {
-    *zoom: expression(this.runtimeStyle['zoom'] = '1',this.innerHTML = '&#xf077;')
-}
-
-.icon-chevron-down {
-    *zoom: expression(this.runtimeStyle['zoom'] = '1',this.innerHTML = '&#xf078;')
-}
-
-.icon-retweet {
-    *zoom: expression(this.runtimeStyle['zoom'] = '1',this.innerHTML = '&#xf079;')
-}
-
-.icon-shopping-cart {
-    *zoom: expression(this.runtimeStyle['zoom'] = '1',this.innerHTML = '&#xf07a;')
-}
-
-.icon-folder-close {
-    *zoom: expression(this.runtimeStyle['zoom'] = '1',this.innerHTML = '&#xf07b;')
-}
-
-.icon-folder-open {
-    *zoom: expression(this.runtimeStyle['zoom'] = '1',this.innerHTML = '&#xf07c;')
-}
-
-.icon-resize-vertical {
-    *zoom: expression(this.runtimeStyle['zoom'] = '1',this.innerHTML = '&#xf07d;')
-}
-
-.icon-resize-horizontal {
-    *zoom: expression(this.runtimeStyle['zoom'] = '1',this.innerHTML = '&#xf07e;')
-}
-
-.icon-bar-chart {
-    *zoom: expression(this.runtimeStyle['zoom'] = '1',this.innerHTML = '&#xf080;')
-}
-
-.icon-twitter-sign {
-    *zoom: expression(this.runtimeStyle['zoom'] = '1',this.innerHTML = '&#xf081;')
-}
-
-.icon-facebook-sign {
-    *zoom: expression(this.runtimeStyle['zoom'] = '1',this.innerHTML = '&#xf082;')
-}
-
-.icon-camera-retro {
-    *zoom: expression(this.runtimeStyle['zoom'] = '1',this.innerHTML = '&#xf083;')
-}
-
-.icon-key {
-    *zoom: expression(this.runtimeStyle['zoom'] = '1',this.innerHTML = '&#xf084;')
-}
-
-.icon-cogs {
-    *zoom: expression(this.runtimeStyle['zoom'] = '1',this.innerHTML = '&#xf085;')
-}
-
-.icon-comments {
-    *zoom: expression(this.runtimeStyle['zoom'] = '1',this.innerHTML = '&#xf086;')
-}
-
-.icon-thumbs-up {
-    *zoom: expression(this.runtimeStyle['zoom'] = '1',this.innerHTML = '&#xf087;')
-}
-
-.icon-thumbs-down {
-    *zoom: expression(this.runtimeStyle['zoom'] = '1',this.innerHTML = '&#xf088;')
-}
-
-.icon-star-half {
-    *zoom: expression(this.runtimeStyle['zoom'] = '1',this.innerHTML = '&#xf089;')
-}
-
-.icon-heart-empty {
-    *zoom: expression(this.runtimeStyle['zoom'] = '1',this.innerHTML = '&#xf08a;')
-}
-
-.icon-signout {
-    *zoom: expression(this.runtimeStyle['zoom'] = '1',this.innerHTML = '&#xf08b;')
-}
-
-.icon-linkedin-sign {
-    *zoom: expression(this.runtimeStyle['zoom'] = '1',this.innerHTML = '&#xf08c;')
-}
-
-.icon-pushpin {
-    *zoom: expression(this.runtimeStyle['zoom'] = '1',this.innerHTML = '&#xf08d;')
-}
-
-.icon-external-link {
-    *zoom: expression(this.runtimeStyle['zoom'] = '1',this.innerHTML = '&#xf08e;')
-}
-
-.icon-signin {
-    *zoom: expression(this.runtimeStyle['zoom'] = '1',this.innerHTML = '&#xf090;')
-}
-
-.icon-trophy {
-    *zoom: expression(this.runtimeStyle['zoom'] = '1',this.innerHTML = '&#xf091;')
-}
-
-.icon-github-sign {
-    *zoom: expression(this.runtimeStyle['zoom'] = '1',this.innerHTML = '&#xf092;')
-}
-
-.icon-upload-alt {
-    *zoom: expression(this.runtimeStyle['zoom'] = '1',this.innerHTML = '&#xf093;')
-}
-
-.icon-lemon {
-    *zoom: expression(this.runtimeStyle['zoom'] = '1',this.innerHTML = '&#xf094;')
-}
-
-.icon-phone {
-    *zoom: expression(this.runtimeStyle['zoom'] = '1',this.innerHTML = '&#xf095;')
-}
-
-.icon-check-empty {
-    *zoom: expression(this.runtimeStyle['zoom'] = '1',this.innerHTML = '&#xf096;')
-}
-
-.icon-bookmark-empty {
-    *zoom: expression(this.runtimeStyle['zoom'] = '1',this.innerHTML = '&#xf097;')
-}
-
-.icon-phone-sign {
-    *zoom: expression(this.runtimeStyle['zoom'] = '1',this.innerHTML = '&#xf098;')
-}
-
-.icon-twitter {
-    *zoom: expression(this.runtimeStyle['zoom'] = '1',this.innerHTML = '&#xf099;')
-}
-
-.icon-facebook {
-    *zoom: expression(this.runtimeStyle['zoom'] = '1',this.innerHTML = '&#xf09a;')
-}
-
-.icon-github {
-    *zoom: expression(this.runtimeStyle['zoom'] = '1',this.innerHTML = '&#xf09b;')
-}
-
-.icon-unlock {
-    *zoom: expression(this.runtimeStyle['zoom'] = '1',this.innerHTML = '&#xf09c;')
-}
-
-.icon-credit-card {
-    *zoom: expression(this.runtimeStyle['zoom'] = '1',this.innerHTML = '&#xf09d;')
-}
-
-.icon-rss {
-    *zoom: expression(this.runtimeStyle['zoom'] = '1',this.innerHTML = '&#xf09e;')
-}
-
-.icon-hdd {
-    *zoom: expression(this.runtimeStyle['zoom'] = '1',this.innerHTML = '&#xf0a0;')
-}
-
-.icon-bullhorn {
-    *zoom: expression(this.runtimeStyle['zoom'] = '1',this.innerHTML = '&#xf0a1;')
-}
-
-.icon-bell {
-    *zoom: expression(this.runtimeStyle['zoom'] = '1',this.innerHTML = '&#xf0a2;')
-}
-
-.icon-certificate {
-    *zoom: expression(this.runtimeStyle['zoom'] = '1',this.innerHTML = '&#xf0a3;')
-}
-
-.icon-hand-right {
-    *zoom: expression(this.runtimeStyle['zoom'] = '1',this.innerHTML = '&#xf0a4;')
-}
-
-.icon-hand-left {
-    *zoom: expression(this.runtimeStyle['zoom'] = '1',this.innerHTML = '&#xf0a5;')
-}
-
-.icon-hand-up {
-    *zoom: expression(this.runtimeStyle['zoom'] = '1',this.innerHTML = '&#xf0a6;')
-}
-
-.icon-hand-down {
-    *zoom: expression(this.runtimeStyle['zoom'] = '1',this.innerHTML = '&#xf0a7;')
-}
-
-.icon-circle-arrow-left {
-    *zoom: expression(this.runtimeStyle['zoom'] = '1',this.innerHTML = '&#xf0a8;')
-}
-
-.icon-circle-arrow-right {
-    *zoom: expression(this.runtimeStyle['zoom'] = '1',this.innerHTML = '&#xf0a9;')
-}
-
-.icon-circle-arrow-up {
-    *zoom: expression(this.runtimeStyle['zoom'] = '1',this.innerHTML = '&#xf0aa;')
-}
-
-.icon-circle-arrow-down {
-    *zoom: expression(this.runtimeStyle['zoom'] = '1',this.innerHTML = '&#xf0ab;')
-}
-
-.icon-globe {
-    *zoom: expression(this.runtimeStyle['zoom'] = '1',this.innerHTML = '&#xf0ac;')
-}
-
-.icon-wrench {
-    *zoom: expression(this.runtimeStyle['zoom'] = '1',this.innerHTML = '&#xf0ad;')
-}
-
-.icon-tasks {
-    *zoom: expression(this.runtimeStyle['zoom'] = '1',this.innerHTML = '&#xf0ae;')
-}
-
-.icon-filter {
-    *zoom: expression(this.runtimeStyle['zoom'] = '1',this.innerHTML = '&#xf0b0;')
-}
-
-.icon-briefcase {
-    *zoom: expression(this.runtimeStyle['zoom'] = '1',this.innerHTML = '&#xf0b1;')
-}
-
-.icon-fullscreen {
-    *zoom: expression(this.runtimeStyle['zoom'] = '1',this.innerHTML = '&#xf0b2;')
-}
-
-.icon-group {
-    *zoom: expression(this.runtimeStyle['zoom'] = '1',this.innerHTML = '&#xf0c0;')
-}
-
-.icon-link {
-    *zoom: expression(this.runtimeStyle['zoom'] = '1',this.innerHTML = '&#xf0c1;')
-}
-
-.icon-cloud {
-    *zoom: expression(this.runtimeStyle['zoom'] = '1',this.innerHTML = '&#xf0c2;')
-}
-
-.icon-beaker {
-    *zoom: expression(this.runtimeStyle['zoom'] = '1',this.innerHTML = '&#xf0c3;')
-}
-
-.icon-cut {
-    *zoom: expression(this.runtimeStyle['zoom'] = '1',this.innerHTML = '&#xf0c4;')
-}
-
-.icon-copy {
-    *zoom: expression(this.runtimeStyle['zoom'] = '1',this.innerHTML = '&#xf0c5;')
-}
-
-.icon-paper-clip {
-    *zoom: expression(this.runtimeStyle['zoom'] = '1',this.innerHTML = '&#xf0c6;')
-}
-
-.icon-save {
-    *zoom: expression(this.runtimeStyle['zoom'] = '1',this.innerHTML = '&#xf0c7;')
-}
-
-.icon-sign-blank {
-    *zoom: expression(this.runtimeStyle['zoom'] = '1',this.innerHTML = '&#xf0c8;')
-}
-
-.icon-reorder {
-    *zoom: expression(this.runtimeStyle['zoom'] = '1',this.innerHTML = '&#xf0c9;')
-}
-
-.icon-list-ul {
-    *zoom: expression(this.runtimeStyle['zoom'] = '1',this.innerHTML = '&#xf0ca;')
-}
-
-.icon-list-ol {
-    *zoom: expression(this.runtimeStyle['zoom'] = '1',this.innerHTML = '&#xf0cb;')
-}
-
-.icon-strikethrough {
-    *zoom: expression(this.runtimeStyle['zoom'] = '1',this.innerHTML = '&#xf0cc;')
-}
-
-.icon-underline {
-    *zoom: expression(this.runtimeStyle['zoom'] = '1',this.innerHTML = '&#xf0cd;')
-}
-
-.icon-table {
-    *zoom: expression(this.runtimeStyle['zoom'] = '1',this.innerHTML = '&#xf0ce;')
-}
-
-.icon-magic {
-    *zoom: expression(this.runtimeStyle['zoom'] = '1',this.innerHTML = '&#xf0d0;')
-}
-
-.icon-truck {
-    *zoom: expression(this.runtimeStyle['zoom'] = '1',this.innerHTML = '&#xf0d1;')
-}
-
-.icon-pinterest {
-    *zoom: expression(this.runtimeStyle['zoom'] = '1',this.innerHTML = '&#xf0d2;')
-}
-
-.icon-pinterest-sign {
-    *zoom: expression(this.runtimeStyle['zoom'] = '1',this.innerHTML = '&#xf0d3;')
-}
-
-.icon-google-plus-sign {
-    *zoom: expression(this.runtimeStyle['zoom'] = '1',this.innerHTML = '&#xf0d4;')
-}
-
-.icon-google-plus {
-    *zoom: expression(this.runtimeStyle['zoom'] = '1',this.innerHTML = '&#xf0d5;')
-}
-
-.icon-money {
-    *zoom: expression(this.runtimeStyle['zoom'] = '1',this.innerHTML = '&#xf0d6;')
-}
-
-.icon-caret-down {
-    *zoom: expression(this.runtimeStyle['zoom'] = '1',this.innerHTML = '&#xf0d7;')
-}
-
-.icon-caret-up {
-    *zoom: expression(this.runtimeStyle['zoom'] = '1',this.innerHTML = '&#xf0d8;')
-}
-
-.icon-caret-left {
-    *zoom: expression(this.runtimeStyle['zoom'] = '1',this.innerHTML = '&#xf0d9;')
-}
-
-.icon-caret-right {
-    *zoom: expression(this.runtimeStyle['zoom'] = '1',this.innerHTML = '&#xf0da;')
-}
-
-.icon-columns {
-    *zoom: expression(this.runtimeStyle['zoom'] = '1',this.innerHTML = '&#xf0db;')
-}
-
-.icon-sort {
-    *zoom: expression(this.runtimeStyle['zoom'] = '1',this.innerHTML = '&#xf0dc;')
-}
-
-.icon-sort-down {
-    *zoom: expression(this.runtimeStyle['zoom'] = '1',this.innerHTML = '&#xf0dd;')
-}
-
-.icon-sort-up {
-    *zoom: expression(this.runtimeStyle['zoom'] = '1',this.innerHTML = '&#xf0de;')
-}
-
-.icon-envelope-alt {
-    *zoom: expression(this.runtimeStyle['zoom'] = '1',this.innerHTML = '&#xf0e0;')
-}
-
-.icon-linkedin {
-    *zoom: expression(this.runtimeStyle['zoom'] = '1',this.innerHTML = '&#xf0e1;')
-}
-
-.icon-undo {
-    *zoom: expression(this.runtimeStyle['zoom'] = '1',this.innerHTML = '&#xf0e2;')
-}
-
-.icon-legal {
-    *zoom: expression(this.runtimeStyle['zoom'] = '1',this.innerHTML = '&#xf0e3;')
-}
-
-.icon-dashboard {
-    *zoom: expression(this.runtimeStyle['zoom'] = '1',this.innerHTML = '&#xf0e4;')
-}
-
-.icon-comment-alt {
-    *zoom: expression(this.runtimeStyle['zoom'] = '1',this.innerHTML = '&#xf0e5;')
-}
-
-.icon-comments-alt {
-    *zoom: expression(this.runtimeStyle['zoom'] = '1',this.innerHTML = '&#xf0e6;')
-}
-
-.icon-bolt {
-    *zoom: expression(this.runtimeStyle['zoom'] = '1',this.innerHTML = '&#xf0e7;')
-}
-
-.icon-sitemap {
-    *zoom: expression(this.runtimeStyle['zoom'] = '1',this.innerHTML = '&#xf0e8;')
-}
-
-.icon-umbrella {
-    *zoom: expression(this.runtimeStyle['zoom'] = '1',this.innerHTML = '&#xf0e9;')
-}
-
-.icon-paste {
-    *zoom: expression(this.runtimeStyle['zoom'] = '1',this.innerHTML = '&#xf0ea;')
-}
-
-.icon-lightbulb {
-    *zoom: expression(this.runtimeStyle['zoom'] = '1',this.innerHTML = '&#xf0eb;')
-}
-
-.icon-exchange {
-    *zoom: expression(this.runtimeStyle['zoom'] = '1',this.innerHTML = '&#xf0ec;')
-}
-
-.icon-cloud-download {
-    *zoom: expression(this.runtimeStyle['zoom'] = '1',this.innerHTML = '&#xf0ed;')
-}
-
-.icon-cloud-upload {
-    *zoom: expression(this.runtimeStyle['zoom'] = '1',this.innerHTML = '&#xf0ee;')
-}
-
-.icon-user-md {
-    *zoom: expression(this.runtimeStyle['zoom'] = '1',this.innerHTML = '&#xf0f0;')
-}
-
-.icon-stethoscope {
-    *zoom: expression(this.runtimeStyle['zoom'] = '1',this.innerHTML = '&#xf0f1;')
-}
-
-.icon-suitcase {
-    *zoom: expression(this.runtimeStyle['zoom'] = '1',this.innerHTML = '&#xf0f2;')
-}
-
-.icon-bell-alt {
-    *zoom: expression(this.runtimeStyle['zoom'] = '1',this.innerHTML = '&#xf0f3;')
-}
-
-.icon-coffee {
-    *zoom: expression(this.runtimeStyle['zoom'] = '1',this.innerHTML = '&#xf0f4;')
-}
-
-.icon-food {
-    *zoom: expression(this.runtimeStyle['zoom'] = '1',this.innerHTML = '&#xf0f5;')
-}
-
-.icon-file-alt {
-    *zoom: expression(this.runtimeStyle['zoom'] = '1',this.innerHTML = '&#xf0f6;')
-}
-
-.icon-building {
-    *zoom: expression(this.runtimeStyle['zoom'] = '1',this.innerHTML = '&#xf0f7;')
-}
-
-.icon-hospital {
-    *zoom: expression(this.runtimeStyle['zoom'] = '1',this.innerHTML = '&#xf0f8;')
-}
-
-.icon-ambulance {
-    *zoom: expression(this.runtimeStyle['zoom'] = '1',this.innerHTML = '&#xf0f9;')
-}
-
-.icon-medkit {
-    *zoom: expression(this.runtimeStyle['zoom'] = '1',this.innerHTML = '&#xf0fa;')
-}
-
-.icon-fighter-jet {
-    *zoom: expression(this.runtimeStyle['zoom'] = '1',this.innerHTML = '&#xf0fb;')
-}
-
-.icon-beer {
-    *zoom: expression(this.runtimeStyle['zoom'] = '1',this.innerHTML = '&#xf0fc;')
-}
-
-.icon-h-sign {
-    *zoom: expression(this.runtimeStyle['zoom'] = '1',this.innerHTML = '&#xf0fd;')
-}
-
-.icon-plus-sign-alt {
-    *zoom: expression(this.runtimeStyle['zoom'] = '1',this.innerHTML = '&#xf0fe;')
-}
-
-.icon-double-angle-left {
-    *zoom: expression(this.runtimeStyle['zoom'] = '1',this.innerHTML = '&#xf100;')
-}
-
-.icon-double-angle-right {
-    *zoom: expression(this.runtimeStyle['zoom'] = '1',this.innerHTML = '&#xf101;')
-}
-
-.icon-double-angle-up {
-    *zoom: expression(this.runtimeStyle['zoom'] = '1',this.innerHTML = '&#xf102;')
-}
-
-.icon-double-angle-down {
-    *zoom: expression(this.runtimeStyle['zoom'] = '1',this.innerHTML = '&#xf103;')
-}
-
-.icon-angle-left {
-    *zoom: expression(this.runtimeStyle['zoom'] = '1',this.innerHTML = '&#xf104;')
-}
-
-.icon-angle-right {
-    *zoom: expression(this.runtimeStyle['zoom'] = '1',this.innerHTML = '&#xf105;')
-}
-
-.icon-angle-up {
-    *zoom: expression(this.runtimeStyle['zoom'] = '1',this.innerHTML = '&#xf106;')
-}
-
-.icon-angle-down {
-    *zoom: expression(this.runtimeStyle['zoom'] = '1',this.innerHTML = '&#xf107;')
-}
-
-.icon-desktop {
-    *zoom: expression(this.runtimeStyle['zoom'] = '1',this.innerHTML = '&#xf108;')
-}
-
-.icon-laptop {
-    *zoom: expression(this.runtimeStyle['zoom'] = '1',this.innerHTML = '&#xf109;')
-}
-
-.icon-tablet {
-    *zoom: expression(this.runtimeStyle['zoom'] = '1',this.innerHTML = '&#xf10a;')
-}
-
-.icon-mobile-phone {
-    *zoom: expression(this.runtimeStyle['zoom'] = '1',this.innerHTML = '&#xf10b;')
-}
-
-.icon-circle-blank {
-    *zoom: expression(this.runtimeStyle['zoom'] = '1',this.innerHTML = '&#xf10c;')
-}
-
-.icon-quote-left {
-    *zoom: expression(this.runtimeStyle['zoom'] = '1',this.innerHTML = '&#xf10d;')
-}
-
-.icon-quote-right {
-    *zoom: expression(this.runtimeStyle['zoom'] = '1',this.innerHTML = '&#xf10e;')
-}
-
-.icon-spinner {
-    *zoom: expression(this.runtimeStyle['zoom'] = '1',this.innerHTML = '&#xf110;')
-}
-
-.icon-circle {
-    *zoom: expression(this.runtimeStyle['zoom'] = '1',this.innerHTML = '&#xf111;')
-}
-
-.icon-reply {
-    *zoom: expression(this.runtimeStyle['zoom'] = '1',this.innerHTML = '&#xf112;')
-}
-
-.icon-github-alt {
-    *zoom: expression(this.runtimeStyle['zoom'] = '1',this.innerHTML = '&#xf113;')
-}
-
-.icon-folder-close-alt {
-    *zoom: expression(this.runtimeStyle['zoom'] = '1',this.innerHTML = '&#xf114;')
-}
-
-.icon-folder-open-alt {
-    *zoom: expression(this.runtimeStyle['zoom'] = '1',this.innerHTML = '&#xf115;')
-}

+ 0 - 1322
main/css/font_awesome/font-awesome.css

@@ -1,1322 +0,0 @@
-/*!
- *  Font Awesome 3.0.2
- *  the iconic font designed for use with Twitter Bootstrap
- *  -------------------------------------------------------
- *  The full suite of pictographic icons, examples, and documentation
- *  can be found at: http://fortawesome.github.com/Font-Awesome/
- *
- *  License
- *  -------------------------------------------------------
- *  - The Font Awesome font is licensed under the SIL Open Font License - http://scripts.sil.org/OFL
- *  - Font Awesome CSS, LESS, and SASS files are licensed under the MIT License -
- *    http://opensource.org/licenses/mit-license.html
- *  - The Font Awesome pictograms are licensed under the CC BY 3.0 License - http://creativecommons.org/licenses/by/3.0/
- *  - Attribution is no longer required in Font Awesome 3.0, but much appreciated:
- *    "Font Awesome by Dave Gandy - http://fortawesome.github.com/Font-Awesome"
-
- *  Contact
- *  -------------------------------------------------------
- *  Email: dave@davegandy.com
- *  Twitter: http://twitter.com/fortaweso_me
- *  Work: Lead Product Designer @ http://kyruus.com
- */
-@font-face {
-    font-family: 'FontAwesome';
-    src: url('../font/fontawesome-webfont.eot?v=3.0.1');
-    src: url('../font/fontawesome-webfont.eot?#iefix&v=3.0.1') format('embedded-opentype'), url('../font/fontawesome-webfont.woff?v=3.0.1') format('woff'), url('../font/fontawesome-webfont.ttf?v=3.0.1') format('truetype');
-    font-weight: normal;
-    font-style: normal;
-}
-
-/*  Font Awesome styles
-    ------------------------------------------------------- */
-[class^="icon-"],
-[class*=" icon-"] {
-    font-family: FontAwesome;
-    font-weight: normal;
-    font-style: normal;
-    text-decoration: inherit;
-    -webkit-font-smoothing: antialiased;
-
-    /* sprites.less reset */
-    display: inline;
-    width: auto;
-    height: auto;
-    line-height: normal;
-    vertical-align: baseline;
-    background-image: none;
-    background-position: 0% 0%;
-    background-repeat: repeat;
-    margin-top: 0;
-}
-
-/* more sprites.less reset */
-.icon-white,
-.nav-pills > .active > a > [class^="icon-"],
-.nav-pills > .active > a > [class*=" icon-"],
-.nav-list > .active > a > [class^="icon-"],
-.nav-list > .active > a > [class*=" icon-"],
-.navbar-inverse .nav > .active > a > [class^="icon-"],
-.navbar-inverse .nav > .active > a > [class*=" icon-"],
-.dropdown-menu > li > a:hover > [class^="icon-"],
-.dropdown-menu > li > a:hover > [class*=" icon-"],
-.dropdown-menu > .active > a > [class^="icon-"],
-.dropdown-menu > .active > a > [class*=" icon-"],
-.dropdown-submenu:hover > a > [class^="icon-"],
-.dropdown-submenu:hover > a > [class*=" icon-"] {
-    background-image: none;
-}
-
-[class^="icon-"]:before,
-[class*=" icon-"]:before {
-    text-decoration: inherit;
-    display: inline-block;
-    speak: none;
-}
-
-/* makes sure icons active on rollover in links */
-a [class^="icon-"],
-a [class*=" icon-"] {
-    display: inline-block;
-}
-
-/* makes the font 33% larger relative to the icon container */
-.icon-large:before {
-    vertical-align: -10%;
-    font-size: 1.3333333333333333em;
-}
-
-.btn [class^="icon-"],
-.nav [class^="icon-"],
-.btn [class*=" icon-"],
-.nav [class*=" icon-"] {
-    display: inline;
-    /* keeps button heights with and without icons the same */
-
-}
-
-.btn [class^="icon-"].icon-large,
-.nav [class^="icon-"].icon-large,
-.btn [class*=" icon-"].icon-large,
-.nav [class*=" icon-"].icon-large {
-    line-height: .9em;
-}
-
-.btn [class^="icon-"].icon-spin,
-.nav [class^="icon-"].icon-spin,
-.btn [class*=" icon-"].icon-spin,
-.nav [class*=" icon-"].icon-spin {
-    display: inline-block;
-}
-
-.nav-tabs [class^="icon-"],
-.nav-pills [class^="icon-"],
-.nav-tabs [class*=" icon-"],
-.nav-pills [class*=" icon-"] {
-    /* keeps button heights with and without icons the same */
-
-}
-
-.nav-tabs [class^="icon-"],
-.nav-pills [class^="icon-"],
-.nav-tabs [class*=" icon-"],
-.nav-pills [class*=" icon-"],
-.nav-tabs [class^="icon-"].icon-large,
-.nav-pills [class^="icon-"].icon-large,
-.nav-tabs [class*=" icon-"].icon-large,
-.nav-pills [class*=" icon-"].icon-large {
-    line-height: .9em;
-}
-
-li [class^="icon-"],
-.nav li [class^="icon-"],
-li [class*=" icon-"],
-.nav li [class*=" icon-"] {
-    display: inline-block;
-    width: 1.25em;
-    text-align: center;
-}
-
-li [class^="icon-"].icon-large,
-.nav li [class^="icon-"].icon-large,
-li [class*=" icon-"].icon-large,
-.nav li [class*=" icon-"].icon-large {
-    /* increased font size for icon-large */
-
-    width: 1.5625em;
-}
-
-ul.icons {
-    list-style-type: none;
-    text-indent: -0.75em;
-}
-
-ul.icons li [class^="icon-"],
-ul.icons li [class*=" icon-"] {
-    width: .75em;
-}
-
-.icon-muted {
-    color: #eeeeee;
-}
-
-.icon-border {
-    border: solid 1px #eeeeee;
-    padding: .2em .25em .15em;
-    -webkit-border-radius: 3px;
-    -moz-border-radius: 3px;
-    border-radius: 3px;
-}
-
-.icon-2x {
-    font-size: 2em;
-}
-
-.icon-2x.icon-border {
-    border-width: 2px;
-    -webkit-border-radius: 4px;
-    -moz-border-radius: 4px;
-    border-radius: 4px;
-}
-
-.icon-3x {
-    font-size: 3em;
-}
-
-.icon-3x.icon-border {
-    border-width: 3px;
-    -webkit-border-radius: 5px;
-    -moz-border-radius: 5px;
-    border-radius: 5px;
-}
-
-.icon-4x {
-    font-size: 4em;
-}
-
-.icon-4x.icon-border {
-    border-width: 4px;
-    -webkit-border-radius: 6px;
-    -moz-border-radius: 6px;
-    border-radius: 6px;
-}
-
-.pull-right {
-    float: right;
-}
-
-.pull-left {
-    float: left;
-}
-
-[class^="icon-"].pull-left,
-[class*=" icon-"].pull-left {
-    margin-right: .3em;
-}
-
-[class^="icon-"].pull-right,
-[class*=" icon-"].pull-right {
-    margin-left: .3em;
-}
-
-.btn [class^="icon-"].pull-left.icon-2x,
-.btn [class*=" icon-"].pull-left.icon-2x,
-.btn [class^="icon-"].pull-right.icon-2x,
-.btn [class*=" icon-"].pull-right.icon-2x {
-    margin-top: .18em;
-}
-
-.btn [class^="icon-"].icon-spin.icon-large,
-.btn [class*=" icon-"].icon-spin.icon-large {
-    line-height: .8em;
-}
-
-.btn.btn-small [class^="icon-"].pull-left.icon-2x,
-.btn.btn-small [class*=" icon-"].pull-left.icon-2x,
-.btn.btn-small [class^="icon-"].pull-right.icon-2x,
-.btn.btn-small [class*=" icon-"].pull-right.icon-2x {
-    margin-top: .25em;
-}
-
-.btn.btn-large [class^="icon-"],
-.btn.btn-large [class*=" icon-"] {
-    margin-top: 0;
-}
-
-.btn.btn-large [class^="icon-"].pull-left.icon-2x,
-.btn.btn-large [class*=" icon-"].pull-left.icon-2x,
-.btn.btn-large [class^="icon-"].pull-right.icon-2x,
-.btn.btn-large [class*=" icon-"].pull-right.icon-2x {
-    margin-top: .05em;
-}
-
-.btn.btn-large [class^="icon-"].pull-left.icon-2x,
-.btn.btn-large [class*=" icon-"].pull-left.icon-2x {
-    margin-right: .2em;
-}
-
-.btn.btn-large [class^="icon-"].pull-right.icon-2x,
-.btn.btn-large [class*=" icon-"].pull-right.icon-2x {
-    margin-left: .2em;
-}
-
-.icon-spin {
-    display: inline-block;
-    -moz-animation: spin 2s infinite linear;
-    -o-animation: spin 2s infinite linear;
-    -webkit-animation: spin 2s infinite linear;
-    animation: spin 2s infinite linear;
-}
-
-@-moz-keyframes spin {
-    0% {
-        -moz-transform: rotate(0deg);
-    }
-    100% {
-        -moz-transform: rotate(359deg);
-    }
-}
-
-@-webkit-keyframes spin {
-    0% {
-        -webkit-transform: rotate(0deg);
-    }
-    100% {
-        -webkit-transform: rotate(359deg);
-    }
-}
-
-@-o-keyframes spin {
-    0% {
-        -o-transform: rotate(0deg);
-    }
-    100% {
-        -o-transform: rotate(359deg);
-    }
-}
-
-@-ms-keyframes spin {
-  0% { -ms-transform: rotate(0deg); }
-  100% { -ms-transform: rotate(359deg); }
-}
-@keyframes spin {
-    0% {
-        transform: rotate(0deg);
-    }
-    100% {
-        transform: rotate(359deg);
-    }
-}
-
-@-moz-document url-prefix() {
-  .icon-spin {
-    height: .9em;
-  }
-  .btn .icon-spin {
-    height: auto;
-  }
-  .icon-spin.icon-large {
-    height: 1.25em;
-  }
-  .btn .icon-spin.icon-large {
-    height: .75em;
-  }
-}
-/*  Font Awesome uses the Unicode Private Use Area (PUA) to ensure screen
-    readers do not read off random characters that represent icons */
-.icon-glass:before {
-    content: "\f000";
-}
-
-.icon-music:before {
-    content: "\f001";
-}
-
-.icon-search:before {
-    content: "\f002";
-}
-
-.icon-envelope:before {
-    content: "\f003";
-}
-
-.icon-heart:before {
-    content: "\f004";
-}
-
-.icon-star:before {
-    content: "\f005";
-}
-
-.icon-star-empty:before {
-    content: "\f006";
-}
-
-.icon-user:before {
-    content: "\f007";
-}
-
-.icon-film:before {
-    content: "\f008";
-}
-
-.icon-th-large:before {
-    content: "\f009";
-}
-
-.icon-th:before {
-    content: "\f00a";
-}
-
-.icon-th-list:before {
-    content: "\f00b";
-}
-
-.icon-ok:before {
-    content: "\f00c";
-}
-
-.icon-remove:before {
-    content: "\f00d";
-}
-
-.icon-zoom-in:before {
-    content: "\f00e";
-}
-
-.icon-zoom-out:before {
-    content: "\f010";
-}
-
-.icon-off:before {
-    content: "\f011";
-}
-
-.icon-signal:before {
-    content: "\f012";
-}
-
-.icon-cog:before {
-    content: "\f013";
-}
-
-.icon-trash:before {
-    content: "\f014";
-}
-
-.icon-home:before {
-    content: "\f015";
-}
-
-.icon-file:before {
-    content: "\f016";
-}
-
-.icon-time:before {
-    content: "\f017";
-}
-
-.icon-road:before {
-    content: "\f018";
-}
-
-.icon-download-alt:before {
-    content: "\f019";
-}
-
-.icon-download:before {
-    content: "\f01a";
-}
-
-.icon-upload:before {
-    content: "\f01b";
-}
-
-.icon-inbox:before {
-    content: "\f01c";
-}
-
-.icon-play-circle:before {
-    content: "\f01d";
-}
-
-.icon-repeat:before {
-    content: "\f01e";
-}
-
-/* \f020 doesn't work in Safari. all shifted one down */
-.icon-refresh:before {
-    content: "\f021";
-}
-
-.icon-list-alt:before {
-    content: "\f022";
-}
-
-.icon-lock:before {
-    content: "\f023";
-}
-
-.icon-flag:before {
-    content: "\f024";
-}
-
-.icon-headphones:before {
-    content: "\f025";
-}
-
-.icon-volume-off:before {
-    content: "\f026";
-}
-
-.icon-volume-down:before {
-    content: "\f027";
-}
-
-.icon-volume-up:before {
-    content: "\f028";
-}
-
-.icon-qrcode:before {
-    content: "\f029";
-}
-
-.icon-barcode:before {
-    content: "\f02a";
-}
-
-.icon-tag:before {
-    content: "\f02b";
-}
-
-.icon-tags:before {
-    content: "\f02c";
-}
-
-.icon-book:before {
-    content: "\f02d";
-}
-
-.icon-bookmark:before {
-    content: "\f02e";
-}
-
-.icon-print:before {
-    content: "\f02f";
-}
-
-.icon-camera:before {
-    content: "\f030";
-}
-
-.icon-font:before {
-    content: "\f031";
-}
-
-.icon-bold:before {
-    content: "\f032";
-}
-
-.icon-italic:before {
-    content: "\f033";
-}
-
-.icon-text-height:before {
-    content: "\f034";
-}
-
-.icon-text-width:before {
-    content: "\f035";
-}
-
-.icon-align-left:before {
-    content: "\f036";
-}
-
-.icon-align-center:before {
-    content: "\f037";
-}
-
-.icon-align-right:before {
-    content: "\f038";
-}
-
-.icon-align-justify:before {
-    content: "\f039";
-}
-
-.icon-list:before {
-    content: "\f03a";
-}
-
-.icon-indent-left:before {
-    content: "\f03b";
-}
-
-.icon-indent-right:before {
-    content: "\f03c";
-}
-
-.icon-facetime-video:before {
-    content: "\f03d";
-}
-
-.icon-picture:before {
-    content: "\f03e";
-}
-
-.icon-pencil:before {
-    content: "\f040";
-}
-
-.icon-map-marker:before {
-    content: "\f041";
-}
-
-.icon-adjust:before {
-    content: "\f042";
-}
-
-.icon-tint:before {
-    content: "\f043";
-}
-
-.icon-edit:before {
-    content: "\f044";
-}
-
-.icon-share:before {
-    content: "\f045";
-}
-
-.icon-check:before {
-    content: "\f046";
-}
-
-.icon-move:before {
-    content: "\f047";
-}
-
-.icon-step-backward:before {
-    content: "\f048";
-}
-
-.icon-fast-backward:before {
-    content: "\f049";
-}
-
-.icon-backward:before {
-    content: "\f04a";
-}
-
-.icon-play:before {
-    content: "\f04b";
-}
-
-.icon-pause:before {
-    content: "\f04c";
-}
-
-.icon-stop:before {
-    content: "\f04d";
-}
-
-.icon-forward:before {
-    content: "\f04e";
-}
-
-.icon-fast-forward:before {
-    content: "\f050";
-}
-
-.icon-step-forward:before {
-    content: "\f051";
-}
-
-.icon-eject:before {
-    content: "\f052";
-}
-
-.icon-chevron-left:before {
-    content: "\f053";
-}
-
-.icon-chevron-right:before {
-    content: "\f054";
-}
-
-.icon-plus-sign:before {
-    content: "\f055";
-}
-
-.icon-minus-sign:before {
-    content: "\f056";
-}
-
-.icon-remove-sign:before {
-    content: "\f057";
-}
-
-.icon-ok-sign:before {
-    content: "\f058";
-}
-
-.icon-question-sign:before {
-    content: "\f059";
-}
-
-.icon-info-sign:before {
-    content: "\f05a";
-}
-
-.icon-screenshot:before {
-    content: "\f05b";
-}
-
-.icon-remove-circle:before {
-    content: "\f05c";
-}
-
-.icon-ok-circle:before {
-    content: "\f05d";
-}
-
-.icon-ban-circle:before {
-    content: "\f05e";
-}
-
-.icon-arrow-left:before {
-    content: "\f060";
-}
-
-.icon-arrow-right:before {
-    content: "\f061";
-}
-
-.icon-arrow-up:before {
-    content: "\f062";
-}
-
-.icon-arrow-down:before {
-    content: "\f063";
-}
-
-.icon-share-alt:before {
-    content: "\f064";
-}
-
-.icon-resize-full:before {
-    content: "\f065";
-}
-
-.icon-resize-small:before {
-    content: "\f066";
-}
-
-.icon-plus:before {
-    content: "\f067";
-}
-
-.icon-minus:before {
-    content: "\f068";
-}
-
-.icon-asterisk:before {
-    content: "\f069";
-}
-
-.icon-exclamation-sign:before {
-    content: "\f06a";
-}
-
-.icon-gift:before {
-    content: "\f06b";
-}
-
-.icon-leaf:before {
-    content: "\f06c";
-}
-
-.icon-fire:before {
-    content: "\f06d";
-}
-
-.icon-eye-open:before {
-    content: "\f06e";
-}
-
-.icon-eye-close:before {
-    content: "\f070";
-}
-
-.icon-warning-sign:before {
-    content: "\f071";
-}
-
-.icon-plane:before {
-    content: "\f072";
-}
-
-.icon-calendar:before {
-    content: "\f073";
-}
-
-.icon-random:before {
-    content: "\f074";
-}
-
-.icon-comment:before {
-    content: "\f075";
-}
-
-.icon-magnet:before {
-    content: "\f076";
-}
-
-.icon-chevron-up:before {
-    content: "\f077";
-}
-
-.icon-chevron-down:before {
-    content: "\f078";
-}
-
-.icon-retweet:before {
-    content: "\f079";
-}
-
-.icon-shopping-cart:before {
-    content: "\f07a";
-}
-
-.icon-folder-close:before {
-    content: "\f07b";
-}
-
-.icon-folder-open:before {
-    content: "\f07c";
-}
-
-.icon-resize-vertical:before {
-    content: "\f07d";
-}
-
-.icon-resize-horizontal:before {
-    content: "\f07e";
-}
-
-.icon-bar-chart:before {
-    content: "\f080";
-}
-
-.icon-twitter-sign:before {
-    content: "\f081";
-}
-
-.icon-facebook-sign:before {
-    content: "\f082";
-}
-
-.icon-camera-retro:before {
-    content: "\f083";
-}
-
-.icon-key:before {
-    content: "\f084";
-}
-
-.icon-cogs:before {
-    content: "\f085";
-}
-
-.icon-comments:before {
-    content: "\f086";
-}
-
-.icon-thumbs-up:before {
-    content: "\f087";
-}
-
-.icon-thumbs-down:before {
-    content: "\f088";
-}
-
-.icon-star-half:before {
-    content: "\f089";
-}
-
-.icon-heart-empty:before {
-    content: "\f08a";
-}
-
-.icon-signout:before {
-    content: "\f08b";
-}
-
-.icon-linkedin-sign:before {
-    content: "\f08c";
-}
-
-.icon-pushpin:before {
-    content: "\f08d";
-}
-
-.icon-external-link:before {
-    content: "\f08e";
-}
-
-.icon-signin:before {
-    content: "\f090";
-}
-
-.icon-trophy:before {
-    content: "\f091";
-}
-
-.icon-github-sign:before {
-    content: "\f092";
-}
-
-.icon-upload-alt:before {
-    content: "\f093";
-}
-
-.icon-lemon:before {
-    content: "\f094";
-}
-
-.icon-phone:before {
-    content: "\f095";
-}
-
-.icon-check-empty:before {
-    content: "\f096";
-}
-
-.icon-bookmark-empty:before {
-    content: "\f097";
-}
-
-.icon-phone-sign:before {
-    content: "\f098";
-}
-
-.icon-twitter:before {
-    content: "\f099";
-}
-
-.icon-facebook:before {
-    content: "\f09a";
-}
-
-.icon-github:before {
-    content: "\f09b";
-}
-
-.icon-unlock:before {
-    content: "\f09c";
-}
-
-.icon-credit-card:before {
-    content: "\f09d";
-}
-
-.icon-rss:before {
-    content: "\f09e";
-}
-
-.icon-hdd:before {
-    content: "\f0a0";
-}
-
-.icon-bullhorn:before {
-    content: "\f0a1";
-}
-
-.icon-bell:before {
-    content: "\f0a2";
-}
-
-.icon-certificate:before {
-    content: "\f0a3";
-}
-
-.icon-hand-right:before {
-    content: "\f0a4";
-}
-
-.icon-hand-left:before {
-    content: "\f0a5";
-}
-
-.icon-hand-up:before {
-    content: "\f0a6";
-}
-
-.icon-hand-down:before {
-    content: "\f0a7";
-}
-
-.icon-circle-arrow-left:before {
-    content: "\f0a8";
-}
-
-.icon-circle-arrow-right:before {
-    content: "\f0a9";
-}
-
-.icon-circle-arrow-up:before {
-    content: "\f0aa";
-}
-
-.icon-circle-arrow-down:before {
-    content: "\f0ab";
-}
-
-.icon-globe:before {
-    content: "\f0ac";
-}
-
-.icon-wrench:before {
-    content: "\f0ad";
-}
-
-.icon-tasks:before {
-    content: "\f0ae";
-}
-
-.icon-filter:before {
-    content: "\f0b0";
-}
-
-.icon-briefcase:before {
-    content: "\f0b1";
-}
-
-.icon-fullscreen:before {
-    content: "\f0b2";
-}
-
-.icon-group:before {
-    content: "\f0c0";
-}
-
-.icon-link:before {
-    content: "\f0c1";
-}
-
-.icon-cloud:before {
-    content: "\f0c2";
-}
-
-.icon-beaker:before {
-    content: "\f0c3";
-}
-
-.icon-cut:before {
-    content: "\f0c4";
-}
-
-.icon-copy:before {
-    content: "\f0c5";
-}
-
-.icon-paper-clip:before {
-    content: "\f0c6";
-}
-
-.icon-save:before {
-    content: "\f0c7";
-}
-
-.icon-sign-blank:before {
-    content: "\f0c8";
-}
-
-.icon-reorder:before {
-    content: "\f0c9";
-}
-
-.icon-list-ul:before {
-    content: "\f0ca";
-}
-
-.icon-list-ol:before {
-    content: "\f0cb";
-}
-
-.icon-strikethrough:before {
-    content: "\f0cc";
-}
-
-.icon-underline:before {
-    content: "\f0cd";
-}
-
-.icon-table:before {
-    content: "\f0ce";
-}
-
-.icon-magic:before {
-    content: "\f0d0";
-}
-
-.icon-truck:before {
-    content: "\f0d1";
-}
-
-.icon-pinterest:before {
-    content: "\f0d2";
-}
-
-.icon-pinterest-sign:before {
-    content: "\f0d3";
-}
-
-.icon-google-plus-sign:before {
-    content: "\f0d4";
-}
-
-.icon-google-plus:before {
-    content: "\f0d5";
-}
-
-.icon-money:before {
-    content: "\f0d6";
-}
-
-.icon-caret-down:before {
-    content: "\f0d7";
-}
-
-.icon-caret-up:before {
-    content: "\f0d8";
-}
-
-.icon-caret-left:before {
-    content: "\f0d9";
-}
-
-.icon-caret-right:before {
-    content: "\f0da";
-}
-
-.icon-columns:before {
-    content: "\f0db";
-}
-
-.icon-sort:before {
-    content: "\f0dc";
-}
-
-.icon-sort-down:before {
-    content: "\f0dd";
-}
-
-.icon-sort-up:before {
-    content: "\f0de";
-}
-
-.icon-envelope-alt:before {
-    content: "\f0e0";
-}
-
-.icon-linkedin:before {
-    content: "\f0e1";
-}
-
-.icon-undo:before {
-    content: "\f0e2";
-}
-
-.icon-legal:before {
-    content: "\f0e3";
-}
-
-.icon-dashboard:before {
-    content: "\f0e4";
-}
-
-.icon-comment-alt:before {
-    content: "\f0e5";
-}
-
-.icon-comments-alt:before {
-    content: "\f0e6";
-}
-
-.icon-bolt:before {
-    content: "\f0e7";
-}
-
-.icon-sitemap:before {
-    content: "\f0e8";
-}
-
-.icon-umbrella:before {
-    content: "\f0e9";
-}
-
-.icon-paste:before {
-    content: "\f0ea";
-}
-
-.icon-lightbulb:before {
-    content: "\f0eb";
-}
-
-.icon-exchange:before {
-    content: "\f0ec";
-}
-
-.icon-cloud-download:before {
-    content: "\f0ed";
-}
-
-.icon-cloud-upload:before {
-    content: "\f0ee";
-}
-
-.icon-user-md:before {
-    content: "\f0f0";
-}
-
-.icon-stethoscope:before {
-    content: "\f0f1";
-}
-
-.icon-suitcase:before {
-    content: "\f0f2";
-}
-
-.icon-bell-alt:before {
-    content: "\f0f3";
-}
-
-.icon-coffee:before {
-    content: "\f0f4";
-}
-
-.icon-food:before {
-    content: "\f0f5";
-}
-
-.icon-file-alt:before {
-    content: "\f0f6";
-}
-
-.icon-building:before {
-    content: "\f0f7";
-}
-
-.icon-hospital:before {
-    content: "\f0f8";
-}
-
-.icon-ambulance:before {
-    content: "\f0f9";
-}
-
-.icon-medkit:before {
-    content: "\f0fa";
-}
-
-.icon-fighter-jet:before {
-    content: "\f0fb";
-}
-
-.icon-beer:before {
-    content: "\f0fc";
-}
-
-.icon-h-sign:before {
-    content: "\f0fd";
-}
-
-.icon-plus-sign-alt:before {
-    content: "\f0fe";
-}
-
-.icon-double-angle-left:before {
-    content: "\f100";
-}
-
-.icon-double-angle-right:before {
-    content: "\f101";
-}
-
-.icon-double-angle-up:before {
-    content: "\f102";
-}
-
-.icon-double-angle-down:before {
-    content: "\f103";
-}
-
-.icon-angle-left:before {
-    content: "\f104";
-}
-
-.icon-angle-right:before {
-    content: "\f105";
-}
-
-.icon-angle-up:before {
-    content: "\f106";
-}
-
-.icon-angle-down:before {
-    content: "\f107";
-}
-
-.icon-desktop:before {
-    content: "\f108";
-}
-
-.icon-laptop:before {
-    content: "\f109";
-}
-
-.icon-tablet:before {
-    content: "\f10a";
-}
-
-.icon-mobile-phone:before {
-    content: "\f10b";
-}
-
-.icon-circle-blank:before {
-    content: "\f10c";
-}
-
-.icon-quote-left:before {
-    content: "\f10d";
-}
-
-.icon-quote-right:before {
-    content: "\f10e";
-}
-
-.icon-spinner:before {
-    content: "\f110";
-}
-
-.icon-circle:before {
-    content: "\f111";
-}
-
-.icon-reply:before {
-    content: "\f112";
-}
-
-.icon-github-alt:before {
-    content: "\f113";
-}
-
-.icon-folder-close-alt:before {
-    content: "\f114";
-}
-
-.icon-folder-open-alt:before {
-    content: "\f115";
-}

+ 0 - 1230
main/css/font_awesome/font-awesome.min.css

@@ -1,1230 +0,0 @@
-/*!
- *  Font Awesome 3.0.2
- *  the iconic font designed for use with Twitter Bootstrap
- *  -------------------------------------------------------
- *  The full suite of pictographic icons, examples, and documentation
- *  can be found at: http://fortawesome.github.com/Font-Awesome/
- *
- *  License
- *  -------------------------------------------------------
- *  - The Font Awesome font is licensed under the SIL Open Font License - http://scripts.sil.org/OFL
- *  - Font Awesome CSS, LESS, and SASS files are licensed under the MIT License -
- *    http://opensource.org/licenses/mit-license.html
- *  - The Font Awesome pictograms are licensed under the CC BY 3.0 License - http://creativecommons.org/licenses/by/3.0/
- *  - Attribution is no longer required in Font Awesome 3.0, but much appreciated:
- *    "Font Awesome by Dave Gandy - http://fortawesome.github.com/Font-Awesome"
-
- *  Contact
- *  -------------------------------------------------------
- *  Email: dave@davegandy.com
- *  Twitter: http://twitter.com/fortaweso_me
- *  Work: Lead Product Designer @ http://kyruus.com
- */
-
-@font-face {
-    font-family: 'FontAwesome';
-    src: url('../font/fontawesome-webfont.eot?v=3.0.1');
-    src: url('../font/fontawesome-webfont.eot?#iefix&v=3.0.1') format('embedded-opentype'), url('../font/fontawesome-webfont.woff?v=3.0.1') format('woff'), url('../font/fontawesome-webfont.ttf?v=3.0.1') format('truetype');
-    font-weight: normal;
-    font-style: normal
-}
-
-[class^="icon-"], [class*=" icon-"] {
-    font-family: FontAwesome;
-    font-weight: normal;
-    font-style: normal;
-    text-decoration: inherit;
-    -webkit-font-smoothing: antialiased;
-    display: inline;
-    width: auto;
-    height: auto;
-    line-height: normal;
-    vertical-align: baseline;
-    background-image: none;
-    background-position: 0 0;
-    background-repeat: repeat;
-    margin-top: 0
-}
-
-.icon-white, .nav-pills>.active>a>[class^="icon-"], .nav-pills>.active>a>[class*=" icon-"], .nav-list>.active>a>[class^="icon-"], .nav-list>.active>a>[class*=" icon-"], .navbar-inverse .nav>.active>a>[class^="icon-"], .navbar-inverse .nav>.active>a>[class*=" icon-"], .dropdown-menu>li>a:hover>[class^="icon-"], .dropdown-menu>li>a:hover>[class*=" icon-"], .dropdown-menu>.active>a>[class^="icon-"], .dropdown-menu>.active>a>[class*=" icon-"], .dropdown-submenu:hover>a>[class^="icon-"], .dropdown-submenu:hover>a>[class*=" icon-"] {
-    background-image: none
-}
-
-[class^="icon-"]:before, [class*=" icon-"]:before {
-    text-decoration: inherit;
-    display: inline-block;
-    speak: none
-}
-
-a [class^="icon-"], a [class*=" icon-"] {
-    display: inline-block
-}
-
-.icon-large:before {
-    vertical-align: -10%;
-    font-size: 1.3333333333333333em
-}
-
-.btn [class^="icon-"], .nav [class^="icon-"], .btn [class*=" icon-"], .nav [class*=" icon-"] {
-    display: inline
-}
-
-.btn [class^="icon-"].icon-large, .nav [class^="icon-"].icon-large, .btn [class*=" icon-"].icon-large, .nav [class*=" icon-"].icon-large {
-    line-height: .9em
-}
-
-.btn [class^="icon-"].icon-spin, .nav [class^="icon-"].icon-spin, .btn [class*=" icon-"].icon-spin, .nav [class*=" icon-"].icon-spin {
-    display: inline-block
-}
-
-.nav-tabs [class^="icon-"], .nav-pills [class^="icon-"], .nav-tabs [class*=" icon-"], .nav-pills [class*=" icon-"], .nav-tabs [class^="icon-"].icon-large, .nav-pills [class^="icon-"].icon-large, .nav-tabs [class*=" icon-"].icon-large, .nav-pills [class*=" icon-"].icon-large {
-    line-height: .9em
-}
-
-li [class^="icon-"], .nav li [class^="icon-"], li [class*=" icon-"], .nav li [class*=" icon-"] {
-    display: inline-block;
-    width: 1.25em;
-    text-align: center
-}
-
-li [class^="icon-"].icon-large, .nav li [class^="icon-"].icon-large, li [class*=" icon-"].icon-large, .nav li [class*=" icon-"].icon-large {
-    width: 1.5625em
-}
-
-ul.icons {
-    list-style-type: none;
-    text-indent: -0.75em
-}
-
-ul.icons li [class^="icon-"], ul.icons li [class*=" icon-"] {
-    width: .75em
-}
-
-.icon-muted {
-    color: #eee
-}
-
-.icon-border {
-    border: solid 1px #eee;
-    padding: .2em .25em .15em;
-    -webkit-border-radius: 3px;
-    -moz-border-radius: 3px;
-    border-radius: 3px
-}
-
-.icon-2x {
-    font-size: 2em
-}
-
-.icon-2x.icon-border {
-    border-width: 2px;
-    -webkit-border-radius: 4px;
-    -moz-border-radius: 4px;
-    border-radius: 4px
-}
-
-.icon-3x {
-    font-size: 3em
-}
-
-.icon-3x.icon-border {
-    border-width: 3px;
-    -webkit-border-radius: 5px;
-    -moz-border-radius: 5px;
-    border-radius: 5px
-}
-
-.icon-4x {
-    font-size: 4em
-}
-
-.icon-4x.icon-border {
-    border-width: 4px;
-    -webkit-border-radius: 6px;
-    -moz-border-radius: 6px;
-    border-radius: 6px
-}
-
-.pull-right {
-    float: right
-}
-
-.pull-left {
-    float: left
-}
-
-[class^="icon-"].pull-left, [class*=" icon-"].pull-left {
-    margin-right: .3em
-}
-
-[class^="icon-"].pull-right, [class*=" icon-"].pull-right {
-    margin-left: .3em
-}
-
-.btn [class^="icon-"].pull-left.icon-2x, .btn [class*=" icon-"].pull-left.icon-2x, .btn [class^="icon-"].pull-right.icon-2x, .btn [class*=" icon-"].pull-right.icon-2x {
-    margin-top: .18em
-}
-
-.btn [class^="icon-"].icon-spin.icon-large, .btn [class*=" icon-"].icon-spin.icon-large {
-    line-height: .8em
-}
-
-.btn.btn-small [class^="icon-"].pull-left.icon-2x, .btn.btn-small [class*=" icon-"].pull-left.icon-2x, .btn.btn-small [class^="icon-"].pull-right.icon-2x, .btn.btn-small [class*=" icon-"].pull-right.icon-2x {
-    margin-top: .25em
-}
-
-.btn.btn-large [class^="icon-"], .btn.btn-large [class*=" icon-"] {
-    margin-top: 0
-}
-
-.btn.btn-large [class^="icon-"].pull-left.icon-2x, .btn.btn-large [class*=" icon-"].pull-left.icon-2x, .btn.btn-large [class^="icon-"].pull-right.icon-2x, .btn.btn-large [class*=" icon-"].pull-right.icon-2x {
-    margin-top: .05em
-}
-
-.btn.btn-large [class^="icon-"].pull-left.icon-2x, .btn.btn-large [class*=" icon-"].pull-left.icon-2x {
-    margin-right: .2em
-}
-
-.btn.btn-large [class^="icon-"].pull-right.icon-2x, .btn.btn-large [class*=" icon-"].pull-right.icon-2x {
-    margin-left: .2em
-}
-
-.icon-spin {
-    display: inline-block;
-    -moz-animation: spin 2s infinite linear;
-    -o-animation: spin 2s infinite linear;
-    -webkit-animation: spin 2s infinite linear;
-    animation: spin 2s infinite linear
-}
-
-@-moz-keyframes spin {
-    0% {
-        -moz-transform: rotate(0deg)
-    }
-    100% {
-        -moz-transform: rotate(359deg)
-    }
-}
-
-@-webkit-keyframes spin {
-    0% {
-        -webkit-transform: rotate(0deg)
-    }
-    100% {
-        -webkit-transform: rotate(359deg)
-    }
-}
-
-@-o-keyframes spin {
-    0% {
-        -o-transform: rotate(0deg)
-    }
-    100% {
-        -o-transform: rotate(359deg)
-    }
-}
-
-@-ms-keyframes spin{0%{-ms-transform:rotate(0deg)}100%{-ms-transform:rotate(359deg)}} @keyframes spin {
-                                                                                          0% {
-                                                                                              transform: rotate(0deg)
-                                                                                          }
-                                                                                          100% {
-                                                                                              transform: rotate(359deg)
-                                                                                          }
-                                                                                      }
-
-@-moz-document url-prefix(){.icon-spin{height:.9em}.btn .icon-spin{height:auto}.icon-spin.icon-large{height:1.25em}.btn .icon-spin.icon-large{height:.75em}} .icon-glass:before {
-                                                                                                                                                                 content: "\f000"
-                                                                                                                                                             }
-
-.icon-music:before {
-    content: "\f001"
-}
-
-.icon-search:before {
-    content: "\f002"
-}
-
-.icon-envelope:before {
-    content: "\f003"
-}
-
-.icon-heart:before {
-    content: "\f004"
-}
-
-.icon-star:before {
-    content: "\f005"
-}
-
-.icon-star-empty:before {
-    content: "\f006"
-}
-
-.icon-user:before {
-    content: "\f007"
-}
-
-.icon-film:before {
-    content: "\f008"
-}
-
-.icon-th-large:before {
-    content: "\f009"
-}
-
-.icon-th:before {
-    content: "\f00a"
-}
-
-.icon-th-list:before {
-    content: "\f00b"
-}
-
-.icon-ok:before {
-    content: "\f00c"
-}
-
-.icon-remove:before {
-    content: "\f00d"
-}
-
-.icon-zoom-in:before {
-    content: "\f00e"
-}
-
-.icon-zoom-out:before {
-    content: "\f010"
-}
-
-.icon-off:before {
-    content: "\f011"
-}
-
-.icon-signal:before {
-    content: "\f012"
-}
-
-.icon-cog:before {
-    content: "\f013"
-}
-
-.icon-trash:before {
-    content: "\f014"
-}
-
-.icon-home:before {
-    content: "\f015"
-}
-
-.icon-file:before {
-    content: "\f016"
-}
-
-.icon-time:before {
-    content: "\f017"
-}
-
-.icon-road:before {
-    content: "\f018"
-}
-
-.icon-download-alt:before {
-    content: "\f019"
-}
-
-.icon-download:before {
-    content: "\f01a"
-}
-
-.icon-upload:before {
-    content: "\f01b"
-}
-
-.icon-inbox:before {
-    content: "\f01c"
-}
-
-.icon-play-circle:before {
-    content: "\f01d"
-}
-
-.icon-repeat:before {
-    content: "\f01e"
-}
-
-.icon-refresh:before {
-    content: "\f021"
-}
-
-.icon-list-alt:before {
-    content: "\f022"
-}
-
-.icon-lock:before {
-    content: "\f023"
-}
-
-.icon-flag:before {
-    content: "\f024"
-}
-
-.icon-headphones:before {
-    content: "\f025"
-}
-
-.icon-volume-off:before {
-    content: "\f026"
-}
-
-.icon-volume-down:before {
-    content: "\f027"
-}
-
-.icon-volume-up:before {
-    content: "\f028"
-}
-
-.icon-qrcode:before {
-    content: "\f029"
-}
-
-.icon-barcode:before {
-    content: "\f02a"
-}
-
-.icon-tag:before {
-    content: "\f02b"
-}
-
-.icon-tags:before {
-    content: "\f02c"
-}
-
-.icon-book:before {
-    content: "\f02d"
-}
-
-.icon-bookmark:before {
-    content: "\f02e"
-}
-
-.icon-print:before {
-    content: "\f02f"
-}
-
-.icon-camera:before {
-    content: "\f030"
-}
-
-.icon-font:before {
-    content: "\f031"
-}
-
-.icon-bold:before {
-    content: "\f032"
-}
-
-.icon-italic:before {
-    content: "\f033"
-}
-
-.icon-text-height:before {
-    content: "\f034"
-}
-
-.icon-text-width:before {
-    content: "\f035"
-}
-
-.icon-align-left:before {
-    content: "\f036"
-}
-
-.icon-align-center:before {
-    content: "\f037"
-}
-
-.icon-align-right:before {
-    content: "\f038"
-}
-
-.icon-align-justify:before {
-    content: "\f039"
-}
-
-.icon-list:before {
-    content: "\f03a"
-}
-
-.icon-indent-left:before {
-    content: "\f03b"
-}
-
-.icon-indent-right:before {
-    content: "\f03c"
-}
-
-.icon-facetime-video:before {
-    content: "\f03d"
-}
-
-.icon-picture:before {
-    content: "\f03e"
-}
-
-.icon-pencil:before {
-    content: "\f040"
-}
-
-.icon-map-marker:before {
-    content: "\f041"
-}
-
-.icon-adjust:before {
-    content: "\f042"
-}
-
-.icon-tint:before {
-    content: "\f043"
-}
-
-.icon-edit:before {
-    content: "\f044"
-}
-
-.icon-share:before {
-    content: "\f045"
-}
-
-.icon-check:before {
-    content: "\f046"
-}
-
-.icon-move:before {
-    content: "\f047"
-}
-
-.icon-step-backward:before {
-    content: "\f048"
-}
-
-.icon-fast-backward:before {
-    content: "\f049"
-}
-
-.icon-backward:before {
-    content: "\f04a"
-}
-
-.icon-play:before {
-    content: "\f04b"
-}
-
-.icon-pause:before {
-    content: "\f04c"
-}
-
-.icon-stop:before {
-    content: "\f04d"
-}
-
-.icon-forward:before {
-    content: "\f04e"
-}
-
-.icon-fast-forward:before {
-    content: "\f050"
-}
-
-.icon-step-forward:before {
-    content: "\f051"
-}
-
-.icon-eject:before {
-    content: "\f052"
-}
-
-.icon-chevron-left:before {
-    content: "\f053"
-}
-
-.icon-chevron-right:before {
-    content: "\f054"
-}
-
-.icon-plus-sign:before {
-    content: "\f055"
-}
-
-.icon-minus-sign:before {
-    content: "\f056"
-}
-
-.icon-remove-sign:before {
-    content: "\f057"
-}
-
-.icon-ok-sign:before {
-    content: "\f058"
-}
-
-.icon-question-sign:before {
-    content: "\f059"
-}
-
-.icon-info-sign:before {
-    content: "\f05a"
-}
-
-.icon-screenshot:before {
-    content: "\f05b"
-}
-
-.icon-remove-circle:before {
-    content: "\f05c"
-}
-
-.icon-ok-circle:before {
-    content: "\f05d"
-}
-
-.icon-ban-circle:before {
-    content: "\f05e"
-}
-
-.icon-arrow-left:before {
-    content: "\f060"
-}
-
-.icon-arrow-right:before {
-    content: "\f061"
-}
-
-.icon-arrow-up:before {
-    content: "\f062"
-}
-
-.icon-arrow-down:before {
-    content: "\f063"
-}
-
-.icon-share-alt:before {
-    content: "\f064"
-}
-
-.icon-resize-full:before {
-    content: "\f065"
-}
-
-.icon-resize-small:before {
-    content: "\f066"
-}
-
-.icon-plus:before {
-    content: "\f067"
-}
-
-.icon-minus:before {
-    content: "\f068"
-}
-
-.icon-asterisk:before {
-    content: "\f069"
-}
-
-.icon-exclamation-sign:before {
-    content: "\f06a"
-}
-
-.icon-gift:before {
-    content: "\f06b"
-}
-
-.icon-leaf:before {
-    content: "\f06c"
-}
-
-.icon-fire:before {
-    content: "\f06d"
-}
-
-.icon-eye-open:before {
-    content: "\f06e"
-}
-
-.icon-eye-close:before {
-    content: "\f070"
-}
-
-.icon-warning-sign:before {
-    content: "\f071"
-}
-
-.icon-plane:before {
-    content: "\f072"
-}
-
-.icon-calendar:before {
-    content: "\f073"
-}
-
-.icon-random:before {
-    content: "\f074"
-}
-
-.icon-comment:before {
-    content: "\f075"
-}
-
-.icon-magnet:before {
-    content: "\f076"
-}
-
-.icon-chevron-up:before {
-    content: "\f077"
-}
-
-.icon-chevron-down:before {
-    content: "\f078"
-}
-
-.icon-retweet:before {
-    content: "\f079"
-}
-
-.icon-shopping-cart:before {
-    content: "\f07a"
-}
-
-.icon-folder-close:before {
-    content: "\f07b"
-}
-
-.icon-folder-open:before {
-    content: "\f07c"
-}
-
-.icon-resize-vertical:before {
-    content: "\f07d"
-}
-
-.icon-resize-horizontal:before {
-    content: "\f07e"
-}
-
-.icon-bar-chart:before {
-    content: "\f080"
-}
-
-.icon-twitter-sign:before {
-    content: "\f081"
-}
-
-.icon-facebook-sign:before {
-    content: "\f082"
-}
-
-.icon-camera-retro:before {
-    content: "\f083"
-}
-
-.icon-key:before {
-    content: "\f084"
-}
-
-.icon-cogs:before {
-    content: "\f085"
-}
-
-.icon-comments:before {
-    content: "\f086"
-}
-
-.icon-thumbs-up:before {
-    content: "\f087"
-}
-
-.icon-thumbs-down:before {
-    content: "\f088"
-}
-
-.icon-star-half:before {
-    content: "\f089"
-}
-
-.icon-heart-empty:before {
-    content: "\f08a"
-}
-
-.icon-signout:before {
-    content: "\f08b"
-}
-
-.icon-linkedin-sign:before {
-    content: "\f08c"
-}
-
-.icon-pushpin:before {
-    content: "\f08d"
-}
-
-.icon-external-link:before {
-    content: "\f08e"
-}
-
-.icon-signin:before {
-    content: "\f090"
-}
-
-.icon-trophy:before {
-    content: "\f091"
-}
-
-.icon-github-sign:before {
-    content: "\f092"
-}
-
-.icon-upload-alt:before {
-    content: "\f093"
-}
-
-.icon-lemon:before {
-    content: "\f094"
-}
-
-.icon-phone:before {
-    content: "\f095"
-}
-
-.icon-check-empty:before {
-    content: "\f096"
-}
-
-.icon-bookmark-empty:before {
-    content: "\f097"
-}
-
-.icon-phone-sign:before {
-    content: "\f098"
-}
-
-.icon-twitter:before {
-    content: "\f099"
-}
-
-.icon-facebook:before {
-    content: "\f09a"
-}
-
-.icon-github:before {
-    content: "\f09b"
-}
-
-.icon-unlock:before {
-    content: "\f09c"
-}
-
-.icon-credit-card:before {
-    content: "\f09d"
-}
-
-.icon-rss:before {
-    content: "\f09e"
-}
-
-.icon-hdd:before {
-    content: "\f0a0"
-}
-
-.icon-bullhorn:before {
-    content: "\f0a1"
-}
-
-.icon-bell:before {
-    content: "\f0a2"
-}
-
-.icon-certificate:before {
-    content: "\f0a3"
-}
-
-.icon-hand-right:before {
-    content: "\f0a4"
-}
-
-.icon-hand-left:before {
-    content: "\f0a5"
-}
-
-.icon-hand-up:before {
-    content: "\f0a6"
-}
-
-.icon-hand-down:before {
-    content: "\f0a7"
-}
-
-.icon-circle-arrow-left:before {
-    content: "\f0a8"
-}
-
-.icon-circle-arrow-right:before {
-    content: "\f0a9"
-}
-
-.icon-circle-arrow-up:before {
-    content: "\f0aa"
-}
-
-.icon-circle-arrow-down:before {
-    content: "\f0ab"
-}
-
-.icon-globe:before {
-    content: "\f0ac"
-}
-
-.icon-wrench:before {
-    content: "\f0ad"
-}
-
-.icon-tasks:before {
-    content: "\f0ae"
-}
-
-.icon-filter:before {
-    content: "\f0b0"
-}
-
-.icon-briefcase:before {
-    content: "\f0b1"
-}
-
-.icon-fullscreen:before {
-    content: "\f0b2"
-}
-
-.icon-group:before {
-    content: "\f0c0"
-}
-
-.icon-link:before {
-    content: "\f0c1"
-}
-
-.icon-cloud:before {
-    content: "\f0c2"
-}
-
-.icon-beaker:before {
-    content: "\f0c3"
-}
-
-.icon-cut:before {
-    content: "\f0c4"
-}
-
-.icon-copy:before {
-    content: "\f0c5"
-}
-
-.icon-paper-clip:before {
-    content: "\f0c6"
-}
-
-.icon-save:before {
-    content: "\f0c7"
-}
-
-.icon-sign-blank:before {
-    content: "\f0c8"
-}
-
-.icon-reorder:before {
-    content: "\f0c9"
-}
-
-.icon-list-ul:before {
-    content: "\f0ca"
-}
-
-.icon-list-ol:before {
-    content: "\f0cb"
-}
-
-.icon-strikethrough:before {
-    content: "\f0cc"
-}
-
-.icon-underline:before {
-    content: "\f0cd"
-}
-
-.icon-table:before {
-    content: "\f0ce"
-}
-
-.icon-magic:before {
-    content: "\f0d0"
-}
-
-.icon-truck:before {
-    content: "\f0d1"
-}
-
-.icon-pinterest:before {
-    content: "\f0d2"
-}
-
-.icon-pinterest-sign:before {
-    content: "\f0d3"
-}
-
-.icon-google-plus-sign:before {
-    content: "\f0d4"
-}
-
-.icon-google-plus:before {
-    content: "\f0d5"
-}
-
-.icon-money:before {
-    content: "\f0d6"
-}
-
-.icon-caret-down:before {
-    content: "\f0d7"
-}
-
-.icon-caret-up:before {
-    content: "\f0d8"
-}
-
-.icon-caret-left:before {
-    content: "\f0d9"
-}
-
-.icon-caret-right:before {
-    content: "\f0da"
-}
-
-.icon-columns:before {
-    content: "\f0db"
-}
-
-.icon-sort:before {
-    content: "\f0dc"
-}
-
-.icon-sort-down:before {
-    content: "\f0dd"
-}
-
-.icon-sort-up:before {
-    content: "\f0de"
-}
-
-.icon-envelope-alt:before {
-    content: "\f0e0"
-}
-
-.icon-linkedin:before {
-    content: "\f0e1"
-}
-
-.icon-undo:before {
-    content: "\f0e2"
-}
-
-.icon-legal:before {
-    content: "\f0e3"
-}
-
-.icon-dashboard:before {
-    content: "\f0e4"
-}
-
-.icon-comment-alt:before {
-    content: "\f0e5"
-}
-
-.icon-comments-alt:before {
-    content: "\f0e6"
-}
-
-.icon-bolt:before {
-    content: "\f0e7"
-}
-
-.icon-sitemap:before {
-    content: "\f0e8"
-}
-
-.icon-umbrella:before {
-    content: "\f0e9"
-}
-
-.icon-paste:before {
-    content: "\f0ea"
-}
-
-.icon-lightbulb:before {
-    content: "\f0eb"
-}
-
-.icon-exchange:before {
-    content: "\f0ec"
-}
-
-.icon-cloud-download:before {
-    content: "\f0ed"
-}
-
-.icon-cloud-upload:before {
-    content: "\f0ee"
-}
-
-.icon-user-md:before {
-    content: "\f0f0"
-}
-
-.icon-stethoscope:before {
-    content: "\f0f1"
-}
-
-.icon-suitcase:before {
-    content: "\f0f2"
-}
-
-.icon-bell-alt:before {
-    content: "\f0f3"
-}
-
-.icon-coffee:before {
-    content: "\f0f4"
-}
-
-.icon-food:before {
-    content: "\f0f5"
-}
-
-.icon-file-alt:before {
-    content: "\f0f6"
-}
-
-.icon-building:before {
-    content: "\f0f7"
-}
-
-.icon-hospital:before {
-    content: "\f0f8"
-}
-
-.icon-ambulance:before {
-    content: "\f0f9"
-}
-
-.icon-medkit:before {
-    content: "\f0fa"
-}
-
-.icon-fighter-jet:before {
-    content: "\f0fb"
-}
-
-.icon-beer:before {
-    content: "\f0fc"
-}
-
-.icon-h-sign:before {
-    content: "\f0fd"
-}
-
-.icon-plus-sign-alt:before {
-    content: "\f0fe"
-}
-
-.icon-double-angle-left:before {
-    content: "\f100"
-}
-
-.icon-double-angle-right:before {
-    content: "\f101"
-}
-
-.icon-double-angle-up:before {
-    content: "\f102"
-}
-
-.icon-double-angle-down:before {
-    content: "\f103"
-}
-
-.icon-angle-left:before {
-    content: "\f104"
-}
-
-.icon-angle-right:before {
-    content: "\f105"
-}
-
-.icon-angle-up:before {
-    content: "\f106"
-}
-
-.icon-angle-down:before {
-    content: "\f107"
-}
-
-.icon-desktop:before {
-    content: "\f108"
-}
-
-.icon-laptop:before {
-    content: "\f109"
-}
-
-.icon-tablet:before {
-    content: "\f10a"
-}
-
-.icon-mobile-phone:before {
-    content: "\f10b"
-}
-
-.icon-circle-blank:before {
-    content: "\f10c"
-}
-
-.icon-quote-left:before {
-    content: "\f10d"
-}
-
-.icon-quote-right:before {
-    content: "\f10e"
-}
-
-.icon-spinner:before {
-    content: "\f110"
-}
-
-.icon-circle:before {
-    content: "\f111"
-}
-
-.icon-reply:before {
-    content: "\f112"
-}
-
-.icon-github-alt:before {
-    content: "\f113"
-}
-
-.icon-folder-close-alt:before {
-    content: "\f114"
-}
-
-.icon-folder-open-alt:before {
-    content: "\f115"
-}

BIN
main/css/font_awesome/font/FontAwesome.otf


BIN
main/css/font_awesome/font/fontawesome-webfont.eot


File diff suppressed because it is too large
+ 195 - 0
main/css/font_awesome/font/fontawesome-webfont.svg


BIN
main/css/font_awesome/font/fontawesome-webfont.ttf


BIN
main/css/font_awesome/font/fontawesome-webfont.woff


+ 2 - 2
main/dropbox/dropbox_functions.inc.php

@@ -1363,7 +1363,7 @@ function get_last_tool_access($tool, $courseId = '', $user_id = '')
     }
 
     // the table where the last tool access is stored (=track_e_lastaccess)
-    $table_last_access = Database::get_statistic_table('track_e_lastaccess');
+    $table_last_access = Database::get_main_table('track_e_lastaccess');
 
     $sql = "SELECT access_date FROM $table_last_access WHERE access_user_id='".Database::escape_string($user_id)."'
 				AND c_id ='".Database::escape_string($courseId)."'
@@ -1374,4 +1374,4 @@ function get_last_tool_access($tool, $courseId = '', $user_id = '')
     $row = Database::fetch_array($result);
 
     return $row['access_date'];
-}
+}

+ 1 - 1
main/dropbox/dropbox_init.inc.php

@@ -64,7 +64,7 @@ require_once api_get_path(SYS_CODE_PATH).'document/document.inc.php';  // we use
 $user_id = api_get_user_id();
 $course_code = api_get_course_id();
 $courseId = api_get_course_int_id();
-$course_info = Database::get_course_info($course_code);
+$course_info = api_get_course_info($course_code);
 
 $session_id = api_get_session_id();
 if (empty($session_id)) {

+ 11 - 12
main/exercice/admin.php

@@ -84,9 +84,7 @@ if ($_SERVER['REQUEST_METHOD'] == 'POST') {
     }
 }
 
-
-
-// get vars from GET
+// Get vars from GET
 if (empty($exerciseId)) {
     $exerciseId = isset($_GET['exerciseId'])?intval($_GET['exerciseId']):'0';
 }
@@ -105,14 +103,15 @@ if (empty($modifyQuestion)) {
 if (empty($deleteQuestion)) {
     $deleteQuestion = isset($_GET['deleteQuestion'])?$_GET['deleteQuestion']:0;
 }
-if (empty($clone_question)) {
-    $clone_question = isset($_GET['clone_question'])?$_GET['clone_question']:0;
-}
+
+$clone_question = isset($_REQUEST['clone_question']) ? $_REQUEST['clone_question']:0;
+
 if (empty($questionId)) {
     $questionId = isset($_SESSION['questionId'])?$_SESSION['questionId']:0;
 }
 
-// Cleaning all incomplete attempts of the admin/teacher to avoid weird problems when changing the exercise settings, number of questions, etc
+/* Cleaning all incomplete attempts of the admin/teacher to avoid weird problems
+    when changing the exercise settings, number of questions, etc */
 
 delete_all_incomplete_attempts(api_get_user_id(), $exerciseId, api_get_course_int_id(), api_get_session_id());
 
@@ -121,7 +120,7 @@ $objExercise = isset($_SESSION['objExercise']) ? $_SESSION['objExercise'] : 0;
 /** @var Question $objQuestion */
 $objQuestion = isset($_SESSION['objQuestion']) ? $_SESSION['objQuestion'] : 0;
 /** @var Answer $objAnswer */
-$objAnswer = isset($_SESSION['objAnswer'])?$_SESSION['objAnswer']:0;
+$objAnswer = isset($_SESSION['objAnswer']) ? $_SESSION['objAnswer'] : 0;
 
 // document path
 $documentPath = api_get_path(SYS_COURSE_PATH).$_course['path'].'/document';
@@ -172,10 +171,9 @@ if (!empty($_GET['action']) && $_GET['action'] == 'exportqti2' && !empty($_GET['
 if (!is_object($objExercise)) {
     // construction of the Exercise object
     $objExercise = new Exercise();
-
     // creation of a new exercise if wrong or not specified exercise ID
     if ($exerciseId) {
-        $objExercise->read($exerciseId, false);
+        $objExercise->read($exerciseId, true);
     }
     // saves the object into the session
     Session::write('objExercise', $objExercise);
@@ -236,14 +234,15 @@ if (!empty($cancelQuestion)) {
     }
 }
 
+
 if (!empty($clone_question) && !empty($objExercise->id)) {
-    $old_question_obj = Question::read($clone_question, api_get_course_int_id());
 
+    $old_question_obj = Question::read($clone_question, api_get_course_int_id());
     $old_question_obj->question = $old_question_obj->question.' - '.get_lang('Copy');
 
     $new_id = $old_question_obj->duplicate();
     $new_question_obj = Question::read($new_id, api_get_course_int_id());
-    $new_question_obj->addToList($exerciseId);
+    $new_question_obj->addToList($objExercise->id);
 
     // This should be moved to the duplicate function
     $new_answer_obj = new Answer($clone_question, null, $objExercise);

+ 6 - 2
main/exercice/exercice.php

@@ -48,7 +48,7 @@ $TBL_DOCUMENT = Database :: get_course_table(TABLE_DOCUMENT);
 $TBL_ITEM_PROPERTY = Database :: get_course_table(TABLE_ITEM_PROPERTY);
 $TBL_EXERCICE_QUESTION = Database :: get_course_table(TABLE_QUIZ_TEST_QUESTION);
 $TBL_EXERCICES = Database :: get_course_table(TABLE_QUIZ_TEST);
-$TBL_TRACK_EXERCICES = Database :: get_statistic_table(TABLE_STATISTIC_TRACK_E_EXERCICES);
+$TBL_TRACK_EXERCICES = Database :: get_main_table(TABLE_STATISTIC_TRACK_E_EXERCICES);
 
 // document path
 $documentPath = api_get_path(SYS_COURSE_PATH).$_course['path']."/document";
@@ -709,7 +709,7 @@ if (!empty($exercise_list)) {
 
                         if ($row['random_by_category'] > 0) {
                             $nbQuestionsTotal = $exercise_obj->getNumberQuestionExerciseCategory();
-                            $real_question_count = count($exercise_obj->selectQuestionList());
+                            //$real_question_count = count($exercise_obj->selectQuestionList());
                             $warning = null;
                             if ($nbQuestionsTotal != $real_question_count) {
                                 $warning = Display::return_icon('warning.png', get_lang('CheckThatYouHaveEnoughQuestionsInYourCategories'));
@@ -1022,3 +1022,7 @@ if (empty($exercise_list) && $hotpotatoes_exist == false) {
 if ($origin != 'learnpath') { //so we are not in learnpath tool
     Display :: display_footer();
 }
+
+Session::erase('objExercise');
+Session::erase('objQuestion');
+Session::erase('objAnswer');

+ 162 - 63
main/exercice/exercise.class.php

@@ -49,7 +49,10 @@ class Exercise
     public $feedback_type;
     public $end_time;
     public $start_time;
-    public $questionList;
+    /* show media id */
+    public $questionList; // medias as id
+    /* including question list of the media */
+    public $questionListUncompressed;
     public $results_disabled;
     public $expired_time;
     public $course;
@@ -119,7 +122,7 @@ class Exercise
      *
      * @author Olivier Brouckaert
      * @param int $id - exercise ID
-     * @param parse exercise question list
+     * @param bool parse exercise question list
      * @return boolean - true if exercise exists, otherwise false
      */
     public function read($id, $parseQuestionList = true)
@@ -192,11 +195,7 @@ class Exercise
             $this->expired_time = $object->expired_time;
 
             if ($parseQuestionList) {
-
-                // Checking if question_order is correctly set
-                $this->questionList = $this->selectQuestionList(true);
-
-                $this->setMediaList();
+                $this->setQuestionList();
             }
 
             //overload questions list with recorded questions list
@@ -629,7 +628,6 @@ class Exercise
                 $questionList = $temp_question_list;
             }
         }
-
         return $questionList;
     }
 
@@ -828,13 +826,13 @@ class Exercise
     }
 
     /**
-     * Returns the array with the question ID list ordered by question order (with the uncompressed media list)
+     * Returns the array with the question ID list ordered by question order (including question list in medias)
      *
      * @author Olivier Brouckaert
      * @param bool $from_db
      * @return array question ID list
      */
-    public function selectQuestionList($from_db = false)
+    private function selectQuestionList($from_db = false)
     {
         if ($from_db && !empty($this->id)) {
 
@@ -852,6 +850,7 @@ class Exercise
                 $this->categoryWithQuestionList = $result['category_with_questions_list'];
                 $questionList = $result['question_list'];
             }
+
             return $questionList;
         }
 
@@ -1830,10 +1829,17 @@ class Exercise
             if ($this->emailAlert) {
 
                 // Text when ending an exam
-                $form->add_html_editor('email_notification_template', array(get_lang('EmailNotificationTemplate'), get_lang('EmailNotificationTemplateDescription')), null, false, $editor_config);
+                $form->add_html_editor(
+                    'email_notification_template',
+                    array(get_lang('EmailNotificationTemplate'), get_lang('EmailNotificationTemplateDescription')),
+                    null,
+                    false,
+                    $editor_config
+                );
             }
 
-            $form->addElement('html', '</div>'); //End advanced setting
+            // End advanced setting.
+            $form->addElement('html', '</div>');
             $form->addElement('html', '</div>');
         }
 
@@ -2177,8 +2183,8 @@ class Exercise
      */
     public function clean_results()
     {
-        $table_track_e_exercises = Database::get_statistic_table(TABLE_STATISTIC_TRACK_E_EXERCICES);
-        $table_track_e_attempt = Database::get_statistic_table(TABLE_STATISTIC_TRACK_E_ATTEMPT);
+        $table_track_e_exercises = Database::get_main_table(TABLE_STATISTIC_TRACK_E_EXERCICES);
+        $table_track_e_attempt = Database::get_main_table(TABLE_STATISTIC_TRACK_E_ATTEMPT);
 
         $sql = "SELECT exe_id FROM $table_track_e_exercises
 					   WHERE 	c_id = '".api_get_course_int_id()."' AND
@@ -2458,7 +2464,7 @@ class Exercise
         $lp_item_view_id = 0,
         $status = 'incomplete'
     ) {
-        $track_exercises = Database :: get_statistic_table(TABLE_STATISTIC_TRACK_E_EXERCICES);
+        $track_exercises = Database :: get_main_table(TABLE_STATISTIC_TRACK_E_EXERCICES);
         if (empty($lp_id)) {
             $lp_id = 0;
         }
@@ -2505,7 +2511,7 @@ class Exercise
         $questionList = array(),
         $weight = 0
     ) {
-        $track_exercises = Database :: get_statistic_table(TABLE_STATISTIC_TRACK_E_EXERCICES);
+        $track_exercises = Database :: get_main_table(TABLE_STATISTIC_TRACK_E_EXERCICES);
         $safe_lp_id = intval($safe_lp_id);
         $safe_lp_item_id = intval($safe_lp_item_id);
         $safe_lp_item_view_id = intval($safe_lp_item_view_id);
@@ -2884,7 +2890,7 @@ class Exercise
 
         $questionId = intval($questionId);
         $exeId = intval($exeId);
-        $TBL_TRACK_ATTEMPT = Database::get_statistic_table(TABLE_STATISTIC_TRACK_E_ATTEMPT);
+        $TBL_TRACK_ATTEMPT = Database::get_main_table(TABLE_STATISTIC_TRACK_E_ATTEMPT);
         $table_ans = Database::get_course_table(TABLE_QUIZ_ANSWER);
 
         // Creates a temporary Question object
@@ -3496,7 +3502,7 @@ class Exercise
                 case HOT_SPOT :
                     if ($from_database) {
                         if ($show_result) {
-                            $TBL_TRACK_HOTSPOT = Database::get_statistic_table(TABLE_STATISTIC_TRACK_E_HOTSPOT);
+                            $TBL_TRACK_HOTSPOT = Database::get_main_table(TABLE_STATISTIC_TRACK_E_HOTSPOT);
                             $query = "SELECT hotspot_correct
                                      FROM ".$TBL_TRACK_HOTSPOT."
                                      WHERE  hotspot_exe_id = '".$exeId."' and
@@ -3538,7 +3544,7 @@ class Exercise
                 case HOT_SPOT_DELINEATION :
                     if ($from_database) {
                         // getting the user answer
-                        $TBL_TRACK_HOTSPOT = Database::get_statistic_table(TABLE_STATISTIC_TRACK_E_HOTSPOT);
+                        $TBL_TRACK_HOTSPOT = Database::get_main_table(TABLE_STATISTIC_TRACK_E_HOTSPOT);
                         $query = "SELECT hotspot_correct, hotspot_coordinate
                                   FROM ".$TBL_TRACK_HOTSPOT."
                                   WHERE hotspot_exe_id = '".$exeId."' AND
@@ -4258,24 +4264,24 @@ class Exercise
                         if ($final_answer == 0) {
                             $questionScore = 0;
                         }
-                        exercise_attempt($questionScore, 1, $quesId, $exeId, 0); // we always insert the answer_id 1 = delineation
+                        saveExerciseAttempt($questionScore, 1, $quesId, $exeId, 0); // we always insert the answer_id 1 = delineation
                         //in delineation mode, get the answer from $hotspot_delineation_result[1]
-                        exercise_attempt_hotspot($exeId, $quesId, $objAnswerTmp->getRealAnswerIdFromList(1), $hotspot_delineation_result[1], $exerciseResultCoordinates[$quesId]);
+                        saveExerciseAttemptHotspot($exeId, $quesId, $objAnswerTmp->getRealAnswerIdFromList(1), $hotspot_delineation_result[1], $exerciseResultCoordinates[$quesId]);
                     } else {
                         if ($final_answer == 0) {
                             $questionScore = 0;
                             $answer = 0;
-                            exercise_attempt($questionScore, $answer, $quesId, $exeId, 0);
+                            saveExerciseAttempt($questionScore, $answer, $quesId, $exeId, 0);
                             if (is_array($exerciseResultCoordinates[$quesId])) {
                                 foreach ($exerciseResultCoordinates[$quesId] as $idx => $val) {
-                                    exercise_attempt_hotspot($exeId, $quesId, $objAnswerTmp->getRealAnswerIdFromList($idx), 0, $val);
+                                    saveExerciseAttemptHotspot($exeId, $quesId, $objAnswerTmp->getRealAnswerIdFromList($idx), 0, $val);
                                 }
                             }
                         } else {
-                            exercise_attempt($questionScore, $answer, $quesId, $exeId, 0);
+                            saveExerciseAttempt($questionScore, $answer, $quesId, $exeId, 0);
                             if (is_array($exerciseResultCoordinates[$quesId])) {
                                 foreach ($exerciseResultCoordinates[$quesId] as $idx => $val) {
-                                    exercise_attempt_hotspot($exeId, $quesId, $objAnswerTmp->getRealAnswerIdFromList($idx), $choice[$idx], $val);
+                                    saveExerciseAttemptHotspot($exeId, $quesId, $objAnswerTmp->getRealAnswerIdFromList($idx), $choice[$idx], $val);
                                 }
                             }
                         }
@@ -4335,13 +4341,13 @@ class Exercise
                     $reply = array_keys($choice);
                     for ($i = 0; $i < sizeof($reply); $i++) {
                         $ans = $reply[$i];
-                        exercise_attempt($questionScore, $ans.':'.$choice[$ans], $quesId, $exeId, $i, $this->id);
+                        saveExerciseAttempt($questionScore, $ans.':'.$choice[$ans], $quesId, $exeId, $i, $this->id);
                         if ($debug) {
                             error_log('result =>'.$questionScore.' '.$ans.':'.$choice[$ans]);
                         }
                     }
                 } else {
-                    exercise_attempt($questionScore, 0, $quesId, $exeId, 0, $this->id);
+                    saveExerciseAttempt($questionScore, 0, $quesId, $exeId, 0, $this->id);
                 }
             } elseif ($answerType == MULTIPLE_ANSWER || $answerType == GLOBAL_MULTIPLE_ANSWER) {
                 if ($choice != 0) {
@@ -4352,46 +4358,46 @@ class Exercise
                     }
                     for ($i = 0; $i < sizeof($reply); $i++) {
                         $ans = $reply[$i];
-                        exercise_attempt($questionScore, $ans, $quesId, $exeId, $i, $this->id);
+                        saveExerciseAttempt($questionScore, $ans, $quesId, $exeId, $i, $this->id);
                     }
                 } else {
-                    exercise_attempt($questionScore, 0, $quesId, $exeId, 0, $this->id);
+                    saveExerciseAttempt($questionScore, 0, $quesId, $exeId, 0, $this->id);
                 }
             } elseif ($answerType == MULTIPLE_ANSWER_COMBINATION) {
                 if ($choice != 0) {
                     $reply = array_keys($choice);
                     for ($i = 0; $i < sizeof($reply); $i++) {
                         $ans = $reply[$i];
-                        exercise_attempt($questionScore, $ans, $quesId, $exeId, $i, $this->id);
+                        saveExerciseAttempt($questionScore, $ans, $quesId, $exeId, $i, $this->id);
                     }
                 } else {
-                    exercise_attempt($questionScore, 0, $quesId, $exeId, 0, $this->id);
+                    saveExerciseAttempt($questionScore, 0, $quesId, $exeId, 0, $this->id);
                 }
             } elseif ($answerType == MATCHING || $answerType == DRAGGABLE) {
                 if (isset($matching)) {
                     foreach ($matching as $j => $val) {
-                        exercise_attempt($questionScore, $val, $quesId, $exeId, $j, $this->id);
+                        saveExerciseAttempt($questionScore, $val, $quesId, $exeId, $j, $this->id);
                     }
                 }
             } elseif ($answerType == FREE_ANSWER) {
                 $answer = $choice;
-                exercise_attempt($questionScore, $answer, $quesId, $exeId, 0, $this->id);
+                saveExerciseAttempt($questionScore, $answer, $quesId, $exeId, 0, $this->id);
             } elseif ($answerType == ORAL_EXPRESSION) {
                 $answer = $choice;
-                exercise_attempt($questionScore, $answer, $quesId, $exeId, 0, $this->id, $nano);
+                saveExerciseAttempt($questionScore, $answer, $quesId, $exeId, 0, $this->id, $nano);
             } elseif ($answerType == UNIQUE_ANSWER || $answerType == UNIQUE_ANSWER_IMAGE || $answerType == UNIQUE_ANSWER_NO_OPTION) {
                 $answer = $choice;
-                exercise_attempt($questionScore, $answer, $quesId, $exeId, 0, $this->id);
+                saveExerciseAttempt($questionScore, $answer, $quesId, $exeId, 0, $this->id);
                 //            } elseif ($answerType == HOT_SPOT || $answerType == HOT_SPOT_DELINEATION) {
             } elseif ($answerType == HOT_SPOT) {
-                exercise_attempt($questionScore, $answer, $quesId, $exeId, 0, $this->id);
+                saveExerciseAttempt($questionScore, $answer, $quesId, $exeId, 0, $this->id);
                 if (isset($exerciseResultCoordinates[$questionId]) && !empty($exerciseResultCoordinates[$questionId])) {
                     foreach ($exerciseResultCoordinates[$questionId] as $idx => $val) {
-                        exercise_attempt_hotspot($exeId, $quesId, $objAnswerTmp->getRealAnswerIdFromList($idx), $choice[$idx], $val, $this->id);
+                        saveExerciseAttemptHotspot($exeId, $quesId, $objAnswerTmp->getRealAnswerIdFromList($idx), $choice[$idx], $val, $this->id);
                     }
                 }
             } else {
-                exercise_attempt($questionScore, $answer, $quesId, $exeId, 0, $this->id);
+                saveExerciseAttempt($questionScore, $answer, $quesId, $exeId, 0, $this->id);
             }
         }
 
@@ -4400,7 +4406,7 @@ class Exercise
         }
 
         if ($saved_results) {
-            $stat_table = Database :: get_statistic_table(TABLE_STATISTIC_TRACK_E_EXERCICES);
+            $stat_table = Database :: get_main_table(TABLE_STATISTIC_TRACK_E_EXERCICES);
             $sql_update = 'UPDATE '.$stat_table.' SET exe_result = exe_result + '.floatval($questionScore).' WHERE exe_id = '.$exeId;
             if ($debug) {
                 error_log($sql_update);
@@ -4458,7 +4464,7 @@ class Exercise
             } else {
                 global $app;
                 $twig = $app['twig'];
-                $template = 'default/exercise/exercise_notification.tpl';
+                $template = 'default/mail/exercise/end_exercise_notification.tpl';
             }
 
             $userInfo = UserManager::get_user_info_by_id($trackExerciseInfo['exe_user_id']);
@@ -4949,29 +4955,29 @@ class Exercise
      *  </code>
      * @return array
      */
-    function setMediaList()
+    private function setMediaList($questionList)
     {
-        $media_questions = array();
-        $question_list = $this->questionList;
-
-        if (!empty($question_list)) {
-            foreach ($question_list as $questionId) {
+        $mediaList= array();
+        if (!empty($questionList)) {
+            foreach ($questionList as $questionId) {
                 $objQuestionTmp = Question::read($questionId);
 
                 // If a media question exists
                 if (isset($objQuestionTmp->parent_id) && $objQuestionTmp->parent_id != 0) {
-                    $media_questions[$objQuestionTmp->parent_id][] = $objQuestionTmp->id;
+                    $mediaList[$objQuestionTmp->parent_id][] = $objQuestionTmp->id;
                 } else {
                     // Always the last item
-                    $media_questions[999][] = $objQuestionTmp->id;
+                    $mediaList[999][] = $objQuestionTmp->id;
                 }
             }
         }
-        $this->mediaList = $media_questions;
+        $this->mediaList = $mediaList;
     }
 
     /**
      * Returns an array with this form
+     * @example
+     * <code>
      * array (size=3)
           999 =>
             array (size=3)
@@ -4985,6 +4991,7 @@ class Exercise
           101 =>
             array (size=1)
               0 => int 3482
+     * </code>
      * The array inside the key 999 means the question list that belongs to the media id = 999,
      * this case is special because 999 means "no media".
      * @return array
@@ -4995,10 +5002,10 @@ class Exercise
     }
 
     /**
-      *Is media question activated
+     * Is media question activated
      * @return bool
      */
-    public function media_is_activated()
+    public function mediaIsActivated()
     {
         $mediaQuestions = $this->getMediaList();
         $active = false;
@@ -5014,21 +5021,67 @@ class Exercise
                 }
             }
         }
-
         return $active;
     }
 
     /**
      * Gets question list from the exercise
-     * @params bool Expand or not question list
      * (true show all questions, false show media question id instead of the question ids)
-     * @return array unflatten question list (no medias)
+     * @return array
      */
-    public function getQuestionList($expand_media_questions = false)
+    public function getQuestionList()
     {
-        $questionList = $this->selectQuestionList();
-        $questionList = $this->transformQuestionListWithMedias($questionList, $expand_media_questions);
-        return $questionList;
+        return $this->questionList;
+    }
+
+    /**
+     * Question list with medias compressed like this
+     * @example
+     * <code>
+     * array(
+     *      question_id,
+     *      question_id,
+     *      media_id, <- this media id contains question ids
+     *      question_id,
+     * )
+     * </code>
+     * @return array
+     */
+    public function getQuestionListWithMediasCompressed()
+    {
+        return $this->questionList;
+    }
+
+    /**
+     * Question list with medias uncompressed like this
+     * @example
+     * <code>
+     * array(
+     *      question_id,
+     *      question_id,
+     *      question_id, <- belongs to a media id
+     *      question_id, <- belongs to a media id
+     *      question_id,
+     * )
+     * </code>
+     * @return array
+     */
+    public function getQuestionListWithMediasUncompressed()
+    {
+        return $this->questionListUncompressed;
+    }
+
+    /**
+     * Sets the question list when the exercise->read() is executed created depending of a parameter
+     */
+    public function setQuestionList()
+    {
+        // Getting question list.
+        $questionList = $this->selectQuestionList(true);
+        $this->setMediaList($questionList);
+
+        $this->questionList = $this->transformQuestionListWithMedias($questionList, false);
+        $this->questionListUncompressed = $this->transformQuestionListWithMedias($questionList, true);
     }
 
     /**
@@ -5043,7 +5096,7 @@ class Exercise
         if (!empty($question_list)) {
             $media_questions = $this->getMediaList();
 
-            $media_active = $this->media_is_activated($media_questions);
+            $media_active = $this->mediaIsActivated($media_questions);
 
             if ($media_active) {
                 $counter = 1;
@@ -5086,7 +5139,7 @@ class Exercise
      */
     public function getStatTrackExerciseInfoByExeId($exe_id)
     {
-        $track_exercises = Database :: get_statistic_table(TABLE_STATISTIC_TRACK_E_EXERCICES);
+        $track_exercises = Database :: get_main_table(TABLE_STATISTIC_TRACK_E_EXERCICES);
         $exe_id = intval($exe_id);
         $sql_track = "SELECT * FROM $track_exercises WHERE exe_id = $exe_id ";
         $result = Database::query($sql_track);
@@ -5126,7 +5179,7 @@ class Exercise
         $exercise_info = self::getStatTrackExerciseInfoByExeId($exe_id);
         $question_id = intval($question_id);
         $exe_id = intval($exe_id);
-        $track_exercises = Database :: get_statistic_table(TABLE_STATISTIC_TRACK_E_EXERCICES);
+        $track_exercises = Database :: get_main_table(TABLE_STATISTIC_TRACK_E_EXERCICES);
         if ($exercise_info) {
 
             if (empty($exercise_info['questions_to_check'])) {
@@ -5209,7 +5262,7 @@ class Exercise
     /**
      * @return string
      */
-    function return_time_left_div()
+    public function returnTimeLeftDiv()
     {
         $html = '<div id="clock_warning" style="display:none">'.Display::return_message(
             get_lang('ReachedTimeLimit'),
@@ -5229,7 +5282,6 @@ class Exercise
      */
     public function getCountUncompressedQuestionList()
     {
-        //Real question count
         $question_count = 0;
         $questionList = $this->questionList;
         if (!empty($questionList)) {
@@ -5257,6 +5309,53 @@ class Exercise
         return $questionCount;
     }
 
+    /**
+     * Gets the position of a questionId in the question list
+     * @param $questionId
+     * @return int
+     */
+    public function getPositionInCompressedQuestionList($questionId)
+    {
+        $questionList = $this->getQuestionListWithMediasCompressed();
+        $mediaQuestions = $this->getMediaList();
+        $position = 1;
+        foreach ($questionList as $id) {
+            if (isset($mediaQuestions[$id]) && in_array($questionId, $mediaQuestions[$id])) {
+                $mediaQuestionList = $mediaQuestions[$id];
+                if (in_array($questionId, $mediaQuestionList)) {
+                    return $position;
+                } else {
+                    $position++;
+                }
+            } else {
+                if ($id == $questionId) {
+                    return $position;
+                } else {
+                    $position++;
+                }
+            }
+        }
+        return 1;
+    }
+
+    /**
+     * Get question list (excluding question ids of the media)
+     * @return int
+     */
+    public function getPositionOfQuestionInCompresedQuestionList()
+    {
+        $mediaQuestions = $this->getMediaList();
+        $questionCount = 0;
+        foreach ($mediaQuestions as $mediaKey => $questionList) {
+            if ($mediaKey == 999) {
+                $questionCount += count($questionList);
+            } else {
+                $questionCount++;
+            }
+        }
+        return $questionCount;
+    }
+
     /**
      * @return array
      */

+ 2 - 2
main/exercice/exercise_history.php

@@ -41,8 +41,8 @@ $interbreadcrumb[]= array ('url' => 'exercise_history.php'.'?exe_id='.intval($_G
 $TBL_USER          	    = Database::get_main_table(TABLE_MAIN_USER);
 $TBL_EXERCICES			= Database::get_course_table(TABLE_QUIZ_TEST);
 $TBL_EXERCICES_QUESTION	= Database::get_course_table(TABLE_QUIZ_QUESTION);
-$TBL_TRACK_EXERCICES	= Database::get_statistic_table(TABLE_STATISTIC_TRACK_E_EXERCICES);
-$TBL_TRACK_ATTEMPT_RECORDING= Database::get_statistic_table(TABLE_STATISTIC_TRACK_E_ATTEMPT_RECORDING);
+$TBL_TRACK_EXERCICES	= Database::get_main_table(TABLE_STATISTIC_TRACK_E_EXERCICES);
+$TBL_TRACK_ATTEMPT_RECORDING= Database::get_main_table(TABLE_STATISTIC_TRACK_E_ATTEMPT_RECORDING);
 Display::display_header($nameTools,get_lang('Exercise'));
 
 if (isset($_GET['message'])) {

+ 1 - 1
main/exercice/exercise_reminder.php

@@ -100,7 +100,7 @@ if (api_is_course_admin() && $origin != 'learnpath') {
 echo Display::page_subheader2(get_lang('QuestionsToReview'));
 
 if ($time_control) {
-    echo $objExercise->return_time_left_div();
+    echo $objExercise->returnTimeLeftDiv();
 }
 
 echo Display::div('', array('id' => 'message'));

+ 32 - 41
main/exercice/exercise_report.php

@@ -44,14 +44,15 @@ $is_allowedToEdit = api_is_allowed_to_edit(null, true) || api_is_drh();
 $is_tutor = api_is_allowed_to_edit(true);
 
 $TBL_QUESTIONS = Database :: get_course_table(TABLE_QUIZ_QUESTION);
-$TBL_TRACK_EXERCICES = Database :: get_statistic_table(TABLE_STATISTIC_TRACK_E_EXERCICES);
-$TBL_TRACK_ATTEMPT = Database :: get_statistic_table(TABLE_STATISTIC_TRACK_E_ATTEMPT);
-$TBL_TRACK_ATTEMPT_RECORDING = Database :: get_statistic_table(TABLE_STATISTIC_TRACK_E_ATTEMPT_RECORDING);
+$TBL_TRACK_EXERCICES = Database :: get_main_table(TABLE_STATISTIC_TRACK_E_EXERCICES);
+$TBL_TRACK_ATTEMPT = Database :: get_main_table(TABLE_STATISTIC_TRACK_E_ATTEMPT);
+$TBL_TRACK_ATTEMPT_RECORDING = Database :: get_main_table(TABLE_STATISTIC_TRACK_E_ATTEMPT_RECORDING);
 $TBL_LP_ITEM_VIEW = Database :: get_course_table(TABLE_LP_ITEM_VIEW);
 
 $course_id = api_get_course_int_id();
 $exercise_id = isset($_REQUEST['exerciseId']) ? intval($_REQUEST['exerciseId']) : null;
 $filter_user = isset($_REQUEST['filter_by_user']) ? intval($_REQUEST['filter_by_user']) : null;
+$gradebook = isset($_REQUEST['gradebook']) ? Security::remove_XSS($_REQUEST['gradebook']) : null;
 
 $locked = api_resource_is_locked_by_gradebook($exercise_id, LINK_EXERCISE);
 
@@ -63,6 +64,7 @@ if (!$is_allowedToEdit) {
     api_not_allowed(true);
 }
 
+// @todo check if the $parameters is used
 if (!empty($exercise_id)) {
     $parameters['exerciseId'] = $exercise_id;
 }
@@ -77,10 +79,9 @@ if (!empty($_REQUEST['export_report']) && $_REQUEST['export_report'] == '1') {
         if (isset($_REQUEST['extra_data']) && $_REQUEST['extra_data'] == 1) {
             $load_extra_data = true;
         }
-
         require_once 'exercise_result.class.php';
         switch ($_GET['export_format']) {
-            case 'xls' :
+            case 'xls':
                 $export = new ExerciseResult();
                 $export->exportCompleteReportXLS(
                     $documentPath,
@@ -92,8 +93,8 @@ if (!empty($_REQUEST['export_report']) && $_REQUEST['export_report'] == '1') {
                 );
                 exit;
                 break;
-            case 'csv' :
-            default :
+            case 'csv':
+            default:
                 $export = new ExerciseResult();
                 $export->exportCompleteReportCSV(
                     $documentPath,
@@ -112,10 +113,7 @@ if (!empty($_REQUEST['export_report']) && $_REQUEST['export_report'] == '1') {
 }
 
 //Send student email @todo move this code in a class, library
-if (isset($_REQUEST['comments']) && $_REQUEST['comments'] == 'update' && ($is_allowedToEdit || $is_tutor) && $_GET['exeid'] == strval(
-    intval($_GET['exeid'])
-)
-) {
+if (isset($_REQUEST['comments']) && $_REQUEST['comments'] == 'update' && ($is_allowedToEdit || $is_tutor) && $_GET['exeid'] == strval(intval($_GET['exeid']))) {
     $id = intval($_GET['exeid']); //filtered by post-condition
     $track_exercise_info = ExerciseLib::get_exercise_track_exercise_info($id);
     if (empty($track_exercise_info)) {
@@ -164,26 +162,34 @@ if (isset($_REQUEST['comments']) && $_REQUEST['comments'] == 'update' && ($is_al
     }
 
     for ($i = 0; $i < $loop_in_track; $i++) {
-        $my_marks = Database::escape_string($_POST['marks_'.$array_content_id_exe[$i]]);
-        $contain_comments = Database::escape_string($_POST['comments_'.$array_content_id_exe[$i]]);
+        $my_marks = null;
+        if (isset($_POST['marks_'.$array_content_id_exe[$i]])) {
+            $my_marks = Database::escape_string($_POST['marks_'.$array_content_id_exe[$i]]);
+        }
+
+        $contain_comments = null;
+        if (isset($_POST['comments_'.$array_content_id_exe[$i]])) {
+            $contain_comments = Database::escape_string($_POST['comments_'.$array_content_id_exe[$i]]);
+        }
+
         if (isset($contain_comments)) {
             $my_comments = Database::escape_string($_POST['comments_'.$array_content_id_exe[$i]]);
         } else {
             $my_comments = '';
         }
         $my_questionid = intval($array_content_id_exe[$i]);
-        $sql = "SELECT question from $TBL_QUESTIONS WHERE c_id = $course_id AND id = '$my_questionid'";
+        $sql = "SELECT question from $TBL_QUESTIONS WHERE c_id = $course_id AND iid = '$my_questionid'";
 
         $result = Database::query($sql);
         Database::result($result, 0, "question");
 
-        $query = "UPDATE $TBL_TRACK_ATTEMPT SET marks = '$my_marks', teacher_comment = '$my_comments' WHERE question_id = ".$my_questionid." AND exe_id=".$id;
+        $query = "UPDATE $TBL_TRACK_ATTEMPT SET marks = '$my_marks', teacher_comment = '$my_comments'
+                  WHERE question_id = ".$my_questionid." AND exe_id=".$id;
         Database::query($query);
 
         //Saving results in the track recording table
         $recording_changes = 'INSERT INTO '.$TBL_TRACK_ATTEMPT_RECORDING.' (exe_id, question_id, marks, insert_date, author, teacher_comment)
-                              VALUES ('."'$id','".$my_questionid."','$my_marks','".api_get_utc_datetime(
-        )."','".api_get_user_id()."'".',"'.$my_comments.'")';
+                              VALUES ('."'$id','".$my_questionid."','$my_marks','".api_get_utc_datetime()."','".api_get_user_id()."'".',"'.$my_comments.'")';
         Database::query($recording_changes);
     }
 
@@ -249,35 +255,20 @@ if (isset($origin) && $origin == 'learnpath') {
     if ($is_allowedToEdit) {
         // the form
         if (api_is_platform_admin() || api_is_course_admin() || api_is_course_tutor() || api_is_course_coach()) {
-            $actions .= '<a href="admin.php?exerciseId='.intval($_GET['exerciseId']).'">'.Display :: return_icon(
-                'back.png',
-                get_lang('GoBackToQuestionList'),
-                '',
-                ICON_SIZE_MEDIUM
-            ).'</a>';
-            $actions .= '<a href="live_stats.php?'.api_get_cidreq().'&exerciseId='.$exercise_id.'">'.Display :: return_icon(
-                'activity_monitor.png',
-                get_lang('LiveResults'),
-                '',
-                ICON_SIZE_MEDIUM
-            ).'</a>';
-            $actions .= '<a href="stats.php?'.api_get_cidreq().'&exerciseId='.$exercise_id.'">'.Display :: return_icon(
-                'statistics.png',
-                get_lang('ReportByQuestion'),
-                '',
-                ICON_SIZE_MEDIUM
-            ).'</a>';
-            $actions .= '<a id="export_opener" href="'.api_get_self(
-            ).'?export_report=1&hotpotato_name='.Security::remove_XSS($_GET['path']).'&exerciseId='.intval(
-                $_GET['exerciseId']
-            ).'" >'.
+            // @todo check if $path is used
+            $path = isset($_GET['path']) ? Security::remove_XSS($_GET['path']) : null;
+
+            $actions .= '<a href="admin.php?exerciseId='.intval($_GET['exerciseId']).'">'.Display :: return_icon('back.png',get_lang('GoBackToQuestionList'),'',ICON_SIZE_MEDIUM).'</a>';
+            $actions .= '<a href="live_stats.php?'.api_get_cidreq().'&exerciseId='.$exercise_id.'">'.Display :: return_icon('activity_monitor.png',get_lang('LiveResults'), '', ICON_SIZE_MEDIUM ).'</a>';
+            $actions .= '<a href="stats.php?'.api_get_cidreq().'&exerciseId='.$exercise_id.'">'.Display :: return_icon('statistics.png',get_lang('ReportByQuestion'), '', ICON_SIZE_MEDIUM).'</a>';
+            $actions .= '<a id="export_opener" href="'.api_get_self().'?export_report=1&hotpotato_name='.$path.'&exerciseId='.intval($_GET['exerciseId']).'" >'.
                 Display::return_icon('save.png', get_lang('Export'), '', ICON_SIZE_MEDIUM).'</a>';
         }
     }
 }
 
 //Deleting an attempt
-if (($is_allowedToEdit || $is_tutor || api_is_coach()) && $_GET['delete'] == 'delete' && !empty ($_GET['did']) && $locked == false
+if (($is_allowedToEdit || $is_tutor || api_is_coach()) && isset($_GET['delete']) && $_GET['delete'] == 'delete' && !empty ($_GET['did']) && $locked == false
 ) {
     $exe_id = intval($_GET['did']);
     if (!empty($exe_id)) {
@@ -592,4 +583,4 @@ jQuery("#results").jqGrid('navButtonAdd','#results_pager',{
 <?php
 
 echo Display::grid_html('results');
-Display :: display_footer();
+Display :: display_footer();

+ 7 - 7
main/exercice/exercise_result.class.php

@@ -87,9 +87,9 @@ class ExerciseResult
 
     	$TBL_EXERCISES          = Database::get_course_table(TABLE_QUIZ_TEST);
 		$TBL_USER          	    = Database::get_main_table(TABLE_MAIN_USER);
-		$TBL_TRACK_EXERCISES    	= Database::get_statistic_table(TABLE_STATISTIC_TRACK_E_EXERCICES);
-		$TBL_TRACK_HOTPOTATOES	= Database::get_statistic_table(TABLE_STATISTIC_TRACK_E_HOTPOTATOES);
-        $TBL_TRACK_ATTEMPT_RECORDING = Database :: get_statistic_table(TABLE_STATISTIC_TRACK_E_ATTEMPT_RECORDING);
+		$TBL_TRACK_EXERCISES    	= Database::get_main_table(TABLE_STATISTIC_TRACK_E_EXERCICES);
+		$TBL_TRACK_HOTPOTATOES	= Database::get_main_table(TABLE_STATISTIC_TRACK_E_HOTPOTATOES);
+        $TBL_TRACK_ATTEMPT_RECORDING = Database :: get_main_table(TABLE_STATISTIC_TRACK_E_ATTEMPT_RECORDING);
 
     	$cid             = api_get_course_id();
         $course_id       = api_get_course_int_id();
@@ -115,7 +115,7 @@ class ExerciseResult
                         steps_counter as exstep,
                         exe_user_id as excruid,
                         te.exe_duration as duration
-                FROM $TBL_EXERCISES  AS ce INNER JOIN $TBL_TRACK_EXERCISES AS te ON (te.exe_exo_id = ce.id) INNER JOIN
+                FROM $TBL_EXERCISES  AS ce INNER JOIN $TBL_TRACK_EXERCISES AS te ON (te.exe_exo_id = ce.iid) INNER JOIN
                      $TBL_USER  AS user ON (user.user_id = exe_user_id)
                 WHERE   ce.c_id = $course_id AND
                         te.status != 'incomplete' AND
@@ -150,7 +150,7 @@ class ExerciseResult
                     exe_user_id as excruid,
                     te.exe_duration as duration,
                     ce.results_disabled as exdisabled
-                        FROM $TBL_EXERCISES  AS ce INNER JOIN $TBL_TRACK_EXERCISES AS te ON (te.exe_exo_id = ce.id)
+                        FROM $TBL_EXERCISES  AS ce INNER JOIN $TBL_TRACK_EXERCISES AS te ON (te.exe_exo_id = ce.iid)
                         INNER JOIN $TBL_USER  AS user ON (user.user_id = exe_user_id)
                         WHERE   ce.c_id = $course_id AND
                                 te.status != 'incomplete' AND
@@ -438,7 +438,7 @@ class ExerciseResult
 		foreach ($this->results as $row) {
 			$column = 0;
 
-            if ($with_column_user) {               
+            if ($with_column_user) {
 
                 if (api_is_western_name_order()) {
                     $worksheet->write($line,$column,api_html_entity_decode(strip_tags($row['first_name']), ENT_QUOTES, $charset));
@@ -486,4 +486,4 @@ class ExerciseResult
 		$workbook->close();
 		return true;
 	}
-}
+}

+ 1 - 1
main/exercice/exercise_result.php

@@ -144,7 +144,7 @@ $objExercise->displayQuestionListByAttempt($exe_id, true);
 // If is not valid.
 $session_control_key = ExerciseLib::get_session_time_control_key($objExercise->id, $learnpath_id, $learnpath_item_id);
 if (isset($session_control_key) && !ExerciseLib::exercise_time_control_is_valid($objExercise->id, $learnpath_id, $learnpath_item_id)) {
-    $TBL_TRACK_ATTEMPT = Database::get_statistic_table(TABLE_STATISTIC_TRACK_E_ATTEMPT);
+    $TBL_TRACK_ATTEMPT = Database::get_main_table(TABLE_STATISTIC_TRACK_E_ATTEMPT);
     $sql_fraud = "UPDATE $TBL_TRACK_ATTEMPT SET answer = 0, marks = 0, position = 0 WHERE exe_id = $exe_id ";
     Database::query($sql_fraud);
 }

+ 2 - 2
main/exercice/exercise_show.php

@@ -39,8 +39,8 @@ if ($origin == 'learnpath') {
 // Database table definitions
 $TBL_EXERCICE_QUESTION 	= Database::get_course_table(TABLE_QUIZ_TEST_QUESTION);
 $TBL_QUESTIONS         	= Database::get_course_table(TABLE_QUIZ_QUESTION);
-$TBL_TRACK_EXERCICES    = Database::get_statistic_table(TABLE_STATISTIC_TRACK_E_EXERCICES);
-$TBL_TRACK_ATTEMPT		= Database::get_statistic_table(TABLE_STATISTIC_TRACK_E_ATTEMPT);
+$TBL_TRACK_EXERCICES    = Database::get_main_table(TABLE_STATISTIC_TRACK_E_EXERCICES);
+$TBL_TRACK_ATTEMPT		= Database::get_main_table(TABLE_STATISTIC_TRACK_E_ATTEMPT);
 
 // General parameters passed via POST/GET
 if ($debug) { error_log('Entered exercise_show.php: '.print_r($_POST,1)); }

+ 22 - 23
main/exercice/exercise_submit.php

@@ -334,7 +334,7 @@ if (api_is_allowed_to_edit(null,true) && isset($_GET['preview']) && $_GET['previ
 }
 
 // 1. Loading the $objExercise variable
-if (!isset($_SESSION['objExercise']) || $_SESSION['objExercise']->id != $_REQUEST['exerciseId']) {
+if (!isset($_SESSION['objExercise']) || isset($_SESSION['objExercise']) && ($_SESSION['objExercise']->id != $_REQUEST['exerciseId'])) {
     // Construction of Exercise
     /** @var Exercise $objExercise */
     $objExercise = new Exercise();
@@ -353,7 +353,6 @@ if (!isset($_SESSION['objExercise']) || $_SESSION['objExercise']->id != $_REQUES
     }
 }
 
-
 // $objExercise = new Exercise(); $objExercise->read($exerciseId);
 
 //2. Checking if $objExercise is set
@@ -388,7 +387,9 @@ if ($objExercise->expired_time != 0) {
 
 //Generating the time control key for the user
 $current_expired_time_key = ExerciseLib::get_time_control_key($objExercise->id, $learnpath_id, $learnpath_item_id);
-if ($debug) error_log("4. current_expired_time_key: $current_expired_time_key ");
+if ($debug) {
+    error_log("4. current_expired_time_key: $current_expired_time_key ");
+}
 
 $_SESSION['duration_time'][$current_expired_time_key] = $current_timestamp;
 
@@ -466,7 +467,7 @@ if (!isset($_SESSION['questionList'])) {
     $questionList = $objExercise->getQuestionList();
 
     // Media questions.
-    $media_is_activated = $objExercise->media_is_activated();
+    $media_is_activated = $objExercise->mediaIsActivated();
 
     //Getting order from random
     if ($media_is_activated == false && $objExercise->isRandom() && isset($exercise_stat_info) && !empty($exercise_stat_info['data_tracking'])) {
@@ -481,9 +482,9 @@ if (!isset($_SESSION['questionList'])) {
 }
 
 //Fix in order to get the correct question list
-$questionListFlatten = $objExercise->transformQuestionListWithMedias($questionList, true);
+$questionListUncompressed = $objExercise->getQuestionListWithMediasUncompressed();
 
-Session::write('question_list_flatten', $questionListFlatten);
+Session::write('question_list_uncompressed', $questionListUncompressed);
 
 $clock_expired_time = null;
 
@@ -491,7 +492,7 @@ if (empty($exercise_stat_info)) {
     if ($debug)  error_log('5  $exercise_stat_info is empty ');
 	$total_weight = 0;
 
-	foreach ($questionListFlatten as $question_id) {
+	foreach ($questionListUncompressed as $question_id) {
 		$objQuestionTmp = Question::read($question_id);
 		$total_weight += floatval($objQuestionTmp->weighting);
 	}
@@ -509,7 +510,7 @@ if (empty($exercise_stat_info)) {
 		$_SESSION['expired_time'][$current_expired_time_key] 	 = $clock_expired_time;
 		if ($debug) { error_log('5.4. Setting the $_SESSION[expired_time]: '.$_SESSION['expired_time'][$current_expired_time_key] ); };
 	}
-	$exe_id = $objExercise->save_stat_track_exercise_info($clock_expired_time, $learnpath_id, $learnpath_item_id, $learnpath_item_view_id, $questionListFlatten, $total_weight);
+	$exe_id = $objExercise->save_stat_track_exercise_info($clock_expired_time, $learnpath_id, $learnpath_item_id, $learnpath_item_view_id, $questionListUncompressed, $total_weight);
 	$exercise_stat_info = $objExercise->getStatTrackExerciseInfo($learnpath_id, $learnpath_item_id, $learnpath_item_view_id);
     if ($debug)  error_log("5.5  Creating a new attempt exercise_stat_info[] exe_id : $exe_id");
 } else {
@@ -537,7 +538,6 @@ if ($reminder == 2 && empty($my_remind_list)) {
 	exit;
 }
 
-
 /*
  * 7. Loading Time control parameters
  * If the expired time is major that zero(0) then the expired time is compute on this time.
@@ -555,7 +555,7 @@ if ($time_control) {
 	        $expired_time_of_this_attempt = $exercise_stat_info['expired_time_control'];
 			if ($debug) {error_log('7.5 $expired_time_of_this_attempt: '.$expired_time_of_this_attempt); }
 	        //Get the last attempt of an exercice
-	    	$last_attempt_date = get_last_attempt_date_of_exercise($exercise_stat_info['exe_id']);
+	    	$last_attempt_date = getLastAttemptDateOfExercise($exercise_stat_info['exe_id']);
 
 	    	//This means that the user enters the exam but do not answer the first question we get the date from the track_e_exercises not from the track_et_attempt see #2069
 	    	if (empty($last_attempt_date)) {
@@ -600,7 +600,8 @@ $time_left = api_strtotime($clock_expired_time,'UTC') - time();
  * The time control feature is enable here - this feature is enable for a jquery plugin called epiclock
  * for more details of how it works see this link : http://eric.garside.name/docs.html?p=epiclock
  */
-if ($time_control) { //Sends the exercise form when the expired time is finished
+if ($time_control) {
+    //Sends the exercise form when the expired time is finished
 	$htmlHeadXtra[] = $objExercise->show_time_control_js($time_left);
 }
 
@@ -664,7 +665,6 @@ if ($formSent && isset($_POST)) {
         if ($debug) { error_log('9.4.  $exerciseResult '.print_r($exerciseResult,1)); }
     }
 
-
     // the script "exercise_result.php" will take the variable $exerciseResult from the session
     Session::write('exerciseResult',$exerciseResult);
     //Session::write('remind_list', $remind_list);
@@ -721,14 +721,15 @@ if ($formSent && isset($_POST)) {
     if ($debug) { error_log('9. $formSent was NOT sent'); }
 }
 
-// if questionNum comes from POST and not from GET
-
-if (!$current_question || $_REQUEST['num']) {
-    if (!$current_question) {
-        $current_question = 1;
-    } else {
-        $current_question++;
+// Getting the latest questionId
+$latestQuestionId = getLatestQuestionIdFromAttempt($exe_id);
+if (is_null($current_question)) {
+    $current_question = 1;
+    if ($latestQuestionId) {
+        $current_question = $objExercise->getPositionInCompressedQuestionList($latestQuestionId);
     }
+} else {
+    $current_question++;
 }
 
 if ($question_count != 0) {
@@ -829,7 +830,7 @@ if ($objExercise->type == ONE_PER_PAGE) {
     echo $objExercise->getProgressPagination(
         $exe_id,
         $questionList,
-        $questionListFlatten,
+        $questionListUncompressed,
         $my_remind_list,
         $reminder,
         $remind_question_id,
@@ -895,7 +896,7 @@ if (isset($_custom['exercises_hidden_when_no_start_date']) && $_custom['exercise
 
 //Timer control
 if ($time_control) {
-    echo $objExercise->return_time_left_div();
+    echo $objExercise->returnTimeLeftDiv();
 	echo '<div style="display:none" class="warning-message" id="expired-message-id">'.get_lang('ExerciceExpiredTimeMessage').'</div>';
 }
 
@@ -999,7 +1000,6 @@ if (!empty($error)) {
         }
     }
 
-
     if ($number_of_hotspot_questions > 0) {
         $onsubmit = "onsubmit=\"return validateFlashVar('" . $number_of_hotspot_questions . "', '" . get_lang('HotspotValidateError1') . "', '" . get_lang('HotspotValidateError2') . "');\"";
     }
@@ -1197,7 +1197,6 @@ if (!empty($error)) {
      <input type="hidden" name="learnpath_id" 			value="'.$learnpath_id . '" />
      <input type="hidden" name="learnpath_item_id" 		value="'.$learnpath_item_id . '" />
      <input type="hidden" name="learnpath_item_view_id" value="'.$learnpath_item_view_id . '" />';
-
     $objExercise->renderQuestionList($questionList, $current_question, $exerciseResult, $attempt_list, $remind_list);
 
     echo '</form>';

+ 3 - 3
main/exercice/hotpotatoes_exercise_report.php

@@ -42,8 +42,8 @@ $is_allowedToEdit = api_is_allowed_to_edit(null, true) || api_is_drh();
 $is_tutor = api_is_allowed_to_edit(true);
 
 $TBL_QUESTIONS = Database :: get_course_table(TABLE_QUIZ_QUESTION);
-$TBL_TRACK_EXERCICES = Database :: get_statistic_table(TABLE_STATISTIC_TRACK_E_EXERCICES);
-$TBL_TRACK_HOTPOTATOES_EXERCICES = Database :: get_statistic_table(TABLE_STATISTIC_TRACK_E_HOTPOTATOES);
+$TBL_TRACK_EXERCICES = Database :: get_main_table(TABLE_STATISTIC_TRACK_E_EXERCICES);
+$TBL_TRACK_HOTPOTATOES_EXERCICES = Database :: get_main_table(TABLE_STATISTIC_TRACK_E_HOTPOTATOES);
 $TBL_LP_ITEM_VIEW = Database :: get_course_table(TABLE_LP_ITEM_VIEW);
 
 $course_id = api_get_course_int_id();
@@ -488,4 +488,4 @@ $extra_params['height'] = 'auto';
 <?php
 
 echo Display::grid_html('results');
-Display :: display_footer();
+Display :: display_footer();

+ 4 - 4
main/exercice/hotpotatoes_exercise_result.class.php

@@ -66,9 +66,9 @@ class HotpotatoesExerciseResult
 
     $TBL_EXERCISES          = Database::get_course_table(TABLE_QUIZ_TEST);
     $TBL_USER          	    = Database::get_main_table(TABLE_MAIN_USER);
-    $TBL_TRACK_EXERCISES    	= Database::get_statistic_table(TABLE_STATISTIC_TRACK_E_EXERCICES);
-    $TBL_TRACK_HOTPOTATOES	= Database::get_statistic_table(TABLE_STATISTIC_TRACK_E_HOTPOTATOES);
-    $TBL_TRACK_ATTEMPT_RECORDING = Database :: get_statistic_table(TABLE_STATISTIC_TRACK_E_ATTEMPT_RECORDING);
+    $TBL_TRACK_EXERCISES    	= Database::get_main_table(TABLE_STATISTIC_TRACK_E_EXERCICES);
+    $TBL_TRACK_HOTPOTATOES	= Database::get_main_table(TABLE_STATISTIC_TRACK_E_HOTPOTATOES);
+    $TBL_TRACK_ATTEMPT_RECORDING = Database :: get_main_table(TABLE_STATISTIC_TRACK_E_ATTEMPT_RECORDING);
 
     $cid             = api_get_course_id();
     $course_id       = api_get_course_int_id();
@@ -376,4 +376,4 @@ class HotpotatoesExerciseResult
 		$workbook->close();
 		return true;
 	}
-}
+}

+ 1 - 1
main/exercice/hotspot_answers.as.php

@@ -95,7 +95,7 @@ if(isset($_SESSION['exerciseResultCoordinates']) && $from_db==0) {
 	}
 } else {
 	// get it from db
-	$tbl_track_e_hotspot = Database::get_statistic_table(TABLE_STATISTIC_TRACK_E_HOTSPOT);
+	$tbl_track_e_hotspot = Database::get_main_table(TABLE_STATISTIC_TRACK_E_HOTSPOT);
 	$sql = "SELECT hotspot_coordinate
             FROM $tbl_track_e_hotspot
             WHERE   hotspot_question_id = $questionId AND

+ 1 - 1
main/exercice/hotspot_savescore.inc.php

@@ -42,7 +42,7 @@ foreach ($coords as $coord) {
 }
 $coordinates = substr($coordinates,0,-1);
 
-$TBL_TRACK_E_HOTSPOT = Database::get_statistic_table(STATISTIC_TRACK_E_HOTSPOTS);
+$TBL_TRACK_E_HOTSPOT = Database::get_main_table(STATISTIC_TRACK_E_HOTSPOTS);
 // Save into db
 $sql = "INSERT INTO $TBL_TRACK_E_HOTSPOT (user_id , course_id , quiz_id , question_id , answer_id , correct , coordinate ) VALUES (
 			'".Database::escape_string($_user['user_id'])."',

+ 1 - 1
main/exercice/hotspot_updatescore.inc.php

@@ -52,7 +52,7 @@ foreach ($coords as $coord) {
 }
 $coordinates = substr($coordinates,0,-1);
 
-$TBL_TRACK_E_HOTSPOT   = Database::get_statistic_table(STATISTIC_TRACK_E_HOTSPOTS);
+$TBL_TRACK_E_HOTSPOT   = Database::get_main_table(STATISTIC_TRACK_E_HOTSPOTS);
 
 // update db
 $update_id = $_SESSION['exerciseResult'][$questionId]['ids'][$answerId];

+ 1 - 1
main/exercice/mark_free_answer.php

@@ -87,7 +87,7 @@ if ($action == 'mark') {
 	if (!empty($_POST['score']) AND $_POST['score'] < $obj_question->selectWeighting() AND $_POST['score'] >= 0) {
 		//mark the user mark into the database using something similar to the following function:
 
-		$exercise_table = Database::get_statistic_table('track_e_exercices');
+		$exercise_table = Database::get_main_table('track_e_exercices');
 		#global $origin, $tbl_learnpath_user, $learnpath_id, $learnpath_item_id;
 		$sql = "SELECT * FROM $exercise_table
 			    WHERE   exe_user_id = '".Database::escape_string($my_usr)."' AND

+ 1 - 0
main/exercice/media.php

@@ -110,3 +110,4 @@ $items = array(
 );
 echo Display::actions($items);
 echo Display::grid_html('medias');
+Display::display_footer();

+ 1 - 1
main/exercice/overview.php

@@ -226,7 +226,7 @@ if ($objExercise->selectAttempts()) {
 }
 
 if ($time_control) {
-    $html.= $objExercise->return_time_left_div();
+    $html.= $objExercise->returnTimeLeftDiv();
 }
 
 $html .=  $message;

+ 55 - 23
main/exercice/question.class.php

@@ -1046,12 +1046,14 @@ abstract class Question
         $TBL_EXERCICE_QUESTION = Database::get_course_table(TABLE_QUIZ_TEST_QUESTION);
         $id                    = $this->id;
         // checks if the exercise ID is not in the list
+
         if (!in_array($exerciseId, $this->exerciseList)) {
             $this->exerciseList[] = $exerciseId;
-            $new_exercise         = new Exercise();
+            $new_exercise = new Exercise();
             $new_exercise->read($exerciseId);
             $count = $new_exercise->selectNbrQuestions();
             $count++;
+
             $sql = "INSERT INTO $TBL_EXERCICE_QUESTION (c_id, question_id, exercice_id, question_order) VALUES
 				 ({$this->course['real_id']}, '".Database::escape_string($id)."','".Database::escape_string($exerciseId)."', '$count' )";
             Database::query($sql);
@@ -1602,7 +1604,7 @@ abstract class Question
             $this->save($objExercise->id);
 
             $field_value = new ExtraFieldValue('question');
-            $params = $form->exportValues();
+            $params = $form->getSubmitValues();
             $params['question_id'] = $this->id;
             $field_value->save_field_values($params);
 
@@ -1844,7 +1846,7 @@ abstract class Question
                 VALUES ($course_id, '".Database::escape_string($question_name)."', '$max_score', $max_position, $type, $level)";
         Database::query($sql);
         // Get the question ID
-        $question_id = Database::get_last_insert_id();
+        $question_id = Database::insert_id();
 
         // Get the max question_order
         $sql = "SELECT max(question_order) as max_order FROM $tbl_quiz_rel_question
@@ -2056,7 +2058,12 @@ abstract class Question
 
     /**
      * Get all questions
-     * @param array $options
+     * @param Application $app
+     * @param $categoryId
+     * @param $exerciseId
+     * @param $courseId
+     * @param $options
+     * @param bool $get_count
      * @return array
      */
     public static function getQuestions($app, $categoryId, $exerciseId, $courseId, $options, $get_count = false)
@@ -2066,22 +2073,20 @@ abstract class Question
         $questionPoolFields = array(
             'question_session_id' => array(
                 'innerjoin' => " INNER JOIN ".Database::get_course_table(TABLE_QUIZ_TEST_QUESTION)." as quiz_rel_question_session ON (quiz_rel_question_session.question_id = s.iid)
-                 INNER JOIN  ".Database::get_course_table(TABLE_QUIZ_TEST)." as quizsession ON (quizsession.iid = quiz_rel_question_session.exercice_id)
-                 INNER JOIN ".Database::get_main_table(TABLE_MAIN_SESSION)." session ON (session.id = quizsession.session_id)",
+                                 INNER JOIN ".Database::get_course_table(TABLE_QUIZ_TEST)." as quizsession ON (quizsession.iid = quiz_rel_question_session.exercice_id)
+                                 INNER JOIN ".Database::get_main_table(TABLE_MAIN_SESSION)." session ON (session.id = quizsession.session_id)",
                 'where' => 'session_id',
                 'inject_fields' => 'session.name as question_session_id, ',
             ),
             'question_category_id' => array(
                 'innerjoin' => " INNER JOIN ".Database::get_course_table(TABLE_QUIZ_QUESTION_REL_CATEGORY)." as quiz_rel_cat ON (quiz_rel_cat.question_id = s.iid)
-                                 INNER JOIN ".Database::get_course_table(TABLE_QUIZ_CATEGORY)." as cat ON (cat.iid = quiz_rel_cat.category_id)
-                ",
+                                 INNER JOIN ".Database::get_course_table(TABLE_QUIZ_CATEGORY)." as cat ON (cat.iid = quiz_rel_cat.category_id)",
                 'where' =>  'quiz_rel_cat.category_id',
                 'inject_fields' => 'cat.title as question_category_id, ',
             ),
             'question_exercise_id' => array(
                 'innerjoin' => " INNER JOIN ".Database::get_course_table(TABLE_QUIZ_TEST_QUESTION)." as quiz_rel_question ON (quiz_rel_question.question_id = s.iid)
-                                 INNER JOIN ".Database::get_course_table(TABLE_QUIZ_TEST)." as quizexercise ON (quizexercise.iid = quiz_rel_question.exercice_id)
-                ",
+                                 INNER JOIN ".Database::get_course_table(TABLE_QUIZ_TEST)." as quizexercise ON (quizexercise.iid = quiz_rel_question.exercice_id) ",
                 'where' =>  'quiz_rel_question.exercice_id',
                 'inject_fields' => 'quizexercise.title as question_exercise_id, ',
             ),
@@ -2100,12 +2105,37 @@ abstract class Question
             )
         );
 
+        // Checking if you're looking for orphan questions.
+        $isOrphanQuestion = false;
+
+        if (isset($options['question'])) {
+            foreach ($options['question'] as $option) {
+                if (isset($option['field']) && $option['field'] == 'question_exercise_id') {
+                    if ($option['data'] == 0) {
+                        $isOrphanQuestion = true;
+                        break;
+                    }
+                }
+            }
+        }
+
+        // Special case for orphan questions.
+        if ($isOrphanQuestion) {
+            $questionPoolFields['question_exercise_id'] = array(
+                'innerjoin' => " LEFT JOIN ".Database::get_course_table(TABLE_QUIZ_TEST_QUESTION)." as quiz_rel_question ON (quiz_rel_question.question_id = s.iid)
+                                 LEFT JOIN ".Database::get_course_table(TABLE_QUIZ_TEST)." as quizexercise ON (quizexercise.iid = quiz_rel_question.exercice_id) ",
+                'where' =>  'quiz_rel_question.exercice_id',
+                'inject_fields' => 'quizexercise.title as question_exercise_id, ',
+            );
+        }
+
         $inject_extra_fields = null;
         $inject_joins = null;
 
         $where = $options['where'];
 
         $newQuestionPoolField = array();
+
         if (isset($options['question'])) {
             foreach ($options['question'] as $question) {
                 if (isset($questionPoolFields[$question['field']])) {
@@ -2117,6 +2147,7 @@ abstract class Question
         $inject_question_fields = null;
 
         $questionPoolFields = $newQuestionPoolField;
+        // Injecting inner joins.
         foreach ($questionPoolFields as $field => $option) {
             $where = str_replace($field, $option['where'], $where);
             if (isset($option['innerjoin']) && !empty($option['innerjoin'])) {
@@ -2164,10 +2195,18 @@ abstract class Question
             $where .= " AND exercice_id = $exerciseId ";
         }*/
 
+        // Orphan questions
+        if ($isOrphanQuestion) {
+            //$exerciseRelQuestionTable = Database::get_course_table(TABLE_QUIZ_TEST_QUESTION);
+            //$extraCondition .= " INNER JOIN $exerciseRelQuestionTable e ON (s.iid = e.question_id)";
+            $where .= " OR quizexercise.active = -1  OR quiz_rel_question.exercice_id IS NULL";
+        }
+
         if (!empty($courseId)) {
             $courseId = intval($courseId);
             $where .= " AND s.c_id = $courseId ";
         }
+        //var_dump($inject_joins);
 
         $query = " $select FROM $questionTable s $inject_joins $extraCondition WHERE 1=1 $where $inject_where $order $limit";
         //echo $query.'<br />';
@@ -2199,9 +2238,7 @@ abstract class Question
             //var_dump($exerciseId);
             // Including actions
             foreach ($questions as &$question) {
-
                 if (empty($exerciseId)) {
-
                     // View.
                     $actions = Display::url(
                         $previewIcon,
@@ -2223,9 +2260,7 @@ abstract class Question
                             )
                         )
                     );
-
                 } else {
-
                     // View.
                     $actions = Display::url(
                         $previewIcon,
@@ -2315,7 +2350,7 @@ abstract class Question
         // type
         if (empty($courseCode)) {
 
-            // Session
+            // Session.
             $sessionList = SessionManager::get_sessions_by_general_coach(api_get_user_id());
             $fields = array();
             if (!empty($sessionList)) {
@@ -2334,7 +2369,7 @@ abstract class Question
                 );
             }
 
-            // Courses
+            // Courses.
             $courseList = CourseManager::get_course_list_of_user_as_course_admin(api_get_user_id());
 
             if (!empty($courseList)) {
@@ -2356,7 +2391,7 @@ abstract class Question
             $courseList = array(api_get_course_info());
         }
 
-        // Categories
+        // Categories.
         $string = null;
         if (!empty($courseList)) {
 
@@ -2401,7 +2436,7 @@ abstract class Question
         $course = api_get_course_int_id();
         $sessionId = api_get_session_id();
 
-        // Exercises
+        // Exercises.
         $exerciseList  = ExerciseLib::get_all_exercises_for_course_id($sessionId, $course);
 
         if (!empty($exerciseList)) {
@@ -2421,8 +2456,7 @@ abstract class Question
             );
         }
 
-
-        // Question type
+        // Question type.
         $questionList = Question::get_question_type_list();
 
         if (!empty($questionList)) {
@@ -2441,7 +2475,7 @@ abstract class Question
             );
         }
 
-        // Difficult
+        // Difficult.
         $levels = Question::get_default_levels();
 
         if (!empty($levels)) {
@@ -2469,7 +2503,6 @@ abstract class Question
 
         if (!empty($fields)) {
             foreach ($fields as $field) {
-
                 $search_options = array();
                 $type           = 'text';
                 if (in_array($field['field_type'], array(ExtraField::FIELD_TYPE_SELECT, ExtraField::FIELD_TYPE_DOUBLE_SELECT))) {
@@ -2494,7 +2527,6 @@ abstract class Question
                     'searchoptions' => $search_options
                 );
                 $columns[] = $field['field_display_text'];
-
                 $rules[] = array(
                     'field' => 'question_'.$field['field_variable'],
                     'op' => 'eq'

+ 0 - 2
main/exercice/question_admin.inc.php

@@ -66,7 +66,6 @@ if (is_object($objQuestion)) {
         $form->freeze();
     }
 
-
     // Form validation
     //$result = $objQuestion->allQuestionWithMediaHaveTheSameCategory($exerciseId, 100);
 
@@ -92,7 +91,6 @@ if (is_object($objQuestion)) {
                 if (count($categories) > 1) {
                     $message = Display::display_warning_message(get_lang('WhenUsingAMediaQuestionYouCantAddMoreThanOneCategory'));
                     $message .= ' '.$tryAgain;
-
                     $process = false;
                 }
 

+ 5 - 3
main/exercice/question_list_admin.inc.php

@@ -109,6 +109,7 @@ echo Question::getMediaLabels();
 
 // If we are in a test.
 $inATest = isset($exerciseId) && $exerciseId > 0;
+
 if (!$inATest) {
 	echo "<p class='warning-message'>".get_lang("ChoiceQuestionType")."</p>";
 } else {
@@ -123,11 +124,12 @@ if (!$inATest) {
     echo "<div style='clear:both'>&nbsp;</div>";
 
     echo '<div id="question_list">';
+
     if ($nbrQuestions) {
         // Always getting list from DB.
 
         $objExercise->setCategoriesGrouping(false);
-        $questionList = $objExercise->selectQuestionList(true);
+        $questionList = $objExercise->getQuestionList();
 
         // Style for columns.
         $styleQuestion = "width:50%; float:left;";
@@ -139,8 +141,8 @@ if (!$inATest) {
         $category_list = Testcategory::getListOfCategoriesNameForTest($objExercise->id, false);
 
         if (is_array($questionList)) {
-			foreach ($questionList as $id) {
-				// To avoid warning messages
+            foreach ($questionList as $id) {
+				// To avoid warning messages.
 				if (!is_numeric($id)) {
 					continue;
 				}

+ 2 - 2
main/exercice/question_list_pagination_admin.inc.php

@@ -89,12 +89,12 @@ $courseCode = api_get_course_id();
 
 $delete_link = null;
 if ($objExercise->edit_exercise_in_lp == true) {
-    $delete_link = '&nbsp;<a onclick="javascript:if(!confirm('."\'".addslashes(api_htmlentities(get_lang("ConfirmYourChoice"), ENT_QUOTES))."\'".')) return false;"  href="?cidReq='.$courseCode.'&sec_token='.$token.'&deleteQuestion=\'+options.rowId+\'">'.Display::return_icon( 'delete.png', get_lang('Delete'), '', ICON_SIZE_SMALL).'</a>';
+    $delete_link = '&nbsp;<a onclick="javascript:if(!confirm('."\'".addslashes(api_htmlentities(get_lang("ConfirmYourChoice"), ENT_QUOTES))."\'".')) return false;" href="?exerciseId='.$exerciseId.'&cidReq='.$courseCode.'&sec_token='.$token.'&deleteQuestion=\'+options.rowId+\'">'.Display::return_icon('delete.png', get_lang('Delete'), '', ICON_SIZE_SMALL).'</a>';
 }
 //With this function we can add actions to the jgrid (edit, delete, etc)
 $action_links = 'function action_formatter(cellvalue, options, rowObject) {
     return \'<a href="?exerciseId='.$exerciseId.'&myid=1&cidReq='.$courseCode.'&editQuestion=\'+options.rowId+\'">'.Display::return_icon('edit.png', get_lang('Edit'), '', ICON_SIZE_SMALL).'</a>'.
-    '&nbsp;<a onclick="javascript:if(!confirm('."\'".addslashes(api_htmlentities(get_lang("ConfirmYourChoice"), ENT_QUOTES))."\'".')) return false;" href="?cidReq='.$courseCode.'&sec_token='.$token.'&clone_question=\'+options.rowId+\'">'.Display::return_icon('cd.gif',get_lang('Copy'), '',ICON_SIZE_SMALL).'</a>'.
+    '&nbsp;<a onclick="javascript:if(!confirm('."\'".addslashes(api_htmlentities(get_lang("ConfirmYourChoice"), ENT_QUOTES))."\'".')) return false;" href="?cidReq='.$courseCode.'&sec_token='.$token.'&clone_question=\'+options.rowId+\'">'.Display::return_icon('cd.gif', get_lang('Copy'), '',ICON_SIZE_SMALL).'</a>'.
     $delete_link.'\';
 }';
 ?>

+ 2 - 2
main/exercice/savescores.php

@@ -35,7 +35,7 @@ $full_file_path = $documentPath.$test;
 
 FileManager::my_delete($full_file_path.$_user['user_id'].".t.html");
 
-$TABLETRACK_HOTPOTATOES = Database::get_statistic_table(TABLE_STATISTIC_TRACK_E_HOTPOTATOES);
+$TABLETRACK_HOTPOTATOES = Database::get_main_table(TABLE_STATISTIC_TRACK_E_HOTPOTATOES);
 $tbl_learnpath_user = Database::get_course_table(TABLE_LEARNPATH_USER);
 $TABLE_LP_ITEM_VIEW = Database::get_course_table(TABLE_LP_ITEM_VIEW);
 
@@ -102,4 +102,4 @@ if ($origin != 'learnpath') {
     Display::display_reduced_header();
     Display::display_confirmation_message(get_lang('HotPotatoesFinished'));
     Display::display_footer();
-}
+}

+ 18 - 16
main/exercice/testcategory.class.php

@@ -126,14 +126,14 @@ class Testcategory
             $category->setDescription($this->description);
 
             if (!empty($parent_id)) {
-                $parent = $app['orm.em']->find('\Entity\CQuizCategory', $parent_id);
+                $parent = $app['orm.ems']['db_write']->find('\Entity\CQuizCategory', $parent_id);
                 if ($parent) {
                     $category->setParent($parent);
                 }
             }
             $category->setCId($course_id);
-            $app['orm.em']->persist($category);
-            $app['orm.em']->flush();
+            $app['orm.ems']['db_write']->persist($category);
+            $app['orm.ems']['db_write']->flush();
 
             if ($category->getIid()) {
                 return $category->getIid();
@@ -152,7 +152,7 @@ class Testcategory
     {
         // @todo inject the app in the class
         global $app;
-        $category = $app['orm.em']->find('\Entity\CQuizCategory', $this->id);
+        $category = $app['orm.ems']['db_write']->find('\Entity\CQuizCategory', $this->id);
         if (!$category) {
             return false;
         }
@@ -171,7 +171,7 @@ class Testcategory
                 if ($this->id == $parentId) {
                     continue;
                 }
-                $parent = $app['orm.em']->find('\Entity\CQuizCategory', $parentId);
+                $parent = $app['orm.ems']['db_write']->find('\Entity\CQuizCategory', $parentId);
                 if ($parent) {
                     $category->setParent($parent);
                 }
@@ -181,8 +181,8 @@ class Testcategory
             $category->setParent(null);
         }
 
-        $app['orm.em']->persist($category);
-        $app['orm.em']->flush();
+        $app['orm.ems']['db_write']->persist($category);
+        $app['orm.ems']['db_write']->flush();
 
         if ($category->getIid()) {
             return $category->getIid();
@@ -200,7 +200,7 @@ class Testcategory
     public function removeCategory()
     {
         global $app;
-        $category = $app['orm.em']->find('\Entity\CQuizCategory', $this->id);
+        $category = $app['orm.ems']['db_write']->find('\Entity\CQuizCategory', $this->id);
         if (!$category) {
             return false;
         }
@@ -212,9 +212,10 @@ class Testcategory
             return false;
         }
 
-        $repo = $app['orm.em']->getRepository('Entity\CQuizCategory');
+        $repo = $app['orm.ems']['db_write']->getRepository('Entity\CQuizCategory');
         $repo->removeFromTree($category);
-        $app['orm.em']->clear(); // clear cached nodes
+        // clear cached nodes
+        $app['orm.ems']['db_write']->clear();
         return true;
     }
 
@@ -502,11 +503,11 @@ class Testcategory
         return $categories_in_exercise;*/
     }
 
-    public static function getListOfCategoriesIDForTestObject($exercise_obj)
+    public static function getListOfCategoriesIDForTestObject(Exercise $exercise_obj)
     {
         // parcourir les questions d'un test, recup les categories uniques dans un tableau
         $categories_in_exercise = array();
-        $question_list = $exercise_obj->selectQuestionList();
+        $question_list = $exercise_obj->getQuestionList();
 
         // the array given by selectQuestionList start at indice 1 and not at indice 0 !!! ???
         foreach ($question_list as $question_id) {
@@ -554,7 +555,7 @@ class Testcategory
      * @param Exercise $exercise_obj
      * @return array
      */
-    public static function getListOfCategoriesForTest($exercise_obj) {
+    public static function getListOfCategoriesForTest(Exercise $exercise_obj) {
         $result = array();
         $categories = self::getListOfCategoriesIDForTestObject($exercise_obj);
         foreach ($categories as $cat_id) {
@@ -583,11 +584,12 @@ class Testcategory
 	 * return : integer
 	 * hubert.borderiou 07-04-2011
 	 */
-	public static function getNumberOfQuestionsInCategoryForTest($exercise_id, $category_id) {
+	public static function getNumberOfQuestionsInCategoryForTest($exercise_id, $category_id)
+    {
 		$number_questions_in_category = 0;
 		$exercise = new Exercise();
 		$exercise->read($exercise_id);
-		$question_list = $exercise->selectQuestionList();
+		$question_list = $exercise->getQuestionList();
 		// the array given by selectQuestionList start at indice 1 and not at indice 0 !!! ? ? ?
         foreach ($question_list as $question_id) {
             $category_in_question = Testcategory::getCategoryForQuestion($question_id);
@@ -762,7 +764,7 @@ class Testcategory
 		* If no question for this category, return ""
 	*/
 	public static function getCatScoreForExeidForUserid($in_cat_id, $in_exe_id, $in_user_id) {
-		$tbl_track_attempt		= Database::get_statistic_table(TABLE_STATISTIC_TRACK_E_ATTEMPT);
+		$tbl_track_attempt		= Database::get_main_table(TABLE_STATISTIC_TRACK_E_ATTEMPT);
 		$tbl_question_rel_category = Database::get_course_table(TABLE_QUIZ_QUESTION_REL_CATEGORY);
         $in_cat_id = intval($in_cat_id);
         $in_exe_id = intval($in_exe_id);

+ 6 - 6
main/exercice/tests_category.php

@@ -116,7 +116,7 @@ function edit_category_form($in_action, $type = 'simple') {
         $objcat = new Testcategory($category_id);
 
         // initiate the object
-        $form = new FormValidator('note', 'post', api_get_self().'?action='.$in_action.'&category_id='.$category_id."&type=".$type);
+        $form = new FormValidator('note', 'post', api_get_self().'?'.api_get_cidreq().'&action='.$in_action.'&category_id='.$category_id."&type=".$type);
 
         $objcat->getForm($form, 'edit');
 
@@ -125,9 +125,9 @@ function edit_category_form($in_action, $type = 'simple') {
             $check = Security::check_token('post');
             if ($check) {
                 $values = $form->getSubmitValues();
-                $v_id = Security::remove_XSS($values['category_id']);
-                $v_name = Security::remove_XSS($values['category_name'], COURSEMANAGER);
-                $v_description = Security::remove_XSS($values['category_description'], COURSEMANAGER);
+                $v_id = $values['category_id'];
+                $v_name = $values['category_name'];
+                $v_description = $values['category_description'];
                 $parent_id = isset($values['parent_id']) ? $values['parent_id'] : null;
                 $objcat = new Testcategory($v_id, $v_name, $v_description, $parent_id, $type);
                 if ($objcat->modifyCategory()) {
@@ -179,7 +179,7 @@ function add_category_form($in_action, $type = 'simple')
 {
     $in_action = Security::remove_XSS($in_action);
     // Initiate the object
-    $form = new FormValidator('note', 'post', api_get_self().'?action='.$in_action."&type=".$type);
+    $form = new FormValidator('note', 'post', api_get_self().'?'.api_get_cidreq().'&action='.$in_action."&type=".$type);
     // Setting the form elements
     $form->addElement('header', get_lang('AddACategory'));
     $form->addElement('text', 'category_name', get_lang('CategoryName'), array('class' => 'span6'));
@@ -223,7 +223,7 @@ function display_add_category($type) {
     if ($type == 'global') {
         $icon = "folder_global_category_new.png";
     }
-    echo '<a href="'.api_get_self().'?action=addcategory&type='.$type.'">'.Display::return_icon($icon, get_lang('AddACategory'), array(), ICON_SIZE_MEDIUM).'</a>';
+    echo '<a href="'.api_get_self().'?'.api_get_cidreq().'&action=addcategory&type='.$type.'">'.Display::return_icon($icon, get_lang('AddACategory'), array(), ICON_SIZE_MEDIUM).'</a>';
     echo '</div>';
     echo "<br/>";
     if ($type == 'simple') {

+ 1 - 1
main/forum/forumfunction.inc.php

@@ -3274,7 +3274,7 @@ function get_whats_new()
     $_course = api_get_course_info();
 
     $table_posts = Database :: get_course_table(TABLE_FORUM_POST);
-    $tracking_last_tool_access = Database::get_statistic_table(TABLE_STATISTIC_TRACK_E_LASTACCESS);
+    $tracking_last_tool_access = Database::get_main_table(TABLE_STATISTIC_TRACK_E_LASTACCESS);
 
     // Note: This has to be replaced by the tool constant later. But temporarily bb_forum is used since this is the only thing that is in the tracking currently.
     //$tool = TOOL_FORUM;

+ 1 - 1
main/gradebook/exercise_jump.php

@@ -18,7 +18,7 @@ api_block_anonymous_users();
 $this_section=SECTION_COURSES;
 
 $course_code = api_get_course_id();
-$course_info = Database::get_course_info($course_code);
+$course_info = api_get_course_info($course_code);
 $course_title = $course_info['title'];
 $course_code = $return_result['code'];
 $gradebook = Security::remove_XSS($_GET['gradebook']);

+ 3 - 3
main/gradebook/gradebook_result.class.php

@@ -92,8 +92,8 @@ class GradeBookResult
 		$return = array();
     	$TBL_EXERCISES          = Database::get_course_table(TABLE_QUIZ_TEST);
     	$TBL_USER          	    = Database::get_main_table(TABLE_MAIN_USER);
-		$TBL_TRACK_EXERCISES	= Database::get_statistic_table(TABLE_STATISTIC_TRACK_E_EXERCICES);
-		$TBL_TRACK_HOTPOTATOES	= Database::get_statistic_table(TABLE_STATISTIC_TRACK_E_HOTPOTATOES);
+		$TBL_TRACK_EXERCISES	= Database::get_main_table(TABLE_STATISTIC_TRACK_E_EXERCICES);
+		$TBL_TRACK_HOTPOTATOES	= Database::get_main_table(TABLE_STATISTIC_TRACK_E_HOTPOTATOES);
 
     	$cid = api_get_course_id();
     	$course_id = api_get_course_int_id();
@@ -328,4 +328,4 @@ class GradeBookResult
         echo $data;
         return true;
     }
-}
+}

+ 1 - 1
main/gradebook/index.php

@@ -731,7 +731,7 @@ $no_qualification = false;
 if ($category != '0') {
 	$cat = new Category();
 	$category_id   = intval($_GET['selectcat']);
-	$course_id     = Database::get_course_by_category($category_id);
+	$course_id     = CourseManager::get_course_by_category($category_id);
 	$show_message  = $cat->show_message_resource_delete($course_id);
 
 	if ($show_message == '') {

File diff suppressed because it is too large
+ 262 - 179
main/gradebook/lib/be/category.class.php


+ 2 - 2
main/gradebook/lib/be/exerciselink.class.php

@@ -85,7 +85,7 @@ class ExerciseLink extends AbstractLink
      * Has anyone done this exercise yet ?
      */
     public function has_results() {
-    	$tbl_stats = Database::get_statistic_table(TABLE_STATISTIC_TRACK_E_EXERCICES);
+    	$tbl_stats = Database::get_main_table(TABLE_STATISTIC_TRACK_E_EXERCICES);
         $session_id = api_get_session_id();
 		$sql = 'SELECT count(exe_id) AS number FROM '.$tbl_stats."
                 WHERE   session_id = $session_id AND
@@ -105,7 +105,7 @@ class ExerciseLink extends AbstractLink
 	 */
     public function calc_score($stud_id = null)
     {
-    	$tbl_stats = Database::get_statistic_table(TABLE_STATISTIC_TRACK_E_EXERCICES);
+    	$tbl_stats = Database::get_main_table(TABLE_STATISTIC_TRACK_E_EXERCICES);
         // The following query should be similar (in conditions)
         // to the one used in exercice/exercice.php, look for note-query-exe-results marker
         $session_id = api_get_session_id();

+ 2 - 2
main/gradebook/lib/fe/displaygradebook.php

@@ -189,7 +189,7 @@ class DisplayGradebook
 		// Student
 		$status = CourseManager::get_user_in_course_status(api_get_user_id(), api_get_course_id());
 		$objcat = new Category();
-		$course_id = Database::get_course_by_category($selectcat);
+		$course_id = CourseManager::get_course_by_category($selectcat);
 		$message_resource=$objcat->show_message_resource_delete($course_id);
 
 		if (!$is_course_admin && $status<>1 && $selectcat<>0) {
@@ -361,7 +361,7 @@ class DisplayGradebook
 		//student
 		$status = CourseManager::get_user_in_course_status(api_get_user_id(), api_get_course_id());
 		$objcat = new Category();
-		$course_id = Database::get_course_by_category($selectcat);
+		$course_id = CourseManager::get_course_by_category($selectcat);
 		$message_resource = $objcat->show_message_resource_delete($course_id);
 
         $grade_model_id = $catobj->get_grade_model_id();

+ 2 - 2
main/gradebook/lib/fe/gradebooktable.class.php

@@ -520,7 +520,7 @@ class GradebookTable extends SortableTable {
 			// evaluation
 			case 'E' :
 				$cat = new Category();
-				$course_id = Database::get_course_by_category($_GET['selectcat']);
+				$course_id = CourseManager::get_course_by_category($_GET['selectcat']);
 
 				$show_message = $cat->show_message_resource_delete($course_id);
 
@@ -557,7 +557,7 @@ class GradebookTable extends SortableTable {
 			// link
 			case 'L' :
 				$cat 			= new Category();
-				$course_id	 	= Database::get_course_by_category($_GET['selectcat']);
+				$course_id	 	= CourseManager::get_course_by_category($_GET['selectcat']);
 				$show_message	= $cat->show_message_resource_delete($course_id);
 
 				$url = $item->get_link();

BIN
main/img/icons/22/dropbox.png


BIN
main/img/icons/32/dropbox.png


+ 1 - 1
main/inc/ajax/agenda.ajax.php

@@ -26,7 +26,7 @@ $user_id = api_get_user_id();
 $is_group_tutor = GroupManager::is_tutor_of_group($user_id, $group_id);
 
 $agenda = new Agenda();
-$agenda->type = $type; //course,admin or personal
+$agenda->setType($type); //course,admin or personal
 
 switch ($action) {
     case 'add_event':

+ 7 - 5
main/inc/ajax/exercise.ajax.php

@@ -151,9 +151,9 @@ switch ($action) {
             $sidx = 1;
         }
 
-        $track_exercise        = Database::get_statistic_table(TABLE_STATISTIC_TRACK_E_EXERCICES);
+        $track_exercise        = Database::get_main_table(TABLE_STATISTIC_TRACK_E_EXERCICES);
         $user_table            = Database::get_main_table(TABLE_MAIN_USER);
-        $track_attempt         = Database::get_statistic_table(TABLE_STATISTIC_TRACK_E_ATTEMPT);
+        $track_attempt         = Database::get_main_table(TABLE_STATISTIC_TRACK_E_ATTEMPT);
 
         $minutes        = intval($_REQUEST['minutes']);
         $now            = time() - 60*$minutes; //1 hour
@@ -338,7 +338,7 @@ switch ($action) {
 
             // Question info.
             $question_id             = isset($_REQUEST['question_id']) ? intval($_REQUEST['question_id']) : null;
-            $question_list           = Session::read('question_list_flatten');
+            $question_list           = Session::read('question_list_uncompressed');
 
             // If exercise or question is not set then exit.
             if (empty($question_list) || empty($objExercise)) {
@@ -423,8 +423,10 @@ switch ($action) {
 
             // Looping the question list
 
-            if ($debug) error_log("Looping question list".print_r($question_list, 1));
-            if ($debug) error_log("Trying to save question: $question_id ");
+            if ($debug) {
+                error_log("Looping question list".print_r($question_list, 1));
+                error_log("Trying to save question: $question_id ");
+            }
 
             foreach ($question_list as $my_question_id) {
 

+ 2 - 2
main/inc/ajax/message.ajax.php

@@ -27,7 +27,7 @@ switch ($action) {
 			echo '';
 			break;
 		}
-		$track_online_table = Database::get_statistic_table(TABLE_STATISTIC_TRACK_E_ONLINE);
+		$track_online_table = Database::get_main_table(TABLE_STATISTIC_TRACK_E_ONLINE);
 		$tbl_my_user		= Database::get_main_table(TABLE_MAIN_USER);
 		$tbl_my_user_friend = Database::get_main_table(TABLE_MAIN_USER_REL_USER);
 		$tbl_user 			= Database::get_main_table(TABLE_MAIN_USER);
@@ -77,4 +77,4 @@ switch ($action) {
 	default:
 		echo '';
 }
-exit;
+exit;

+ 9 - 5
main/inc/ajax/thematic.ajax.php

@@ -9,7 +9,9 @@ require_once '../global.inc.php';
 api_protect_course_script(true);
 
 $action = $_GET['a'];
-$thematic = new Thematic();
+$courseInfo = api_get_course_info();
+
+$thematic = new Thematic($courseInfo);
 
 switch ($action) {
 	case 'save_thematic_plan':
@@ -84,12 +86,13 @@ switch ($action) {
 	case 'get_datetime_by_attendance':
 		$attendance_id       = intval($_REQUEST['attendance_id']);
 		$thematic_advance_id = intval($_REQUEST['thematic_advance_id']);
+        $courseInfo = api_get_course_info();
 
 		$label = '';
 		$input_select = '';
 		if (!empty($attendance_id)) {
 			$attendance = new Attendance();
-			$thematic   = new Thematic();
+			$thematic   = new Thematic($courseInfo);
             $thematic_list = $thematic->get_thematic_list();
 
             $my_list = $thematic_list_temp = array();
@@ -143,12 +146,13 @@ switch ($action) {
 	    break;
 	case 'update_done_thematic_advance':
 		$thematic_advance_id = intval($_GET['thematic_advance_id']);
+        $courseInfo = api_get_course_info();
 		$total_average = 0;
 		if (!empty($thematic_advance_id)) {
-			$thematic = new Thematic();
+			$thematic = new Thematic($courseInfo);
 			$affected_rows  = $thematic->update_done_thematic_advances($thematic_advance_id);
 			//if ($affected_rows) {
-			$total_average  = $thematic->get_total_average_of_thematic_advances(api_get_course_id(), api_get_session_id());
+			$total_average  = $thematic->get_total_average_of_thematic_advances(null, api_get_session_id());
 			//}
 		}
 		echo $total_average;
@@ -156,4 +160,4 @@ switch ($action) {
 	default:
 		echo '';
 }
-exit;
+exit;

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