فهرست منبع

Merge branch '1.10.x' of ssh://github.com/chamilo/chamilo-lms into 1.10.x

Julio Montoya 9 سال پیش
والد
کامیت
b9e05ced40
97فایلهای تغییر یافته به همراه4065 افزوده شده و 590 حذف شده
  1. 16 44
      app/Resources/public/css/base.css
  2. 4 0
      app/Resources/public/css/scorm.css
  3. 188 0
      app/Resources/public/css/themes/readable/default.css
  4. BIN
      app/Resources/public/css/themes/readable/fonts/RobotoSlab-Bold.woff2
  5. BIN
      app/Resources/public/css/themes/readable/fonts/RobotoSlab-Light.woff2
  6. BIN
      app/Resources/public/css/themes/readable/fonts/RobotoSlab-Regular.woff2
  7. BIN
      app/Resources/public/css/themes/readable/images/header-logo.png
  8. 197 0
      app/Resources/public/css/themes/silver_line/default.css
  9. BIN
      app/Resources/public/css/themes/silver_line/fonts/TitilliumWeb-Bold.woff2
  10. BIN
      app/Resources/public/css/themes/silver_line/fonts/TitilliumWeb-Regular.woff2
  11. BIN
      app/Resources/public/css/themes/silver_line/fonts/TitilliumWeb-SemiBold.woff2
  12. BIN
      app/Resources/public/css/themes/silver_line/images/bg_menu.gif
  13. BIN
      app/Resources/public/css/themes/silver_line/images/header-logo.png
  14. 169 0
      app/Resources/public/css/themes/simplex/default.css
  15. BIN
      app/Resources/public/css/themes/simplex/fonts/Lato-Bold.woff2
  16. BIN
      app/Resources/public/css/themes/simplex/fonts/Lato-Light.woff2
  17. BIN
      app/Resources/public/css/themes/simplex/fonts/Lato-Regular.woff2
  18. BIN
      app/Resources/public/css/themes/simplex/images/header-logo.png
  19. 2 1
      composer.json
  20. 3 3
      main/admin/career_dashboard.php
  21. 42 44
      main/coursecopy/copy_course_session.php
  22. 98 69
      main/document/webcam_clip.php
  23. 10 18
      main/document/webcam_receiver.php
  24. 0 6
      main/inc/lib/javascript/bootstrap-select.min.js
  25. 7 5
      main/inc/lib/javascript/bootstrap-select/css/bootstrap-select.css
  26. 0 0
      main/inc/lib/javascript/bootstrap-select/css/bootstrap-select.css.map
  27. 5 0
      main/inc/lib/javascript/bootstrap-select/css/bootstrap-select.min.css
  28. 1650 0
      main/inc/lib/javascript/bootstrap-select/js/bootstrap-select.js
  29. 0 0
      main/inc/lib/javascript/bootstrap-select/js/bootstrap-select.js.map
  30. 6 0
      main/inc/lib/javascript/bootstrap-select/js/bootstrap-select.min.js
  31. 44 0
      main/inc/lib/javascript/bootstrap-select/js/i18n/defaults-bg_BG.js
  32. 7 0
      main/inc/lib/javascript/bootstrap-select/js/i18n/defaults-bg_BG.min.js
  33. 35 0
      main/inc/lib/javascript/bootstrap-select/js/i18n/defaults-cs_CZ.js
  34. 7 0
      main/inc/lib/javascript/bootstrap-select/js/i18n/defaults-cs_CZ.min.js
  35. 44 0
      main/inc/lib/javascript/bootstrap-select/js/i18n/defaults-da_DK.js
  36. 7 0
      main/inc/lib/javascript/bootstrap-select/js/i18n/defaults-da_DK.min.js
  37. 35 0
      main/inc/lib/javascript/bootstrap-select/js/i18n/defaults-de_DE.js
  38. 7 0
      main/inc/lib/javascript/bootstrap-select/js/i18n/defaults-de_DE.min.js
  39. 44 0
      main/inc/lib/javascript/bootstrap-select/js/i18n/defaults-en_US.js
  40. 7 0
      main/inc/lib/javascript/bootstrap-select/js/i18n/defaults-en_US.min.js
  41. 35 0
      main/inc/lib/javascript/bootstrap-select/js/i18n/defaults-es_CL.js
  42. 7 0
      main/inc/lib/javascript/bootstrap-select/js/i18n/defaults-es_CL.min.js
  43. 35 0
      main/inc/lib/javascript/bootstrap-select/js/i18n/defaults-es_ES.js
  44. 7 0
      main/inc/lib/javascript/bootstrap-select/js/i18n/defaults-es_ES.min.js
  45. 35 0
      main/inc/lib/javascript/bootstrap-select/js/i18n/defaults-eu.js
  46. 7 0
      main/inc/lib/javascript/bootstrap-select/js/i18n/defaults-eu.min.js
  47. 37 0
      main/inc/lib/javascript/bootstrap-select/js/i18n/defaults-fa_IR.js
  48. 7 0
      main/inc/lib/javascript/bootstrap-select/js/i18n/defaults-fa_IR.min.js
  49. 42 0
      main/inc/lib/javascript/bootstrap-select/js/i18n/defaults-fr_FR.js
  50. 7 0
      main/inc/lib/javascript/bootstrap-select/js/i18n/defaults-fr_FR.min.js
  51. 44 0
      main/inc/lib/javascript/bootstrap-select/js/i18n/defaults-hu_HU.js
  52. 7 0
      main/inc/lib/javascript/bootstrap-select/js/i18n/defaults-hu_HU.min.js
  53. 35 0
      main/inc/lib/javascript/bootstrap-select/js/i18n/defaults-it_IT.js
  54. 7 0
      main/inc/lib/javascript/bootstrap-select/js/i18n/defaults-it_IT.min.js
  55. 44 0
      main/inc/lib/javascript/bootstrap-select/js/i18n/defaults-ko_KR.js
  56. 7 0
      main/inc/lib/javascript/bootstrap-select/js/i18n/defaults-ko_KR.min.js
  57. 35 0
      main/inc/lib/javascript/bootstrap-select/js/i18n/defaults-nl_NL.js
  58. 7 0
      main/inc/lib/javascript/bootstrap-select/js/i18n/defaults-nl_NL.min.js
  59. 37 0
      main/inc/lib/javascript/bootstrap-select/js/i18n/defaults-pl_PL.js
  60. 7 0
      main/inc/lib/javascript/bootstrap-select/js/i18n/defaults-pl_PL.min.js
  61. 35 0
      main/inc/lib/javascript/bootstrap-select/js/i18n/defaults-pt_BR.js
  62. 7 0
      main/inc/lib/javascript/bootstrap-select/js/i18n/defaults-pt_BR.min.js
  63. 35 0
      main/inc/lib/javascript/bootstrap-select/js/i18n/defaults-pt_PT.js
  64. 7 0
      main/inc/lib/javascript/bootstrap-select/js/i18n/defaults-pt_PT.min.js
  65. 35 0
      main/inc/lib/javascript/bootstrap-select/js/i18n/defaults-ro_RO.js
  66. 7 0
      main/inc/lib/javascript/bootstrap-select/js/i18n/defaults-ro_RO.min.js
  67. 36 0
      main/inc/lib/javascript/bootstrap-select/js/i18n/defaults-ru_RU.js
  68. 7 0
      main/inc/lib/javascript/bootstrap-select/js/i18n/defaults-ru_RU.min.js
  69. 37 0
      main/inc/lib/javascript/bootstrap-select/js/i18n/defaults-sk_SK.js
  70. 7 0
      main/inc/lib/javascript/bootstrap-select/js/i18n/defaults-sk_SK.min.js
  71. 44 0
      main/inc/lib/javascript/bootstrap-select/js/i18n/defaults-sl_SI.js
  72. 7 0
      main/inc/lib/javascript/bootstrap-select/js/i18n/defaults-sl_SI.min.js
  73. 44 0
      main/inc/lib/javascript/bootstrap-select/js/i18n/defaults-sv_SE.js
  74. 7 0
      main/inc/lib/javascript/bootstrap-select/js/i18n/defaults-sv_SE.min.js
  75. 44 0
      main/inc/lib/javascript/bootstrap-select/js/i18n/defaults-tr_TR.js
  76. 7 0
      main/inc/lib/javascript/bootstrap-select/js/i18n/defaults-tr_TR.min.js
  77. 35 0
      main/inc/lib/javascript/bootstrap-select/js/i18n/defaults-ua_UA.js
  78. 7 0
      main/inc/lib/javascript/bootstrap-select/js/i18n/defaults-ua_UA.min.js
  79. 35 0
      main/inc/lib/javascript/bootstrap-select/js/i18n/defaults-zh_CN.js
  80. 7 0
      main/inc/lib/javascript/bootstrap-select/js/i18n/defaults-zh_CN.min.js
  81. 37 0
      main/inc/lib/javascript/bootstrap-select/js/i18n/defaults-zh_TW.js
  82. 7 0
      main/inc/lib/javascript/bootstrap-select/js/i18n/defaults-zh_TW.min.js
  83. 1 1
      main/inc/lib/javascript/chat/video.php
  84. 0 165
      main/inc/lib/jpegcam/LICENSE.txt
  85. 0 8
      main/inc/lib/jpegcam/index.html
  86. BIN
      main/inc/lib/jpegcam/shutter.mp3
  87. 0 197
      main/inc/lib/jpegcam/webcam.js
  88. BIN
      main/inc/lib/jpegcam/webcam.swf
  89. 5 3
      main/inc/lib/template.lib.php
  90. 11 0
      main/lang/english/trad4all.inc.php
  91. 7 0
      main/lang/french/trad4all.inc.php
  92. 7 0
      main/lang/galician/trad4all.inc.php
  93. 348 1
      main/lang/italian/trad4all.inc.php
  94. 11 0
      main/lang/spanish/trad4all.inc.php
  95. 4 1
      main/newscorm/learnpath.class.php
  96. 88 18
      main/template/default/chat/video.tpl
  97. 6 6
      main/template/default/social/user_block.tpl

+ 16 - 44
app/Resources/public/css/base.css

@@ -6126,52 +6126,17 @@ a.sessionView {
     width: auto;
 }
 /* video chat */
-#chat-local-video video,
-#chat-remote-video video{
-  border-radius: 5px;
-  -moz-border-radius: 4px;
-  -webkit-border-radius: 4px;
-  box-shadow: 0 2px 3px #C8C8C8;
-  border: 1px solid #e6e6e6;
-  background-color:#fff;
-  padding: 5px;
-}
-#chat-local-video video,
-#chat-remote-video video{
-  width: 100%;
-  min-width: 100%;
-  display: block;
-}
-#chat-video-panel .username-local{
-  text-align: center;
-  padding-bottom: 5px;
-  padding-top:5px;
-  margin-top:10px;
-  margin-bottom:10px;
-  color: #666666;
-}
-#chat-video-panel .chat-user-remote{
-  text-align: center;
-  padding-bottom: 5px;
-  padding-top:5px;
-  color: #666666;
+#chat-video-panel .thumbnail .caption p {
+    margin-bottom: 0;
 }
-#chat-video-panel .title{
+#chat-video-panel .thumbnail video {
+  background-color: #FFF;
+  background-image: url("../../main/img/icons/128/camera-webrtc.png");
+  background-position: center center;
+  background-repeat: no-repeat;
   display: block;
-  color: #52606F;
-  padding: 0;
-  margin: 0;
-  margin-bottom: 20px;
-  padding-bottom: 10px;
-  font-size: 20px;
-  border-bottom: 1px solid #E5E5E5;
-}
-#chat-video-panel #chat-local-video video,
-#chat-video-panel #chat-remote-video video {
-    background-color: #FFF;
-    background-image: url("../../main/img/icons/128/camera-webrtc.png");
-    background-position: center center;
-    background-repeat: no-repeat;
+  min-width: 100%;
+  width: 100%;
 }
 #listFriends .list-group-item{
   border: none;
@@ -6365,6 +6330,13 @@ a.sessionView {
 #prev.disabled {
     opacity: 0.2;
 }
+.webcamclip_bg{
+    width:340px;
+    height:260px;
+    border:10px solid;
+    border-radius: 25px;
+    border-color: #00677C;
+}
 /* CSS NEW TOP ******************************************************************************/
 /* CSS Responsive */
 @media (min-width: 1025px) and (max-width: 1200px) {

+ 4 - 0
app/Resources/public/css/scorm.css

@@ -388,6 +388,10 @@ See https://support.chamilo.org/issues/6976
   background:url("../../main/img/scorm/scorm_current.png") no-repeat left center !important;
   color: #009AB8;
 }
+.scorm_item_normal.scorm_highlight.scorm_failed{
+    background:url("../../main/img/scorm/scorm_failed.png") no-repeat left center !important;
+    color: #009AB8;
+}
 .scorm_item_normal.scorm_highlight a{
   color: #009AB8 !important;
 }

+ 188 - 0
app/Resources/public/css/themes/readable/default.css

@@ -0,0 +1,188 @@
+/*!
+ * CSS Readable - v. 2.0
+ * 2015 - Alex Aragón (aragonc@beeznest.com)
+ * Licensed GPL
+ * Based on Bootstrap
+*/
+
+@font-face {
+  font-family: 'Roboto Slab';
+  font-style: normal;
+  font-weight: 300;
+  src: local('Roboto Slab Light'), local('RobotoSlab-Light'), url(fonts/RobotoSlab-Light.woff2) format('woff2');
+}
+@font-face {
+  font-family: 'Roboto Slab';
+  font-style: normal;
+  font-weight: 400;
+  src: local('Roboto Slab Regular'), local('RobotoSlab-Regular'), url(fonts/RobotoSlab-Regular.woff2) format('woff2');
+}
+@font-face {
+  font-family: 'Roboto Slab';
+  font-style: normal;
+  font-weight: 700;
+  src: local('Roboto Slab Bold'), local('RobotoSlab-Bold'), url(fonts/RobotoSlab-Bold.woff2) format('woff2');
+}
+
+
+html {
+  -ms-text-size-adjust: 100%;
+  -webkit-text-size-adjust: 100%;
+}
+body {
+  margin: 0;
+  font-family: 'Roboto Slab', serif;
+  line-height: 1.72222;
+  background-color: #E3E3E3;
+}
+a{
+  color: #666666;
+}
+a:hover{
+  color: #62366F;
+  text-decoration: none;
+}
+
+.navbar-default {
+background: #333333;
+background: -moz-linear-gradient(top, #333333 0%, #262626 100%);
+background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#333333), color-stop(100%,#262626));
+background: -webkit-linear-gradient(top, #333333 0%,#262626 100%);
+background: -o-linear-gradient(top, #333333 0%,#262626 100%);
+background: -ms-linear-gradient(top, #333333 0%,#262626 100%);
+background: linear-gradient(to bottom, #333333 0%,#262626 100%);
+filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#333333', endColorstr='#262626',GradientType=0 );
+border: none;
+border-radius: 0;
+}
+.navbar-default .navbar-brand {
+  color: #ffffff;
+}
+.navbar-default .navbar-brand:hover, .navbar-default .navbar-brand:focus {
+  color: #ededed;
+}
+.navbar-default .navbar-text {
+  color: #ffffff;
+}
+.navbar-default .navbar-nav > li > a {
+  color: #ffffff;
+  padding-top: 5px;
+  padding-bottom: 5px;
+  margin-top: 10px;
+}
+.navbar-default .navbar-nav > li > a:hover, .navbar-default .navbar-nav > li > a:focus {
+color: #FFFFFF;
+background: #8fc400;
+background: -moz-linear-gradient(top, #8fc400 0%, #5c8e2e 100%);
+background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#8fc400), color-stop(100%,#5c8e2e));
+background: -webkit-linear-gradient(top, #8fc400 0%,#5c8e2e 100%);
+background: -o-linear-gradient(top, #8fc400 0%,#5c8e2e 100%);
+background: -ms-linear-gradient(top, #8fc400 0%,#5c8e2e 100%);
+background: linear-gradient(to bottom, #8fc400 0%,#5c8e2e 100%);
+filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#8fc400', endColorstr='#5c8e2e',GradientType=0 );
+border-radius: 5px;
+}
+.navbar-default .navbar-nav > li > .dropdown-menu {
+  background-color: #80B40C;
+}
+.navbar-default .navbar-nav > li > .dropdown-menu > li > a {
+  color: #ffffff;
+}
+.navbar-default .navbar-nav > li > .dropdown-menu > li > a:hover,
+.navbar-default .navbar-nav > li > .dropdown-menu > li > a:focus {
+  color: #ededed;
+  background-color: #2E2E2E;
+}
+.navbar-default .navbar-nav > li > .dropdown-menu > li > .divider {
+  background-color: #0099c0;
+}
+.navbar-default .navbar-nav > .active > a, .navbar-default .navbar-nav > .active > a:hover, .navbar-default .navbar-nav > .active > a:focus {
+color: #87BB06;
+background: none;
+}
+.navbar-default .navbar-nav > .open > a, .navbar-default .navbar-nav > .open > a:hover, .navbar-default .navbar-nav > .open > a:focus {
+color: #FFFFFF;
+background: #8fc400;
+background: -moz-linear-gradient(top, #8fc400 0%, #5c8e2e 100%);
+background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#8fc400), color-stop(100%,#5c8e2e));
+background: -webkit-linear-gradient(top, #8fc400 0%,#5c8e2e 100%);
+background: -o-linear-gradient(top, #8fc400 0%,#5c8e2e 100%);
+background: -ms-linear-gradient(top, #8fc400 0%,#5c8e2e 100%);
+background: linear-gradient(to bottom, #8fc400 0%,#5c8e2e 100%);
+filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#8fc400', endColorstr='#5c8e2e',GradientType=0 );
+}
+.navbar-default .navbar-toggle {
+  border-color: #666;
+}
+.navbar-default .navbar-toggle:hover, .navbar-default .navbar-toggle:focus {
+  background: #8fc400;
+background: -moz-linear-gradient(top, #8fc400 0%, #5c8e2e 100%);
+background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#8fc400), color-stop(100%,#5c8e2e));
+background: -webkit-linear-gradient(top, #8fc400 0%,#5c8e2e 100%);
+background: -o-linear-gradient(top, #8fc400 0%,#5c8e2e 100%);
+background: -ms-linear-gradient(top, #8fc400 0%,#5c8e2e 100%);
+background: linear-gradient(to bottom, #8fc400 0%,#5c8e2e 100%);
+filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#8fc400', endColorstr='#5c8e2e',GradientType=0 );
+}
+.navbar-default .navbar-toggle .icon-bar {
+  background-color: #ffffff;
+}
+.navbar-default .navbar-collapse,
+.navbar-default .navbar-form {
+  border-color: #ffffff;
+}
+.navbar-default .navbar-link {
+  color: #ffffff;
+}
+.navbar-default .navbar-link:hover {
+  color: #ededed;
+}
+
+@media (max-width: 767px) {
+  .navbar-default .navbar-nav .open .dropdown-menu > li > a {
+    color: #ffffff;
+  }
+  .navbar-default .navbar-nav .open .dropdown-menu > li > a:hover, .navbar-default .navbar-nav .open .dropdown-menu > li > a:focus {
+    color: #ededed;
+  }
+  .navbar-default .navbar-nav .open .dropdown-menu > .active > a, .navbar-default .navbar-nav .open .dropdown-menu > .active > a:hover, .navbar-default .navbar-nav .open .dropdown-menu > .active > a:focus {
+    color: #ededed;
+    background-color: #0099c0;
+  }
+}
+.breadcrumb{
+  background: #D3D3D3;
+  color: #006A84;
+}
+.nav li a:hover{
+    background: transparent;
+}
+.panel-default .panel-heading{
+    background-color: #F9F9F9;
+}
+footer{
+  background: #232323;
+  color: #837E76;
+  border-top: 2px solid #79B72C;
+}
+footer a{
+  color: #63AC0C;
+}
+footer a:hover{
+  color: #63AC0C;
+}
+.menu-column .panel-default .panel-heading{
+   background-color: #444444;
+   border-color: #444;
+}
+.menu-column .panel-default .panel-heading a{
+    color: #fff;
+}
+.menu-column .panel-default .panel-body{
+    background-color: #F5F5F5;
+}
+#page-content .panel{
+    background: none;
+    border: 1px solid #D3D3D3;
+    box-shadow: none;
+}

BIN
app/Resources/public/css/themes/readable/fonts/RobotoSlab-Bold.woff2


BIN
app/Resources/public/css/themes/readable/fonts/RobotoSlab-Light.woff2


BIN
app/Resources/public/css/themes/readable/fonts/RobotoSlab-Regular.woff2


BIN
app/Resources/public/css/themes/readable/images/header-logo.png


+ 197 - 0
app/Resources/public/css/themes/silver_line/default.css

@@ -0,0 +1,197 @@
+/*!
+ * CSS Silver Line - v. 2.0
+ * 2015 - Alex Aragón (aragonc@beeznest.com)
+ * Licensed GPL
+ * Based on Bootstrap
+*/
+@font-face {
+  font-family: 'Titillium Web';
+  font-style: normal;
+  font-weight: 400;
+  src: local('Titillium Web'), local('TitilliumWeb-Regular'), url(fonts/TitilliumWeb-Regular.woff2) format('woff2');
+}
+@font-face {
+  font-family: 'Titillium Web';
+  font-style: normal;
+  font-weight: 600;
+  src: local('Titillium WebSemiBold'), local('TitilliumWeb-SemiBold'), url(fonts/TitilliumWeb-SemiBold.woff2) format('woff2');
+}
+@font-face {
+  font-family: 'Titillium Web';
+  font-style: normal;
+  font-weight: 700;
+  src: local('Titillium WebBold'), local('TitilliumWeb-Bold'), url(fonts/TitilliumWeb-Bold.woff2) format('woff2');
+}
+
+html {
+  -ms-text-size-adjust: 100%;
+  -webkit-text-size-adjust: 100%;
+}
+body {
+  margin: 0;
+  font-family: 'Titillium Web', sans-serif;
+  line-height: 1.72222;
+}
+a{
+  color: #666666;
+}
+a:hover{
+  color: #62366F;
+  text-decoration: none;
+}
+
+.navbar-default {
+background: url(images/bg_menu.gif) repeat-x 0px -45px #D1D3D4;
+border: none;
+border-radius: 0;
+}
+.navbar-default .navbar-brand {
+  color: #ffffff;
+}
+.navbar-default .navbar-brand:hover, .navbar-default .navbar-brand:focus {
+  color: #ededed;
+}
+.navbar-default .navbar-text {
+  color: #ffffff;
+}
+.navbar-default .navbar-nav > li > a {
+  color: #53676C;
+  padding-top: 5px;
+  padding-bottom: 5px;
+  margin-top: 10px;
+  font-size: 1.15em;
+  font-weight: bold;
+}
+.navbar-default .navbar-nav > li > a:hover, .navbar-default .navbar-nav > li > a:focus {
+color: #53676C;
+background: #eeeeee;
+background: -moz-linear-gradient(top, #eeeeee 0%, #cccccc 100%);
+background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#eeeeee), color-stop(100%,#cccccc));
+background: -webkit-linear-gradient(top, #eeeeee 0%,#cccccc 100%);
+background: -o-linear-gradient(top, #eeeeee 0%,#cccccc 100%);
+background: -ms-linear-gradient(top, #eeeeee 0%,#cccccc 100%); 
+background: linear-gradient(to bottom, #eeeeee 0%,#cccccc 100%);
+filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#eeeeee', endColorstr='#cccccc',GradientType=0 );
+border-radius: 5px;
+}
+.navbar-default .navbar-nav > li > .dropdown-menu {
+  background-color: #56696E;
+}
+.navbar-default .navbar-nav > li > .dropdown-menu > li > a {
+  color: #ffffff;
+}
+.navbar-default .navbar-nav > li > .dropdown-menu > li > a:hover,
+.navbar-default .navbar-nav > li > .dropdown-menu > li > a:focus {
+  color: #ededed;
+  background-color: #2E2E2E;
+}
+.navbar-default .navbar-nav > li > .dropdown-menu > li > .divider {
+  background-color: #0099c0;
+}
+.navbar-default .navbar-nav > .active > a, .navbar-default .navbar-nav > .active > a:hover, .navbar-default .navbar-nav > .active > a:focus {
+color: #FFF;
+background: #6e7c84;
+background: -moz-linear-gradient(top, #6e7c84 0%, #53676c 100%);
+background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#6e7c84), color-stop(100%,#53676c));
+background: -webkit-linear-gradient(top, #6e7c84 0%,#53676c 100%);
+background: -o-linear-gradient(top, #6e7c84 0%,#53676c 100%);
+background: -ms-linear-gradient(top, #6e7c84 0%,#53676c 100%);
+background: linear-gradient(to bottom, #6e7c84 0%,#53676c 100%);
+filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#6e7c84', endColorstr='#53676c',GradientType=0 );
+border-radius: 5px;
+}
+.navbar-default .navbar-nav > .open > a, .navbar-default .navbar-nav > .open > a:hover, .navbar-default .navbar-nav > .open > a:focus {
+color: #FFFFFF;
+background: #6e7c84;
+background: -moz-linear-gradient(top, #6e7c84 0%, #53676c 100%);
+background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#6e7c84), color-stop(100%,#53676c));
+background: -webkit-linear-gradient(top, #6e7c84 0%,#53676c 100%);
+background: -o-linear-gradient(top, #6e7c84 0%,#53676c 100%);
+background: -ms-linear-gradient(top, #6e7c84 0%,#53676c 100%);
+background: linear-gradient(to bottom, #6e7c84 0%,#53676c 100%);
+filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#6e7c84', endColorstr='#53676c',GradientType=0 );
+}
+.navbar-default .navbar-toggle {
+  border-color: #666;
+  background-color: #53676C;
+}
+.navbar-default .navbar-toggle:hover, .navbar-default .navbar-toggle:focus {
+  background: #53676C;
+}
+.navbar-default .navbar-toggle .icon-bar {
+  background-color: #ffffff;
+}
+.navbar-default .navbar-collapse,
+.navbar-default .navbar-form {
+  border-color: #ffffff;
+}
+.navbar-default .navbar-link {
+  color: #ffffff;
+}
+.navbar-default .navbar-link:hover {
+  color: #ededed;
+}
+
+@media (max-width: 767px) {
+  .navbar-default .navbar-nav .open .dropdown-menu > li > a {
+    color: #ffffff;
+  }
+  .navbar-default .navbar-nav .open .dropdown-menu > li > a:hover, .navbar-default .navbar-nav .open .dropdown-menu > li > a:focus {
+    color: #ededed;
+  }
+  .navbar-default .navbar-nav .open .dropdown-menu > .active > a, .navbar-default .navbar-nav .open .dropdown-menu > .active > a:hover, .navbar-default .navbar-nav .open .dropdown-menu > .active > a:focus {
+    color: #ededed;
+    background-color: #0099c0;
+  }
+}
+.breadcrumb{
+  background: #F9F9F9;
+  color: #006A84;
+}
+.nav li a:hover{
+    background: transparent;
+}
+.panel-default .panel-heading{
+    background-color: #F9F9F9;
+}
+footer{
+background: #6e7c84;
+background: -moz-linear-gradient(top, #6e7c84 0%, #53676c 100%);
+background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#6e7c84), color-stop(100%,#53676c));
+background: -webkit-linear-gradient(top, #6e7c84 0%,#53676c 100%);
+background: -o-linear-gradient(top, #6e7c84 0%,#53676c 100%);
+background: -ms-linear-gradient(top, #6e7c84 0%,#53676c 100%);
+background: linear-gradient(to bottom, #6e7c84 0%,#53676c 100%);
+filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#6e7c84', endColorstr='#53676c',GradientType=0 );
+color: #ccc;
+border: none;
+}
+footer a{
+  color: #EEE;
+}
+footer a:hover{
+  color: #EEE;
+  text-decoration: underline;
+}
+.menu-column .panel-default .panel-heading{
+background: #6e7c84;
+background: -moz-linear-gradient(top, #6e7c84 0%, #53676c 100%);
+background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#6e7c84), color-stop(100%,#53676c));
+background: -webkit-linear-gradient(top, #6e7c84 0%,#53676c 100%);
+background: -o-linear-gradient(top, #6e7c84 0%,#53676c 100%);
+background: -ms-linear-gradient(top, #6e7c84 0%,#53676c 100%);
+background: linear-gradient(to bottom, #6e7c84 0%,#53676c 100%);
+filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#6e7c84', endColorstr='#53676c',GradientType=0 );
+border-color: #444;
+}
+.menu-column .panel-default .panel-heading a{
+    color: #fff;
+}
+.menu-column .panel-default .panel-body{
+    background-color: #FFF;
+}
+#page-content .panel{
+    background: none;
+    border: 1px solid #D3D3D3;
+    box-shadow: none;
+}

BIN
app/Resources/public/css/themes/silver_line/fonts/TitilliumWeb-Bold.woff2


BIN
app/Resources/public/css/themes/silver_line/fonts/TitilliumWeb-Regular.woff2


BIN
app/Resources/public/css/themes/silver_line/fonts/TitilliumWeb-SemiBold.woff2


BIN
app/Resources/public/css/themes/silver_line/images/bg_menu.gif


BIN
app/Resources/public/css/themes/silver_line/images/header-logo.png


+ 169 - 0
app/Resources/public/css/themes/simplex/default.css

@@ -0,0 +1,169 @@
+/*!
+ * CSS Simplex - v. 2.0
+ * 2015 - Alex Aragón (aragonc@beeznest.com)
+ * Licensed GPL
+ * Based on Bootstrap
+*/
+
+@font-face {
+  font-family: 'Lato';
+  font-style: normal;
+  font-weight: 300;
+  src: local('Lato Light'), local('Lato-Light'), url(fonts/Lato-Light.woff2) format('woff2');
+}
+@font-face {
+  font-family: 'Lato';
+  font-style: normal;
+  font-weight: 400;
+  src: local('Lato Regular'), local('Lato-Regular'), url(fonts/Lato-Regular.woff2) format('woff2');
+}
+@font-face {
+  font-family: 'Lato';
+  font-style: normal;
+  font-weight: 700;
+  src: local('Lato Bold'), local('Lato-Bold'), url(fonts/Lato-Bold.woff2) format('woff2');
+}
+
+html {
+  -ms-text-size-adjust: 100%;
+  -webkit-text-size-adjust: 100%;
+}
+body {
+  margin: 0;
+  font-family: 'Lato', sans-serif;
+  line-height: 1.72222;
+}
+a{
+  color: #111111;
+}
+a:hover{
+  color: #34495E;
+  text-decoration: none;
+}
+.nav li a {
+padding: 15px 10px;
+}
+.navbar-default {
+background: #FBD232;
+border: none;
+}
+header{
+    background: #D3D3D3;
+}
+.navbar{
+    margin-bottom: 0;
+}
+#breadcrumb-bar{
+    padding-top: 10px;
+    background-color: #fff;
+}
+.navbar-default .navbar-brand {
+  color: #ffffff;
+}
+.navbar-default .navbar-brand:hover, .navbar-default .navbar-brand:focus {
+  color: #ededed;
+}
+.navbar-default .navbar-text {
+  color: #ffffff;
+}
+.navbar-default .navbar-nav > li > a {
+  color: #111;
+  text-transform: uppercase;
+  font-weight: bold;
+}
+.navbar-default .navbar-nav > li > a:hover, .navbar-default .navbar-nav > li > a:focus {
+color: #FFFFFF;
+background: #111111;
+}
+.navbar-default .navbar-nav > li > .dropdown-menu {
+  background: #FBD232;
+}
+.navbar-default .navbar-nav > li > .dropdown-menu > li > a {
+  color: #111111;
+  padding: 5px;
+}
+.navbar-default .navbar-nav > li > .dropdown-menu > li{
+    border: none;
+}
+.navbar-default .navbar-nav > li > .dropdown-menu > li > a:hover,
+.navbar-default .navbar-nav > li > .dropdown-menu > li > a:focus {
+  color: #ffffff;
+  background-color: #111111;
+}
+.navbar-default .navbar-nav > li > .dropdown-menu > li > .divider {
+  background-color: #0099c0;
+}
+.navbar-default .navbar-nav > .active > a, .navbar-default .navbar-nav > .active > a:hover, .navbar-default .navbar-nav > .active > a:focus {
+color: #FFFFFF;
+background: #111111;
+}
+.navbar-default .navbar-nav > .open > a, .navbar-default .navbar-nav > .open > a:hover, .navbar-default .navbar-nav > .open > a:focus {
+color: #FFFFFF;
+background: #111111;
+}
+.navbar-default .navbar-toggle {
+  border-color: #111;
+}
+.navbar-default .navbar-toggle:hover, .navbar-default .navbar-toggle:focus {
+  background-color: #111111;
+}
+.navbar-default .navbar-toggle .icon-bar {
+  background-color: #666;
+}
+.navbar-default .navbar-collapse,
+.navbar-default .navbar-form {
+  border-color: #111;
+}
+.navbar-default .navbar-link {
+  color: #ffffff;
+}
+.navbar-default .navbar-link:hover {
+  color: #ededed;
+}
+.badge{
+    background-color: #222222;
+}
+@media (max-width: 767px) {
+  .navbar-default .navbar-nav .open .dropdown-menu > li > a {
+    color: #ffffff;
+  }
+  .navbar-default .navbar-nav .open .dropdown-menu > li > a:hover, .navbar-default .navbar-nav .open .dropdown-menu > li > a:focus {
+    color: #ededed;
+    background-color: #6D0019;
+  }
+  .navbar-default .navbar-nav .open .dropdown-menu > .active > a, .navbar-default .navbar-nav .open .dropdown-menu > .active > a:hover, .navbar-default .navbar-nav .open .dropdown-menu > .active > a:focus {
+    color: #ededed;
+    background-color: #0099c0;
+  }
+}
+.breadcrumb{
+  background: #F9F9F9;
+  color: #006A84;
+}
+.nav li a:hover{
+    background: transparent;
+}
+.panel-default .panel-heading{
+    background-color: #EBECF2;
+}
+.panel-default{
+    border-color: #F3F3F4;
+}
+footer{
+background: #111111;
+color: #FBD232;
+border-top: 5px solid #FBD232;
+}
+footer a{
+  color: #ffffff;
+}
+footer a:hover{
+  color: #CCC;
+}
+.menu-column .panel-heading{
+    text-transform: uppercase;
+    background-color: #FBD232;
+}
+.menu-column .panel-heading a{
+    font-weight: bold;
+}

BIN
app/Resources/public/css/themes/simplex/fonts/Lato-Bold.woff2


BIN
app/Resources/public/css/themes/simplex/fonts/Lato-Light.woff2


BIN
app/Resources/public/css/themes/simplex/fonts/Lato-Regular.woff2


BIN
app/Resources/public/css/themes/simplex/images/header-logo.png


+ 2 - 1
composer.json

@@ -63,7 +63,7 @@
         "webit/eval-math": "dev-master",
         "fxp/composer-asset-plugin": "~1.0",
         "bower-asset/bootstrap": "3.3.*",
-        "bower-asset/fontawesome": "4.3.*",
+        "bower-asset/fontawesome": "4.4.*",
         "bower-asset/jquery-ui": "1.11.*",
         "bower-asset/bootstrap-daterangepicker": "1.3.*",
         "bower-asset/ckeditor": "4.*",
@@ -76,6 +76,7 @@
         "bower-asset/simplewebrtc": "1.15.*",
         "bower-asset/select2": "4.*",
         "bower-asset/MathJax": "2.5.*",
+        "bower-asset/webcamjs": "1.0.*",
         "clue/graph": "~0.9.0",
         "graphp/graphviz": "~0.2.0",
         "graphp/algorithms": "~0.8.0",

+ 3 - 3
main/admin/career_dashboard.php

@@ -119,8 +119,8 @@ foreach($career_array as $career_id => $data) {
     $career     = $data['name'];
     $promotions = $data['promotions'];
     $career = Display::url($career,'careers.php?action=edit&id='.$career_id);
-    $career = Display::tag('h3',$career);
-    echo '<tr><td style="background-color:#eee" colspan="3">'.$career.'</td></tr>';
+    $career = Display::tag('h4',$career);
+    echo '<tr><td style="background-color:#ECF0F1" colspan="3">'.$career.'</td></tr>';
     foreach($promotions as $promotion_id => $promotion) {
     	$promotion_name = $promotion['name'];
         $promotion_url  = Display::url($promotion_name,'promotions.php?action=edit&id='.$promotion_id);
@@ -133,7 +133,7 @@ foreach($career_array as $career_id => $data) {
         	$rowspan = 'rowspan="'.$count.'"';
         }
         echo '<td '.$rowspan.'>';
-        echo Display::tag('h4',$promotion_url);
+        echo Display::tag('h5',$promotion_url);
         echo '</td>';
         echo '</tr>';
 

+ 42 - 44
main/coursecopy/copy_course_session.php

@@ -55,14 +55,14 @@ function make_select_session_list($name, $sessions, $attr = array())
             $attributes .= ' '.$key.'="'.$value.'"';
         }
     }
-    $output = '<select name="'.$name.'" '.$attributes.'>';
+    $output = '<select id="session" class="form-control" name="'.$name.'" '.$attributes.'>';
 
     if (count($sessions) == 0) {
         $output .= '<option value = "0">'.get_lang('ThereIsNotStillASession').'</option>';
     } else {
         $output .= '<option value = "0">'.get_lang('SelectASession').'</option>';
     }
-
+ 
     if (is_array($sessions)) {
         foreach ($sessions as $session) {
             $categoryName = '';
@@ -86,50 +86,56 @@ function display_form()
     $sessions = SessionManager::get_sessions_list(array(), array('name', 'ASC'));
 
     // Actions
-    $html .= '<div class="actions">';
+    
     // Link back to the documents overview
-    $html .= '<a href="../admin/index.php">'.
+    $actionsLeft = '<a href="../admin/index.php">'.
         Display::return_icon('back.png', get_lang('BackTo').' '.get_lang('PlatformAdmin'), '', ICON_SIZE_MEDIUM).
         '</a>';
-    $html .= '</div>';
+    
+    
+    $html .= Display::toolbarAction('toolbar-copysession', array(0 => $actionsLeft));
 
-    $html .= Display::return_message(get_lang('CopyCourseFromSessionToSessionExplanation'));
+    $html .= Display::return_message(get_lang('CopyCourseFromSessionToSessionExplanation'), 'warning');
 
-    $html .= '<form name="formulaire" method="post" action="'.api_get_self().'" >';
-    $html .= '<table border="0" cellpadding="5" cellspacing="0" width="100%">';
+    $html .= '<form class="form-horizontal" name="formulaire" method="post" action="'.api_get_self().'" >';
+    $html .= '<div class="form-group">';
 
     // origin
-    $html .= '<tr><td width="15%"><b>'.get_lang('OriginCoursesFromSession').':</b></td>';
-    $html .= '<td width="10%" align="left">'.make_select_session_list('sessions_list_origin', $sessions, array('onchange' => 'javascript: xajax_search_courses(this.value,\'origin\');')).'</td>';
-    $html .= '<td width="50%"><div id="ajax_list_courses_origin">';
-    $html .= '<select id="origin" name="SessionCoursesListOrigin[]"  style="width:380px;"></select></div></td></tr>';
+    $html .= '<label class="col-sm-2 control-label">'.get_lang('OriginCoursesFromSession').': </label>';
+    $html .= '<div class="col-sm-5">'.make_select_session_list('sessions_list_origin', $sessions, array('onchange' => 'javascript: xajax_search_courses(this.value,\'origin\');')).'</div>';
+    $html .= '<div class="col-sm-5" id="ajax_list_courses_origin">';
+    $html .= '<select id="origin" class="form-control" name="SessionCoursesListOrigin[]" ></select>';
+    $html .= '</div></div>';
 
     //destination
-    $html .= '<tr><td width="15%"><b>'.get_lang('DestinationCoursesFromSession').':</b></td>';
-    $html .= '<td width="10%" align="left"><div id="ajax_sessions_list_destination">';
-    $html .= '<select name="sessions_list_destination" onchange="javascript: xajax_search_courses(this.value,\'destination\');">';
-    $html .= '<option value = "0">'.get_lang('ThereIsNotStillASession').'</option></select ></div></td>';
-
-    $html .= '<td width="50%">';
-    $html .= '<div id="ajax_list_courses_destination">';
-    $html .= '<select id="destination" name="SessionCoursesListDestination[]" style="width:380px;" ></select></div></td>';
-    $html .= '</tr></table>';
-
-    $html .= '<h4>'.get_lang('TypeOfCopy').'</h4>';
-    $html .= '<label class="radio"><input type="radio" id="copy_option_1" name="copy_option" value="full_copy" checked="checked"/>';
-    $html .= get_lang('FullCopy').'</label><br/>';
-    $html .= '<label class="radio"><input type="radio" id="copy_option_2" name="copy_option" value="select_items" disabled="disabled"/>';
-    $html .= ' '.get_lang('LetMeSelectItems').'</label><br/>';
-
-    $html .= '<label class="checkbox"><input type="checkbox" id="copy_base_content_id" name="copy_only_session_items" />'.get_lang('CopyOnlySessionItems').'</label><br /><br/>';
-
+    $html .= '<div class="form-group">';
+    $html .= '<label class="col-sm-2 control-label">' . get_lang('DestinationCoursesFromSession') . ': </label>';
+    $html .= '<div class="col-sm-5" id="ajax_sessions_list_destination">';
+    $html .= '<select class="form-control" name="sessions_list_destination" onchange="javascript: xajax_search_courses(this.value,\'destination\');">';
+    $html .= '<option value = "0">'.get_lang('ThereIsNotStillASession').'</option></select ></div>';
+
+    $html .= '<div class="col-sm-5" id="ajax_list_courses_destination">';
+    $html .= '<select id="destination" class="form-control" name="SessionCoursesListDestination[]" ></select>';
+    $html .= '</div></div>';
+    
+    $options = '<div class="radio"><label><input type="radio" id="copy_option_1" name="copy_option" value="full_copy" checked="checked"/>';
+    $options .= get_lang('FullCopy').'</label></div>';
+    $options .= '<div class="radio"><label><input type="radio" id="copy_option_2" name="copy_option" value="select_items" disabled="disabled"/>';
+    $options .= ' '.get_lang('LetMeSelectItems').'</label></div>';
+
+    $options .= '<div class="checkbox"><label><input type="checkbox" id="copy_base_content_id" name="copy_only_session_items" />'.get_lang('CopyOnlySessionItems').'</label></div>';
+     
+    $html .= Display::panel($options, get_lang('TypeOfCopy'));
+    
+    $html .= '<div class="form-group"><div class="col-sm-12">';
     $html .= '<button class="btn btn-success" type="submit" onclick="javascript:if(!confirm('."'".addslashes(api_htmlentities(get_lang('ConfirmYourChoice'), ENT_QUOTES))."'".')) return false;"><i class="fa fa-files-o"></i> '.get_lang('CopyCourse').'</button>';
 
     // Add Security token
     $html .= '<input type="hidden" value="' . Security::get_token() . '" name="sec_token">';
+    $html .= '</div></div>';
 
     $html .= '</form>';
-
+    
     echo $html;
 }
 
@@ -145,7 +151,7 @@ function search_courses($id_session, $type)
         if ($type == 'origin') {
             $course_list = SessionManager::get_course_list_by_session_id($id_session);
             $temp_course_list = array();
-            $return .= '<select id="origin" name="SessionCoursesListOrigin[]" style="width:380px;" onclick="javascript: checkSelected(this.id,\'copy_option_2\',\'title_option2\',\'destination\');">';
+            $return .= '<select id="origin" name="SessionCoursesListOrigin[]" class="form-control" onclick="javascript: checkSelected(this.id,\'copy_option_2\',\'title_option2\',\'destination\');">';
 
             foreach ($course_list as $course) {
                 $temp_course_list[] = "'{$course['code']}'";
@@ -161,7 +167,7 @@ function search_courses($id_session, $type)
 
                 $sessions = SessionManager::get_sessions_list(array(), array('name', 'ASC'));
 
-                $select_destination .= '<select name="sessions_list_destination" width="380px" onchange = "javascript: xajax_search_courses(this.value,\'destination\');">';
+                $select_destination .= '<select name="sessions_list_destination" class="form-control" onchange = "javascript: xajax_search_courses(this.value,\'destination\');">';
                 $select_destination .= '<option value = "0">-- '.get_lang('SelectASession').' --</option>';
                 foreach ($sessions as $session) {
                     if ($id_session == $session['id']) {
@@ -175,14 +181,14 @@ function search_courses($id_session, $type)
                 $select_destination .= '</select>';
                 $xajax_response -> addAssign('ajax_sessions_list_destination', 'innerHTML', api_utf8_encode($select_destination));
             } else {
-                $select_destination .= '<select name="sessions_list_destination" width="380px" onchange = "javascript: xajax_search_courses(this.value,\'destination\');">';
+                $select_destination .= '<select name="sessions_list_destination" class="form-control" onchange = "javascript: xajax_search_courses(this.value,\'destination\');">';
                 $select_destination .= '<option value = "0">'.get_lang('ThereIsNotStillASession').'</option>';
                 $select_destination .= '</select>';
                 $xajax_response -> addAssign('ajax_sessions_list_destination', 'innerHTML', api_utf8_encode($select_destination));
             }
 
             // Select multiple destination empty
-            $select_multiple_empty = '<select id="destination" name="SessionCoursesListDestination[]" style="width:380px;"></select>';
+            $select_multiple_empty = '<select id="destination" name="SessionCoursesListDestination[]" class="form-control"></select>';
 
             // Send response by ajax
             $xajax_response -> addAssign('ajax_list_courses_origin', 'innerHTML', api_utf8_encode($return));
@@ -201,7 +207,7 @@ function search_courses($id_session, $type)
             $rs = Database::query($sql);
 
             $course_list_destination = array();
-            $return .= '<select id="destination" name="SessionCoursesListDestination[]" style="width:380px;" >';
+            $return .= '<select id="destination" name="SessionCoursesListDestination[]" class="form-control">';
             while ($course = Database :: fetch_array($rs)) {
                 $course_list_destination[] = $course['code'];
                 $return .= '<option value="'.$course['code'].'" title="'.@htmlspecialchars($course['title'].' ('.$course['visual_code'].')', ENT_QUOTES, api_get_system_encoding()).'">'.$course['title'].' ('.$course['visual_code'].')</option>';
@@ -250,14 +256,6 @@ function checkSelected(id_select,id_radio,id_title,id_destination) {
             }
         }
    }
-
-   if (num == 1) {
-      document.getElementById(id_radio).disabled = false;
-      document.getElementById(id_title).style.color = \'#000\';
-   } else {
-      document.getElementById(id_radio).disabled = true;
-      document.getElementById(id_title).style.color = \'#aaa\';
-   }
 }
 </script>';
 

+ 98 - 69
main/document/webcam_clip.php

@@ -8,6 +8,7 @@
  *
  * @author Juan Carlos Raña Trabado herodoto@telefonica.net
  * @since 7/jun/2012
+ * @Updated 04/09/2015 Upgrade to WebCamJS
 */
 require_once '../inc/global.inc.php';
 
@@ -127,78 +128,77 @@ echo '</div>';
 <div align="center">
     <h2><?php echo get_lang('TakeYourPhotos'); ?></h2>
 </div>
-<div align="center" style="padding-left:50px;">
-<table><tr><td valign=top>
-<h3><?php echo get_lang('LocalInputImage'); ?></h3>
-<!-- First, include the JPEGCam JavaScript Library -->
-	<script type="text/javascript" src="<?php echo api_get_path(WEB_LIBRARY_PATH); ?>jpegcam/webcam.js"></script>
-
-	<!-- Configure a few settings -->
-	<script language="JavaScript">
-		var clip_filename='video_clip.jpg';
-		//var clip_filename='<?php //echo date('YmdHis') . '.jpg'; ?>';
-		webcam.set_swf_url ( '<?php echo api_get_path(WEB_LIBRARY_PATH); ?>jpegcam//webcam.swf?blackboard.png' );
-		webcam.set_shutter_sound( true,'<?php echo api_get_path(WEB_LIBRARY_PATH); ?>jpegcam/shutter.mp3' ); // true play shutter click sound
-		webcam.set_quality( 90 ); // JPEG quality (1 - 100)
-		webcam.set_api_url( '<?php echo api_get_path(WEB_LIBRARY_PATH); ?>jpegcam/webcam_receiver.php?webcamname='+escape(clip_filename)+'&webcamdir=<?php echo $webcamdir; ?>&webcamuserid=<?php echo $webcamuserid; ?>' );
-
-	</script>
-
-	<!-- Next, write the movie to the page at 320x240 -->
+<div align="center">
+<table><tr><td valign='top' align='center'>
+<h3 align='center'><?php echo get_lang('LocalInputImage'); ?></h3>
+    <!-- Including New Lib WebCamJS upgrading from JPEGCam -->
+    <script type="text/javascript" src="<?php echo api_get_path(WEB_PATH); ?>web/assets/webcamjs/webcam.js"></script>
+    <!-- Adding a div container for the new live camera with some cool style options-->
+    <div class="webcamclip_bg">
+        <div id="chamilo-camera"></div>
+    </div>
+	<!-- Configure a few settings and attach the camera to the div container -->
 	<script language="JavaScript">
-		document.write( webcam.get_html(320, 240) );
+		Webcam.set({
+            width: 320,
+            height: 240,
+            image_format: 'jpeg',
+            jpeg_quality: 90
+        });
+        Webcam.attach( '#chamilo-camera' );
+        //This line Fix a minor bug that made a conflict with a videochat feature in another module file
+        $('video').addClass('skip');
 	</script>
 
-	<!-- Some buttons for controlling things -->
-	<br/>
-    <form>
-    <br/>
-		<input type=button value="<?php echo get_lang('Snapshot'); ?>" onClick="webcam.freeze()">
-		<input type=button value="<?php echo get_lang('Clean'); ?>" onClick="webcam.reset()">
-        <input type=button value="<?php echo get_lang('Send'); ?>" onClick="do_upload()">
-        &nbsp;&nbsp;||&nbsp;&nbsp;
-        <input type=button value="<?php echo get_lang('Auto'); ?>" onClick="start_video();">
-		<input type=button value="<?php echo get_lang('Stop'); ?>" onClick="stop_video()">
-        <br/>
-        <input type=button value="<?php echo get_lang('Configure'); ?>" onClick="webcam.configure()">
-
-	</form>
-
-	<!-- Code to handle the server response (see webcam_receiver.php) -->
+	<!-- Using now Jquery to do the webcamJS Functions and handle the server response (see webcam_receiver.php now in webcamJS directory) -->
 	<script language="JavaScript">
-		webcam.set_hook( 'onComplete', 'my_completion_handler' );
-
-		function do_upload() {
-			// upload to server
-			if (this.loaded){
-				document.getElementById('upload_results').innerHTML = '<h3><?php echo get_lang('Uploading'); ?></h3>';
-			}
-			webcam.upload();
-		}
-
-		function my_completion_handler(msg) {
-			// extract URL out of PHP output
-			if (msg.match(/(http\:\/\/\S+)/)) {
-				var image_url = RegExp.$1;
-
-				image_url=image_url.replace(/\\/g,'/').replace( /.*\//, '' );// extract basename
-				image_url='<?php echo api_get_path(WEB_COURSE_PATH).$_course['path'].'/document/'.$dir;?>'+image_url+'<?php echo '?'.api_get_cidreq(); ?>';
-
-				// show JPEG image in page
-				document.getElementById('upload_results').innerHTML =
-				'<div style="width: 320px;">' +
-					'<h3><?php echo get_lang('ClipSent'); ?></h3>' +
-					'<img src="' + image_url + '">' +
-					'</div>';
-				// reset camera for another shot
-				webcam.reset();
-			}
-			else alert("PHP Error: " + msg);
-		}
+		$(document).ready(function() {
+           $('#btnCapture').click(function() {
+               Webcam.freeze();
+               return false;
+           });
+           
+           $('#btnClean').click(function() {
+               Webcam.unfreeze();
+               return false;
+           });
+           
+           $('#btnSave').click(function() {
+               snap();
+               return false;
+           });
+           
+           $('#btnAuto').click(function() {
+               start_video();
+               return false;
+           });
+           
+           $('#btnStop').click(function() {
+               stop_video();
+               return false;
+           });
+        });
+        
+        function snap() {
+            Webcam.snap( function(data_uri) {
+                  var clip_filename='video_clip.jpg';
+                  var url = 'webcam_receiver.php?webcamname='+escape(clip_filename)+'&webcamdir=<?php echo $webcamdir; ?>&webcamuserid=<?php echo $webcamuserid; ?>';
+                  Webcam.upload(data_uri, url, function(code, response){
+                      $('#upload_results').html(
+                          '<h3>'+response+'</h3>' +
+                          '<div>'+
+                          '<img src="' + data_uri + '" class="webcamclip_bg">' +
+                          '</div>'+
+                          '</div>'+
+                          '<p hidden="true">'+code+'</p>'
+                      );
+                  });
+              });
+        }
 	</script>
 
      <script language=javascript>
-	   var internaval=null;
+	   var interval=null;
 	   var timeout=null;
 	   var counter=0;
 	   var fps=1000;//one frame per second
@@ -207,18 +207,18 @@ echo '</div>';
 
 	   function stop_video() {
 			interval=window.clearInterval(interval);
+            return false;
 	   }
 
 	   function start_video() {
-		   	webcam.set_stealth( true ); // do not freeze image upon capture
 		 	interval=window.setInterval("clip_send_video()",fps);
 	   }
 
 	   function clip_send_video() {
-		   counter++
+		   counter++;
 		   timeout=setTimeout('stop_video()',maxtime);
 		   if(maxclip>=counter){
-		       webcam.snap();// clip and upload
+		       snap();// clip and upload
 		   }
 		   else {
 			   interval=window.clearInterval(interval);
@@ -227,9 +227,38 @@ echo '</div>';
  </script>
 
 
-	</td><td width=50>&nbsp;</td><td valign=top>
+	</td><td width=50></td><td valign='top' align='center'>
 		<div id="upload_results" style="background-color:#ffffff;"></div>
 	</td></tr></table>
+    
+    <!-- Implementing Button html5 Tags instead Inputs and some cool bootstrap button styles -->
+    <div>
+        <br/>
+            <form>
+                <br/>
+                <button id="btnCapture" class="btn btn-danger">
+                <i class="fa fa-camera"></i>
+                <?php echo get_lang('Snapshot'); ?>
+                </button>
+                <button id="btnClean" class="btn btn-success">
+                <i class="fa fa-refresh"></i>
+                <?php echo get_lang('Clean'); ?>
+                </button>
+                <button id="btnSave" class="btn btn-primary">
+                <i class="fa fa-save"></i>
+                <?php echo get_lang('Save'); ?>
+                </button>
+                &nbsp;&nbsp;||&nbsp;&nbsp;
+                <button id="btnAuto" class="btn btn-default">
+                <?php echo get_lang('Auto'); ?>
+                </button>
+                <button id="btnStop" class="btn btn-default">
+                <?php echo get_lang('Stop'); ?>
+                </button>
+                <br/>
+            </form>
+        <br/>
+   </div>
 </div>
 
 <?php

+ 10 - 18
main/inc/lib/jpegcam/webcam_receiver.php → main/document/webcam_receiver.php

@@ -1,9 +1,11 @@
 <?php
 
-/* JPEGCam Script */
+/* JPEGCam Script *****UPDATED to lib webcamJS 2015-09-04***** */
 /* Receives JPEG webcam submission and saves to local file. */
 /* Make sure your directory has permission to write files as your web server user! */
-require_once '../../../inc/global.inc.php';
+
+//Changes on directory because move the proper script to the new lib upgrade directory
+require_once '../inc/global.inc.php';
 ////Add security from Chamilo
 api_protect_course_script();
 api_block_anonymous_users();
@@ -46,11 +48,11 @@ if($ext!= 'jpg'){
 //Do not use here check Fileinfo method because return: text/plain                //CHECK THIS BEFORE COMMIT
 
 $dirBaseDocuments = api_get_path(SYS_COURSE_PATH).$_course['path'].'/document';
-$saveDir=$dirBaseDocuments.$webcamdir;
+$saveDir = $dirBaseDocuments.$webcamdir;
 $current_session_id = api_get_session_id();
 $groupId = api_get_group_id();
 
-//avoid duplicates
+//Avoid duplicates
 $webcamname_to_save=$webcamname;
 $title_to_save=str_replace('_',' ',$webcamname);
 $webcamname_noex=basename($webcamname, ".jpg");
@@ -62,29 +64,19 @@ if (file_exists($saveDir.'/'.$webcamname_noex.'.'.$ext)){
 		$title_to_save = str_replace('_',' ',$title_to_save);
 }
 
-
 $documentPath = $saveDir.'/'.$webcamname_to_save;
 
-
 //read content
-$content = file_get_contents('php://input');
+//Change to move_uploaded_file() function instead file_get_contents() to adapt the new lib
+$content = move_uploaded_file($_FILES['webcam']['tmp_name'], $documentPath);
 if (!$content) {
-	print "ERROR: Failed to read data\n";
+	print "PHP ERROR: Failed to read data\n";
 	exit();
 }
 
-//add to disk
-$fh = fopen($documentPath, 'w') or die("can't open file");
-fwrite($fh, $content);
-fclose($fh);
-
-
-//
 //add document to database
 	$doc_id = add_document($_course, $webcamdir.'/'.$webcamname_to_save, 'file', filesize($documentPath), $title_to_save);
 	api_item_property_update($_course, TOOL_DOCUMENT, $doc_id, 'DocumentAdded', $_user['user_id'], $groupId, null, null, null, $current_session_id);
 ///
 $url = 'http://' . $_SERVER['HTTP_HOST'] . dirname($_SERVER['REQUEST_URI']) . '/' . $documentPath;
-print "$url\n";
-
-?>
+print get_lang('ClipSent');

تفاوت فایلی نمایش داده نمی شود زیرا این فایل بسیار بزرگ است
+ 0 - 6
main/inc/lib/javascript/bootstrap-select.min.js


+ 7 - 5
app/Resources/public/css/bootstrap-select.css → main/inc/lib/javascript/bootstrap-select/css/bootstrap-select.css

@@ -1,8 +1,10 @@
-/*!
- * Bootstrap-select v1.7.2 (http://silviomoreto.github.io/bootstrap-select)
- *
- */
-
+/*!
+ * Bootstrap-select v1.7.3 (http://silviomoreto.github.io/bootstrap-select)
+ *
+ * Copyright 2013-2015 bootstrap-select
+ * Licensed under MIT (https://github.com/silviomoreto/bootstrap-select/blob/master/LICENSE)
+ */
+
 .bootstrap-select {
   width: 220px \0;
   /*IE9 and below*/

تفاوت فایلی نمایش داده نمی شود زیرا این فایل بسیار بزرگ است
+ 0 - 0
main/inc/lib/javascript/bootstrap-select/css/bootstrap-select.css.map


تفاوت فایلی نمایش داده نمی شود زیرا این فایل بسیار بزرگ است
+ 5 - 0
main/inc/lib/javascript/bootstrap-select/css/bootstrap-select.min.css


+ 1650 - 0
main/inc/lib/javascript/bootstrap-select/js/bootstrap-select.js

@@ -0,0 +1,1650 @@
+/*!
+ * Bootstrap-select v1.7.3 (http://silviomoreto.github.io/bootstrap-select)
+ *
+ * Copyright 2013-2015 bootstrap-select
+ * Licensed under MIT (https://github.com/silviomoreto/bootstrap-select/blob/master/LICENSE)
+ */
+
+(function (root, factory) {
+  if (typeof define === 'function' && define.amd) {
+    // AMD. Register as an anonymous module unless amdModuleId is set
+    define(["jquery"], function (a0) {
+      return (factory(a0));
+    });
+  } else if (typeof exports === 'object') {
+    // Node. Does not work with strict CommonJS, but
+    // only CommonJS-like environments that support module.exports,
+    // like Node.
+    module.exports = factory(require("jquery"));
+  } else {
+    factory(jQuery);
+  }
+}(this, function () {
+
+(function ($) {
+  'use strict';
+
+  //<editor-fold desc="Shims">
+  if (!String.prototype.includes) {
+    (function () {
+      'use strict'; // needed to support `apply`/`call` with `undefined`/`null`
+      var toString = {}.toString;
+      var defineProperty = (function () {
+        // IE 8 only supports `Object.defineProperty` on DOM elements
+        try {
+          var object = {};
+          var $defineProperty = Object.defineProperty;
+          var result = $defineProperty(object, object, object) && $defineProperty;
+        } catch (error) {
+        }
+        return result;
+      }());
+      var indexOf = ''.indexOf;
+      var includes = function (search) {
+        if (this == null) {
+          throw TypeError();
+        }
+        var string = String(this);
+        if (search && toString.call(search) == '[object RegExp]') {
+          throw TypeError();
+        }
+        var stringLength = string.length;
+        var searchString = String(search);
+        var searchLength = searchString.length;
+        var position = arguments.length > 1 ? arguments[1] : undefined;
+        // `ToInteger`
+        var pos = position ? Number(position) : 0;
+        if (pos != pos) { // better `isNaN`
+          pos = 0;
+        }
+        var start = Math.min(Math.max(pos, 0), stringLength);
+        // Avoid the `indexOf` call if no match is possible
+        if (searchLength + start > stringLength) {
+          return false;
+        }
+        return indexOf.call(string, searchString, pos) != -1;
+      };
+      if (defineProperty) {
+        defineProperty(String.prototype, 'includes', {
+          'value': includes,
+          'configurable': true,
+          'writable': true
+        });
+      } else {
+        String.prototype.includes = includes;
+      }
+    }());
+  }
+
+  if (!String.prototype.startsWith) {
+    (function () {
+      'use strict'; // needed to support `apply`/`call` with `undefined`/`null`
+      var defineProperty = (function () {
+        // IE 8 only supports `Object.defineProperty` on DOM elements
+        try {
+          var object = {};
+          var $defineProperty = Object.defineProperty;
+          var result = $defineProperty(object, object, object) && $defineProperty;
+        } catch (error) {
+        }
+        return result;
+      }());
+      var toString = {}.toString;
+      var startsWith = function (search) {
+        if (this == null) {
+          throw TypeError();
+        }
+        var string = String(this);
+        if (search && toString.call(search) == '[object RegExp]') {
+          throw TypeError();
+        }
+        var stringLength = string.length;
+        var searchString = String(search);
+        var searchLength = searchString.length;
+        var position = arguments.length > 1 ? arguments[1] : undefined;
+        // `ToInteger`
+        var pos = position ? Number(position) : 0;
+        if (pos != pos) { // better `isNaN`
+          pos = 0;
+        }
+        var start = Math.min(Math.max(pos, 0), stringLength);
+        // Avoid the `indexOf` call if no match is possible
+        if (searchLength + start > stringLength) {
+          return false;
+        }
+        var index = -1;
+        while (++index < searchLength) {
+          if (string.charCodeAt(start + index) != searchString.charCodeAt(index)) {
+            return false;
+          }
+        }
+        return true;
+      };
+      if (defineProperty) {
+        defineProperty(String.prototype, 'startsWith', {
+          'value': startsWith,
+          'configurable': true,
+          'writable': true
+        });
+      } else {
+        String.prototype.startsWith = startsWith;
+      }
+    }());
+  }
+
+  if (!Object.keys) {
+    Object.keys = function (
+      o, // object
+      k, // key
+      r  // result array
+      ){
+      // initialize object and result
+      r=[];
+      // iterate over object keys
+      for (k in o) 
+          // fill result array with non-prototypical keys
+        r.hasOwnProperty.call(o, k) && r.push(k);
+      // return result
+      return r
+    };
+  }
+
+  $.fn.triggerNative = function (eventName) {
+    var el = this[0],
+        event;
+
+    if (el.dispatchEvent) {
+      if (typeof Event === 'function') {
+        // For modern browsers
+        event = new Event(eventName, {
+          bubbles: true
+        });
+      } else {
+        // For IE since it doesn't support Event constructor
+        event = document.createEvent('Event');
+        event.initEvent(eventName, true, false);
+      }
+
+      el.dispatchEvent(event);
+    } else {
+      if (el.fireEvent) {
+        event = document.createEventObject();
+        event.eventType = eventName;
+        el.fireEvent('on' + eventName, event);
+      }
+
+      this.trigger(eventName);
+    }
+  };
+  //</editor-fold>
+
+  // Case insensitive contains search
+  $.expr[':'].icontains = function (obj, index, meta) {
+    var $obj = $(obj);
+    var haystack = ($obj.data('tokens') || $obj.text()).toUpperCase();
+    return haystack.includes(meta[3].toUpperCase());
+  };
+
+  // Case insensitive begins search
+  $.expr[':'].ibegins = function (obj, index, meta) {
+    var $obj = $(obj);
+    var haystack = ($obj.data('tokens') || $obj.text()).toUpperCase();
+    return haystack.startsWith(meta[3].toUpperCase());
+  };
+
+  // Case and accent insensitive contains search
+  $.expr[':'].aicontains = function (obj, index, meta) {
+    var $obj = $(obj);
+    var haystack = ($obj.data('tokens') || $obj.data('normalizedText') || $obj.text()).toUpperCase();
+    return haystack.includes(meta[3].toUpperCase());
+  };
+
+  // Case and accent insensitive begins search
+  $.expr[':'].aibegins = function (obj, index, meta) {
+    var $obj = $(obj);
+    var haystack = ($obj.data('tokens') || $obj.data('normalizedText') || $obj.text()).toUpperCase();
+    return haystack.startsWith(meta[3].toUpperCase());
+  };
+
+  /**
+   * Remove all diatrics from the given text.
+   * @access private
+   * @param {String} text
+   * @returns {String}
+   */
+  function normalizeToBase(text) {
+    var rExps = [
+      {re: /[\xC0-\xC6]/g, ch: "A"},
+      {re: /[\xE0-\xE6]/g, ch: "a"},
+      {re: /[\xC8-\xCB]/g, ch: "E"},
+      {re: /[\xE8-\xEB]/g, ch: "e"},
+      {re: /[\xCC-\xCF]/g, ch: "I"},
+      {re: /[\xEC-\xEF]/g, ch: "i"},
+      {re: /[\xD2-\xD6]/g, ch: "O"},
+      {re: /[\xF2-\xF6]/g, ch: "o"},
+      {re: /[\xD9-\xDC]/g, ch: "U"},
+      {re: /[\xF9-\xFC]/g, ch: "u"},
+      {re: /[\xC7-\xE7]/g, ch: "c"},
+      {re: /[\xD1]/g, ch: "N"},
+      {re: /[\xF1]/g, ch: "n"}
+    ];
+    $.each(rExps, function () {
+      text = text.replace(this.re, this.ch);
+    });
+    return text;
+  }
+
+
+  function htmlEscape(html) {
+    var escapeMap = {
+      '&': '&amp;',
+      '<': '&lt;',
+      '>': '&gt;',
+      '"': '&quot;',
+      "'": '&#x27;',
+      '`': '&#x60;'
+    };
+    var source = '(?:' + Object.keys(escapeMap).join('|') + ')',
+        testRegexp = new RegExp(source),
+        replaceRegexp = new RegExp(source, 'g'),
+        string = html == null ? '' : '' + html;
+    return testRegexp.test(string) ? string.replace(replaceRegexp, function (match) {
+      return escapeMap[match];
+    }) : string;
+  }
+
+  var Selectpicker = function (element, options, e) {
+    if (e) {
+      e.stopPropagation();
+      e.preventDefault();
+    }
+
+    this.$element = $(element);
+    this.$newElement = null;
+    this.$button = null;
+    this.$menu = null;
+    this.$lis = null;
+    this.options = options;
+
+    // If we have no title yet, try to pull it from the html title attribute (jQuery doesnt' pick it up as it's not a
+    // data-attribute)
+    if (this.options.title === null) {
+      this.options.title = this.$element.attr('title');
+    }
+
+    //Expose public methods
+    this.val = Selectpicker.prototype.val;
+    this.render = Selectpicker.prototype.render;
+    this.refresh = Selectpicker.prototype.refresh;
+    this.setStyle = Selectpicker.prototype.setStyle;
+    this.selectAll = Selectpicker.prototype.selectAll;
+    this.deselectAll = Selectpicker.prototype.deselectAll;
+    this.destroy = Selectpicker.prototype.remove;
+    this.remove = Selectpicker.prototype.remove;
+    this.show = Selectpicker.prototype.show;
+    this.hide = Selectpicker.prototype.hide;
+
+    this.init();
+  };
+
+  Selectpicker.VERSION = '1.7.2';
+
+  // part of this is duplicated in i18n/defaults-en_US.js. Make sure to update both.
+  Selectpicker.DEFAULTS = {
+    noneSelectedText: 'Nothing selected',
+    noneResultsText: 'No results matched {0}',
+    countSelectedText: function (numSelected, numTotal) {
+      return (numSelected == 1) ? "{0} item selected" : "{0} items selected";
+    },
+    maxOptionsText: function (numAll, numGroup) {
+      return [
+        (numAll == 1) ? 'Limit reached ({n} item max)' : 'Limit reached ({n} items max)',
+        (numGroup == 1) ? 'Group limit reached ({n} item max)' : 'Group limit reached ({n} items max)'
+      ];
+    },
+    selectAllText: 'Select All',
+    deselectAllText: 'Deselect All',
+    doneButton: false,
+    doneButtonText: 'Close',
+    multipleSeparator: ', ',
+    styleBase: 'btn',
+    style: 'btn-default',
+    size: 'auto',
+    title: null,
+    selectedTextFormat: 'values',
+    width: false,
+    container: false,
+    hideDisabled: false,
+    showSubtext: false,
+    showIcon: true,
+    showContent: true,
+    dropupAuto: true,
+    header: false,
+    liveSearch: false,
+    liveSearchPlaceholder: null,
+    liveSearchNormalize: false,
+    liveSearchStyle: 'contains',
+    actionsBox: false,
+    iconBase: 'glyphicon',
+    tickIcon: 'glyphicon-ok',
+    maxOptions: false,
+    mobile: false,
+    selectOnTab: false,
+    dropdownAlignRight: false
+  };
+
+  Selectpicker.prototype = {
+
+    constructor: Selectpicker,
+
+    init: function () {
+      var that = this,
+          id = this.$element.attr('id');
+
+      this.$element.addClass('bs-select-hidden');
+      // store originalIndex (key) and newIndex (value) in this.liObj for fast accessibility
+      // allows us to do this.$lis.eq(that.liObj[index]) instead of this.$lis.filter('[data-original-index="' + index + '"]')
+      this.liObj = {};
+      this.multiple = this.$element.prop('multiple');
+      this.autofocus = this.$element.prop('autofocus');
+      this.$newElement = this.createView();
+      this.$element.after(this.$newElement);
+      this.$button = this.$newElement.children('button');
+      this.$menu = this.$newElement.children('.dropdown-menu');
+      this.$menuInner = this.$menu.children('.inner');
+      this.$searchbox = this.$menu.find('input');
+
+      if (this.options.dropdownAlignRight)
+        this.$menu.addClass('dropdown-menu-right');
+
+      if (typeof id !== 'undefined') {
+        this.$button.attr('data-id', id);
+        $('label[for="' + id + '"]').click(function (e) {
+          e.preventDefault();
+          that.$button.focus();
+        });
+      }
+
+      this.checkDisabled();
+      this.clickListener();
+      if (this.options.liveSearch) this.liveSearchListener();
+      this.render();
+      this.setStyle();
+      this.setWidth();
+      if (this.options.container) this.selectPosition();
+      this.$menu.data('this', this);
+      this.$newElement.data('this', this);
+      if (this.options.mobile) this.mobile();
+
+      this.$newElement.on('hide.bs.dropdown', function (e) {
+        that.$element.trigger('hide.bs.select', e);
+      });
+      
+      this.$newElement.on('hidden.bs.dropdown', function (e) {
+        that.$element.trigger('hidden.bs.select', e);
+      });
+      
+      this.$newElement.on('show.bs.dropdown', function (e) {
+        that.$element.trigger('show.bs.select', e);
+      });
+      
+      this.$newElement.on('shown.bs.dropdown', function (e) {
+        that.$element.trigger('shown.bs.select', e);
+      });
+
+      setTimeout(function () {
+        that.$element.trigger('loaded.bs.select');
+      });
+    },
+
+    createDropdown: function () {
+      // Options
+      // If we are multiple, then add the show-tick class by default
+      var multiple = this.multiple ? ' show-tick' : '',
+          inputGroup = this.$element.parent().hasClass('input-group') ? ' input-group-btn' : '',
+          autofocus = this.autofocus ? ' autofocus' : '';
+      // Elements
+      var header = this.options.header ? '<div class="popover-title"><button type="button" class="close" aria-hidden="true">&times;</button>' + this.options.header + '</div>' : '';
+      var searchbox = this.options.liveSearch ?
+      '<div class="bs-searchbox">' +
+      '<input type="text" class="form-control" autocomplete="off"' +
+      (null === this.options.liveSearchPlaceholder ? '' : ' placeholder="' + htmlEscape(this.options.liveSearchPlaceholder) + '"') + '>' +
+      '</div>'
+          : '';
+      var actionsbox = this.multiple && this.options.actionsBox ?
+      '<div class="bs-actionsbox">' +
+      '<div class="btn-group btn-group-sm btn-block">' +
+      '<button type="button" class="actions-btn bs-select-all btn btn-default">' +
+      this.options.selectAllText +
+      '</button>' +
+      '<button type="button" class="actions-btn bs-deselect-all btn btn-default">' +
+      this.options.deselectAllText +
+      '</button>' +
+      '</div>' +
+      '</div>'
+          : '';
+      var donebutton = this.multiple && this.options.doneButton ?
+      '<div class="bs-donebutton">' +
+      '<div class="btn-group btn-block">' +
+      '<button type="button" class="btn btn-sm btn-default">' +
+      this.options.doneButtonText +
+      '</button>' +
+      '</div>' +
+      '</div>'
+          : '';
+      var drop =
+          '<div class="btn-group bootstrap-select' + multiple + inputGroup + '">' +
+          '<button type="button" class="' + this.options.styleBase + ' dropdown-toggle" data-toggle="dropdown"' + autofocus + '>' +
+          '<span class="filter-option pull-left"></span>&nbsp;' +
+          '<span class="caret"></span>' +
+          '</button>' +
+          '<div class="dropdown-menu open">' +
+          header +
+          searchbox +
+          actionsbox +
+          '<ul class="dropdown-menu inner" role="menu">' +
+          '</ul>' +
+          donebutton +
+          '</div>' +
+          '</div>';
+
+      return $(drop);
+    },
+
+    createView: function () {
+      var $drop = this.createDropdown(),
+          li = this.createLi();
+
+      $drop.find('ul')[0].innerHTML = li;
+      return $drop;
+    },
+
+    reloadLi: function () {
+      //Remove all children.
+      this.destroyLi();
+      //Re build
+      var li = this.createLi();
+      this.$menuInner[0].innerHTML = li;
+    },
+
+    destroyLi: function () {
+      this.$menu.find('li').remove();
+    },
+
+    createLi: function () {
+      var that = this,
+          _li = [],
+          optID = 0,
+          titleOption = document.createElement('option'),
+          liIndex = -1; // increment liIndex whenever a new <li> element is created to ensure liObj is correct
+
+      // Helper functions
+      /**
+       * @param content
+       * @param [index]
+       * @param [classes]
+       * @param [optgroup]
+       * @returns {string}
+       */
+      var generateLI = function (content, index, classes, optgroup) {
+        return '<li' +
+            ((typeof classes !== 'undefined' & '' !== classes) ? ' class="' + classes + '"' : '') +
+            ((typeof index !== 'undefined' & null !== index) ? ' data-original-index="' + index + '"' : '') +
+            ((typeof optgroup !== 'undefined' & null !== optgroup) ? 'data-optgroup="' + optgroup + '"' : '') +
+            '>' + content + '</li>';
+      };
+
+      /**
+       * @param text
+       * @param [classes]
+       * @param [inline]
+       * @param [tokens]
+       * @returns {string}
+       */
+      var generateA = function (text, classes, inline, tokens) {
+        return '<a tabindex="0"' +
+            (typeof classes !== 'undefined' ? ' class="' + classes + '"' : '') +
+            (typeof inline !== 'undefined' ? ' style="' + inline + '"' : '') +
+            (that.options.liveSearchNormalize ? ' data-normalized-text="' + normalizeToBase(htmlEscape(text)) + '"' : '') +
+            (typeof tokens !== 'undefined' || tokens !== null ? ' data-tokens="' + tokens + '"' : '') +
+            '>' + text +
+            '<span class="' + that.options.iconBase + ' ' + that.options.tickIcon + ' check-mark"></span>' +
+            '</a>';
+      };
+
+      if (this.options.title && !this.multiple) {
+        // this option doesn't create a new <li> element, but does add a new option, so liIndex is decreased
+        // since liObj is recalculated on every refresh, liIndex needs to be decreased even if the titleOption is already appended
+        liIndex--;
+
+        if (!this.$element.find('.bs-title-option').length) {
+          // Use native JS to prepend option (faster)
+          var element = this.$element[0];
+          titleOption.className = 'bs-title-option';
+          titleOption.appendChild(document.createTextNode(this.options.title));
+          titleOption.value = '';
+          element.insertBefore(titleOption, element.firstChild);
+          // Check if selected attribute is already set on an option. If not, select the titleOption option.
+          if ($(element.options[element.selectedIndex]).attr('selected') === undefined) titleOption.selected = true;
+        }
+      }
+
+      this.$element.find('option').each(function (index) {
+        var $this = $(this);
+
+        liIndex++;
+
+        if ($this.hasClass('bs-title-option')) return;
+
+        // Get the class and text for the option
+        var optionClass = this.className || '',
+            inline = this.style.cssText,
+            text = $this.data('content') ? $this.data('content') : $this.html(),
+            tokens = $this.data('tokens') ? $this.data('tokens') : null,
+            subtext = typeof $this.data('subtext') !== 'undefined' ? '<small class="text-muted">' + $this.data('subtext') + '</small>' : '',
+            icon = typeof $this.data('icon') !== 'undefined' ? '<span class="' + that.options.iconBase + ' ' + $this.data('icon') + '"></span> ' : '',
+            isDisabled = this.disabled || (this.parentElement.tagName === 'OPTGROUP' && this.parentElement.disabled);
+
+        if (icon !== '' && isDisabled) {
+          icon = '<span>' + icon + '</span>';
+        }
+
+        if (that.options.hideDisabled && isDisabled) {
+          liIndex--;
+          return;
+        }
+
+        if (!$this.data('content')) {
+          // Prepend any icon and append any subtext to the main text.
+          text = icon + '<span class="text">' + text + subtext + '</span>';
+        }
+
+        if (this.parentElement.tagName === 'OPTGROUP' && $this.data('divider') !== true) {
+          var optGroupClass = ' ' + this.parentElement.className || '';
+
+          if ($this.index() === 0) { // Is it the first option of the optgroup?
+            optID += 1;
+
+            // Get the opt group label
+            var label = this.parentElement.label,
+                labelSubtext = typeof $this.parent().data('subtext') !== 'undefined' ? '<small class="text-muted">' + $this.parent().data('subtext') + '</small>' : '',
+                labelIcon = $this.parent().data('icon') ? '<span class="' + that.options.iconBase + ' ' + $this.parent().data('icon') + '"></span> ' : '';
+            
+            label = labelIcon + '<span class="text">' + label + labelSubtext + '</span>';
+
+            if (index !== 0 && _li.length > 0) { // Is it NOT the first option of the select && are there elements in the dropdown?
+              liIndex++;
+              _li.push(generateLI('', null, 'divider', optID + 'div'));
+            }
+            liIndex++;
+            _li.push(generateLI(label, null, 'dropdown-header' + optGroupClass, optID));
+          }
+          _li.push(generateLI(generateA(text, 'opt ' + optionClass + optGroupClass, inline, tokens), index, '', optID));
+        } else if ($this.data('divider') === true) {
+          _li.push(generateLI('', index, 'divider'));
+        } else if ($this.data('hidden') === true) {
+          _li.push(generateLI(generateA(text, optionClass, inline, tokens), index, 'hidden is-hidden'));
+        } else {
+          if (this.previousElementSibling && this.previousElementSibling.tagName === 'OPTGROUP') {
+            liIndex++;
+            _li.push(generateLI('', null, 'divider', optID + 'div'));
+          }
+          _li.push(generateLI(generateA(text, optionClass, inline, tokens), index));
+        }
+
+        that.liObj[index] = liIndex;
+      });
+
+      //If we are not multiple, we don't have a selected item, and we don't have a title, select the first element so something is set in the button
+      if (!this.multiple && this.$element.find('option:selected').length === 0 && !this.options.title) {
+        this.$element.find('option').eq(0).prop('selected', true).attr('selected', 'selected');
+      }
+
+      return _li.join('');
+    },
+
+    findLis: function () {
+      if (this.$lis == null) this.$lis = this.$menu.find('li');
+      return this.$lis;
+    },
+
+    /**
+     * @param [updateLi] defaults to true
+     */
+    render: function (updateLi) {
+      var that = this,
+          notDisabled;
+
+      //Update the LI to match the SELECT
+      if (updateLi !== false) {
+        this.$element.find('option').each(function (index) {
+          var $lis = that.findLis().eq(that.liObj[index]);
+
+          that.setDisabled(index, this.disabled || this.parentElement.tagName === 'OPTGROUP' && this.parentElement.disabled, $lis);
+          that.setSelected(index, this.selected, $lis);
+        });
+      }
+
+      this.tabIndex();
+
+      var selectedItems = this.$element.find('option').map(function () {
+        if (this.selected) {
+          if (that.options.hideDisabled && (this.disabled || this.parentElement.tagName === 'OPTGROUP' && this.parentElement.disabled)) return false;
+
+          var $this = $(this),
+              icon = $this.data('icon') && that.options.showIcon ? '<i class="' + that.options.iconBase + ' ' + $this.data('icon') + '"></i> ' : '',
+              subtext;
+
+          if (that.options.showSubtext && $this.data('subtext') && !that.multiple) {
+            subtext = ' <small class="text-muted">' + $this.data('subtext') + '</small>';
+          } else {
+            subtext = '';
+          }
+          if (typeof $this.attr('title') !== 'undefined') {
+            return $this.attr('title');
+          } else if ($this.data('content') && that.options.showContent) {
+            return $this.data('content');
+          } else {
+            return icon + $this.html() + subtext;
+          }
+        }
+      }).toArray();
+
+      //Fixes issue in IE10 occurring when no default option is selected and at least one option is disabled
+      //Convert all the values into a comma delimited string
+      var title = !this.multiple ? selectedItems[0] : selectedItems.join(this.options.multipleSeparator);
+
+      //If this is multi select, and the selectText type is count, the show 1 of 2 selected etc..
+      if (this.multiple && this.options.selectedTextFormat.indexOf('count') > -1) {
+        var max = this.options.selectedTextFormat.split('>');
+        if ((max.length > 1 && selectedItems.length > max[1]) || (max.length == 1 && selectedItems.length >= 2)) {
+          notDisabled = this.options.hideDisabled ? ', [disabled]' : '';
+          var totalCount = this.$element.find('option').not('[data-divider="true"], [data-hidden="true"]' + notDisabled).length,
+              tr8nText = (typeof this.options.countSelectedText === 'function') ? this.options.countSelectedText(selectedItems.length, totalCount) : this.options.countSelectedText;
+          title = tr8nText.replace('{0}', selectedItems.length.toString()).replace('{1}', totalCount.toString());
+        }
+      }
+
+      if (this.options.title == undefined) {
+        this.options.title = this.$element.attr('title');
+      }
+
+      if (this.options.selectedTextFormat == 'static') {
+        title = this.options.title;
+      }
+
+      //If we dont have a title, then use the default, or if nothing is set at all, use the not selected text
+      if (!title) {
+        title = typeof this.options.title !== 'undefined' ? this.options.title : this.options.noneSelectedText;
+      }
+
+      //strip all html-tags and trim the result
+      this.$button.attr('title', $.trim(title.replace(/<[^>]*>?/g, '')));
+      this.$button.children('.filter-option').html(title);
+
+      this.$element.trigger('rendered.bs.select');
+    },
+
+    /**
+     * @param [style]
+     * @param [status]
+     */
+    setStyle: function (style, status) {
+      if (this.$element.attr('class')) {
+        this.$newElement.addClass(this.$element.attr('class').replace(/selectpicker|mobile-device|bs-select-hidden|validate\[.*\]/gi, ''));
+      }
+
+      var buttonClass = style ? style : this.options.style;
+
+      if (status == 'add') {
+        this.$button.addClass(buttonClass);
+      } else if (status == 'remove') {
+        this.$button.removeClass(buttonClass);
+      } else {
+        this.$button.removeClass(this.options.style);
+        this.$button.addClass(buttonClass);
+      }
+    },
+
+    liHeight: function (refresh) {
+      if (!refresh && (this.options.size === false || this.sizeInfo)) return;
+
+      var newElement = document.createElement('div'),
+          menu = document.createElement('div'),
+          menuInner = document.createElement('ul'),
+          divider = document.createElement('li'),
+          li = document.createElement('li'),
+          a = document.createElement('a'),
+          text = document.createElement('span'),
+          header = this.options.header ? this.$menu.find('.popover-title')[0].cloneNode(true) : null,
+          search = this.options.liveSearch ? document.createElement('div') : null,
+          actions = this.options.actionsBox && this.multiple ? this.$menu.find('.bs-actionsbox')[0].cloneNode(true) : null,
+          doneButton = this.options.doneButton && this.multiple ? this.$menu.find('.bs-donebutton')[0].cloneNode(true) : null;
+
+      text.className = 'text';
+      newElement.className = this.$menu[0].parentNode.className + ' open';
+      menu.className = 'dropdown-menu open';
+      menuInner.className = 'dropdown-menu inner';
+      divider.className = 'divider';
+
+      text.appendChild(document.createTextNode('Inner text'));
+      a.appendChild(text);
+      li.appendChild(a);
+      menuInner.appendChild(li);
+      menuInner.appendChild(divider);
+      if (header) menu.appendChild(header);
+      if (search) {
+        // create a span instead of input as creating an input element is slower
+        var input = document.createElement('span');
+        search.className = 'bs-searchbox';
+        input.className = 'form-control';
+        search.appendChild(input);
+        menu.appendChild(search);
+      }
+      if (actions) menu.appendChild(actions);
+      menu.appendChild(menuInner);
+      if (doneButton) menu.appendChild(doneButton);
+      newElement.appendChild(menu);
+
+      document.body.appendChild(newElement);
+
+      var liHeight = a.offsetHeight,
+          headerHeight = header ? header.offsetHeight : 0,
+          searchHeight = search ? search.offsetHeight : 0,
+          actionsHeight = actions ? actions.offsetHeight : 0,
+          doneButtonHeight = doneButton ? doneButton.offsetHeight : 0,
+          dividerHeight = $(divider).outerHeight(true),
+          // fall back to jQuery if getComputedStyle is not supported
+          menuStyle = typeof getComputedStyle === 'function' ? getComputedStyle(menu) : false,
+          $menu = menuStyle ? null : $(menu),
+          menuPadding = parseInt(menuStyle ? menuStyle.paddingTop : $menu.css('paddingTop')) +
+                        parseInt(menuStyle ? menuStyle.paddingBottom : $menu.css('paddingBottom')) +
+                        parseInt(menuStyle ? menuStyle.borderTopWidth : $menu.css('borderTopWidth')) +
+                        parseInt(menuStyle ? menuStyle.borderBottomWidth : $menu.css('borderBottomWidth')),
+          menuExtras =  menuPadding + 
+                        parseInt(menuStyle ? menuStyle.marginTop : $menu.css('marginTop')) + 
+                        parseInt(menuStyle ? menuStyle.marginBottom : $menu.css('marginBottom')) + 2;
+
+      document.body.removeChild(newElement);
+
+      this.sizeInfo = {
+        liHeight: liHeight,
+        headerHeight: headerHeight,
+        searchHeight: searchHeight,
+        actionsHeight: actionsHeight,
+        doneButtonHeight: doneButtonHeight,
+        dividerHeight: dividerHeight,
+        menuPadding: menuPadding,
+        menuExtras: menuExtras
+      };
+    },
+
+    setSize: function () {
+      this.findLis();
+      this.liHeight();
+
+      if (this.options.header) this.$menu.css('padding-top', 0);
+      if (this.options.size === false) return;
+
+      var that = this,
+          $menu = this.$menu,
+          $menuInner = this.$menuInner,
+          $window = $(window),
+          selectHeight = this.$newElement[0].offsetHeight,
+          liHeight = this.sizeInfo['liHeight'],
+          headerHeight = this.sizeInfo['headerHeight'],
+          searchHeight = this.sizeInfo['searchHeight'],
+          actionsHeight = this.sizeInfo['actionsHeight'],
+          doneButtonHeight = this.sizeInfo['doneButtonHeight'],
+          divHeight = this.sizeInfo['dividerHeight'],
+          menuPadding = this.sizeInfo['menuPadding'],
+          menuExtras = this.sizeInfo['menuExtras'],
+          notDisabled = this.options.hideDisabled ? '.disabled' : '',
+          menuHeight,
+          getHeight,
+          selectOffsetTop,
+          selectOffsetBot,
+          posVert = function () {
+            selectOffsetTop = that.$newElement.offset().top - $window.scrollTop();
+            selectOffsetBot = $window.height() - selectOffsetTop - selectHeight;
+          };
+
+      posVert();
+
+      if (this.options.size === 'auto') {
+        var getSize = function () {
+          var minHeight,
+              hasClass = function (className, include) {
+                return function (element) {
+                    if (include) {
+                        return (element.classList ? element.classList.contains(className) : $(element).hasClass(className));
+                    } else {
+                        return !(element.classList ? element.classList.contains(className) : $(element).hasClass(className));
+                    }
+                };
+              },
+              lis = that.$menuInner[0].getElementsByTagName('li'),
+              lisVisible = Array.prototype.filter ? Array.prototype.filter.call(lis, hasClass('hidden', false)) : that.$lis.not('.hidden'),
+              optGroup = Array.prototype.filter ? Array.prototype.filter.call(lisVisible, hasClass('dropdown-header', true)) : lisVisible.filter('.dropdown-header');
+
+          posVert();
+          menuHeight = selectOffsetBot - menuExtras;
+
+          if (that.options.container) {
+            if (!$menu.data('height')) $menu.data('height', $menu.height());
+            getHeight = $menu.data('height');
+          } else {
+            getHeight = $menu.height();
+          }
+
+          if (that.options.dropupAuto) {
+            that.$newElement.toggleClass('dropup', selectOffsetTop > selectOffsetBot && (menuHeight - menuExtras) < getHeight);
+          }
+          if (that.$newElement.hasClass('dropup')) {
+            menuHeight = selectOffsetTop - menuExtras;
+          }
+
+          if ((lisVisible.length + optGroup.length) > 3) {
+            minHeight = liHeight * 3 + menuExtras - 2;
+          } else {
+            minHeight = 0;
+          }
+
+          $menu.css({
+            'max-height': menuHeight + 'px',
+            'overflow': 'hidden',
+            'min-height': minHeight + headerHeight + searchHeight + actionsHeight + doneButtonHeight + 'px'
+          });
+          $menuInner.css({
+            'max-height': menuHeight - headerHeight - searchHeight - actionsHeight - doneButtonHeight - menuPadding + 'px',
+            'overflow-y': 'auto',
+            'min-height': Math.max(minHeight - menuPadding, 0) + 'px'
+          });
+        };
+        getSize();
+        this.$searchbox.off('input.getSize propertychange.getSize').on('input.getSize propertychange.getSize', getSize);
+        $window.off('resize.getSize scroll.getSize').on('resize.getSize scroll.getSize', getSize);
+      } else if (this.options.size && this.options.size != 'auto' && this.$lis.not(notDisabled).length > this.options.size) {
+        var optIndex = this.$lis.not('.divider').not(notDisabled).children().slice(0, this.options.size).last().parent().index(),
+            divLength = this.$lis.slice(0, optIndex + 1).filter('.divider').length;
+        menuHeight = liHeight * this.options.size + divLength * divHeight + menuPadding;
+
+        if (that.options.container) {
+          if (!$menu.data('height')) $menu.data('height', $menu.height());
+          getHeight = $menu.data('height');
+        } else {
+          getHeight = $menu.height();
+        }
+
+        if (that.options.dropupAuto) {
+          //noinspection JSUnusedAssignment
+          this.$newElement.toggleClass('dropup', selectOffsetTop > selectOffsetBot && (menuHeight - menuExtras) < getHeight);
+        }
+        $menu.css({
+          'max-height': menuHeight + headerHeight + searchHeight + actionsHeight + doneButtonHeight + 'px',
+          'overflow': 'hidden',
+          'min-height': ''
+        });
+        $menuInner.css({
+          'max-height': menuHeight - menuPadding + 'px',
+          'overflow-y': 'auto',
+          'min-height': ''
+        });
+      }
+    },
+
+    setWidth: function () {
+      if (this.options.width === 'auto') {
+        this.$menu.css('min-width', '0');
+
+        // Get correct width if element is hidden
+        var $selectClone = this.$menu.parent().clone().appendTo('body'),
+            $selectClone2 = this.options.container ? this.$newElement.clone().appendTo('body') : $selectClone,
+            ulWidth = $selectClone.children('.dropdown-menu').outerWidth(),
+            btnWidth = $selectClone2.css('width', 'auto').children('button').outerWidth();
+
+        $selectClone.remove();
+        $selectClone2.remove();
+
+        // Set width to whatever's larger, button title or longest option
+        this.$newElement.css('width', Math.max(ulWidth, btnWidth) + 'px');
+      } else if (this.options.width === 'fit') {
+        // Remove inline min-width so width can be changed from 'auto'
+        this.$menu.css('min-width', '');
+        this.$newElement.css('width', '').addClass('fit-width');
+      } else if (this.options.width) {
+        // Remove inline min-width so width can be changed from 'auto'
+        this.$menu.css('min-width', '');
+        this.$newElement.css('width', this.options.width);
+      } else {
+        // Remove inline min-width/width so width can be changed
+        this.$menu.css('min-width', '');
+        this.$newElement.css('width', '');
+      }
+      // Remove fit-width class if width is changed programmatically
+      if (this.$newElement.hasClass('fit-width') && this.options.width !== 'fit') {
+        this.$newElement.removeClass('fit-width');
+      }
+    },
+
+    selectPosition: function () {
+      var that = this,
+          drop = '<div />',
+          $drop = $(drop),
+          pos,
+          actualHeight,
+          getPlacement = function ($element) {
+            $drop.addClass($element.attr('class').replace(/form-control|fit-width/gi, '')).toggleClass('dropup', $element.hasClass('dropup'));
+            pos = $element.offset();
+            actualHeight = $element.hasClass('dropup') ? 0 : $element[0].offsetHeight;
+            $drop.css({
+              'top': pos.top + actualHeight,
+              'left': pos.left,
+              'width': $element[0].offsetWidth,
+              'position': 'absolute'
+            });
+          };
+
+      this.$newElement.on('click', function () {
+        if (that.isDisabled()) {
+          return;
+        }
+        getPlacement($(this));
+        $drop.appendTo(that.options.container);
+        $drop.toggleClass('open', !$(this).hasClass('open'));
+        $drop.append(that.$menu);
+      });
+
+      $(window).on('resize scroll', function () {
+        getPlacement(that.$newElement);
+      });
+
+      this.$element.on('hide.bs.select', function () {
+        that.$menu.data('height', that.$menu.height());
+        $drop.detach();
+      });
+    },
+
+    setSelected: function (index, selected, $lis) {
+      if (!$lis) {
+        var $lis = this.findLis().eq(this.liObj[index]);
+      }
+
+      $lis.toggleClass('selected', selected);
+    },
+
+    setDisabled: function (index, disabled, $lis) {
+      if (!$lis) {
+        var $lis = this.findLis().eq(this.liObj[index]);
+      }
+
+      if (disabled) {
+        $lis.addClass('disabled').children('a').attr('href', '#').attr('tabindex', -1);
+      } else {
+        $lis.removeClass('disabled').children('a').removeAttr('href').attr('tabindex', 0);
+      }
+    },
+
+    isDisabled: function () {
+      return this.$element[0].disabled;
+    },
+
+    checkDisabled: function () {
+      var that = this;
+
+      if (this.isDisabled()) {
+        this.$newElement.addClass('disabled');
+        this.$button.addClass('disabled').attr('tabindex', -1);
+      } else {
+        if (this.$button.hasClass('disabled')) {
+          this.$newElement.removeClass('disabled');
+          this.$button.removeClass('disabled');
+        }
+
+        if (this.$button.attr('tabindex') == -1 && !this.$element.data('tabindex')) {
+          this.$button.removeAttr('tabindex');
+        }
+      }
+
+      this.$button.click(function () {
+        return !that.isDisabled();
+      });
+    },
+
+    tabIndex: function () {
+      if (this.$element.is('[tabindex]')) {
+        this.$element.data('tabindex', this.$element.attr('tabindex'));
+        this.$button.attr('tabindex', this.$element.data('tabindex'));
+      }
+    },
+
+    clickListener: function () {
+      var that = this,
+          $document = $(document);
+
+      this.$newElement.on('touchstart.dropdown', '.dropdown-menu', function (e) {
+        e.stopPropagation();
+      });
+
+      $document.data('spaceSelect', false);
+      
+      this.$button.on('keyup', function (e) {
+        if (/(32)/.test(e.keyCode.toString(10)) && $document.data('spaceSelect')) {
+            e.preventDefault();
+            $document.data('spaceSelect', false);
+        }
+      });
+
+      this.$newElement.on('click', function () {
+        that.setSize();
+        that.$element.on('shown.bs.select', function () {
+          if (!that.options.liveSearch && !that.multiple) {
+            that.$menu.find('.selected a').focus();
+          } else if (!that.multiple) {
+            var selectedIndex = that.liObj[that.$element[0].selectedIndex];
+
+            if (typeof selectedIndex !== 'number' || that.options.size === false) return;
+            
+            // scroll to selected option
+            var offset = that.$lis.eq(selectedIndex)[0].offsetTop - that.$menuInner[0].offsetTop;
+            offset = offset - that.$menuInner[0].offsetHeight/2 + that.sizeInfo.liHeight/2;
+            that.$menuInner[0].scrollTop = offset;
+          }
+        });
+      });
+
+      this.$menu.on('click', 'li a', function (e) {
+        var $this = $(this),
+            clickedIndex = $this.parent().data('originalIndex'),
+            prevValue = that.$element.val(),
+            prevIndex = that.$element.prop('selectedIndex');
+
+        // Don't close on multi choice menu
+        if (that.multiple) {
+          e.stopPropagation();
+        }
+
+        e.preventDefault();
+
+        //Don't run if we have been disabled
+        if (!that.isDisabled() && !$this.parent().hasClass('disabled')) {
+          var $options = that.$element.find('option'),
+              $option = $options.eq(clickedIndex),
+              state = $option.prop('selected'),
+              $optgroup = $option.parent('optgroup'),
+              maxOptions = that.options.maxOptions,
+              maxOptionsGrp = $optgroup.data('maxOptions') || false;
+
+          if (!that.multiple) { // Deselect all others if not multi select box
+            $options.prop('selected', false);
+            $option.prop('selected', true);
+            that.$menu.find('.selected').removeClass('selected');
+            that.setSelected(clickedIndex, true);
+          } else { // Toggle the one we have chosen if we are multi select.
+            $option.prop('selected', !state);
+            that.setSelected(clickedIndex, !state);
+            $this.blur();
+
+            if (maxOptions !== false || maxOptionsGrp !== false) {
+              var maxReached = maxOptions < $options.filter(':selected').length,
+                  maxReachedGrp = maxOptionsGrp < $optgroup.find('option:selected').length;
+
+              if ((maxOptions && maxReached) || (maxOptionsGrp && maxReachedGrp)) {
+                if (maxOptions && maxOptions == 1) {
+                  $options.prop('selected', false);
+                  $option.prop('selected', true);
+                  that.$menu.find('.selected').removeClass('selected');
+                  that.setSelected(clickedIndex, true);
+                } else if (maxOptionsGrp && maxOptionsGrp == 1) {
+                  $optgroup.find('option:selected').prop('selected', false);
+                  $option.prop('selected', true);
+                  var optgroupID = $this.parent().data('optgroup');
+                  that.$menu.find('[data-optgroup="' + optgroupID + '"]').removeClass('selected');
+                  that.setSelected(clickedIndex, true);
+                } else {
+                  var maxOptionsArr = (typeof that.options.maxOptionsText === 'function') ?
+                          that.options.maxOptionsText(maxOptions, maxOptionsGrp) : that.options.maxOptionsText,
+                      maxTxt = maxOptionsArr[0].replace('{n}', maxOptions),
+                      maxTxtGrp = maxOptionsArr[1].replace('{n}', maxOptionsGrp),
+                      $notify = $('<div class="notify"></div>');
+                  // If {var} is set in array, replace it
+                  /** @deprecated */
+                  if (maxOptionsArr[2]) {
+                    maxTxt = maxTxt.replace('{var}', maxOptionsArr[2][maxOptions > 1 ? 0 : 1]);
+                    maxTxtGrp = maxTxtGrp.replace('{var}', maxOptionsArr[2][maxOptionsGrp > 1 ? 0 : 1]);
+                  }
+
+                  $option.prop('selected', false);
+
+                  that.$menu.append($notify);
+
+                  if (maxOptions && maxReached) {
+                    $notify.append($('<div>' + maxTxt + '</div>'));
+                    that.$element.trigger('maxReached.bs.select');
+                  }
+
+                  if (maxOptionsGrp && maxReachedGrp) {
+                    $notify.append($('<div>' + maxTxtGrp + '</div>'));
+                    that.$element.trigger('maxReachedGrp.bs.select');
+                  }
+
+                  setTimeout(function () {
+                    that.setSelected(clickedIndex, false);
+                  }, 10);
+
+                  $notify.delay(750).fadeOut(300, function () {
+                    $(this).remove();
+                  });
+                }
+              }
+            }
+          }
+
+          if (!that.multiple) {
+            that.$button.focus();
+          } else if (that.options.liveSearch) {
+            that.$searchbox.focus();
+          }
+
+          // Trigger select 'change'
+          if ((prevValue != that.$element.val() && that.multiple) || (prevIndex != that.$element.prop('selectedIndex') && !that.multiple)) {
+            that.$element.triggerNative('change');
+            // $option.prop('selected') is current option state (selected/unselected). state is previous option state.
+            that.$element.trigger('changed.bs.select', [clickedIndex, $option.prop('selected'), state]);
+          }
+        }
+      });
+
+      this.$menu.on('click', 'li.disabled a, .popover-title, .popover-title :not(.close)', function (e) {
+        if (e.currentTarget == this) {
+          e.preventDefault();
+          e.stopPropagation();
+          if (that.options.liveSearch && !$(e.target).hasClass('close')) {
+            that.$searchbox.focus();
+          } else {
+            that.$button.focus();
+          }
+        }
+      });
+
+      this.$menu.on('click', 'li.divider, li.dropdown-header', function (e) {
+        e.preventDefault();
+        e.stopPropagation();
+        if (that.options.liveSearch) {
+          that.$searchbox.focus();
+        } else {
+          that.$button.focus();
+        }
+      });
+
+      this.$menu.on('click', '.popover-title .close', function () {
+        that.$button.click();
+      });
+
+      this.$searchbox.on('click', function (e) {
+        e.stopPropagation();
+      });
+
+      this.$menu.on('click', '.actions-btn', function (e) {
+        if (that.options.liveSearch) {
+          that.$searchbox.focus();
+        } else {
+          that.$button.focus();
+        }
+
+        e.preventDefault();
+        e.stopPropagation();
+
+        if ($(this).hasClass('bs-select-all')) {
+          that.selectAll();
+        } else {
+          that.deselectAll();
+        }
+        that.$element.triggerNative('change');
+      });
+
+      this.$element.change(function () {
+        that.render(false);
+      });
+    },
+
+    liveSearchListener: function () {
+      var that = this,
+          $no_results = $('<li class="no-results"></li>');
+
+      this.$newElement.on('click.dropdown.data-api touchstart.dropdown.data-api', function () {
+        that.$menuInner.find('.active').removeClass('active');
+        if (!!that.$searchbox.val()) {
+          that.$searchbox.val('');
+          that.$lis.not('.is-hidden').removeClass('hidden');
+          if (!!$no_results.parent().length) $no_results.remove();
+        }
+        if (!that.multiple) that.$menuInner.find('.selected').addClass('active');
+        setTimeout(function () {
+          that.$searchbox.focus();
+        }, 10);
+      });
+
+      this.$searchbox.on('click.dropdown.data-api focus.dropdown.data-api touchend.dropdown.data-api', function (e) {
+        e.stopPropagation();
+      });
+
+      this.$searchbox.on('input propertychange', function () {
+        if (that.$searchbox.val()) {
+          var $searchBase = that.$lis.not('.is-hidden').removeClass('hidden').children('a');
+          if (that.options.liveSearchNormalize) {
+            $searchBase = $searchBase.not(':a' + that._searchStyle() + '("' + normalizeToBase(that.$searchbox.val()) + '")');
+          } else {
+            $searchBase = $searchBase.not(':' + that._searchStyle() + '("' + that.$searchbox.val() + '")');
+          }
+          $searchBase.parent().addClass('hidden');
+
+          that.$lis.filter('.dropdown-header').each(function () {
+            var $this = $(this),
+                optgroup = $this.data('optgroup');
+
+            if (that.$lis.filter('[data-optgroup=' + optgroup + ']').not($this).not('.hidden').length === 0) {
+              $this.addClass('hidden');
+              that.$lis.filter('[data-optgroup=' + optgroup + 'div]').addClass('hidden');
+            }
+          });
+
+          var $lisVisible = that.$lis.not('.hidden');
+
+          // hide divider if first or last visible, or if followed by another divider
+          $lisVisible.each(function (index) {
+            var $this = $(this);
+
+            if ($this.hasClass('divider') && (
+              $this.index() === $lisVisible.eq(0).index() ||
+              $this.index() === $lisVisible.last().index() ||
+              $lisVisible.eq(index + 1).hasClass('divider'))) {
+              $this.addClass('hidden');
+            }
+          });
+
+          if (!that.$lis.not('.hidden, .no-results').length) {
+            if (!!$no_results.parent().length) {
+              $no_results.remove();
+            }
+            $no_results.html(that.options.noneResultsText.replace('{0}', '"' + htmlEscape(that.$searchbox.val()) + '"')).show();
+            that.$menuInner.append($no_results);
+          } else if (!!$no_results.parent().length) {
+            $no_results.remove();
+          }
+
+        } else {
+          that.$lis.not('.is-hidden').removeClass('hidden');
+          if (!!$no_results.parent().length) {
+            $no_results.remove();
+          }
+        }
+
+        that.$lis.filter('.active').removeClass('active');
+        if (that.$searchbox.val()) that.$lis.not('.hidden, .divider, .dropdown-header').eq(0).addClass('active').children('a').focus();
+        $(this).focus();
+      });
+    },
+
+    _searchStyle: function () {
+      var style = 'icontains';
+      switch (this.options.liveSearchStyle) {
+        case 'begins':
+        case 'startsWith':
+          style = 'ibegins';
+          break;
+        case 'contains':
+        default:
+          break; //no need to change the default
+      }
+
+      return style;
+    },
+
+    val: function (value) {
+      if (typeof value !== 'undefined') {
+        this.$element.val(value);
+        this.render();
+
+        return this.$element;
+      } else {
+        return this.$element.val();
+      }
+    },
+
+    selectAll: function () {
+      this.findLis();
+      this.$element.find('option:enabled').not('[data-divider], [data-hidden]').prop('selected', true);
+      this.$lis.not('.divider, .dropdown-header, .disabled, .hidden').addClass('selected');
+      this.render(false);
+    },
+
+    deselectAll: function () {
+      this.findLis();
+      this.$element.find('option:enabled').not('[data-divider], [data-hidden]').prop('selected', false);
+      this.$lis.not('.divider, .dropdown-header, .disabled, .hidden').removeClass('selected');
+      this.render(false);
+    },
+
+    keydown: function (e) {
+      var $this = $(this),
+          $parent = $this.is('input') ? $this.parent().parent() : $this.parent(),
+          $items,
+          that = $parent.data('this'),
+          index,
+          next,
+          first,
+          last,
+          prev,
+          nextPrev,
+          prevIndex,
+          isActive,
+          selector = ':not(.disabled, .hidden, .dropdown-header, .divider)',
+          keyCodeMap = {
+            32: ' ',
+            48: '0',
+            49: '1',
+            50: '2',
+            51: '3',
+            52: '4',
+            53: '5',
+            54: '6',
+            55: '7',
+            56: '8',
+            57: '9',
+            59: ';',
+            65: 'a',
+            66: 'b',
+            67: 'c',
+            68: 'd',
+            69: 'e',
+            70: 'f',
+            71: 'g',
+            72: 'h',
+            73: 'i',
+            74: 'j',
+            75: 'k',
+            76: 'l',
+            77: 'm',
+            78: 'n',
+            79: 'o',
+            80: 'p',
+            81: 'q',
+            82: 'r',
+            83: 's',
+            84: 't',
+            85: 'u',
+            86: 'v',
+            87: 'w',
+            88: 'x',
+            89: 'y',
+            90: 'z',
+            96: '0',
+            97: '1',
+            98: '2',
+            99: '3',
+            100: '4',
+            101: '5',
+            102: '6',
+            103: '7',
+            104: '8',
+            105: '9'
+          };
+
+      if (that.options.liveSearch) $parent = $this.parent().parent();
+
+      if (that.options.container) $parent = that.$menu;
+
+      $items = $('[role=menu] li a', $parent);
+
+      isActive = that.$menu.parent().hasClass('open');
+
+      if (!isActive && (e.keyCode >= 48 && e.keyCode <= 57 || e.keyCode >= 65 && e.keyCode <= 90)) {
+        if (!that.options.container) {
+          that.setSize();
+          that.$menu.parent().addClass('open');
+          isActive = true;
+        } else {
+          that.$newElement.trigger('click');
+        }
+        that.$searchbox.focus();
+      }
+
+      if (that.options.liveSearch) {
+        if (/(^9$|27)/.test(e.keyCode.toString(10)) && isActive && that.$menu.find('.active').length === 0) {
+          e.preventDefault();
+          that.$menu.parent().removeClass('open');
+          if (that.options.container) that.$newElement.removeClass('open');
+          that.$button.focus();
+        }
+        // $items contains li elements when liveSearch is enabled
+        $items = $('[role=menu] li:not(.disabled, .hidden, .dropdown-header, .divider)', $parent);
+        if (!$this.val() && !/(38|40)/.test(e.keyCode.toString(10))) {
+          if ($items.filter('.active').length === 0) {
+            $items = that.$newElement.find('li');
+            if (that.options.liveSearchNormalize) {
+              $items = $items.filter(':a' + that._searchStyle() + '(' + normalizeToBase(keyCodeMap[e.keyCode]) + ')');
+            } else {
+              $items = $items.filter(':' + that._searchStyle() + '(' + keyCodeMap[e.keyCode] + ')');
+            }
+          }
+        }
+      }
+
+      if (!$items.length) return;
+
+      if (/(38|40)/.test(e.keyCode.toString(10))) {
+        index = $items.index($items.filter(':focus'));
+        first = $items.parent(selector).first().data('originalIndex');
+        last = $items.parent(selector).last().data('originalIndex');
+        next = $items.eq(index).parent().nextAll(selector).eq(0).data('originalIndex');
+        prev = $items.eq(index).parent().prevAll(selector).eq(0).data('originalIndex');
+        nextPrev = $items.eq(next).parent().prevAll(selector).eq(0).data('originalIndex');
+
+        if (that.options.liveSearch) {
+          $items.each(function (i) {
+            if (!$(this).hasClass('disabled')) {
+              $(this).data('index', i);
+            }
+          });
+          index = $items.index($items.filter('.active'));
+          first = $items.first().data('index');
+          last = $items.last().data('index');
+          next = $items.eq(index).nextAll().eq(0).data('index');
+          prev = $items.eq(index).prevAll().eq(0).data('index');
+          nextPrev = $items.eq(next).prevAll().eq(0).data('index');
+        }
+
+        prevIndex = $this.data('prevIndex');
+
+        if (e.keyCode == 38) {
+          if (that.options.liveSearch) index -= 1;
+          if (index != nextPrev && index > prev) index = prev;
+          if (index < first) index = first;
+          if (index == prevIndex) index = last;
+        } else if (e.keyCode == 40) {
+          if (that.options.liveSearch) index += 1;
+          if (index == -1) index = 0;
+          if (index != nextPrev && index < next) index = next;
+          if (index > last) index = last;
+          if (index == prevIndex) index = first;
+        }
+
+        $this.data('prevIndex', index);
+
+        if (!that.options.liveSearch) {
+          $items.eq(index).focus();
+        } else {
+          e.preventDefault();
+          if (!$this.hasClass('dropdown-toggle')) {
+            $items.removeClass('active').eq(index).addClass('active').children('a').focus();
+            $this.focus();
+          }
+        }
+
+      } else if (!$this.is('input')) {
+        var keyIndex = [],
+            count,
+            prevKey;
+
+        $items.each(function () {
+          if (!$(this).parent().hasClass('disabled')) {
+            if ($.trim($(this).text().toLowerCase()).substring(0, 1) == keyCodeMap[e.keyCode]) {
+              keyIndex.push($(this).parent().index());
+            }
+          }
+        });
+
+        count = $(document).data('keycount');
+        count++;
+        $(document).data('keycount', count);
+
+        prevKey = $.trim($(':focus').text().toLowerCase()).substring(0, 1);
+
+        if (prevKey != keyCodeMap[e.keyCode]) {
+          count = 1;
+          $(document).data('keycount', count);
+        } else if (count >= keyIndex.length) {
+          $(document).data('keycount', 0);
+          if (count > keyIndex.length) count = 1;
+        }
+
+        $items.eq(keyIndex[count - 1]).focus();
+      }
+
+      // Select focused option if "Enter", "Spacebar" or "Tab" (when selectOnTab is true) are pressed inside the menu.
+      if ((/(13|32)/.test(e.keyCode.toString(10)) || (/(^9$)/.test(e.keyCode.toString(10)) && that.options.selectOnTab)) && isActive) {
+        if (!/(32)/.test(e.keyCode.toString(10))) e.preventDefault();
+        if (!that.options.liveSearch) {
+          var elem = $(':focus');
+          elem.click();
+          // Bring back focus for multiselects
+          elem.focus();
+          // Prevent screen from scrolling if the user hit the spacebar
+          e.preventDefault();
+          // Fixes spacebar selection of dropdown items in FF & IE
+          $(document).data('spaceSelect', true);
+        } else if (!/(32)/.test(e.keyCode.toString(10))) {
+          that.$menu.find('.active a').click();
+          $this.focus();
+        }
+        $(document).data('keycount', 0);
+      }
+
+      if ((/(^9$|27)/.test(e.keyCode.toString(10)) && isActive && (that.multiple || that.options.liveSearch)) || (/(27)/.test(e.keyCode.toString(10)) && !isActive)) {
+        that.$menu.parent().removeClass('open');
+        if (that.options.container) that.$newElement.removeClass('open');
+        that.$button.focus();
+      }
+    },
+
+    mobile: function () {
+      this.$element.addClass('mobile-device').appendTo(this.$newElement);
+      if (this.options.container) this.$menu.hide();
+    },
+
+    refresh: function () {
+      this.$lis = null;
+      this.liObj = {};
+      this.reloadLi();
+      this.render();
+      this.checkDisabled();
+      this.liHeight(true);
+      this.setStyle();
+      this.setWidth();
+      if (this.$lis) this.$searchbox.trigger('propertychange');
+
+      this.$element.trigger('refreshed.bs.select');
+    },
+
+    hide: function () {
+      this.$newElement.hide();
+    },
+
+    show: function () {
+      this.$newElement.show();
+    },
+
+    remove: function () {
+      this.$newElement.remove();
+      this.$element.remove();
+    }
+  };
+
+  // SELECTPICKER PLUGIN DEFINITION
+  // ==============================
+  function Plugin(option, event) {
+    // get the args of the outer function..
+    var args = arguments;
+    // The arguments of the function are explicitly re-defined from the argument list, because the shift causes them
+    // to get lost/corrupted in android 2.3 and IE9 #715 #775
+    var _option = option,
+        _event = event;
+    [].shift.apply(args);
+
+    var value;
+    var chain = this.each(function () {
+      var $this = $(this);
+      if ($this.is('select')) {
+        var data = $this.data('selectpicker'),
+            options = typeof _option == 'object' && _option;
+
+        if (!data) {
+          var config = $.extend({}, Selectpicker.DEFAULTS, $.fn.selectpicker.defaults || {}, $this.data(), options);
+          $this.data('selectpicker', (data = new Selectpicker(this, config, _event)));
+        } else if (options) {
+          for (var i in options) {
+            if (options.hasOwnProperty(i)) {
+              data.options[i] = options[i];
+            }
+          }
+        }
+
+        if (typeof _option == 'string') {
+          if (data[_option] instanceof Function) {
+            value = data[_option].apply(data, args);
+          } else {
+            value = data.options[_option];
+          }
+        }
+      }
+    });
+
+    if (typeof value !== 'undefined') {
+      //noinspection JSUnusedAssignment
+      return value;
+    } else {
+      return chain;
+    }
+  }
+
+  var old = $.fn.selectpicker;
+  $.fn.selectpicker = Plugin;
+  $.fn.selectpicker.Constructor = Selectpicker;
+
+  // SELECTPICKER NO CONFLICT
+  // ========================
+  $.fn.selectpicker.noConflict = function () {
+    $.fn.selectpicker = old;
+    return this;
+  };
+
+  $(document)
+      .data('keycount', 0)
+      .on('keydown', '.bootstrap-select [data-toggle=dropdown], .bootstrap-select [role="menu"], .bs-searchbox input', Selectpicker.prototype.keydown)
+      .on('focusin.modal', '.bootstrap-select [data-toggle=dropdown], .bootstrap-select [role="menu"], .bs-searchbox input', function (e) {
+        e.stopPropagation();
+      });
+
+  // SELECTPICKER DATA-API
+  // =====================
+  $(window).on('load.bs.select.data-api', function () {
+    $('.selectpicker').each(function () {
+      var $selectpicker = $(this);
+      Plugin.call($selectpicker, $selectpicker.data());
+    })
+  });
+})(jQuery);
+
+
+}));

تفاوت فایلی نمایش داده نمی شود زیرا این فایل بسیار بزرگ است
+ 0 - 0
main/inc/lib/javascript/bootstrap-select/js/bootstrap-select.js.map


تفاوت فایلی نمایش داده نمی شود زیرا این فایل بسیار بزرگ است
+ 6 - 0
main/inc/lib/javascript/bootstrap-select/js/bootstrap-select.min.js


+ 44 - 0
main/inc/lib/javascript/bootstrap-select/js/i18n/defaults-bg_BG.js

@@ -0,0 +1,44 @@
+/*!
+ * Bootstrap-select v1.7.3 (http://silviomoreto.github.io/bootstrap-select)
+ *
+ * Copyright 2013-2015 bootstrap-select
+ * Licensed under MIT (https://github.com/silviomoreto/bootstrap-select/blob/master/LICENSE)
+ */
+
+(function (root, factory) {
+  if (typeof define === 'function' && define.amd) {
+    // AMD. Register as an anonymous module unless amdModuleId is set
+    define(["jquery"], function (a0) {
+      return (factory(a0));
+    });
+  } else if (typeof exports === 'object') {
+    // Node. Does not work with strict CommonJS, but
+    // only CommonJS-like environments that support module.exports,
+    // like Node.
+    module.exports = factory(require("jquery"));
+  } else {
+    factory(jQuery);
+  }
+}(this, function () {
+
+(function ($) {
+  $.fn.selectpicker.defaults = {
+    noneSelectedText: 'Нищо избрано',
+    noneResultsText: 'Няма резултат за {0}',
+    countSelectedText: function (numSelected, numTotal) {
+      return (numSelected == 1) ? "{0} избран елемент" : "{0} избрани елемента";
+    },
+    maxOptionsText: function (numAll, numGroup) {
+      return [
+        (numAll == 1) ? 'Лимита е достигнат ({n} елемент максимум)' : 'Лимита е достигнат ({n} елемента максимум)',
+        (numGroup == 1) ? 'Груповия лимит е достигнат ({n} елемент максимум)' : 'Груповия лимит е достигнат ({n} елемента максимум)'
+      ];
+    },
+    selectAllText: 'Избери всички',
+    deselectAllText: 'Размаркирай всички',
+    multipleSeparator: ', '
+  };
+})(jQuery);
+
+
+}));

+ 7 - 0
main/inc/lib/javascript/bootstrap-select/js/i18n/defaults-bg_BG.min.js

@@ -0,0 +1,7 @@
+/*!
+ * Bootstrap-select v1.7.3 (http://silviomoreto.github.io/bootstrap-select)
+ *
+ * Copyright 2013-2015 bootstrap-select
+ * Licensed under MIT (https://github.com/silviomoreto/bootstrap-select/blob/master/LICENSE)
+ */
+!function(a,b){"function"==typeof define&&define.amd?define(["jquery"],function(a){return b(a)}):"object"==typeof exports?module.exports=b(require("jquery")):b(jQuery)}(this,function(){!function(a){a.fn.selectpicker.defaults={noneSelectedText:"Нищо избрано",noneResultsText:"Няма резултат за {0}",countSelectedText:function(a,b){return 1==a?"{0} избран елемент":"{0} избрани елемента"},maxOptionsText:function(a,b){return[1==a?"Лимита е достигнат ({n} елемент максимум)":"Лимита е достигнат ({n} елемента максимум)",1==b?"Груповия лимит е достигнат ({n} елемент максимум)":"Груповия лимит е достигнат ({n} елемента максимум)"]},selectAllText:"Избери всички",deselectAllText:"Размаркирай всички",multipleSeparator:", "}}(jQuery)});

+ 35 - 0
main/inc/lib/javascript/bootstrap-select/js/i18n/defaults-cs_CZ.js

@@ -0,0 +1,35 @@
+/*!
+ * Bootstrap-select v1.7.3 (http://silviomoreto.github.io/bootstrap-select)
+ *
+ * Copyright 2013-2015 bootstrap-select
+ * Licensed under MIT (https://github.com/silviomoreto/bootstrap-select/blob/master/LICENSE)
+ */
+
+(function (root, factory) {
+  if (typeof define === 'function' && define.amd) {
+    // AMD. Register as an anonymous module unless amdModuleId is set
+    define(["jquery"], function (a0) {
+      return (factory(a0));
+    });
+  } else if (typeof exports === 'object') {
+    // Node. Does not work with strict CommonJS, but
+    // only CommonJS-like environments that support module.exports,
+    // like Node.
+    module.exports = factory(require("jquery"));
+  } else {
+    factory(jQuery);
+  }
+}(this, function () {
+
+(function ($) {
+  $.fn.selectpicker.defaults = {
+    noneSelectedText: 'Nic není vybráno',
+    noneResultsText: 'Žádné výsledky {0}',
+    countSelectedText: 'Označeno {0} z {1}',
+    maxOptionsText: ['Limit překročen ({n} {var} max)', 'Limit skupiny překročen ({n} {var} max)', ['položek', 'položka']],
+    multipleSeparator: ', '
+  };
+})(jQuery);
+
+
+}));

+ 7 - 0
main/inc/lib/javascript/bootstrap-select/js/i18n/defaults-cs_CZ.min.js

@@ -0,0 +1,7 @@
+/*!
+ * Bootstrap-select v1.7.3 (http://silviomoreto.github.io/bootstrap-select)
+ *
+ * Copyright 2013-2015 bootstrap-select
+ * Licensed under MIT (https://github.com/silviomoreto/bootstrap-select/blob/master/LICENSE)
+ */
+!function(a,b){"function"==typeof define&&define.amd?define(["jquery"],function(a){return b(a)}):"object"==typeof exports?module.exports=b(require("jquery")):b(jQuery)}(this,function(){!function(a){a.fn.selectpicker.defaults={noneSelectedText:"Nic není vybráno",noneResultsText:"Žádné výsledky {0}",countSelectedText:"Označeno {0} z {1}",maxOptionsText:["Limit překročen ({n} {var} max)","Limit skupiny překročen ({n} {var} max)",["položek","položka"]],multipleSeparator:", "}}(jQuery)});

+ 44 - 0
main/inc/lib/javascript/bootstrap-select/js/i18n/defaults-da_DK.js

@@ -0,0 +1,44 @@
+/*!
+ * Bootstrap-select v1.7.3 (http://silviomoreto.github.io/bootstrap-select)
+ *
+ * Copyright 2013-2015 bootstrap-select
+ * Licensed under MIT (https://github.com/silviomoreto/bootstrap-select/blob/master/LICENSE)
+ */
+
+(function (root, factory) {
+  if (typeof define === 'function' && define.amd) {
+    // AMD. Register as an anonymous module unless amdModuleId is set
+    define(["jquery"], function (a0) {
+      return (factory(a0));
+    });
+  } else if (typeof exports === 'object') {
+    // Node. Does not work with strict CommonJS, but
+    // only CommonJS-like environments that support module.exports,
+    // like Node.
+    module.exports = factory(require("jquery"));
+  } else {
+    factory(jQuery);
+  }
+}(this, function () {
+
+(function ($) {
+  $.fn.selectpicker.defaults = {
+    noneSelectedText: 'Intet valgt',
+    noneResultsText: 'Ingen resultater fundet {0}',
+    countSelectedText: function (numSelected, numTotal) {
+      return (numSelected == 1) ? "{0} valgt" : "{0} valgt";
+    },
+    maxOptionsText: function (numAll, numGroup) {
+      return [
+        (numAll == 1) ? 'Begrænsning nået (max {n} valgt)' : 'Begrænsning nået (max {n} valgte)',
+        (numGroup == 1) ? 'Gruppe-begrænsning nået (max {n} valgt)' : 'Gruppe-begrænsning nået (max {n} valgte)'
+      ];
+    },
+    selectAllText: 'Markér alle',
+    deselectAllText: 'Afmarkér alle',
+    multipleSeparator: ', '
+  };
+})(jQuery);
+
+
+}));

+ 7 - 0
main/inc/lib/javascript/bootstrap-select/js/i18n/defaults-da_DK.min.js

@@ -0,0 +1,7 @@
+/*!
+ * Bootstrap-select v1.7.3 (http://silviomoreto.github.io/bootstrap-select)
+ *
+ * Copyright 2013-2015 bootstrap-select
+ * Licensed under MIT (https://github.com/silviomoreto/bootstrap-select/blob/master/LICENSE)
+ */
+!function(a,b){"function"==typeof define&&define.amd?define(["jquery"],function(a){return b(a)}):"object"==typeof exports?module.exports=b(require("jquery")):b(jQuery)}(this,function(){!function(a){a.fn.selectpicker.defaults={noneSelectedText:"Intet valgt",noneResultsText:"Ingen resultater fundet {0}",countSelectedText:function(a,b){return"{0} valgt"},maxOptionsText:function(a,b){return[1==a?"Begrænsning nået (max {n} valgt)":"Begrænsning nået (max {n} valgte)",1==b?"Gruppe-begrænsning nået (max {n} valgt)":"Gruppe-begrænsning nået (max {n} valgte)"]},selectAllText:"Markér alle",deselectAllText:"Afmarkér alle",multipleSeparator:", "}}(jQuery)});

+ 35 - 0
main/inc/lib/javascript/bootstrap-select/js/i18n/defaults-de_DE.js

@@ -0,0 +1,35 @@
+/*!
+ * Bootstrap-select v1.7.3 (http://silviomoreto.github.io/bootstrap-select)
+ *
+ * Copyright 2013-2015 bootstrap-select
+ * Licensed under MIT (https://github.com/silviomoreto/bootstrap-select/blob/master/LICENSE)
+ */
+
+(function (root, factory) {
+  if (typeof define === 'function' && define.amd) {
+    // AMD. Register as an anonymous module unless amdModuleId is set
+    define(["jquery"], function (a0) {
+      return (factory(a0));
+    });
+  } else if (typeof exports === 'object') {
+    // Node. Does not work with strict CommonJS, but
+    // only CommonJS-like environments that support module.exports,
+    // like Node.
+    module.exports = factory(require("jquery"));
+  } else {
+    factory(jQuery);
+  }
+}(this, function () {
+
+(function ($) {
+  $.fn.selectpicker.defaults = {
+    noneSelectedText: 'Bitte wählen...',
+    noneResultsText: 'Keine Ergebnisse für {0}',
+    countSelectedText: '{0} von {1} ausgewählt',
+    maxOptionsText: ['Limit erreicht ({n} {var} max.)', 'Gruppen-Limit erreicht ({n} {var} max.)', ['Eintrag', 'Einträge']],
+    multipleSeparator: ', '
+  };
+})(jQuery);
+
+
+}));

+ 7 - 0
main/inc/lib/javascript/bootstrap-select/js/i18n/defaults-de_DE.min.js

@@ -0,0 +1,7 @@
+/*!
+ * Bootstrap-select v1.7.3 (http://silviomoreto.github.io/bootstrap-select)
+ *
+ * Copyright 2013-2015 bootstrap-select
+ * Licensed under MIT (https://github.com/silviomoreto/bootstrap-select/blob/master/LICENSE)
+ */
+!function(a,b){"function"==typeof define&&define.amd?define(["jquery"],function(a){return b(a)}):"object"==typeof exports?module.exports=b(require("jquery")):b(jQuery)}(this,function(){!function(a){a.fn.selectpicker.defaults={noneSelectedText:"Bitte wählen...",noneResultsText:"Keine Ergebnisse für {0}",countSelectedText:"{0} von {1} ausgewählt",maxOptionsText:["Limit erreicht ({n} {var} max.)","Gruppen-Limit erreicht ({n} {var} max.)",["Eintrag","Einträge"]],multipleSeparator:", "}}(jQuery)});

+ 44 - 0
main/inc/lib/javascript/bootstrap-select/js/i18n/defaults-en_US.js

@@ -0,0 +1,44 @@
+/*!
+ * Bootstrap-select v1.7.3 (http://silviomoreto.github.io/bootstrap-select)
+ *
+ * Copyright 2013-2015 bootstrap-select
+ * Licensed under MIT (https://github.com/silviomoreto/bootstrap-select/blob/master/LICENSE)
+ */
+
+(function (root, factory) {
+  if (typeof define === 'function' && define.amd) {
+    // AMD. Register as an anonymous module unless amdModuleId is set
+    define(["jquery"], function (a0) {
+      return (factory(a0));
+    });
+  } else if (typeof exports === 'object') {
+    // Node. Does not work with strict CommonJS, but
+    // only CommonJS-like environments that support module.exports,
+    // like Node.
+    module.exports = factory(require("jquery"));
+  } else {
+    factory(jQuery);
+  }
+}(this, function () {
+
+(function ($) {
+  $.fn.selectpicker.defaults = {
+    noneSelectedText: 'Nothing selected',
+    noneResultsText: 'No results match {0}',
+    countSelectedText: function (numSelected, numTotal) {
+      return (numSelected == 1) ? "{0} item selected" : "{0} items selected";
+    },
+    maxOptionsText: function (numAll, numGroup) {
+      return [
+        (numAll == 1) ? 'Limit reached ({n} item max)' : 'Limit reached ({n} items max)',
+        (numGroup == 1) ? 'Group limit reached ({n} item max)' : 'Group limit reached ({n} items max)'
+      ];
+    },
+    selectAllText: 'Select All',
+    deselectAllText: 'Deselect All',
+    multipleSeparator: ', '
+  };
+})(jQuery);
+
+
+}));

+ 7 - 0
main/inc/lib/javascript/bootstrap-select/js/i18n/defaults-en_US.min.js

@@ -0,0 +1,7 @@
+/*!
+ * Bootstrap-select v1.7.3 (http://silviomoreto.github.io/bootstrap-select)
+ *
+ * Copyright 2013-2015 bootstrap-select
+ * Licensed under MIT (https://github.com/silviomoreto/bootstrap-select/blob/master/LICENSE)
+ */
+!function(a,b){"function"==typeof define&&define.amd?define(["jquery"],function(a){return b(a)}):"object"==typeof exports?module.exports=b(require("jquery")):b(jQuery)}(this,function(){!function(a){a.fn.selectpicker.defaults={noneSelectedText:"Nothing selected",noneResultsText:"No results match {0}",countSelectedText:function(a,b){return 1==a?"{0} item selected":"{0} items selected"},maxOptionsText:function(a,b){return[1==a?"Limit reached ({n} item max)":"Limit reached ({n} items max)",1==b?"Group limit reached ({n} item max)":"Group limit reached ({n} items max)"]},selectAllText:"Select All",deselectAllText:"Deselect All",multipleSeparator:", "}}(jQuery)});

+ 35 - 0
main/inc/lib/javascript/bootstrap-select/js/i18n/defaults-es_CL.js

@@ -0,0 +1,35 @@
+/*!
+ * Bootstrap-select v1.7.3 (http://silviomoreto.github.io/bootstrap-select)
+ *
+ * Copyright 2013-2015 bootstrap-select
+ * Licensed under MIT (https://github.com/silviomoreto/bootstrap-select/blob/master/LICENSE)
+ */
+
+(function (root, factory) {
+  if (typeof define === 'function' && define.amd) {
+    // AMD. Register as an anonymous module unless amdModuleId is set
+    define(["jquery"], function (a0) {
+      return (factory(a0));
+    });
+  } else if (typeof exports === 'object') {
+    // Node. Does not work with strict CommonJS, but
+    // only CommonJS-like environments that support module.exports,
+    // like Node.
+    module.exports = factory(require("jquery"));
+  } else {
+    factory(jQuery);
+  }
+}(this, function () {
+
+(function ($) {
+  $.fn.selectpicker.defaults = {
+    noneSelectedText: 'No hay selección',
+    noneResultsText: 'No hay resultados {0}',
+    countSelectedText: 'Seleccionados {0} de {1}',
+    maxOptionsText: ['Límite alcanzado ({n} {var} max)', 'Límite del grupo alcanzado({n} {var} max)', ['elementos', 'element']],
+    multipleSeparator: ', '
+  };
+})(jQuery);
+
+
+}));

+ 7 - 0
main/inc/lib/javascript/bootstrap-select/js/i18n/defaults-es_CL.min.js

@@ -0,0 +1,7 @@
+/*!
+ * Bootstrap-select v1.7.3 (http://silviomoreto.github.io/bootstrap-select)
+ *
+ * Copyright 2013-2015 bootstrap-select
+ * Licensed under MIT (https://github.com/silviomoreto/bootstrap-select/blob/master/LICENSE)
+ */
+!function(a,b){"function"==typeof define&&define.amd?define(["jquery"],function(a){return b(a)}):"object"==typeof exports?module.exports=b(require("jquery")):b(jQuery)}(this,function(){!function(a){a.fn.selectpicker.defaults={noneSelectedText:"No hay selección",noneResultsText:"No hay resultados {0}",countSelectedText:"Seleccionados {0} de {1}",maxOptionsText:["Límite alcanzado ({n} {var} max)","Límite del grupo alcanzado({n} {var} max)",["elementos","element"]],multipleSeparator:", "}}(jQuery)});

+ 35 - 0
main/inc/lib/javascript/bootstrap-select/js/i18n/defaults-es_ES.js

@@ -0,0 +1,35 @@
+/*!
+ * Bootstrap-select v1.7.3 (http://silviomoreto.github.io/bootstrap-select)
+ *
+ * Copyright 2013-2015 bootstrap-select
+ * Licensed under MIT (https://github.com/silviomoreto/bootstrap-select/blob/master/LICENSE)
+ */
+
+(function (root, factory) {
+  if (typeof define === 'function' && define.amd) {
+    // AMD. Register as an anonymous module unless amdModuleId is set
+    define(["jquery"], function (a0) {
+      return (factory(a0));
+    });
+  } else if (typeof exports === 'object') {
+    // Node. Does not work with strict CommonJS, but
+    // only CommonJS-like environments that support module.exports,
+    // like Node.
+    module.exports = factory(require("jquery"));
+  } else {
+    factory(jQuery);
+  }
+}(this, function () {
+
+(function ($) {
+  $.fn.selectpicker.defaults = {
+    noneSelectedText: 'No hay selección',
+    noneResultsText: 'No hay resultados {0}',
+    countSelectedText: 'Seleccionados {0} de {1}',
+    maxOptionsText: ['Límite alcanzado ({n} {var} max)', 'Límite del grupo alcanzado({n} {var} max)', ['elementos', 'element']],
+    multipleSeparator: ', '
+  };
+})(jQuery);
+
+
+}));

+ 7 - 0
main/inc/lib/javascript/bootstrap-select/js/i18n/defaults-es_ES.min.js

@@ -0,0 +1,7 @@
+/*!
+ * Bootstrap-select v1.7.3 (http://silviomoreto.github.io/bootstrap-select)
+ *
+ * Copyright 2013-2015 bootstrap-select
+ * Licensed under MIT (https://github.com/silviomoreto/bootstrap-select/blob/master/LICENSE)
+ */
+!function(a,b){"function"==typeof define&&define.amd?define(["jquery"],function(a){return b(a)}):"object"==typeof exports?module.exports=b(require("jquery")):b(jQuery)}(this,function(){!function(a){a.fn.selectpicker.defaults={noneSelectedText:"No hay selección",noneResultsText:"No hay resultados {0}",countSelectedText:"Seleccionados {0} de {1}",maxOptionsText:["Límite alcanzado ({n} {var} max)","Límite del grupo alcanzado({n} {var} max)",["elementos","element"]],multipleSeparator:", "}}(jQuery)});

+ 35 - 0
main/inc/lib/javascript/bootstrap-select/js/i18n/defaults-eu.js

@@ -0,0 +1,35 @@
+/*!
+ * Bootstrap-select v1.7.3 (http://silviomoreto.github.io/bootstrap-select)
+ *
+ * Copyright 2013-2015 bootstrap-select
+ * Licensed under MIT (https://github.com/silviomoreto/bootstrap-select/blob/master/LICENSE)
+ */
+
+(function (root, factory) {
+  if (typeof define === 'function' && define.amd) {
+    // AMD. Register as an anonymous module unless amdModuleId is set
+    define(["jquery"], function (a0) {
+      return (factory(a0));
+    });
+  } else if (typeof exports === 'object') {
+    // Node. Does not work with strict CommonJS, but
+    // only CommonJS-like environments that support module.exports,
+    // like Node.
+    module.exports = factory(require("jquery"));
+  } else {
+    factory(jQuery);
+  }
+}(this, function () {
+
+(function ($) {
+  $.fn.selectpicker.defaults = {
+    noneSelectedText: 'Hautapenik ez',
+    noneResultsText: 'Emaitzarik ez {0}',
+    countSelectedText: '{1}(e)tik {0} hautatuta',
+    maxOptionsText: ['Mugara iritsita ({n} {var} gehienez)', 'Taldearen mugara iritsita ({n} {var} gehienez)', ['elementu', 'elementu']],
+    multipleSeparator: ', '
+  };
+})(jQuery);
+
+
+}));

+ 7 - 0
main/inc/lib/javascript/bootstrap-select/js/i18n/defaults-eu.min.js

@@ -0,0 +1,7 @@
+/*!
+ * Bootstrap-select v1.7.3 (http://silviomoreto.github.io/bootstrap-select)
+ *
+ * Copyright 2013-2015 bootstrap-select
+ * Licensed under MIT (https://github.com/silviomoreto/bootstrap-select/blob/master/LICENSE)
+ */
+!function(a,b){"function"==typeof define&&define.amd?define(["jquery"],function(a){return b(a)}):"object"==typeof exports?module.exports=b(require("jquery")):b(jQuery)}(this,function(){!function(a){a.fn.selectpicker.defaults={noneSelectedText:"Hautapenik ez",noneResultsText:"Emaitzarik ez {0}",countSelectedText:"{1}(e)tik {0} hautatuta",maxOptionsText:["Mugara iritsita ({n} {var} gehienez)","Taldearen mugara iritsita ({n} {var} gehienez)",["elementu","elementu"]],multipleSeparator:", "}}(jQuery)});

+ 37 - 0
main/inc/lib/javascript/bootstrap-select/js/i18n/defaults-fa_IR.js

@@ -0,0 +1,37 @@
+/*!
+ * Bootstrap-select v1.7.3 (http://silviomoreto.github.io/bootstrap-select)
+ *
+ * Copyright 2013-2015 bootstrap-select
+ * Licensed under MIT (https://github.com/silviomoreto/bootstrap-select/blob/master/LICENSE)
+ */
+
+(function (root, factory) {
+  if (typeof define === 'function' && define.amd) {
+    // AMD. Register as an anonymous module unless amdModuleId is set
+    define(["jquery"], function (a0) {
+      return (factory(a0));
+    });
+  } else if (typeof exports === 'object') {
+    // Node. Does not work with strict CommonJS, but
+    // only CommonJS-like environments that support module.exports,
+    // like Node.
+    module.exports = factory(require("jquery"));
+  } else {
+    factory(jQuery);
+  }
+}(this, function () {
+
+(function ($) {
+    $.fn.selectpicker.defaults = {
+        noneSelectedText: 'چیزی انتخاب نشده است',
+        noneResultsText: 'هیج مشابهی برای {0} پیدا نشد',
+        countSelectedText: "{0} از {1} مورد انتخاب شده",
+        maxOptionsText: ['بیشتر ممکن نیست {حداکثر {n} عدد}', 'بیشتر ممکن نیست {حداکثر {n} عدد}'],
+        selectAllText: 'انتخاب همه',
+        deselectAllText: 'انتخاب هیچ کدام',
+        multipleSeparator: ', '
+    };
+})(jQuery);
+
+
+}));

+ 7 - 0
main/inc/lib/javascript/bootstrap-select/js/i18n/defaults-fa_IR.min.js

@@ -0,0 +1,7 @@
+/*!
+ * Bootstrap-select v1.7.3 (http://silviomoreto.github.io/bootstrap-select)
+ *
+ * Copyright 2013-2015 bootstrap-select
+ * Licensed under MIT (https://github.com/silviomoreto/bootstrap-select/blob/master/LICENSE)
+ */
+!function(a,b){"function"==typeof define&&define.amd?define(["jquery"],function(a){return b(a)}):"object"==typeof exports?module.exports=b(require("jquery")):b(jQuery)}(this,function(){!function(a){a.fn.selectpicker.defaults={noneSelectedText:"چیزی انتخاب نشده است",noneResultsText:"هیج مشابهی برای {0} پیدا نشد",countSelectedText:"{0} از {1} مورد انتخاب شده",maxOptionsText:["بیشتر ممکن نیست {حداکثر {n} عدد}","بیشتر ممکن نیست {حداکثر {n} عدد}"],selectAllText:"انتخاب همه",deselectAllText:"انتخاب هیچ کدام",multipleSeparator:", "}}(jQuery)});

+ 42 - 0
main/inc/lib/javascript/bootstrap-select/js/i18n/defaults-fr_FR.js

@@ -0,0 +1,42 @@
+/*!
+ * Bootstrap-select v1.7.3 (http://silviomoreto.github.io/bootstrap-select)
+ *
+ * Copyright 2013-2015 bootstrap-select
+ * Licensed under MIT (https://github.com/silviomoreto/bootstrap-select/blob/master/LICENSE)
+ */
+
+(function (root, factory) {
+  if (typeof define === 'function' && define.amd) {
+    // AMD. Register as an anonymous module unless amdModuleId is set
+    define(["jquery"], function (a0) {
+      return (factory(a0));
+    });
+  } else if (typeof exports === 'object') {
+    // Node. Does not work with strict CommonJS, but
+    // only CommonJS-like environments that support module.exports,
+    // like Node.
+    module.exports = factory(require("jquery"));
+  } else {
+    factory(jQuery);
+  }
+}(this, function () {
+
+(function ($) {
+  $.fn.selectpicker.defaults = {
+    noneSelectedText: 'Aucune s&eacute;lection',
+    noneResultsText: 'Aucun r&eacute;sultat pour {0}',
+    countSelectedText: function (numSelected, numTotal) {
+      return (numSelected > 1) ? "{0} &eacute;l&eacute;ments s&eacute;lectionn&eacute;s" : "{0} &eacute;l&eacute;ment s&eacute;lectionn&eacute;";
+    },
+    maxOptionsText: function (numAll, numGroup) {
+      return [
+        (numAll > 1) ? 'Limite atteinte ({n} &eacute;l&eacute;ments max)' : 'Limite atteinte ({n} &eacute;l&eacute;ment max)',
+        (numGroup > 1) ? 'Limite du groupe atteinte ({n} &eacute;l&eacute;ments max)' : 'Limite du groupe atteinte ({n} &eacute;l&eacute;ment max)'
+      ];
+    },
+    multipleSeparator: ', '
+  };
+})(jQuery);
+
+
+}));

+ 7 - 0
main/inc/lib/javascript/bootstrap-select/js/i18n/defaults-fr_FR.min.js

@@ -0,0 +1,7 @@
+/*!
+ * Bootstrap-select v1.7.3 (http://silviomoreto.github.io/bootstrap-select)
+ *
+ * Copyright 2013-2015 bootstrap-select
+ * Licensed under MIT (https://github.com/silviomoreto/bootstrap-select/blob/master/LICENSE)
+ */
+!function(a,b){"function"==typeof define&&define.amd?define(["jquery"],function(a){return b(a)}):"object"==typeof exports?module.exports=b(require("jquery")):b(jQuery)}(this,function(){!function(a){a.fn.selectpicker.defaults={noneSelectedText:"Aucune s&eacute;lection",noneResultsText:"Aucun r&eacute;sultat pour {0}",countSelectedText:function(a,b){return a>1?"{0} &eacute;l&eacute;ments s&eacute;lectionn&eacute;s":"{0} &eacute;l&eacute;ment s&eacute;lectionn&eacute;"},maxOptionsText:function(a,b){return[a>1?"Limite atteinte ({n} &eacute;l&eacute;ments max)":"Limite atteinte ({n} &eacute;l&eacute;ment max)",b>1?"Limite du groupe atteinte ({n} &eacute;l&eacute;ments max)":"Limite du groupe atteinte ({n} &eacute;l&eacute;ment max)"]},multipleSeparator:", "}}(jQuery)});

+ 44 - 0
main/inc/lib/javascript/bootstrap-select/js/i18n/defaults-hu_HU.js

@@ -0,0 +1,44 @@
+/*!
+ * Bootstrap-select v1.7.3 (http://silviomoreto.github.io/bootstrap-select)
+ *
+ * Copyright 2013-2015 bootstrap-select
+ * Licensed under MIT (https://github.com/silviomoreto/bootstrap-select/blob/master/LICENSE)
+ */
+
+(function (root, factory) {
+  if (typeof define === 'function' && define.amd) {
+    // AMD. Register as an anonymous module unless amdModuleId is set
+    define(["jquery"], function (a0) {
+      return (factory(a0));
+    });
+  } else if (typeof exports === 'object') {
+    // Node. Does not work with strict CommonJS, but
+    // only CommonJS-like environments that support module.exports,
+    // like Node.
+    module.exports = factory(require("jquery"));
+  } else {
+    factory(jQuery);
+  }
+}(this, function () {
+
+(function ($) {
+  $.fn.selectpicker.defaults = {
+    noneSelectedText: 'Válasszon!',
+    noneResultsText: 'Nincs találat {0}',
+    countSelectedText: function (numSelected, numTotal) {
+      return '{n} elem kiválasztva';
+    },
+    maxOptionsText: function (numAll, numGroup) {
+      return [
+        'Legfeljebb {n} elem választható',
+        'A csoportban legfeljebb {n} elem választható'
+      ];
+    },
+    selectAllText: 'Mind',
+    deselectAllText: 'Egyik sem',
+    multipleSeparator: ', '
+  };
+})(jQuery);
+
+
+}));

+ 7 - 0
main/inc/lib/javascript/bootstrap-select/js/i18n/defaults-hu_HU.min.js

@@ -0,0 +1,7 @@
+/*!
+ * Bootstrap-select v1.7.3 (http://silviomoreto.github.io/bootstrap-select)
+ *
+ * Copyright 2013-2015 bootstrap-select
+ * Licensed under MIT (https://github.com/silviomoreto/bootstrap-select/blob/master/LICENSE)
+ */
+!function(a,b){"function"==typeof define&&define.amd?define(["jquery"],function(a){return b(a)}):"object"==typeof exports?module.exports=b(require("jquery")):b(jQuery)}(this,function(){!function(a){a.fn.selectpicker.defaults={noneSelectedText:"Válasszon!",noneResultsText:"Nincs találat {0}",countSelectedText:function(a,b){return"{n} elem kiválasztva"},maxOptionsText:function(a,b){return["Legfeljebb {n} elem választható","A csoportban legfeljebb {n} elem választható"]},selectAllText:"Mind",deselectAllText:"Egyik sem",multipleSeparator:", "}}(jQuery)});

+ 35 - 0
main/inc/lib/javascript/bootstrap-select/js/i18n/defaults-it_IT.js

@@ -0,0 +1,35 @@
+/*!
+ * Bootstrap-select v1.7.3 (http://silviomoreto.github.io/bootstrap-select)
+ *
+ * Copyright 2013-2015 bootstrap-select
+ * Licensed under MIT (https://github.com/silviomoreto/bootstrap-select/blob/master/LICENSE)
+ */
+
+(function (root, factory) {
+  if (typeof define === 'function' && define.amd) {
+    // AMD. Register as an anonymous module unless amdModuleId is set
+    define(["jquery"], function (a0) {
+      return (factory(a0));
+    });
+  } else if (typeof exports === 'object') {
+    // Node. Does not work with strict CommonJS, but
+    // only CommonJS-like environments that support module.exports,
+    // like Node.
+    module.exports = factory(require("jquery"));
+  } else {
+    factory(jQuery);
+  }
+}(this, function () {
+
+(function ($) {
+  $.fn.selectpicker.defaults = {
+    noneSelectedText: 'Nessuna selezione',
+    noneResultsText: 'Nessun risultato per {0}',
+    countSelectedText: 'Selezionati {0} di {1}',
+    maxOptionsText: ['Limite raggiunto ({n} {var} max)', 'Limite del gruppo raggiunto ({n} {var} max)', ['elementi', 'elemento']],
+    multipleSeparator: ', '
+  };
+})(jQuery);
+
+
+}));

+ 7 - 0
main/inc/lib/javascript/bootstrap-select/js/i18n/defaults-it_IT.min.js

@@ -0,0 +1,7 @@
+/*!
+ * Bootstrap-select v1.7.3 (http://silviomoreto.github.io/bootstrap-select)
+ *
+ * Copyright 2013-2015 bootstrap-select
+ * Licensed under MIT (https://github.com/silviomoreto/bootstrap-select/blob/master/LICENSE)
+ */
+!function(a,b){"function"==typeof define&&define.amd?define(["jquery"],function(a){return b(a)}):"object"==typeof exports?module.exports=b(require("jquery")):b(jQuery)}(this,function(){!function(a){a.fn.selectpicker.defaults={noneSelectedText:"Nessuna selezione",noneResultsText:"Nessun risultato per {0}",countSelectedText:"Selezionati {0} di {1}",maxOptionsText:["Limite raggiunto ({n} {var} max)","Limite del gruppo raggiunto ({n} {var} max)",["elementi","elemento"]],multipleSeparator:", "}}(jQuery)});

+ 44 - 0
main/inc/lib/javascript/bootstrap-select/js/i18n/defaults-ko_KR.js

@@ -0,0 +1,44 @@
+/*!
+ * Bootstrap-select v1.7.3 (http://silviomoreto.github.io/bootstrap-select)
+ *
+ * Copyright 2013-2015 bootstrap-select
+ * Licensed under MIT (https://github.com/silviomoreto/bootstrap-select/blob/master/LICENSE)
+ */
+
+(function (root, factory) {
+  if (typeof define === 'function' && define.amd) {
+    // AMD. Register as an anonymous module unless amdModuleId is set
+    define(["jquery"], function (a0) {
+      return (factory(a0));
+    });
+  } else if (typeof exports === 'object') {
+    // Node. Does not work with strict CommonJS, but
+    // only CommonJS-like environments that support module.exports,
+    // like Node.
+    module.exports = factory(require("jquery"));
+  } else {
+    factory(jQuery);
+  }
+}(this, function () {
+
+(function ($) {
+  $.fn.selectpicker.defaults = {
+    noneSelectedText: '항목을 선택해주세요',
+    noneResultsText: '{0} 검색 결과가 없습니다',
+    countSelectedText: function (numSelected, numTotal) {
+      return "{0}개를 선택하였습니다";
+    },
+    maxOptionsText: function (numAll, numGroup) {
+      return [
+        '{n}개까지 선택 가능합니다',
+        '해당 그룹은 {n}개까지 선택 가능합니다'
+      ];
+    },
+    selectAllText: '전체선택',
+    deselectAllText: '전체해제',
+    multipleSeparator: ', '
+  };
+})(jQuery);
+
+
+}));

+ 7 - 0
main/inc/lib/javascript/bootstrap-select/js/i18n/defaults-ko_KR.min.js

@@ -0,0 +1,7 @@
+/*!
+ * Bootstrap-select v1.7.3 (http://silviomoreto.github.io/bootstrap-select)
+ *
+ * Copyright 2013-2015 bootstrap-select
+ * Licensed under MIT (https://github.com/silviomoreto/bootstrap-select/blob/master/LICENSE)
+ */
+!function(a,b){"function"==typeof define&&define.amd?define(["jquery"],function(a){return b(a)}):"object"==typeof exports?module.exports=b(require("jquery")):b(jQuery)}(this,function(){!function(a){a.fn.selectpicker.defaults={noneSelectedText:"항목을 선택해주세요",noneResultsText:"{0} 검색 결과가 없습니다",countSelectedText:function(a,b){return"{0}개를 선택하였습니다"},maxOptionsText:function(a,b){return["{n}개까지 선택 가능합니다","해당 그룹은 {n}개까지 선택 가능합니다"]},selectAllText:"전체선택",deselectAllText:"전체해제",multipleSeparator:", "}}(jQuery)});

+ 35 - 0
main/inc/lib/javascript/bootstrap-select/js/i18n/defaults-nl_NL.js

@@ -0,0 +1,35 @@
+/*!
+ * Bootstrap-select v1.7.3 (http://silviomoreto.github.io/bootstrap-select)
+ *
+ * Copyright 2013-2015 bootstrap-select
+ * Licensed under MIT (https://github.com/silviomoreto/bootstrap-select/blob/master/LICENSE)
+ */
+
+(function (root, factory) {
+  if (typeof define === 'function' && define.amd) {
+    // AMD. Register as an anonymous module unless amdModuleId is set
+    define(["jquery"], function (a0) {
+      return (factory(a0));
+    });
+  } else if (typeof exports === 'object') {
+    // Node. Does not work with strict CommonJS, but
+    // only CommonJS-like environments that support module.exports,
+    // like Node.
+    module.exports = factory(require("jquery"));
+  } else {
+    factory(jQuery);
+  }
+}(this, function () {
+
+(function ($) {
+  $.fn.selectpicker.defaults = {
+    noneSelectedText: 'Niets geselecteerd',
+    noneResultsText: 'Geen resultaten gevonden voor {0}',
+    countSelectedText: '{0} van {1} geselecteerd',
+    maxOptionsText: ['Limiet bereikt ({n} {var} max)', 'Groep limiet bereikt ({n} {var} max)', ['items', 'item']],
+    multipleSeparator: ', '
+  };
+})(jQuery);
+
+
+}));

+ 7 - 0
main/inc/lib/javascript/bootstrap-select/js/i18n/defaults-nl_NL.min.js

@@ -0,0 +1,7 @@
+/*!
+ * Bootstrap-select v1.7.3 (http://silviomoreto.github.io/bootstrap-select)
+ *
+ * Copyright 2013-2015 bootstrap-select
+ * Licensed under MIT (https://github.com/silviomoreto/bootstrap-select/blob/master/LICENSE)
+ */
+!function(a,b){"function"==typeof define&&define.amd?define(["jquery"],function(a){return b(a)}):"object"==typeof exports?module.exports=b(require("jquery")):b(jQuery)}(this,function(){!function(a){a.fn.selectpicker.defaults={noneSelectedText:"Niets geselecteerd",noneResultsText:"Geen resultaten gevonden voor {0}",countSelectedText:"{0} van {1} geselecteerd",maxOptionsText:["Limiet bereikt ({n} {var} max)","Groep limiet bereikt ({n} {var} max)",["items","item"]],multipleSeparator:", "}}(jQuery)});

+ 37 - 0
main/inc/lib/javascript/bootstrap-select/js/i18n/defaults-pl_PL.js

@@ -0,0 +1,37 @@
+/*!
+ * Bootstrap-select v1.7.3 (http://silviomoreto.github.io/bootstrap-select)
+ *
+ * Copyright 2013-2015 bootstrap-select
+ * Licensed under MIT (https://github.com/silviomoreto/bootstrap-select/blob/master/LICENSE)
+ */
+
+(function (root, factory) {
+  if (typeof define === 'function' && define.amd) {
+    // AMD. Register as an anonymous module unless amdModuleId is set
+    define(["jquery"], function (a0) {
+      return (factory(a0));
+    });
+  } else if (typeof exports === 'object') {
+    // Node. Does not work with strict CommonJS, but
+    // only CommonJS-like environments that support module.exports,
+    // like Node.
+    module.exports = factory(require("jquery"));
+  } else {
+    factory(jQuery);
+  }
+}(this, function () {
+
+(function ($) {
+  $.fn.selectpicker.defaults = {
+    noneSelectedText: 'Nic nie zaznaczono',
+    noneResultsText: 'Brak wyników wyszukiwania {0}',
+    countSelectedText: 'Zaznaczono {0} z {1}',
+    maxOptionsText: ['Osiągnięto limit ({n} {var} max)', 'Limit grupy osiągnięty ({n} {var} max)', ['elementy', 'element']],
+    selectAll: 'Zaznacz wszystkie',
+    deselectAll: 'Odznacz wszystkie',
+    multipleSeparator: ', '
+  };
+})(jQuery);
+
+
+}));

+ 7 - 0
main/inc/lib/javascript/bootstrap-select/js/i18n/defaults-pl_PL.min.js

@@ -0,0 +1,7 @@
+/*!
+ * Bootstrap-select v1.7.3 (http://silviomoreto.github.io/bootstrap-select)
+ *
+ * Copyright 2013-2015 bootstrap-select
+ * Licensed under MIT (https://github.com/silviomoreto/bootstrap-select/blob/master/LICENSE)
+ */
+!function(a,b){"function"==typeof define&&define.amd?define(["jquery"],function(a){return b(a)}):"object"==typeof exports?module.exports=b(require("jquery")):b(jQuery)}(this,function(){!function(a){a.fn.selectpicker.defaults={noneSelectedText:"Nic nie zaznaczono",noneResultsText:"Brak wyników wyszukiwania {0}",countSelectedText:"Zaznaczono {0} z {1}",maxOptionsText:["Osiągnięto limit ({n} {var} max)","Limit grupy osiągnięty ({n} {var} max)",["elementy","element"]],selectAll:"Zaznacz wszystkie",deselectAll:"Odznacz wszystkie",multipleSeparator:", "}}(jQuery)});

+ 35 - 0
main/inc/lib/javascript/bootstrap-select/js/i18n/defaults-pt_BR.js

@@ -0,0 +1,35 @@
+/*!
+ * Bootstrap-select v1.7.3 (http://silviomoreto.github.io/bootstrap-select)
+ *
+ * Copyright 2013-2015 bootstrap-select
+ * Licensed under MIT (https://github.com/silviomoreto/bootstrap-select/blob/master/LICENSE)
+ */
+
+(function (root, factory) {
+  if (typeof define === 'function' && define.amd) {
+    // AMD. Register as an anonymous module unless amdModuleId is set
+    define(["jquery"], function (a0) {
+      return (factory(a0));
+    });
+  } else if (typeof exports === 'object') {
+    // Node. Does not work with strict CommonJS, but
+    // only CommonJS-like environments that support module.exports,
+    // like Node.
+    module.exports = factory(require("jquery"));
+  } else {
+    factory(jQuery);
+  }
+}(this, function () {
+
+(function ($) {
+  $.fn.selectpicker.defaults = {
+    noneSelectedText: 'Nada selecionado',
+    noneResultsText: 'Nada encontrado contendo {0}',
+    countSelectedText: 'Selecionado {0} de {1}',
+    maxOptionsText: ['Limite excedido (máx. {n} {var})', 'Limite do grupo excedido (máx. {n} {var})', ['itens', 'item']],
+    multipleSeparator: ', '
+  };
+})(jQuery);
+
+
+}));

+ 7 - 0
main/inc/lib/javascript/bootstrap-select/js/i18n/defaults-pt_BR.min.js

@@ -0,0 +1,7 @@
+/*!
+ * Bootstrap-select v1.7.3 (http://silviomoreto.github.io/bootstrap-select)
+ *
+ * Copyright 2013-2015 bootstrap-select
+ * Licensed under MIT (https://github.com/silviomoreto/bootstrap-select/blob/master/LICENSE)
+ */
+!function(a,b){"function"==typeof define&&define.amd?define(["jquery"],function(a){return b(a)}):"object"==typeof exports?module.exports=b(require("jquery")):b(jQuery)}(this,function(){!function(a){a.fn.selectpicker.defaults={noneSelectedText:"Nada selecionado",noneResultsText:"Nada encontrado contendo {0}",countSelectedText:"Selecionado {0} de {1}",maxOptionsText:["Limite excedido (máx. {n} {var})","Limite do grupo excedido (máx. {n} {var})",["itens","item"]],multipleSeparator:", "}}(jQuery)});

+ 35 - 0
main/inc/lib/javascript/bootstrap-select/js/i18n/defaults-pt_PT.js

@@ -0,0 +1,35 @@
+/*!
+ * Bootstrap-select v1.7.3 (http://silviomoreto.github.io/bootstrap-select)
+ *
+ * Copyright 2013-2015 bootstrap-select
+ * Licensed under MIT (https://github.com/silviomoreto/bootstrap-select/blob/master/LICENSE)
+ */
+
+(function (root, factory) {
+  if (typeof define === 'function' && define.amd) {
+    // AMD. Register as an anonymous module unless amdModuleId is set
+    define(["jquery"], function (a0) {
+      return (factory(a0));
+    });
+  } else if (typeof exports === 'object') {
+    // Node. Does not work with strict CommonJS, but
+    // only CommonJS-like environments that support module.exports,
+    // like Node.
+    module.exports = factory(require("jquery"));
+  } else {
+    factory(jQuery);
+  }
+}(this, function () {
+
+(function ($) {
+$.fn.selectpicker.defaults = {
+noneSelectedText: 'Nenhum seleccionado',
+noneResultsText: 'Sem resultados contendo {0}',
+countSelectedText: 'Selecionado {0} de {1}',
+maxOptionsText: ['Limite ultrapassado (máx. {n} {var})', 'Limite de seleções ultrapassado (máx. {n} {var})', ['itens', 'item']],
+multipleSeparator: ', '
+};
+})(jQuery);
+
+
+}));

+ 7 - 0
main/inc/lib/javascript/bootstrap-select/js/i18n/defaults-pt_PT.min.js

@@ -0,0 +1,7 @@
+/*!
+ * Bootstrap-select v1.7.3 (http://silviomoreto.github.io/bootstrap-select)
+ *
+ * Copyright 2013-2015 bootstrap-select
+ * Licensed under MIT (https://github.com/silviomoreto/bootstrap-select/blob/master/LICENSE)
+ */
+!function(a,b){"function"==typeof define&&define.amd?define(["jquery"],function(a){return b(a)}):"object"==typeof exports?module.exports=b(require("jquery")):b(jQuery)}(this,function(){!function(a){a.fn.selectpicker.defaults={noneSelectedText:"Nenhum seleccionado",noneResultsText:"Sem resultados contendo {0}",countSelectedText:"Selecionado {0} de {1}",maxOptionsText:["Limite ultrapassado (máx. {n} {var})","Limite de seleções ultrapassado (máx. {n} {var})",["itens","item"]],multipleSeparator:", "}}(jQuery)});

+ 35 - 0
main/inc/lib/javascript/bootstrap-select/js/i18n/defaults-ro_RO.js

@@ -0,0 +1,35 @@
+/*!
+ * Bootstrap-select v1.7.3 (http://silviomoreto.github.io/bootstrap-select)
+ *
+ * Copyright 2013-2015 bootstrap-select
+ * Licensed under MIT (https://github.com/silviomoreto/bootstrap-select/blob/master/LICENSE)
+ */
+
+(function (root, factory) {
+  if (typeof define === 'function' && define.amd) {
+    // AMD. Register as an anonymous module unless amdModuleId is set
+    define(["jquery"], function (a0) {
+      return (factory(a0));
+    });
+  } else if (typeof exports === 'object') {
+    // Node. Does not work with strict CommonJS, but
+    // only CommonJS-like environments that support module.exports,
+    // like Node.
+    module.exports = factory(require("jquery"));
+  } else {
+    factory(jQuery);
+  }
+}(this, function () {
+
+(function ($) {
+  $.fn.selectpicker.defaults = {
+    noneSelectedText: 'Nu a fost selectat nimic',
+    noneResultsText: 'Nu exista niciun rezultat {0}',
+    countSelectedText: '{0} din {1} selectat(e)',
+    maxOptionsText: ['Limita a fost atinsa ({n} {var} max)', 'Limita de grup a fost atinsa ({n} {var} max)', ['iteme', 'item']],
+    multipleSeparator: ', '
+  };
+})(jQuery);
+
+
+}));

+ 7 - 0
main/inc/lib/javascript/bootstrap-select/js/i18n/defaults-ro_RO.min.js

@@ -0,0 +1,7 @@
+/*!
+ * Bootstrap-select v1.7.3 (http://silviomoreto.github.io/bootstrap-select)
+ *
+ * Copyright 2013-2015 bootstrap-select
+ * Licensed under MIT (https://github.com/silviomoreto/bootstrap-select/blob/master/LICENSE)
+ */
+!function(a,b){"function"==typeof define&&define.amd?define(["jquery"],function(a){return b(a)}):"object"==typeof exports?module.exports=b(require("jquery")):b(jQuery)}(this,function(){!function(a){a.fn.selectpicker.defaults={noneSelectedText:"Nu a fost selectat nimic",noneResultsText:"Nu exista niciun rezultat {0}",countSelectedText:"{0} din {1} selectat(e)",maxOptionsText:["Limita a fost atinsa ({n} {var} max)","Limita de grup a fost atinsa ({n} {var} max)",["iteme","item"]],multipleSeparator:", "}}(jQuery)});

+ 36 - 0
main/inc/lib/javascript/bootstrap-select/js/i18n/defaults-ru_RU.js

@@ -0,0 +1,36 @@
+/*!
+ * Bootstrap-select v1.7.3 (http://silviomoreto.github.io/bootstrap-select)
+ *
+ * Copyright 2013-2015 bootstrap-select
+ * Licensed under MIT (https://github.com/silviomoreto/bootstrap-select/blob/master/LICENSE)
+ */
+
+(function (root, factory) {
+  if (typeof define === 'function' && define.amd) {
+    // AMD. Register as an anonymous module unless amdModuleId is set
+    define(["jquery"], function (a0) {
+      return (factory(a0));
+    });
+  } else if (typeof exports === 'object') {
+    // Node. Does not work with strict CommonJS, but
+    // only CommonJS-like environments that support module.exports,
+    // like Node.
+    module.exports = factory(require("jquery"));
+  } else {
+    factory(jQuery);
+  }
+}(this, function () {
+
+(function ($) {
+  $.fn.selectpicker.defaults = {
+    noneSelectedText: 'Ничего не выбрано',
+    noneResultsText: 'Совпадений не найдено {0}',
+    countSelectedText: 'Выбрано {0} из {1}',
+    maxOptionsText: ['Достигнут предел ({n} {var} максимум)', 'Достигнут предел в группе ({n} {var} максимум)', ['items', 'item']],
+    doneButtonText: 'Закрыть',
+    multipleSeparator: ', '
+  };
+})(jQuery);
+
+
+}));

+ 7 - 0
main/inc/lib/javascript/bootstrap-select/js/i18n/defaults-ru_RU.min.js

@@ -0,0 +1,7 @@
+/*!
+ * Bootstrap-select v1.7.3 (http://silviomoreto.github.io/bootstrap-select)
+ *
+ * Copyright 2013-2015 bootstrap-select
+ * Licensed under MIT (https://github.com/silviomoreto/bootstrap-select/blob/master/LICENSE)
+ */
+!function(a,b){"function"==typeof define&&define.amd?define(["jquery"],function(a){return b(a)}):"object"==typeof exports?module.exports=b(require("jquery")):b(jQuery)}(this,function(){!function(a){a.fn.selectpicker.defaults={noneSelectedText:"Ничего не выбрано",noneResultsText:"Совпадений не найдено {0}",countSelectedText:"Выбрано {0} из {1}",maxOptionsText:["Достигнут предел ({n} {var} максимум)","Достигнут предел в группе ({n} {var} максимум)",["items","item"]],doneButtonText:"Закрыть",multipleSeparator:", "}}(jQuery)});

+ 37 - 0
main/inc/lib/javascript/bootstrap-select/js/i18n/defaults-sk_SK.js

@@ -0,0 +1,37 @@
+/*!
+ * Bootstrap-select v1.7.3 (http://silviomoreto.github.io/bootstrap-select)
+ *
+ * Copyright 2013-2015 bootstrap-select
+ * Licensed under MIT (https://github.com/silviomoreto/bootstrap-select/blob/master/LICENSE)
+ */
+
+(function (root, factory) {
+  if (typeof define === 'function' && define.amd) {
+    // AMD. Register as an anonymous module unless amdModuleId is set
+    define(["jquery"], function (a0) {
+      return (factory(a0));
+    });
+  } else if (typeof exports === 'object') {
+    // Node. Does not work with strict CommonJS, but
+    // only CommonJS-like environments that support module.exports,
+    // like Node.
+    module.exports = factory(require("jquery"));
+  } else {
+    factory(jQuery);
+  }
+}(this, function () {
+
+(function ($) {
+  $.fn.selectpicker.defaults = {
+    noneSelectedText: 'Vyberte zo zoznamu',
+    noneResultsText: 'Pre výraz {0} neboli nájdené žiadne výsledky',
+    countSelectedText: 'Vybrané {0} z {1}',
+    maxOptionsText: ['Limit prekročený ({n} {var} max)', 'Limit skupiny prekročený ({n} {var} max)', ['položiek', 'položka']],
+    selectAllText: 'Vybrať všetky',
+    deselectAllText: 'Zrušiť výber',
+    multipleSeparator: ', '
+  };
+})(jQuery);
+
+
+}));

+ 7 - 0
main/inc/lib/javascript/bootstrap-select/js/i18n/defaults-sk_SK.min.js

@@ -0,0 +1,7 @@
+/*!
+ * Bootstrap-select v1.7.3 (http://silviomoreto.github.io/bootstrap-select)
+ *
+ * Copyright 2013-2015 bootstrap-select
+ * Licensed under MIT (https://github.com/silviomoreto/bootstrap-select/blob/master/LICENSE)
+ */
+!function(a,b){"function"==typeof define&&define.amd?define(["jquery"],function(a){return b(a)}):"object"==typeof exports?module.exports=b(require("jquery")):b(jQuery)}(this,function(){!function(a){a.fn.selectpicker.defaults={noneSelectedText:"Vyberte zo zoznamu",noneResultsText:"Pre výraz {0} neboli nájdené žiadne výsledky",countSelectedText:"Vybrané {0} z {1}",maxOptionsText:["Limit prekročený ({n} {var} max)","Limit skupiny prekročený ({n} {var} max)",["položiek","položka"]],selectAllText:"Vybrať všetky",deselectAllText:"Zrušiť výber",multipleSeparator:", "}}(jQuery)});

+ 44 - 0
main/inc/lib/javascript/bootstrap-select/js/i18n/defaults-sl_SI.js

@@ -0,0 +1,44 @@
+/*!
+ * Bootstrap-select v1.7.3 (http://silviomoreto.github.io/bootstrap-select)
+ *
+ * Copyright 2013-2015 bootstrap-select
+ * Licensed under MIT (https://github.com/silviomoreto/bootstrap-select/blob/master/LICENSE)
+ */
+
+(function (root, factory) {
+  if (typeof define === 'function' && define.amd) {
+    // AMD. Register as an anonymous module unless amdModuleId is set
+    define(["jquery"], function (a0) {
+      return (factory(a0));
+    });
+  } else if (typeof exports === 'object') {
+    // Node. Does not work with strict CommonJS, but
+    // only CommonJS-like environments that support module.exports,
+    // like Node.
+    module.exports = factory(require("jquery"));
+  } else {
+    factory(jQuery);
+  }
+}(this, function () {
+
+(function ($) {
+  $.fn.selectpicker.defaults = {
+    noneSelectedText: 'Nič izbranega',
+    noneResultsText: 'Ni zadetkov za {0}',
+    countSelectedText: function (numSelected, numTotal) {
+      "Število izbranih: {0}";
+    },
+    maxOptionsText: function (numAll, numGroup) {
+      return [
+        'Omejitev dosežena (max. izbranih: {n})',
+        'Omejitev skupine dosežena (max. izbranih: {n})'
+      ];
+    },
+    selectAllText: 'Izberi vse',
+    deselectAllText: 'Počisti izbor',
+    multipleSeparator: ', '
+  };
+})(jQuery);
+
+
+}));

+ 7 - 0
main/inc/lib/javascript/bootstrap-select/js/i18n/defaults-sl_SI.min.js

@@ -0,0 +1,7 @@
+/*!
+ * Bootstrap-select v1.7.3 (http://silviomoreto.github.io/bootstrap-select)
+ *
+ * Copyright 2013-2015 bootstrap-select
+ * Licensed under MIT (https://github.com/silviomoreto/bootstrap-select/blob/master/LICENSE)
+ */
+!function(a,b){"function"==typeof define&&define.amd?define(["jquery"],function(a){return b(a)}):"object"==typeof exports?module.exports=b(require("jquery")):b(jQuery)}(this,function(){!function(a){a.fn.selectpicker.defaults={noneSelectedText:"Nič izbranega",noneResultsText:"Ni zadetkov za {0}",countSelectedText:function(a,b){"Število izbranih: {0}"},maxOptionsText:function(a,b){return["Omejitev dosežena (max. izbranih: {n})","Omejitev skupine dosežena (max. izbranih: {n})"]},selectAllText:"Izberi vse",deselectAllText:"Počisti izbor",multipleSeparator:", "}}(jQuery)});

+ 44 - 0
main/inc/lib/javascript/bootstrap-select/js/i18n/defaults-sv_SE.js

@@ -0,0 +1,44 @@
+/*!
+ * Bootstrap-select v1.7.3 (http://silviomoreto.github.io/bootstrap-select)
+ *
+ * Copyright 2013-2015 bootstrap-select
+ * Licensed under MIT (https://github.com/silviomoreto/bootstrap-select/blob/master/LICENSE)
+ */
+
+(function (root, factory) {
+  if (typeof define === 'function' && define.amd) {
+    // AMD. Register as an anonymous module unless amdModuleId is set
+    define(["jquery"], function (a0) {
+      return (factory(a0));
+    });
+  } else if (typeof exports === 'object') {
+    // Node. Does not work with strict CommonJS, but
+    // only CommonJS-like environments that support module.exports,
+    // like Node.
+    module.exports = factory(require("jquery"));
+  } else {
+    factory(jQuery);
+  }
+}(this, function () {
+
+(function ($) {
+  $.fn.selectpicker.defaults = {
+    noneSelectedText: 'Inget valt',
+    noneResultsText: 'Inget sökresultat matchar {0}',
+    countSelectedText: function (numSelected, numTotal) {
+      return (numSelected === 1) ? "{0} alternativ valt" : "{0} alternativ valda";
+    },
+    maxOptionsText: function (numAll, numGroup) {
+      return [
+        'Gräns uppnåd (max {n} alternativ)',
+        'Gräns uppnåd (max {n} gruppalternativ)'
+      ];
+    },
+    selectAllText: 'Markera alla',
+    deselectAllText: 'Avmarkera alla',
+    multipleSeparator: ', '
+  };
+})(jQuery);
+
+
+}));

+ 7 - 0
main/inc/lib/javascript/bootstrap-select/js/i18n/defaults-sv_SE.min.js

@@ -0,0 +1,7 @@
+/*!
+ * Bootstrap-select v1.7.3 (http://silviomoreto.github.io/bootstrap-select)
+ *
+ * Copyright 2013-2015 bootstrap-select
+ * Licensed under MIT (https://github.com/silviomoreto/bootstrap-select/blob/master/LICENSE)
+ */
+!function(a,b){"function"==typeof define&&define.amd?define(["jquery"],function(a){return b(a)}):"object"==typeof exports?module.exports=b(require("jquery")):b(jQuery)}(this,function(){!function(a){a.fn.selectpicker.defaults={noneSelectedText:"Inget valt",noneResultsText:"Inget sökresultat matchar {0}",countSelectedText:function(a,b){return 1===a?"{0} alternativ valt":"{0} alternativ valda"},maxOptionsText:function(a,b){return["Gräns uppnåd (max {n} alternativ)","Gräns uppnåd (max {n} gruppalternativ)"]},selectAllText:"Markera alla",deselectAllText:"Avmarkera alla",multipleSeparator:", "}}(jQuery)});

+ 44 - 0
main/inc/lib/javascript/bootstrap-select/js/i18n/defaults-tr_TR.js

@@ -0,0 +1,44 @@
+/*!
+ * Bootstrap-select v1.7.3 (http://silviomoreto.github.io/bootstrap-select)
+ *
+ * Copyright 2013-2015 bootstrap-select
+ * Licensed under MIT (https://github.com/silviomoreto/bootstrap-select/blob/master/LICENSE)
+ */
+
+(function (root, factory) {
+  if (typeof define === 'function' && define.amd) {
+    // AMD. Register as an anonymous module unless amdModuleId is set
+    define(["jquery"], function (a0) {
+      return (factory(a0));
+    });
+  } else if (typeof exports === 'object') {
+    // Node. Does not work with strict CommonJS, but
+    // only CommonJS-like environments that support module.exports,
+    // like Node.
+    module.exports = factory(require("jquery"));
+  } else {
+    factory(jQuery);
+  }
+}(this, function () {
+
+(function ($) {
+  $.fn.selectpicker.defaults = {
+    noneSelectedText: 'Hiçbiri seçilmedi',
+    noneResultsText: 'Hiçbir sonuç bulunamadı {0}',
+    countSelectedText: function (numSelected, numTotal) {
+      return (numSelected == 1) ? "{0} öğe seçildi" : "{0} öğe seçildi";
+    },
+    maxOptionsText: function (numAll, numGroup) {
+      return [
+        (numAll == 1) ? 'Limit aşıldı (maksimum {n} sayıda öğe )' : 'Limit aşıldı (maksimum {n} sayıda öğe)',
+        (numGroup == 1) ? 'Grup limiti aşıldı (maksimum {n} sayıda öğe)' : 'Grup limiti aşıldı (maksimum {n} sayıda öğe)'
+      ];
+    },
+    selectAllText: 'Tümünü Seç',
+    deselectAllText: 'Seçiniz',
+    multipleSeparator: ', '
+  };
+})(jQuery);
+
+
+}));

+ 7 - 0
main/inc/lib/javascript/bootstrap-select/js/i18n/defaults-tr_TR.min.js

@@ -0,0 +1,7 @@
+/*!
+ * Bootstrap-select v1.7.3 (http://silviomoreto.github.io/bootstrap-select)
+ *
+ * Copyright 2013-2015 bootstrap-select
+ * Licensed under MIT (https://github.com/silviomoreto/bootstrap-select/blob/master/LICENSE)
+ */
+!function(a,b){"function"==typeof define&&define.amd?define(["jquery"],function(a){return b(a)}):"object"==typeof exports?module.exports=b(require("jquery")):b(jQuery)}(this,function(){!function(a){a.fn.selectpicker.defaults={noneSelectedText:"Hiçbiri seçilmedi",noneResultsText:"Hiçbir sonuç bulunamadı {0}",countSelectedText:function(a,b){return"{0} öğe seçildi"},maxOptionsText:function(a,b){return[1==a?"Limit aşıldı (maksimum {n} sayıda öğe )":"Limit aşıldı (maksimum {n} sayıda öğe)","Grup limiti aşıldı (maksimum {n} sayıda öğe)"]},selectAllText:"Tümünü Seç",deselectAllText:"Seçiniz",multipleSeparator:", "}}(jQuery)});

+ 35 - 0
main/inc/lib/javascript/bootstrap-select/js/i18n/defaults-ua_UA.js

@@ -0,0 +1,35 @@
+/*!
+ * Bootstrap-select v1.7.3 (http://silviomoreto.github.io/bootstrap-select)
+ *
+ * Copyright 2013-2015 bootstrap-select
+ * Licensed under MIT (https://github.com/silviomoreto/bootstrap-select/blob/master/LICENSE)
+ */
+
+(function (root, factory) {
+  if (typeof define === 'function' && define.amd) {
+    // AMD. Register as an anonymous module unless amdModuleId is set
+    define(["jquery"], function (a0) {
+      return (factory(a0));
+    });
+  } else if (typeof exports === 'object') {
+    // Node. Does not work with strict CommonJS, but
+    // only CommonJS-like environments that support module.exports,
+    // like Node.
+    module.exports = factory(require("jquery"));
+  } else {
+    factory(jQuery);
+  }
+}(this, function () {
+
+(function ($) {
+  $.fn.selectpicker.defaults = {
+    noneSelectedText: 'Нічого не вибрано',
+    noneResultsText: 'Збігів не знайдено {0}',
+    countSelectedText: 'Вибрано {0} із {1}',
+    maxOptionsText: ['Досягнута межа ({n} {var} максимум)', 'Досягнута межа в групі ({n} {var} максимум)', ['items', 'item']],
+    multipleSeparator: ', '
+  };
+})(jQuery);
+
+
+}));

+ 7 - 0
main/inc/lib/javascript/bootstrap-select/js/i18n/defaults-ua_UA.min.js

@@ -0,0 +1,7 @@
+/*!
+ * Bootstrap-select v1.7.3 (http://silviomoreto.github.io/bootstrap-select)
+ *
+ * Copyright 2013-2015 bootstrap-select
+ * Licensed under MIT (https://github.com/silviomoreto/bootstrap-select/blob/master/LICENSE)
+ */
+!function(a,b){"function"==typeof define&&define.amd?define(["jquery"],function(a){return b(a)}):"object"==typeof exports?module.exports=b(require("jquery")):b(jQuery)}(this,function(){!function(a){a.fn.selectpicker.defaults={noneSelectedText:"Нічого не вибрано",noneResultsText:"Збігів не знайдено {0}",countSelectedText:"Вибрано {0} із {1}",maxOptionsText:["Досягнута межа ({n} {var} максимум)","Досягнута межа в групі ({n} {var} максимум)",["items","item"]],multipleSeparator:", "}}(jQuery)});

+ 35 - 0
main/inc/lib/javascript/bootstrap-select/js/i18n/defaults-zh_CN.js

@@ -0,0 +1,35 @@
+/*!
+ * Bootstrap-select v1.7.3 (http://silviomoreto.github.io/bootstrap-select)
+ *
+ * Copyright 2013-2015 bootstrap-select
+ * Licensed under MIT (https://github.com/silviomoreto/bootstrap-select/blob/master/LICENSE)
+ */
+
+(function (root, factory) {
+  if (typeof define === 'function' && define.amd) {
+    // AMD. Register as an anonymous module unless amdModuleId is set
+    define(["jquery"], function (a0) {
+      return (factory(a0));
+    });
+  } else if (typeof exports === 'object') {
+    // Node. Does not work with strict CommonJS, but
+    // only CommonJS-like environments that support module.exports,
+    // like Node.
+    module.exports = factory(require("jquery"));
+  } else {
+    factory(jQuery);
+  }
+}(this, function () {
+
+(function ($) {
+  $.fn.selectpicker.defaults = {
+    noneSelectedText: '没有选中任何项',
+    noneResultsText: '没有找到匹配项',
+    countSelectedText: '选中{1}中的{0}项',
+    maxOptionsText: ['超出限制 (最多选择{n}项)', '组选择超出限制(最多选择{n}组)'],
+    multipleSeparator: ', '
+  };
+})(jQuery);
+
+
+}));

+ 7 - 0
main/inc/lib/javascript/bootstrap-select/js/i18n/defaults-zh_CN.min.js

@@ -0,0 +1,7 @@
+/*!
+ * Bootstrap-select v1.7.3 (http://silviomoreto.github.io/bootstrap-select)
+ *
+ * Copyright 2013-2015 bootstrap-select
+ * Licensed under MIT (https://github.com/silviomoreto/bootstrap-select/blob/master/LICENSE)
+ */
+!function(a,b){"function"==typeof define&&define.amd?define(["jquery"],function(a){return b(a)}):"object"==typeof exports?module.exports=b(require("jquery")):b(jQuery)}(this,function(){!function(a){a.fn.selectpicker.defaults={noneSelectedText:"没有选中任何项",noneResultsText:"没有找到匹配项",countSelectedText:"选中{1}中的{0}项",maxOptionsText:["超出限制 (最多选择{n}项)","组选择超出限制(最多选择{n}组)"],multipleSeparator:", "}}(jQuery)});

+ 37 - 0
main/inc/lib/javascript/bootstrap-select/js/i18n/defaults-zh_TW.js

@@ -0,0 +1,37 @@
+/*!
+ * Bootstrap-select v1.7.3 (http://silviomoreto.github.io/bootstrap-select)
+ *
+ * Copyright 2013-2015 bootstrap-select
+ * Licensed under MIT (https://github.com/silviomoreto/bootstrap-select/blob/master/LICENSE)
+ */
+
+(function (root, factory) {
+  if (typeof define === 'function' && define.amd) {
+    // AMD. Register as an anonymous module unless amdModuleId is set
+    define(["jquery"], function (a0) {
+      return (factory(a0));
+    });
+  } else if (typeof exports === 'object') {
+    // Node. Does not work with strict CommonJS, but
+    // only CommonJS-like environments that support module.exports,
+    // like Node.
+    module.exports = factory(require("jquery"));
+  } else {
+    factory(jQuery);
+  }
+}(this, function () {
+
+(function ($) {
+  $.fn.selectpicker.defaults = {
+    noneSelectedText: '沒有選取任何項目',
+    noneResultsText: '沒有找到符合的結果',
+    countSelectedText: '已經選取{0}個項目',
+    maxOptionsText: ['超過限制 (最多選擇{n}項)', '超過限制(最多選擇{n}組)'],
+    selectAllText: '選取全部',
+    deselectAllText: '全部取消',
+    multipleSeparator: ', '
+  };
+})(jQuery);
+
+
+}));

+ 7 - 0
main/inc/lib/javascript/bootstrap-select/js/i18n/defaults-zh_TW.min.js

@@ -0,0 +1,7 @@
+/*!
+ * Bootstrap-select v1.7.3 (http://silviomoreto.github.io/bootstrap-select)
+ *
+ * Copyright 2013-2015 bootstrap-select
+ * Licensed under MIT (https://github.com/silviomoreto/bootstrap-select/blob/master/LICENSE)
+ */
+!function(a,b){"function"==typeof define&&define.amd?define(["jquery"],function(a){return b(a)}):"object"==typeof exports?module.exports=b(require("jquery")):b(jQuery)}(this,function(){!function(a){a.fn.selectpicker.defaults={noneSelectedText:"沒有選取任何項目",noneResultsText:"沒有找到符合的結果",countSelectedText:"已經選取{0}個項目",maxOptionsText:["超過限制 (最多選擇{n}項)","超過限制(最多選擇{n}組)"],selectAllText:"選取全部",deselectAllText:"全部取消",multipleSeparator:", "}}(jQuery)});

+ 1 - 1
main/inc/lib/javascript/chat/video.php

@@ -38,6 +38,7 @@ $htmlHeadXtra[] = '<script type="text/javascript" src="'
     . '"></script>' . "\n";
 
 $template = new Template();
+$template->assign('room_name', $chatVideo->getRoomName());
 $template->assign('chat_user', $chatUser);
 $template->assign('user_local', $userLocal);
 $template->assign('block_friends', $friend_html);
@@ -54,4 +55,3 @@ $template->assign(
     Display::return_message(get_lang('YourBroswerDoesNotSupportWebRTC'), 'warning')
 );
 $template->display_one_col_template();
-//$template->display_no_layout_template();

+ 0 - 165
main/inc/lib/jpegcam/LICENSE.txt

@@ -1,165 +0,0 @@
-		   GNU LESSER GENERAL PUBLIC LICENSE
-                       Version 3, 29 June 2007
-
- Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
- Everyone is permitted to copy and distribute verbatim copies
- of this license document, but changing it is not allowed.
-
-
-  This version of the GNU Lesser General Public License incorporates
-the terms and conditions of version 3 of the GNU General Public
-License, supplemented by the additional permissions listed below.
-
-  0. Additional Definitions. 
-
-  As used herein, "this License" refers to version 3 of the GNU Lesser
-General Public License, and the "GNU GPL" refers to version 3 of the GNU
-General Public License.
-
-  "The Library" refers to a covered work governed by this License,
-other than an Application or a Combined Work as defined below.
-
-  An "Application" is any work that makes use of an interface provided
-by the Library, but which is not otherwise based on the Library.
-Defining a subclass of a class defined by the Library is deemed a mode
-of using an interface provided by the Library.
-
-  A "Combined Work" is a work produced by combining or linking an
-Application with the Library.  The particular version of the Library
-with which the Combined Work was made is also called the "Linked
-Version".
-
-  The "Minimal Corresponding Source" for a Combined Work means the
-Corresponding Source for the Combined Work, excluding any source code
-for portions of the Combined Work that, considered in isolation, are
-based on the Application, and not on the Linked Version.
-
-  The "Corresponding Application Code" for a Combined Work means the
-object code and/or source code for the Application, including any data
-and utility programs needed for reproducing the Combined Work from the
-Application, but excluding the System Libraries of the Combined Work.
-
-  1. Exception to Section 3 of the GNU GPL.
-
-  You may convey a covered work under sections 3 and 4 of this License
-without being bound by section 3 of the GNU GPL.
-
-  2. Conveying Modified Versions.
-
-  If you modify a copy of the Library, and, in your modifications, a
-facility refers to a function or data to be supplied by an Application
-that uses the facility (other than as an argument passed when the
-facility is invoked), then you may convey a copy of the modified
-version:
-
-   a) under this License, provided that you make a good faith effort to
-   ensure that, in the event an Application does not supply the
-   function or data, the facility still operates, and performs
-   whatever part of its purpose remains meaningful, or
-
-   b) under the GNU GPL, with none of the additional permissions of
-   this License applicable to that copy.
-
-  3. Object Code Incorporating Material from Library Header Files.
-
-  The object code form of an Application may incorporate material from
-a header file that is part of the Library.  You may convey such object
-code under terms of your choice, provided that, if the incorporated
-material is not limited to numerical parameters, data structure
-layouts and accessors, or small macros, inline functions and templates
-(ten or fewer lines in length), you do both of the following:
-
-   a) Give prominent notice with each copy of the object code that the
-   Library is used in it and that the Library and its use are
-   covered by this License.
-
-   b) Accompany the object code with a copy of the GNU GPL and this license
-   document.
-
-  4. Combined Works.
-
-  You may convey a Combined Work under terms of your choice that,
-taken together, effectively do not restrict modification of the
-portions of the Library contained in the Combined Work and reverse
-engineering for debugging such modifications, if you also do each of
-the following:
-
-   a) Give prominent notice with each copy of the Combined Work that
-   the Library is used in it and that the Library and its use are
-   covered by this License.
-
-   b) Accompany the Combined Work with a copy of the GNU GPL and this license
-   document.
-
-   c) For a Combined Work that displays copyright notices during
-   execution, include the copyright notice for the Library among
-   these notices, as well as a reference directing the user to the
-   copies of the GNU GPL and this license document.
-
-   d) Do one of the following:
-
-       0) Convey the Minimal Corresponding Source under the terms of this
-       License, and the Corresponding Application Code in a form
-       suitable for, and under terms that permit, the user to
-       recombine or relink the Application with a modified version of
-       the Linked Version to produce a modified Combined Work, in the
-       manner specified by section 6 of the GNU GPL for conveying
-       Corresponding Source.
-
-       1) Use a suitable shared library mechanism for linking with the
-       Library.  A suitable mechanism is one that (a) uses at run time
-       a copy of the Library already present on the user's computer
-       system, and (b) will operate properly with a modified version
-       of the Library that is interface-compatible with the Linked
-       Version. 
-
-   e) Provide Installation Information, but only if you would otherwise
-   be required to provide such information under section 6 of the
-   GNU GPL, and only to the extent that such information is
-   necessary to install and execute a modified version of the
-   Combined Work produced by recombining or relinking the
-   Application with a modified version of the Linked Version. (If
-   you use option 4d0, the Installation Information must accompany
-   the Minimal Corresponding Source and Corresponding Application
-   Code. If you use option 4d1, you must provide the Installation
-   Information in the manner specified by section 6 of the GNU GPL
-   for conveying Corresponding Source.)
-
-  5. Combined Libraries.
-
-  You may place library facilities that are a work based on the
-Library side by side in a single library together with other library
-facilities that are not Applications and are not covered by this
-License, and convey such a combined library under terms of your
-choice, if you do both of the following:
-
-   a) Accompany the combined library with a copy of the same work based
-   on the Library, uncombined with any other library facilities,
-   conveyed under the terms of this License.
-
-   b) Give prominent notice with the combined library that part of it
-   is a work based on the Library, and explaining where to find the
-   accompanying uncombined form of the same work.
-
-  6. Revised Versions of the GNU Lesser General Public License.
-
-  The Free Software Foundation may publish revised and/or new versions
-of the GNU Lesser General Public License from time to time. Such new
-versions will be similar in spirit to the present version, but may
-differ in detail to address new problems or concerns.
-
-  Each version is given a distinguishing version number. If the
-Library as you received it specifies that a certain numbered version
-of the GNU Lesser General Public License "or any later version"
-applies to it, you have the option of following the terms and
-conditions either of that published version or of any later version
-published by the Free Software Foundation. If the Library as you
-received it does not specify a version number of the GNU Lesser
-General Public License, you may choose any version of the GNU Lesser
-General Public License ever published by the Free Software Foundation.
-
-  If the Library as you received it specifies that a proxy can decide
-whether future versions of the GNU Lesser General Public License shall
-apply, that proxy's public statement of acceptance of any version is
-permanent authorization for you to choose that version for the
-Library.

+ 0 - 8
main/inc/lib/jpegcam/index.html

@@ -1,8 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
-<head>
-</head>
-<body>
-<br />
-</body>
-</html>

BIN
main/inc/lib/jpegcam/shutter.mp3


+ 0 - 197
main/inc/lib/jpegcam/webcam.js

@@ -1,197 +0,0 @@
-/* JPEGCam v1.0.9 */
-/* Webcam library for capturing JPEG images and submitting to a server */
-/* Copyright (c) 2008 - 2009 Joseph Huckaby <jhuckaby@goldcartridge.com> */
-/* Licensed under the GNU Lesser Public License */
-/* http://www.gnu.org/licenses/lgpl.html */
-
-/* Usage:
-	<script language="JavaScript">
-		document.write( webcam.get_html(320, 240) );
-		webcam.set_api_url( 'test.php' );
-		webcam.set_hook( 'onComplete', 'my_callback_function' );
-		function my_callback_function(response) {
-			alert("Success! PHP returned: " + response);
-		}
-	</script>
-	<a href="javascript:void(webcam.snap())">Take Snapshot</a>
-*/
-
-// Everything is under a 'webcam' Namespace
-window.webcam = {
-	version: '1.0.9',
-	
-	// globals
-	ie: !!navigator.userAgent.match(/MSIE/),
-	protocol: location.protocol.match(/https/i) ? 'https' : 'http',
-	callback: null, // user callback for completed uploads
-	swf_url: 'webcam.swf', // URI to webcam.swf movie (defaults to cwd)
-	shutter_url: 'shutter.mp3', // URI to shutter.mp3 sound
-	api_url: '', // URL to upload script
-	loaded: false, // true when webcam movie finishes loading
-	quality: 90, // JPEG quality (1 - 100)
-	shutter_sound: true, // shutter sound effect on/off
-	stealth: false, // stealth mode (do not freeze image upon capture)
-	hooks: {
-		onLoad: null,
-		onComplete: null,
-		onError: null
-	}, // callback hook functions
-	
-	set_hook: function(name, callback) {
-		// set callback hook
-		// supported hooks: onLoad, onComplete, onError
-		if (typeof(this.hooks[name]) == 'undefined')
-			return alert("Hook type not supported: " + name);
-		
-		this.hooks[name] = callback;
-	},
-	
-	fire_hook: function(name, value) {
-		// fire hook callback, passing optional value to it
-		if (this.hooks[name]) {
-			if (typeof(this.hooks[name]) == 'function') {
-				// callback is function reference, call directly
-				this.hooks[name](value);
-			}
-			else if (typeof(this.hooks[name]) == 'array') {
-				// callback is PHP-style object instance method
-				this.hooks[name][0][this.hooks[name][1]](value);
-			}
-			else if (window[this.hooks[name]]) {
-				// callback is global function name
-				window[ this.hooks[name] ](value);
-			}
-			return true;
-		}
-		return false; // no hook defined
-	},
-	
-	set_api_url: function(url) {
-		// set location of upload API script
-		this.api_url = url;
-	},
-	
-	set_swf_url: function(url) {
-		// set location of SWF movie (defaults to webcam.swf in cwd)
-		this.swf_url = url;
-	},
-	
-	get_html: function(width, height, server_width, server_height) {
-		// Return HTML for embedding webcam capture movie
-		// Specify pixel width and height (640x480, 320x240, etc.)
-		// Server width and height are optional, and default to movie width/height
-		if (!server_width) server_width = width;
-		if (!server_height) server_height = height;
-		
-		var html = '';
-		var flashvars = 'shutter_enabled=' + (this.shutter_sound ? 1 : 0) + 
-			'&shutter_url=' + escape(this.shutter_url) + 
-			'&width=' + width + 
-			'&height=' + height + 
-			'&server_width=' + server_width + 
-			'&server_height=' + server_height;
-		
-		if (this.ie) {
-			html += '<object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" codebase="'+this.protocol+'://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=9,0,0,0" width="'+width+'" height="'+height+'" id="webcam_movie" align="middle"><param name="allowScriptAccess" value="always" /><param name="allowFullScreen" value="false" /><param name="movie" value="'+this.swf_url+'" /><param name="loop" value="false" /><param name="menu" value="false" /><param name="quality" value="best" /><param name="bgcolor" value="#ffffff" /><param name="flashvars" value="'+flashvars+'"/></object>';
-		}
-		else {
-			html += '<embed id="webcam_movie" src="'+this.swf_url+'" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="'+width+'" height="'+height+'" name="webcam_movie" align="middle" allowScriptAccess="always" allowFullScreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="'+flashvars+'" />';
-		}
-		
-		this.loaded = false;
-		return html;
-	},
-	
-	get_movie: function() {
-		// get reference to movie object/embed in DOM
-		if (!this.loaded) return alert("ERROR: Movie is not loaded yet");
-		var movie = document.getElementById('webcam_movie');
-		if (!movie) alert("ERROR: Cannot locate movie 'webcam_movie' in DOM");
-		return movie;
-	},
-	
-	set_stealth: function(stealth) {
-		// set or disable stealth mode
-		this.stealth = stealth;
-	},
-	
-	snap: function(url, callback, stealth) {
-		// take snapshot and send to server
-		// specify fully-qualified URL to server API script
-		// and callback function (string or function object)
-		if (callback) this.set_hook('onComplete', callback);
-		if (url) this.set_api_url(url);
-		if (typeof(stealth) != 'undefined') this.set_stealth( stealth );
-		
-		this.get_movie()._snap( this.api_url, this.quality, this.shutter_sound ? 1 : 0, this.stealth ? 1 : 0 );
-	},
-	
-	freeze: function() {
-		// freeze webcam image (capture but do not upload)
-		this.get_movie()._snap('', this.quality, this.shutter_sound ? 1 : 0, 0 );
-	},
-	
-	upload: function(url, callback) {
-		// upload image to server after taking snapshot
-		// specify fully-qualified URL to server API script
-		// and callback function (string or function object)
-		if (callback) this.set_hook('onComplete', callback);
-		if (url) this.set_api_url(url);
-		
-		this.get_movie()._upload( this.api_url );
-	},
-	
-	reset: function() {
-		// reset movie after taking snapshot
-		this.get_movie()._reset();
-	},
-	
-	configure: function(panel) {
-		// open flash configuration panel -- specify tab name:
-		// "camera", "privacy", "default", "localStorage", "microphone", "settingsManager"
-		if (!panel) panel = "camera";
-		this.get_movie()._configure(panel);
-	},
-	
-	set_quality: function(new_quality) {
-		// set the JPEG quality (1 - 100)
-		// default is 90
-		this.quality = new_quality;
-	},
-	
-	set_shutter_sound: function(enabled, url) {
-		// enable or disable the shutter sound effect
-		// defaults to enabled
-		this.shutter_sound = enabled;
-		this.shutter_url = url ? url : 'shutter.mp3';
-	},
-	
-	flash_notify: function(type, msg) {
-		// receive notification from flash about event
-		switch (type) {
-			case 'flashLoadComplete':
-				// movie loaded successfully
-				this.loaded = true;
-				this.fire_hook('onLoad');
-				break;
-
-			case 'error':
-				// HTTP POST error most likely
-				if (!this.fire_hook('onError', msg)) {
-					alert("JPEGCam Flash Error: " + msg);
-				}
-				break;
-
-			case 'success':
-				// upload complete, execute user callback function
-				// and pass raw API script results to function
-				this.fire_hook('onComplete', msg.toString());
-				break;
-
-			default:
-				// catch-all, just in case
-				alert("jpegcam flash_notify: " + type + ": " + msg);
-				break;
-		}
-	}
-};

BIN
main/inc/lib/jpegcam/webcam.swf


+ 5 - 3
main/inc/lib/template.lib.php

@@ -524,7 +524,7 @@ class Template
         foreach ($bowerCSSFiles as $file) {
             $css[] = api_get_path(WEB_PATH).'web/assets/'.$file;
         }
-        $css[] = api_get_path(WEB_CSS_PATH) . 'bootstrap-select.css';
+        $css[] = api_get_path(WEB_LIBRARY_PATH) . 'javascript/bootstrap-select/css/bootstrap-select.min.css';
         $css[] = api_get_path(WEB_LIBRARY_PATH) . 'javascript/chosen/chosen.css';
         $css[] = api_get_path(WEB_LIBRARY_PATH) . 'javascript/tag/style.css';
 
@@ -614,10 +614,14 @@ class Template
     public function set_js_files()
     {
         global $disable_js_and_css_files, $htmlHeadXtra;
+        
+        $isoCode = api_get_language_isocode();
 
         //JS files
         $js_files = array(
             'chosen/chosen.jquery.min.js',
+            'bootstrap-select/js/bootstrap-select.min.js',
+            'bootstrap-select/js/i18n/defaults-' . $isoCode . '_' . strtoupper($isoCode) . '.min.js'
         );
 
         $viewBySession = api_get_setting('my_courses_view_by_session') === 'true';
@@ -640,7 +644,6 @@ class Template
         $js_files[] = 'tag/jquery.fcbkcomplete.js';
 
         $js_file_to_string = null;
-        $isoCode = api_get_language_isocode();
 
         $bowerJsFiles = [
             'modernizr/modernizr.js',
@@ -668,7 +671,6 @@ class Template
         foreach ($bowerJsFiles as $file) {
             $js_file_to_string .= '<script type="text/javascript" src="'.api_get_path(WEB_PATH).'web/assets/'.$file.'"></script>'."\n";
         }
-        $js_file_to_string .= '<script type="text/javascript" src="'.  api_get_path(WEB_LIBRARY_PATH) . 'javascript/bootstrap-select.min.js"></script>'."\n";
 
         foreach ($js_files as $file) {
             $js_file_to_string .= api_get_js($file);

+ 11 - 0
main/lang/english/trad4all.inc.php

@@ -7511,10 +7511,21 @@ $ShowFullSkillNameOnSkillWheelTitle = "Show full skill name on skill wheel";
 $ShowFullSkillNameOnSkillWheelComment = "On the wheel of skills, it shows the name of the skill when it has short code.";
 $DBPort = "Port";
 $CreatedBy = "Created by";
+$DropboxHideGeneralCoachTitle = "Hide general coach in dropbox";
+$DropboxHideGeneralCoachComment = "Hide general coach name in the dropbox tool when the general coach uploaded the file";
 $UploadMyAssignment = "Upload my assignment";
 $Inserted = "Inserted";
 $YourBroswerDoesNotSupportWebRTC = "Your browser does not support native video transmission.";
 $OtherTeachers = "Other teachers";
 $CourseCategory = "Course category";
 $VideoChatBetweenUserXAndUserY = "Video chat between %s and %s";
+$Enable = "Enable";
+$Disable = "Disable";
+$AvoidChangingPageAsThisWillCutYourCurrentVideoChatSession = "Avoid changing page as this will cut your current video chat session";
+$ConnectingToPeer = "Connecting to peer";
+$ConnectionEstablished = "Connection established";
+$ConnectionFailed = "Connection failed";
+$ConnectionClosed = "Connection closed";
+$LocalConnectionFailed = "Local connection failed";
+$RemoteConnectionFailed = "Remote connection failed";
 ?>

+ 7 - 0
main/lang/french/trad4all.inc.php

@@ -7498,7 +7498,14 @@ $ShowFullSkillNameOnSkillWheelTitle = "Montrer nom complet sur roue de compéten
 $ShowFullSkillNameOnSkillWheelComment = "Dans la roue des compétences, montrer le titre complet de la compétence même si celle-ci dispose d'un code court (peut rendre la roue moins lisible selon la quantité de compétences)";
 $DBPort = "Port";
 $CreatedBy = "Créé par";
+$DropboxHideGeneralCoachTitle = "Cacher le tuteur général dans partage de documents";
+$DropboxHideGeneralCoachComment = "Cacher le nom du tuteur général de la session lorsque c'est lui qui a envoyé le document dans le partage de documents";
 $UploadMyAssignment = "Envoyer mon travail";
 $Inserted = "Inséré";
 $YourBroswerDoesNotSupportWebRTC = "Votre navigateur ne supporte pas nativement la transmission de vidéo.";
+$OtherTeachers = "Autres enseignants";
+$CourseCategory = "Catégorie de cours";
+$VideoChatBetweenUserXAndUserY = "Appel vidéo entre %s et %s";
+$Enable = "Activer";
+$Disable = "Désactiver";
 ?>

+ 7 - 0
main/lang/galician/trad4all.inc.php

@@ -1388,6 +1388,7 @@ $NoCategories = "Non hai categorías aquí";
 $AllowCoursesInCategory = "¿permitir engadir cursos nesta categoría?";
 $GoToForum = "Ir ó foro";
 $CategoryCode = "Categoría de código";
+$MetaTwitterCreatorComment = "Conta persoal de Twitter (ex: @ywarnier) que representa a *persoa* que está a cargo de ou representa este portal. Este campo é opcional.";
 $EditNode = "Editar esta categoría";
 $OpenNode = "Abrir esta categoría";
 $DeleteNode = "Borrar esta categoría";
@@ -1531,6 +1532,7 @@ $EditNews = "Modificar novas";
 $EditCategories = "Modificar categorías";
 $EditHomePage = "Modificar páxina de inicio";
 $AllowUserHeadingsComment = "Pode un administrador do curso definir cabeceiras de usuario para recoller máis información dos usuarios?";
+$MetaTwitterSiteTitle = "Conta de Twitter Site";
 $Languages = "Linguas";
 $NoticeTitle = "Título do aviso";
 $NoticeText = "Texto do aviso";
@@ -1538,6 +1540,7 @@ $LinkURL = "URL da ligazón";
 $OpenInNewWindow = "Abrir en unha ventá nova";
 $LimitUsersListDefaultMaxComment = "Nas pantallas que permiten a adición de usuarios a cursos ou clases, se a primira lista non filtrada contiver máis do que este número de usuarios, deixar por omisión a primeira letra (A)";
 $HideDLTTMarkupComment = "Ocultar a marca [=...=] cando unha variable de idioma non estea traducida";
+$UpgradeFromLMS19x = "Actualizar desde LMS v 1.9.*";
 $SignUp = "Rexístrate!!";
 $UserDeleted = "Eliminouse o usuario";
 $NoClassesForThisCourse = "Non hai clases suscritas a este curso";
@@ -1552,6 +1555,7 @@ $Exercises = "Exercicios";
 $AllowPersonalAgendaTitle = "Axenda persoal";
 $AllowPersonalAgendaComment = "¿Un usuario pode engadir eventos a súa axenda persoal?";
 $CurrentValue = "valor actual";
+$AlreadyRegisteredToSession = "Xa está rexistrado na sesión";
 $UserPassword = "Contrasinal";
 $SubscriptionAllowed = "Permitir inscrición";
 $UnsubscriptionAllowed = "Desinscrición permitida";
@@ -1622,6 +1626,7 @@ $ShowOnlineUsers = "Mostrar número de usuarios online en todas as páxinas (vis
 $ShowOnlineCourse = "Amosar o número de usuarios online neste curso";
 $ShowIconsInNavigationsMenuTitle = "Amosar as iconas no menú de navegación?";
 $SeeAllRightsAllRolesForSpecificLocation = "Ver todos os roles e dereitos para un lugar específico";
+$MetaTwitterCreatorTitle = "Conta Twiter Creator";
 $ClassesSubscribed = "As clases seleccionadas foron suscritas ós cursos seleccionados";
 $RoleId = "ID de rol";
 $RoleName = "Nome do rol";
@@ -1699,6 +1704,7 @@ $EnableToolIntroductionTitle = "Permitir as introducións das ferramentas";
 $EnableToolIntroductionComment = "Permitir introducións en cada ferramenta da páxina principal";
 $BreadCrumbsCourseHomepageTitle = "Camiño da páxina principal do curso";
 $BreadCrumbsCourseHomepageComment = "O camiño é o sistema de navegación horizontal mediante ligazóns que xeralmente se situa na zona superior esquerda da súa páxina. Nesta opción selecciona o que desexe que apareza no camiño das páxinas principais dos cursos";
+$MetaTwitterSiteComment = "Conta persoal en Twitter (ex: @ywarnier) que representa a persoa que está a cargo de ou representa ese portal. Este campo é opcional.";
 $LoginPageMainArea = "Área principal da páxina de acceso";
 $LoginPageMenu = "Menú da páxina de acceso";
 $CampusHomepageMainArea = "Área da páxina principal do campus";
@@ -6004,6 +6010,7 @@ $LPWasReset = "O itinerario de aprendizaxe foi reiniciado para o alumno";
 $AnnouncementVisible = "Anuncio visible";
 $AnnouncementInvisible = "Anuncio invisible";
 $GlossaryDeleted = "Glosario eliminado";
+$CalendarYear = "Calendario anual";
 $SessionReadOnly = "Só lectura";
 $SessionAccessible = "Accesible";
 $SessionNotAccessible = "Non accesible";

+ 348 - 1
main/lang/italian/trad4all.inc.php

@@ -2,7 +2,7 @@
 /*
 for more information: see languages.txt in the lang folder.
 */
-$OpenBadgesBannerText = "Puoi generare attestati di riconoscimento per le competenze acquisite dagli utenti, i quali potranno mostrarli come icone delle competenze e capacità acquisite, sui loro profili personali. Per ulteriori info su cos'è OpenBadges, visita: http://openbadges.org/";
+$OpenBadgesBannerText = "Puoi generare attestati di riconoscimento per le competenze acquisite dagli utenti, i quali potranno mostrarli come icone delle competenze e capacità acquisite, sui loro profili personali. Per ulteriori info su cos'è OpenBadges, visita:<a href=\"http://openbadges.org/\">http://openbadges.org/</a>";
 $OpenBadgesIntroduction = "Adesso è possibile progettare attestati di apprendimento attraverso i tuoi corsi su questo campus.";
 $DesignANewBadgeComment = "Progetta un nuovo attestato, scaricalo dal tool di progetto e caricalo in piattaforma.";
 $TheBadgesWillBeSentToThatBackpack = "Questi attestati saranno inviati a questo fascicolo.";
@@ -21,6 +21,18 @@ $SkillsReport = "Resoconto competenze";
 $AssignedUsersListToStudentBoss = "Utenti assegnati al loro superiore";
 $AssignUsersToBoss = "Assegna l'utente al suo superiore";
 $RoleStudentBoss = "Il superiore dello studente";
+$CosecantCsc = "Cosecante:\t\t\t\tcsc(x)";
+$HyperbolicCosecantCsch = "Cosecante iperbolica:\t\tcsch(x)";
+$ArccosecantArccsc = "Arcocosecante:\t\t\tarccsc(x)";
+$HyperbolicArccosecantArccsch = "Arcocosecante iperbolica:\t\tarccsch(x)";
+$SecantSec = "Secante:\t\t\t\tsec(x)";
+$HyperbolicSecantSech = "Secante iperbolica:\t\tsech(x)";
+$ArcsecantArcsec = "Arcosecante:\t\t\tarcsec(x)";
+$HyperbolicArcsecantArcsech = "Arcosecante iperbolica:\t\tarcsech(x)";
+$CotangentCot = "Cotangente:\t\t\tcot(x)";
+$HyperbolicCotangentCoth = "Cotangente iperbolica:\t\tcoth(x)";
+$ArccotangentArccot = "Arcocotangente:\t\t\tarccot(x)";
+$HyperbolicArccotangentArccoth = "Arcocotangente iperbolica:\t\tarccoth(x)";
 $HelpCookieUsageValidation = "Per monitorare l'uso dei contenuti questo sito usa i cookie.
 
 \nSe necessario, controlla le impostazioni sui cookie del tuo browser.
@@ -42,6 +54,73 @@ $AudioFileForItemX = "File audio per l'elemento %s";
 $ThereIsANewWorkFeedbackInWorkXHere = "C'è un nuovo feedback nel lavoro: %s Clicca qui per vedere.";
 $ThereIsANewWorkFeedback = "C'è un nuovo feedback in: %s";
 $LastUpload = "Ultimo caricamento";
+$EditUserListCSV = "Modifica la lista utenti";
+$NumberOfCoursesHidden = "Numero dei corsi nascosti";
+$Post = "Pubblica";
+$Write = "Scrivi";
+$YouHaveNotYetAchievedSkills = "Non hai ancora acquisito competenze";
+$Corn = "Mais";
+$Gray = "Grigio";
+$LightBlue = "Azzurro";
+$Black = "Nero";
+$White = "Bianco";
+$DisplayOptions = "Mostra opzioni";
+$EnterTheSkillNameToSearch = "Digita una competenza da ricercare";
+$SkillsSearch = "Ricerca competenze";
+$ChooseABackgroundColor = "Scegli un colore di fondo";
+$SocialWriteNewComment = "Scrivi un nuovo commento";
+$SocialWallWhatAreYouThinkingAbout = "A cosa stai pensando?";
+$SocialMessageDelete = "Cancella il commento";
+$SocialWall = "Social wall";
+$BuyCourses = "Acquista corsi";
+$MySessions = "Le mie sessioni";
+$ActivateAudioRecorder = "Attiva il registratore audio";
+$StartSpeaking = "Inizia a parlare";
+$AssignedCourses = "Corsi assegnati";
+$QuestionEditionNotAvailableBecauseItIsAlreadyAnsweredHoweverYouCanCopyItAndModifyTheCopy = "Non è possibile modificare il quesito perché ha già ricevuto delle risposte. Puoi comunque copiarlo e modificarlo.";
+$SessionDurationDescription = "La durata della sessione ti permette di impostare un numero di giorni nei quali vi è possibile accedere, partendo dalla data del primo accesso dell'utente alla sessione. In questo modo puoi impostare una sessione ad es. \" negli ultimi 15 gg.\", anziché farla iniziare a una data fissa per tutti gli studenti.";
+$HyperbolicArctangentArctanh = "Arcotangente iperbolico:\t\tarctanh(x)";
+$SessionDurationTitle = "Durata della sessione";
+$ArctangentArctan = "Arcotangente:\t\t\tarctan(x)";
+$HyperbolicTangentTanh = "Tangente iperbolica:\t\ttanh(x)";
+$TangentTan = "Tangente:\t\t\ttan(x)";
+$CoachAndStudent = "Istruttore e studente";
+$Serie = "Serie";
+$HyperbolicArccosineArccosh = "Arcocoseno iperbolico:\t\tarccosh(x)";
+$ArccosineArccos = "Arcocoseno:\t\t\tarccos(x)";
+$HyperbolicCosineCosh = "Coseno iperbolico:\t\tcosh(x)";
+$CosineCos = "Coseno:\t\t\t\tcos(x)";
+$TeacherTimeReport = "Rapporto orario docenti";
+$HyperbolicArcsineArcsinh = "Arcoseno iperbolico:\t\tarcsinh(x)";
+$YourLanguageNotThereContactUs = "Non trovi la tua lingua nella lista? Contattaci su info@chamilo.org e contribuisci alla traduzione.";
+$ArcsineArcsin = "Arcoseno:\t\t\tarcsin(x)";
+$HyperbolicSineSinh = "Funzione iperbolica:\t\tsinh(x)";
+$SineSin = "Seno:\t\t\t\tsin(x)";
+$PiNumberPi = "Pi greco:\t\t\tpi";
+$ENumberE = "E number:\t\t\te";
+$LogarithmLog = "Logaritmo:\t\t\tlog(x)";
+$NaturalLogarithmLn = "Logaritmo naturale:\t\tln(x)";
+$AbsoluteValueAbs = "Valore assoluto:\t\t\tabs(x)";
+$SquareRootSqrt = "Radice quadrata:\t\t\tsqrt(x)";
+$ExponentiationCircumflex = "Elevamento a potenza:\t\t\t^";
+$DivisionSlash = "Divisione:\t\t\t/";
+$MultiplicationStar = "Moltiplicazione:\t\t\t*";
+$SubstractionMinus = "Sottrazione:\t\t\t-";
+$SummationPlus = "Somma:\t\t\t+";
+$NotationList = "Notazione della Formula";
+$SubscribeToSessionRequest = "Richiesta di iscrizione a una sessione";
+$PleaseSubscribeMeToSession = "Si prega di considerare la mia iscrizione alla sessione";
+$SearchActiveSessions = "Cerca le sessioni attive";
+$UserNameHasDash = "Il nome utente non può contenere il carattere '-'";
+$IfYouWantOnlyIntegerValuesWriteBothLimitsWithoutDecimals = "Se si desiderano solo valori interi, scrivere entrambi i limiti senza decimali";
+$GiveAnswerVariations = "Scrivi quante varianti alla domanda desideri";
+$AnswerVariations = "Variazioni della domanda";
+$GiveFormula = "Prego, scrivi la formula";
+$SignatureFormula = "Cordialmente";
+$FormulaExample = "Formula d'esempio: sqrt( [x] / [y] ) * ( e ^ ( ln(pi) ) )";
+$VariableRanges = "Intervalli variabili";
+$ExampleValue = "Gamma del valore";
+$CalculatedAnswer = "Domanda calcolata";
 $UserIsCurrentlySubscribed = "L'utente è attualmente iscritto";
 $OnlyBestAttempts = "Solo le prove migliori";
 $IncludeAllUsers = "Includi tutti gli utenti";
@@ -242,6 +321,11 @@ $LearnpathsLeft = "Percorsi di apprendimento non completati";
 $LearnpathsDone = "Percorsi di apprendimento completati";
 $LearnpathsTotal = "Totale dei percorsi di apprendimento";
 $TimeLoggedIn = "Tempo di connessione (hh:mm)";
+$SelectSurvey = "Seleziona sondaggio";
+$SurveyCopied = "Sondaggio copiato";
+$NoSurveysAvailable = "Non ci sono sondaggi";
+$DescriptionCopySurvey = "Duplica una copia di un sondaggio vuoto in un altro corso. Avrai bisogno di due corsi: un corso di partenza e uno di destinazione.";
+$CopySurvey = "Copia sondaggio";
 $ChooseSession = "Scegli una sessione";
 $SearchSession = "Cerca sessioni";
 $ChooseStudent = "Scegli uno studente";
@@ -659,6 +743,7 @@ $DocumentsWillBeAddedToo = "Saranno aggiunti anche i documenti";
 $ToExportLearnpathWithQuizYouHaveToSelectQuiz = "Seleziona i test in elenco per includerli nella esportazione del modulo didattico";
 $ArchivesDirectoryNotWriteableContactAdmin = "La directory di archiviazione, usata dalla funzione, non è scrivibile. Se necessario, contatta l'amministratore di sistema.";
 $DestinationCourse = "Corso di destinazione";
+$ConvertToMultipleAnswer = "Converti in risposta multipla";
 $CasMainActivateComment = "Abilitando l'autenticazione CAS, gli utenti potranno utilizzare le loro credenziali CAS.
 Vai al Plugin per configurare un pulsante 'CAS Login' per questo campus.";
 $UsersRegisteredInAnyGroup = "Utenti registrati in qualsiasi gruppo";
@@ -748,6 +833,9 @@ $ThickStroke = "Spesso";
 $ShowHotCoursesComment = "La lista dei corsi più attivi sarà aggiunta alla pagina principale";
 $ShowHotCoursesTitle = "Mostra i corsi più attivi";
 $ThisItemIsInvisibleForStudentsButYouHaveAccessAsTeacher = "Questo elemento è invisibile agli studenti ma tu vi hai accesso come docente.";
+$PreventSessionAdminsToManageAllUsersTitle = "Impedisce agli amministratori delle sessioni di gestire tutti gli utenti";
+$IsOpenSession = "Sessione aperta";
+$AllowVisitors = "Permetti visitatori";
 $EnableIframeInclusionComment = "Permettere iFrame arbitrari nell'editor HTML potenzierà la capacità di editing degli utenti ma potrebbere aumentare i rischi per la sicurezza. Assicurati di sapere chi sono gli utenti e di poterti fidare.";
 $AddedToLPCannotBeAccessed = "Questa esercitazione è inclusa in un percorso di apprendimento, pertanto gli studenti non possono accedervi da qui. Se vuoi che questo stesso esercizio sia utilizzabile nel tool Esercitazioni, fai una copia cliccando sull'icona \"Copia\".";
 $EnableIframeInclusionTitle = "Permetti gli iFrame nell' editor HTML";
@@ -1045,6 +1133,7 @@ $AdminPass = "password dell'Amministratore (<font color=\"red\">puoi cambiarla</
 $EducationManager = "Responsabile didattico";
 $CampusName = "Il nome del vostro campus";
 $DBSettingIntro = "\t\t\t\tLo script d'installazione creerà il database principale. \t\t\t\tIn seguito il sistema avrà la necessità di creare un database per ogni corso.\t\t\t\tIn caso non vi sia concesso di creare più di un database selezionate l'opzione \"Unico database\" sottostante\t\t\t: la piattaforma verrà installata nella versione con database singolo.";
+$TimeSpentByStudentsInCourses = "Tempo trascorso dagli studenti nei corsi";
 $Step3 = "Passo 3 di 6";
 $Step4 = "Passo 4 di 6";
 $Step5 = "Passo 5 of 6";
@@ -1054,6 +1143,7 @@ $DBSetting = "Impostazioni del database MySQL";
 $MainLang = "Linguaggio principale";
 $Licence = "Licenza";
 $LastCheck = "Ultimo controllo prima dell'installazione";
+$AutoEvaluation = "Autovalutazione";
 $DbPrefixForm = "Prefisso di MySQL";
 $DbPrefixCom = "Lascia vuoto in caso non sia richiesto";
 $EncryptUserPass = "Crittografa le password degli utenti nel database";
@@ -1193,6 +1283,12 @@ $OrganiseDocuments = "Crea l'elenco dei contenuti";
 $Uncompress = "Estrai l'archivio compresso (.ZIP)";
 $ExportShort = "Esporta come SCORM";
 $AllDay = "Tutti i giorni";
+$PublicationStartDate = "Pubblicato il";
+$ShowStatus = "Mostra status";
+$Mode = "Modalità";
+$Schedule = "Programmma";
+$Place = "Località";
+$RecommendedNumberOfParticipants = "Numero consigliato di partecipanti";
 $WCAGGoMenu = "Vai al menù";
 $WCAGGoContent = "Vai al contenuto";
 $AdminBy = "Amministrato da";
@@ -1240,6 +1336,7 @@ $DeleteSelectedClasses = "Elimina le classi selezionate";
 $DeleteSelectedGroups = "Elimina i gruppi selezionati";
 $Administrator = "Amministratore";
 $ChangePicture = "Modifica l'immagine";
+$myCoursesSessionView = "Vista sessione";
 $AddUsers = "Aggiungi utenti";
 $AddGroups = "Aggiungi gruppi";
 $AddClasses = "Aggiungi classi";
@@ -1303,6 +1400,7 @@ $NoCategories = "Non ci sono categorie";
 $AllowCoursesInCategory = "Consentire l'aggiunta di corsi in questa categoria ?";
 $GoToForum = "Vai al forum";
 $CategoryCode = "Codice Categoria";
+$MetaTwitterCreatorComment = "Il Creatore account Twitter è un account Twitter (per es. @accademia) e rappresenta la *persona* che ha creato il sito. Questo campo è opzionale.";
 $EditNode = "Modifica questa categoria";
 $OpenNode = "Apri questa categoria";
 $DeleteNode = "Elimina questa categoria";
@@ -1313,6 +1411,7 @@ $TreeRecountedIn = "Struttura rinumerata in";
 $RebuildTree = "Ricostruisci struttura";
 $RefreshNbChildren = "Aggiorna numero dipendenti";
 $ShowTree = "Mostra struttura";
+$MetaImagePathTitle = "Percorso Meta immagine";
 $LogDeleteCat = "Categoria eliminata";
 $RecountChildren = "Riconta dipendenti";
 $UpInSameLevel = "Su nello stesso livello";
@@ -1369,6 +1468,7 @@ $CourseCreationSucceeded = "Il corso è stato creato correttamente.";
 $OnTheHardDisk = "sul disco rigido";
 $IsVirtualCourse = "E' un corso virtuale";
 $AnnouncementUpdated = "L'avviso è stato aggiornato";
+$MetaImagePathComment = "Questo percorso Meta Immagine punta a un file nella cartella di Chamilo (ad es. home/image.png) e dovrebbe essere visibile in una Twitter card o in una OpenGraph card mostrando un link al tuo LMS. Twitter raccomanda un'immagine da 120 x 120 pixel la quale può eventualmente essere rifilata a 120 x 90 px.";
 $PermissionsForNewFiles = "Permessi per i nuovi file";
 $PermissionsForNewFilesComment = "La possibilità di definire permessi per ogni nuovo file creato migliora la sicurezza nei confronti di attacchi eseguiti caricando nel portale dei file pericolosi. I permessi 0550 (in formato Linux) permettono una protezione abbastanza elevata.<br/>Se usi Oogie-Woogie assicurati che l'utente che lancia OpenOffice abbia i permessi di scrittura nella cartella del corso.";
 $Guest = "Ospite";
@@ -1446,6 +1546,7 @@ $EditNews = "Modifica le news";
 $EditCategories = "Modifica le categorie";
 $EditHomePage = "Modifica la Pagina iniziale";
 $AllowUserHeadingsComment = "Il gestore di un corso può definire intestazioni di utente per raccogliere ulteriori informazioni?";
+$MetaTwitterSiteTitle = "Account Twitter";
 $Languages = "Lingue";
 $NoticeTitle = "Titolo dell'avviso";
 $NoticeText = "Testo dell'avviso";
@@ -1453,6 +1554,8 @@ $LinkURL = "URL del collegamento";
 $OpenInNewWindow = "Apri in una nuova finestra";
 $LimitUsersListDefaultMaxComment = "Nelle schermate destinate all'iscrizione di utenti a corsi o alle classi, si vedrà  - a partire dalla lettera A - un elenco che non sarà più lungo del numero assegnato di elementi.";
 $HideDLTTMarkupComment = "Nascondi il marcatore [= ...=] per i nomi di variabile non tradotti";
+$UpgradeFromLMS19x = "Aggiornamento da LMS v1.9.*";
+$SignUp = "Iscriviti!";
 $UserDeleted = "Utente eliminato";
 $NoClassesForThisCourse = "Non ci sono classi iscritte al corso";
 $CourseUsage = "Utilizzo del corso";
@@ -1466,6 +1569,7 @@ $Exercises = "Test";
 $AllowPersonalAgendaTitle = "Agenda";
 $AllowPersonalAgendaComment = "L'utente può aggiungere elementi all'agenda personale?";
 $CurrentValue = "valore attuale";
+$AlreadyRegisteredToSession = "Già registrato alla sessione";
 $UserPassword = "Password";
 $SubscriptionAllowed = "Iscrizione consentita";
 $UnsubscriptionAllowed = "Cancellazione consentita";
@@ -1536,6 +1640,7 @@ $ShowOnlineUsers = "Mostra il numero di utenti online in ciascuna pagina (visibi
 $ShowOnlineCourse = "Mostra il numero di utenti online solo a chi è entrato nel corso";
 $ShowIconsInNavigationsMenuTitle = "Mosto le icone nel menù di navigazione?";
 $SeeAllRightsAllRolesForSpecificLocation = "Posizione:";
+$MetaTwitterCreatorTitle = "Creatore account Twitter";
 $ClassesSubscribed = "Le classi selezionate sono iscritte ai corsi selezionati";
 $RoleId = "ID del Ruolo";
 $RoleName = "Nome del Ruolo";
@@ -1613,6 +1718,7 @@ $EnableToolIntroductionTitle = "Abilita i testi introduttivi";
 $EnableToolIntroductionComment = "Abilita brevi indicazioni nella pagina iniziale dei diversi strumenti";
 $BreadCrumbsCourseHomepageTitle = "Barra di navigazione nella pagina principale del corso";
 $BreadCrumbsCourseHomepageComment = "La barra di navigazione indica il percorso necessario per raggiungere la pagina da quella principale (es. Corso > Forum > Assistenza)";
+$MetaTwitterSiteComment = "Il sito Twitter è un account Twitter (per es. @abarm_news) che è collegato al tuo sito. E' più un account temporaneo che un vero acoount Twitter e rappresenta un'entità (non una persona). Questo campo è richiesto se vuoi mostrare delle Twitter Cards.";
 $LoginPageMainArea = "Area principale della pagina di accesso";
 $LoginPageMenu = "Menù della pagina d'accesso";
 $CampusHomepageMainArea = "Area principale della pagina iniziale del corso";
@@ -1891,6 +1997,10 @@ $IsNotWritable = "è di sola lettura";
 $FieldMovedDown = "Il campo è stato spostato in basso";
 $CannotMoveField = "Il campo non può essere spostato";
 $FieldMovedUp = "Il campo è stato spostato in alto";
+$MetaTitleTitle = "OpenGraph meta title";
+$MetaDescriptionComment = "Mostrerà una meta OpenGraph Description negli headers del sito (og:description)";
+$MetaDescriptionTitle = "Meta descrizioni";
+$MetaTitleComment = "Mostrerà un OpenGraph Title meta (og:title) negli headers del tuo sito.";
 $FieldDeleted = "Campo eliminato";
 $CannotDeleteField = "Campo non eliminabile";
 $AddUsersByCoachTitle = "Iscrizione di utenti da parte del docente";
@@ -2515,9 +2625,21 @@ $AddAssignmentToCourse = "Includi pagina elaborati nel modulo";
 $AddForumToCourse = "Includi Forum nel modulo";
 $SaveAudioAndOrganization = "Salva audio e ordinamento";
 $UploadOnlyMp3Files = "Si possono caricare solo file mp3, grazie";
+$OpenBadgesTitle = "Chamilo supporta lo standard OpenBadges";
+$NoPosts = "Nessuna pubblicazione";
+$WithoutAchievedSkills = "Senza competenze raggiunte";
 $TypeMessage = "Per favore, scrivi il tuo messaggio !";
 $ConfirmReset = "Vuoi veramente cancellare tutti i messaggi ?";
+$MailCronCourseExpirationReminderBody = "Gentile %s, abbiamo verificato che non ha completato il corso di %s e benché la data di chiusura sia il %s, ti rimangono %s giorni per terminarlo. Ti ricordiamo che puoi seguire il corso una volta all'anno e per questo ti invitiamo a finirlo in tempo. Puoi accedere al corso a questo indirizzo: %s Cordiali saluti, %s E-Learning abarm.it";
+$MailCronCourseExpirationReminderSubject = "Urgente: %s avviso scadenza corso";
+$ExerciseAndLearningPath = "Esercitazione e Modulo didattico";
+$LearningPathGradebookWarning = "Attenzione: è possibile usare, nel Registro voti, i test che sono inseriti nei moduli didattici. Se il modulo didattico è già incluso, questo test è già nel Registro voti. La valutazione nei Moduli didattici è fatta sulla base di un progresso/percentuale, mentre la valutazione sui test è basata sul punteggio. Le valutazioni dei questionari dipendono se lo studente ha risposto (1) oppure no (0). Controlla che la combinazione delle valutazioni non diventi troppo complicata.";
+$ChooseEitherDurationOrTimeLimit = "Scegli la durata o il tempo limite";
 $ClearList = "Cancella i messaggi";
+$SessionBanner = "Banner sessione";
+$ShortDescription = "Descrizione breve";
+$TargetAudience = "Destinatari";
+$OpenBadgesActionCall = "Converti il tuo virtual campus in un'esperienza basata sull'apprendimento di competenze";
 $CallSent = "La chiamata in chat è stata inviata: sono in attesa di consenso da parte della persona che hai chiamato";
 $ChatDenied = "Il consenso alla chat è stato negato da parte della persona che hai chiamato";
 $Send = "Invia";
@@ -2856,6 +2978,7 @@ $DelImage = "Elimina immagine";
 $Code = "Codice del Corso";
 $Up = "Su";
 $Down = "giù";
+$TimeReportForCourseX = "Rapporto orario per il corso %s";
 $Theme = "Aspetto";
 $TheListIsEmpty = "L'elenco è vuoto.";
 $UniqueSelect = "Risposta singola";
@@ -2867,6 +2990,7 @@ $TooShort = "Troppo corto";
 $CourseCreate = "Crea un corso";
 $Todo = "Suggerimenti";
 $UserName = "Nome utente";
+$TimeReportIncludingAllCoursesAndSessionsByTeacher = "Rapporto orario di tutti i corsi e sessioni, per docente";
 $CategoryMod = "Modifica una categoria";
 $Hide = "Nascondi";
 $Dear = "Cara/o";
@@ -2964,6 +3088,8 @@ $SwitchToTeacherView = "Vista Docente";
 $SwitchToStudentView = "Vista Corsista";
 $AddResource = "Aggiungi";
 $AddedResources = "Allegati";
+$TimeReportForTeacherX = "Rapporto orario per il docente %s";
+$TotalTime = "Tempo totale";
 $NameOfLang['arabic'] = "Arabo";
 $NameOfLang['brazilian'] = "brasiliano";
 $NameOfLang['bulgarian'] = "Bulgaro";
@@ -3175,6 +3301,7 @@ $CourseAdminRoleDescription = "Gestione del corso";
 $MoveTo = "Sposta verso";
 $Delete = "Elimina";
 $MoveFileTo = "Sposta il file verso";
+$TimeReportForSessionX = "Rapporto orario per la sessione %s";
 $Error = "Errore";
 $Anonymous = "Anonimo";
 $h = "h";
@@ -3709,10 +3836,16 @@ $ThereIsNotACertificateAvailableByDefault = "Non ci sono certificati di default
 $CertificateMinimunScoreIsRequiredAndMustNotBeMoreThan = "Per il certificato è necessario un punteggio minimo non minore di";
 $CourseProgram = "Descrizione del Corso";
 $ThisCourseDescriptionIsEmpty = "Questo corso non è stato ancora descritto";
+$Vacancies = "Posti vacanti";
 $QuestionPlan = "Informazioni da dare:";
+$Cost = "Costo";
 $NewBloc = "Altro";
+$TeachingHours = "Ore di lezione";
+$Area = "Area";
+$InProcess = "In corso";
 $CourseDescriptionUpdated = "Descrizione del corso aggiornata";
 $CourseDescriptionDeleted = "Descrizione del corso eliminata";
+$PreventSessionAdminsToManageAllUsersComment = "Attivando questa opzione, gli amministratori delle sessioni, potranno vedere nell'area amministrativa solo gli utenti creati da loro.";
 $InvalidId = "Identificativo non valido";
 $Pass = "Password";
 $Advises = "Annunci";
@@ -3891,6 +4024,15 @@ $Interaction = "Interazione";
 $Authoring = "Contenuti";
 $SessionIdentifier = "Identificatore della sessione";
 $SessionCategory = "Categoria di sessione";
+$ConvertToUniqueAnswer = "Converti in risposta singola";
+$ReportsRequiresNoSetting = "Questo resoconto non richiede impostazioni";
+$ShowWizard = "Mostra la procedura guidata";
+$ReportFormat = "Formato resoconto";
+$ReportType = "Tipo di report";
+$PleaseChooseReportType = "Scegli un tipo di resoconto";
+$PleaseFillFormToBuildReport = "Compila il form per creare il resoconto";
+$UnknownFormat = "Formato sconosciuto";
+$ErrorWhileBuildingReport = "Errore durante la creazione del report";
 $WikiSearchResults = "Risultati della ricerca su Wiki";
 $StartPage = "Pagina iniziale";
 $EditThisPage = "Modifica la pagina";
@@ -4616,6 +4758,7 @@ $HAnnouncements = "Annunci";
 $HChat = "Chat";
 $HWork = "Contributi";
 $HTracking = "Statistiche";
+$IsInductionSession = "Sessione di tipo induttivo";
 $PublishSurvey = "Pubblica il questionario";
 $CompareQuestions = "Confronta le risposte";
 $InformationUpdated = "Informazione aggiornata";
@@ -4830,7 +4973,9 @@ $ShowThumbnails = "Mostra miniature";
 $SetSlideshowOptions = "Imposta le opzioni della presentazione";
 $SlideshowOptions = "Opzioni della presentazione";
 $NoResizing = "Non ridimensionare (predefinita)";
+$Brochure = "Brochure";
 $SlideShow = "Presentazione";
+$PublicationEndDate = "Ritirato il";
 $ViewSlideshow = "Mostra presentazione";
 $MyTasks = "Le mie attività";
 $FavoriteBlogs = "I miei blog";
@@ -5097,6 +5242,7 @@ $PleaseSelectInstallationProcessLanguage = "Ti prego di selezionare la lingua ch
 $HereAreTheValuesYouEntered = "Hai immesso i seguenti valori";
 $PrintThisPageToRememberPassAndOthers = "Stampa la pagina per ricordare la password e i parametri di configurazione";
 $TheInstallScriptWillEraseAllTables = "Lo script di installazione svuoterà completamente le tabelle dei database selezionati. TI RACCOMANDIAMO di eseguire un BACKUP COMPLETO del database e dei files prima di confermare l'inizio dell'installazione.";
+$Published = "Pubblicato";
 $ReadWarningBelow = "leggi gli avvisi di sicurezza sottostanti";
 $SecurityAdvice = "Avvisi di sicurezza";
 $YouHaveMoreThanXCourses = "Hai più di %d corsi nella piattaforma. Sono stati aggiornati silo %d corsi. Per aggiornare i corsi rimanenti, %s clicca qui %s";
@@ -5132,6 +5278,8 @@ $SilverLine = "Silver line";
 $SoberBrown = "Sober brown";
 $SteelGrey = "Steel grey";
 $TastyOlive = "Tasty olive";
+$QuestionsOverallReportDetail = "In questo resoconto ci sono i risultati di tutti i quesiti";
+$QuestionsOverallReport = "Report globale sulle domande";
 $NameOfLang['bosnian'] = "Bosniaco";
 $NameOfLang['czech'] = "Ceco";
 $NameOfLang['dari'] = "Dari (Farsi)";
@@ -5181,6 +5329,8 @@ $SendEmailToAdminComment = "Ogni volta che un docente crea un nuovo corso, verr
 $UserTag = "Etichetta utente";
 $SelectSession = "Seleziona la sessione";
 $SpecialCourse = "Corso speciale";
+$DurationInWords = "Durata letterale";
+$UploadCorrection = "Carica correzione";
 $MathASCIImathMLTitle = "Editor matematico ASCIIMathML";
 $MathASCIImathMLComment = "Abilita'editor matematico ASCIIMathML";
 $YoutubeForStudentsTitle = "Permetti ai corsisti di inserire video da YouTube";
@@ -5845,6 +5995,7 @@ $webserver = "Web Server";
 $mysql = "MySQL";
 $NotInserted = "Non inserito";
 $Multipleresponse = "Risposta multipla";
+$EnableMathJaxComment = "Attiva l'editor matematico MathJax";
 $YouCanNowLoginAtXUsingTheLoginAndThePasswordYouHaveProvided = "Ora puoi accedere a %s usando il nome utente e la password da te indicata";
 $HaveFun = "Buon lavoro,";
 $AreYouSureToEditTheUserStatus = "Sei sicuro di modificare lo stato dell'utente?";
@@ -5854,6 +6005,7 @@ $LPWasReset = "Il modulo è stato reinizializzato";
 $AnnouncementVisible = "Avviso visibile";
 $AnnouncementInvisible = "Avviso non visibile";
 $GlossaryDeleted = "Glossario eliminato";
+$CalendarYear = "Anno del calendario";
 $SessionReadOnly = "Sola lettura";
 $SessionAccessible = "Accessibile";
 $SessionNotAccessible = "Non accessibile";
@@ -6033,6 +6185,7 @@ $ChatFiles = "Storico chat";
 $Flash = "Flash";
 $Video = "Video";
 $Images = "Immagini";
+$UploadCorrections = "Carica le correzioni";
 $Text2AudioTitle = "Abilitare il servizio di ci conversione del testo in audio";
 $Text2AudioComment = "Strumento on-line di conversione che usa sistemi di sintesi vocale per produrre un file audio";
 $ShowUsersFoldersTitle = "Mostra le cartelle utenti nella sezione Documenti";
@@ -6098,6 +6251,7 @@ $MultipleAnswerCombinationTrueFalse = "Combinazione V/F/Non So";
 $DontKnow = "Non so";
 $ExamNotAvailableAtThisTime = "Esame non disponibile attualmente";
 $LoginOrEmailAddress = "Nome dell'utente ed indirizzo e-mail";
+$EnableMathJaxTitle = "Attiva MathJax";
 $Activate = "Attiva";
 $Deactivate = "Disattiva";
 $ConfigLearnpath = "Configura i moduli didattici";
@@ -7101,4 +7255,197 @@ $DataTableSearch = "Cerca";
 $HideColumn = "Nascondi colonna";
 $DisplayColumn = "Mostra colonna";
 $LegalAgreementAccepted = "Licenza d'uso e termini accettati";
+$WorkEmailAlertActivateOnlyForTeachers = "Attiva solo per gli avvisi email dei docenti per l'invio di nuovi lavori";
+$WorkEmailAlertActivateOnlyForStudents = "Attiva solo per gli avvisi email degli studenti per l'invio di nuovi lavori";
+$Uncategorized = "Senza categoria";
+$NaturalYear = "Anno Solare";
+$AutoWeight = "Carico automatico";
+$AutoWeightExplanation = "Usa il carico automatico per velocizzare le cose. Il sistema distribuirà eventualmente il carico totale fra gli elementi di valutazione qui sotto.";
+$EditWeight = "Modifica carico";
+$TheSkillHasBeenCreated = "La competenza è stata creata";
+$CreateSkill = "Crea competenza";
+$CannotCreateSkill = "Non posso creare la competenza";
+$SkillEdit = "Modifica competenza";
+$TheSkillHasBeenUpdated = "Competenza aggiornata";
+$CannotUpdateSkill = "Non posso aggiornare la competenza";
+$BadgesManagement = "Gestione Badges";
+$CurrentBadges = "Badges correnti";
+$SaveBadge = "Salva il badge";
+$BadgeMeasuresXPixelsInPNG = "Il badge misura 200 x 200 px, in PNG.";
+$SetTutor = "Imposta come istruttore";
+$UniqueAnswerImage = "Immagine risposta unica";
+$TimeSpentByStudentsInCoursesGroupedByCode = "Tempo trascorso dagli studenti nei corsi, raggruppati per codice";
+$TestResultsByStudentsGroupesByCode = "Risultati dei test per gruppi studente, per codice";
+$TestResultsByStudents = "Risultati test per studente";
+$SystemCouldNotLogYouIn = "Il sistema non ha consentito l'accesso. Contatta l'administrator.";
+$ShibbolethLogin = "Login Shibboleth";
+$NewStatus = "Nuovo status";
+$Reason = "Motivazioni";
+$RequestStatus = "Richiedi un nuovo status";
+$StatusRequestMessage = "Hai avuto accesso con permessi predefiniti. Puoi richiedere più permessi inviando la richiesta seguente.";
+$ReasonIsMandatory = "Il campo Motivazioni è obbligatorio. Compilalo prima di inviare.";
+$RequestSubmitted = "La tua richiesta è stata inviata.";
+$RequestFailed = "In questo momento non siamo in grado di soddisfare la tua richiesta. Contatta l'administrator.";
+$InternalLogin = "Login interno";
+$AlreadyLoggedIn = "Sei già connesso";
+$Draggable = "Ordinamento sequenza";
+$Incorrect = "Errato";
+$YouNotYetAchievedCertificates = "Non hai ancora acquisito nessun certificato. Prosegui col percorso di apprendimento!";
+$SearchCertificates = "Cerca certificati";
+$TheUserXNotYetAchievedCertificates = "L'utente %s non ha ancora acquisito nessun certificato";
+$CertificatesNotPublic = "I certificati non sono pubblicamente disponbili";
+$MatchingDraggable = "Combina trascinando";
+$ForumThreadPeerScoring = "Discussione segnata da colleghi";
+$ForumThreadPeerScoringComment = "Se selezionata, sarà necessario che ogni studente definisca almeno altri due studenti per avere un punteggio superiore a zero.";
+$ForumThreadPeerScoringStudentComment = "Per ottenere il punteggio previsto in questo forum, il tuo contributo dovrà essere vistato da un altro studente, e dovrai vistare i contributi di almeno altri 2 studenti. Fino a che non avrai raggiunto questo obiettivo, anche se vistato, il tuo contributo verrà visualizzato con punteggio 0 nelle valutazioni globali per questo corso.";
+$Readable = "Leggibile";
+$NotReadable = "Non leggibile";
+$DefaultInstallAdminFirstname = "Mario";
+$DefaultInstallAdminLastname = "Rossi";
+$AttendanceUpdated = "Presenze aggiornate";
+$HideHomeTopContentWhenLoggedInText = "Nascondi contenuti top sulla homepage quando connesso";
+$HideHomeTopContentWhenLoggedInComment = "Nell'homepage, questa opzione permette di nascondere il riquadro introduttivo (usandolo per gli annunci, per es.) a tutti gli utenti connessi. Tuttavia, l'introduzione rimarrà visibile agli utenti non connessi.";
+$HideGlobalAnnouncementsWhenNotLoggedInText = "Nascondi annunci globali agli utenti anonimi";
+$HideGlobalAnnouncementsWhenNotLoggedInComment = "Nasconde gli annunci agli utenti anonimi ma non agli utenti registrati.";
+$CourseCreationUsesTemplateText = "Utilizza un modello di corso per i nuovi corsi";
+$CourseCreationUsesTemplateComment = "Imposta per usare lo stesso modello grafico del corso (indentificabile dal suo ID numerico nel database) per tutti i nuovi corsi che saranno creati. Fai attenzione, perché potrebbe avere ripercussioni sullo spazio occupato. Il modello sarà usato quando il docente duplicherà il corso con lo strumento backup. Si applicherà la stessa regola agli altri backup. Lascia vuoto (o imposta 0) per disabilitare.";
+$EnablePasswordStrengthCheckerText = "Strumento di controllo del livello di robustezza della password";
+$EnablePasswordStrengthCheckerComment = "Abilita l'opzione per attivare un indicatore di forza della password quando un utente la modifica. Non impedirà di inserire password scadenti o insicure, è solo un indicatore.";
+$EnableCaptchaText = "CAPTCHA";
+$EnableCaptchaComment = "Abilita il CAPTCHA al login per evitare che robots forzino le password.";
+$CaptchaNumberOfMistakesBeforeBlockingAccountText = "Gestione errori sul CAPTCHA";
+$CaptchaNumberOfMistakesBeforeBlockingAccountComment = "Il numero di volte che un utente può sbagliare il CAPTCHA prima che il suo account venga bloccato.";
+$CaptchaTimeAccountIsLockedText = "Durata del blocco account";
+$CaptchaTimeAccountIsLockedComment = "Se l'utente raggiunge il numero massimo di tentativi consentiti (usando il CAPTCHA) il suo account sarà bloccato per questi minuti.";
+$DRHAccessToAllSessionContentText = "I responsabili Risorse Umane accedono a tutti i contenuti delle sessioni";
+$DRHAccessToAllSessionContentComment = "Se abilitato, ai responsabili Risorse Umane sarà garantito l'accesso a tutti i contenuti e a tutti gli utenti dalle sessioni che seguono.";
+$ShowGroupForaInGeneralToolText = "Mostra i gruppi dei forum nel forum generale";
+$ShowGroupForaInGeneralToolComment = "Mostra i gruppi dei forum nello strumento forum del corso. L'opzione è attiva normalmente (in questo caso la vibilità dei singoli gruppi forum ha diversi criteri). Se disattivata, i gruppi forum saranno vibili dallo strumento gruppi, pubblicamente visibili o no.";
+$TutorsCanAssignStudentsToSessionsText = "Il Tutor può assegnare studenti alle sessioni";
+$TutorsCanAssignStudentsToSessionsComment = "Se abilitata, i tutor/istruttori delle sessioni, possono iscrivere nuovi utenti alle loro sessioni. Tale opzione è comunque disponobile solo per gli amministratori e gli amministratori della sessione.";
+$UniqueAnswerImagePreferredSize200x150 = "L'immagine sarà ridimensionata a 200x150 pixels. Per una migliore visualizzazione, si raccomanda di caricare solo immagini di questa dimensione.";
+$AllowLearningPathReturnLinkTitle = "Mostra un link di ritorno al modulo didattico";
+$AllowLearningPathReturnLinkComment = "Disabilita questa opzione per nascondere il pulsante \"Ritorna all'homepage\" nel modulo didattico";
+$HideScormExportLinkTitle = "Nascondi l'esportazione SCORM";
+$HideScormExportLinkComment = "Nascondi l'icona \"esporta come SCORM\" nella lista dei moduli didattici";
+$HideScormCopyLinkTitle = "Nascondi la copia SCORM";
+$HideScormCopyLinkComment = "Nascondi l'icona \"copia modulo didattico\" nella lista dei moduli didattici";
+$HideScormPdfLinkTitle = "Nascondi esportazione PDF del modulo didattico";
+$HideScormPdfLinkComment = "Nascondi l'icona esportazione PDF del modulo didattico nella lista dei moduli didattici";
+$SessionDaysBeforeCoachAccessTitle = "Durata predefinita di pre-accesso dell'istruttore prima della sessione.";
+$SessionDaysBeforeCoachAccessComment = "Numero predefinito di giorni in cui un istruttore può accedere alla propria sessione prima del suo inizio";
+$SessionDaysAfterCoachAccessTitle = "Numero predefinito di giorni in cui un istruttore può accedere alla propria sessione quando essa è terminata";
+$SessionDaysAfterCoachAccessComment = "Numero predefinito di giorni in cui un istruttore può accedere alla propria sessione dopo la data ufficiale di scadenza";
+$PdfLogoHeaderTitle = "Logo PDF";
+$PdfLogoHeaderComment = "Utilizzabile come immagine in css/themes/[your-css]/images/pdf_logo_header.png, ma anche come logo PDF per le esportazioni in PDF (sostituendo il logo del portale)";
+$OrderUserListByOfficialCodeTitle = "Ordina gli utenti in base al codice";
+$OrderUserListByOfficialCodeComment = "Usa il \"codice\" per elencarela maggior parte degli studenti in piattaforma invece del nome e cognome.";
+$AlertManagerOnNewQuizTitle = "Impostazione avvisi email predefiniti in un nuovo quiz";
+$AlertManagerOnNewQuizComment = "Notificare via email ai docenti quando uno studente risponde a un quesito del test. Questa impostazione è predefinita per tutti i nuovi corsi ma il docente è libero di cambiarla per i propri corsi.";
+$ShowOfficialCodeInExerciseResultListTitle = "Mostra il codice nei risultati degli esercizi";
+$ShowOfficialCodeInExerciseResultListComment = "Mostrare nel resoconto sui risultati degli esercizi il codice dello studente";
+$HidePrivateCoursesFromCourseCatalogTitle = "Nascondi i corsi privati dal catalogo corsi";
+$HidePrivateCoursesFromCourseCatalogComment = "Nascondere i corsi privati dal catalogo corsi. Ha senso se si usa principalmente il catalogo corsi per permettere l'auto-iscrizione degli studenti ai corsi.";
+$CoursesCatalogueShowSessionsTitle = "Catalogo delle Sessioni e dei Corsi";
+$CoursesCatalogueShowSessionsComment = "Sia che si voglia mostrare solo i corsi, solo le sessioni, o entrambi corsi *e* sessioni, nel catalogo corsi.";
+$AutoDetectLanguageCustomPagesTitle = "Abilita l'auto-rilevamento della lingua nelle pagine personalizzate";
+$AutoDetectLanguageCustomPagesComment = "Se usi pagine personalizzate, abilita il rilevamento della lingua per presentare la pagina all'utente nella propria lingua; disabilita se vuoi imporre il linguaggio principale usato in piattaforma.";
+$LearningPathShowReducedReportTitle = "Moduli didattici: mostra resoconto ridotto";
+$LearningPathShowReducedReportComment = "Nello strumento Moduli didattici, quando l'utente controlla i propri progressi (con l'icona statistiche), mostra un brevissimo resoconto dei progressi, privo dei dettagli.";
+$AllowSessionCourseCopyForTeachersTitle = "Consenti agli Insegnanti la copia da sessione a sessione";
+$HideLogoutButtonTitle = "Nascondi pulsante di Logout";
+$RedirectAdminToCoursesListTitle = "Reindirizza Admin all'elenco dei corsi";
+$CookieWarningTitle = "Notifica della privacy sui cookie";
+$AttendanceDeletionEnableTitle = "Presenze: abilitare l'eliminazione";
+$GravatarPicturesTypeTitle = "Tipo avatar Gravatar";
+$ShowSessionDescriptionTitle = "Mostra la descrizione della sessione";
+$SSOForceRedirectTitle = "Single Sign On: forza il reindirizzamento";
+$SessionCourseOrderingTitle = "Ordinamento manuale dei corsi di sessione";
+$WithOutCategory = "Senza categoria";
+$UseAsReference = "Utilizza come riferimento";
+$SetAsRequirement = "Imposta come requisito";
+$AddSequence = "Aggiungi nuova sequenza";
+$GamificationModeTitle = "Modalità gamification";
+$LevelX = "Livello %s";
+$SeeCourse = "Visualizza corso";
+$XPoints = "%s punti";
+$FromXUntilY = "Dal %s fino al %s";
+$ByDate = "Per data";
+$ByTag = "Per tag";
+$EnableGamificationMode = "Attiva modalità gamification";
+$DisableGamificationMode = "Disattiva modalità gamification";
+$SequenceSelection = "Selezione sequenza";
+$SequenceConfiguration = "Configurazione sequenza";
+$SequencePreview = "Anteprima sequenza";
+$DisplayDates = "Date indicate";
+$ChatWithXUser = "Chat con %s";
+$StartVideoChat = "Inizia video chiamata";
+$FieldTypeVideoUrl = "Video URL";
+$InsertAValidUrl = "Inserisci URL valido";
+$SeeInformation = "Vedi informazioni";
+$ShareWithYourFriends = "Condividi con i tuoi amici";
+$ChatRoomName = "Nome Chatroom";
+$TheVideoChatRoomXNameAlreadyExists = "La video chatroom %s esiste già";
+$ChatRoomNotCreated = "Impossibile creare chatroom";
+$FromDateX = "Dal %s";
+$UntilDateX = "Fino al %s";
+$GraphDependencyTree = "Albero delle dipendenze";
+$CustomizeIcons = "Personalizza icone";
+$ExportAllToPDF = "Esporta tutto in PDF";
+$SelectSomeOptions = "Selezionare qualche opzione";
+$AddCustomCourseIntro = "Puoi aggiungere una introduzione per questo corso qui cliccando l'icona di editing";
+$ByDuration = "Per durata";
+$ByDates = "Per date";
+$PoweredByX = "Powered by %s";
+$NoDependencies = "Nessuna dipendenza";
+$SendMailToStudent = "Invia mail allo studente";
+$SendMailToHR = "Invia mail al Responsabile Risorse Umane";
+$FieldTypeInteger = "Valore numerico intero";
+$FieldTypeFileImage = "File immagine";
+$FieldTypeFloat = "Valore numerico float";
+$HtmlPurifierWikiTitle = "HTML Purifier nel Wiki";
+$RemoveTutorStatus = "Rimuovi lo stato del tutor";
+$InstitutionAddressTitle = "Indirizzo dell'Istituto";
+$InstitutionAddressComment = "Indirizzo";
+$LatestLoginInCourse = "Ultimo accesso al corso";
+$LatestLoginInPlatform = "Ultimo accesso alla piattaforma";
+$FirstLoginInPlatform = "Primo accesso alla piattaforma";
+$FirstLoginInCourse = "Primo accesso al corso";
+$LoadMoreComments = "Caricare più commenti";
+$ShowProgress = "Mostra progresso";
+$XPercent = "%s %%";
+$CheckRequirements = "Controllo requisiti";
+$SessionRequirements = "Requisiti di sessione";
+$AreYouSureToSubscribe = "Sei sicuro di volerti iscrivere?";
+$CheckYourEmailAndFollowInstructions = "Controlla la tua casella di posta elettronica e segui le istruzioni";
+$ResetPasswordInstructions = "Istruzioni per la procedura di modifica della password";
+$MailCronCourseFinishedSubject = "Fine corso %s";
+$GenerateDefaultContent = "Genera contenuto di default";
+$ThanksForYourSubscription = "Grazie per la tua iscrizione";
+$VideoUrl = "Video URL";
+$AddAttachment = "Aggiungi allegato";
+$OnlyLetters = "Solo lettere";
+$WordTofind = "Parola da trovare";
+$DateFormatLongNoDayJS = "MM dd,yy";
+$TimeFormatNoSecJS = "HH:mm";
+$SendSubscriptionNotification = "Invia mail di notifica per l'iscrizione";
+$SendAnEmailWhenAUserBeingSubscribed = "Invia una mail quando un utente risulta iscritto ad una sessione";
+$SelectDate = "Seleziona data";
+$OnlyLettersAndSpaces = "Solo lettere e spazi";
+$OnlyLettersAndNumbersAndSpaces = "Solo lettere, numeri e spazi";
+$CronRemindCourseFinishedActivateTitle = "Invia notifica di corso terminato";
+$ThanksForRegisteringToSite = "Grazie per esserti registrato su %s";
+$PreventMultipleSimultaneousLoginTitle = "Prevenire l'accesso simultaneo";
+$CourseCatalogIsPublicTitle = "Pubblicare catalogo corsi";
+$DownloadCertificatePdf = "Scarica il certificato in formato PDF";
+$EnterPassword = "Inserire la password";
+$DownloadReportPdf = "Scarica il report in formato PDF";
+$DBPort = "Porta";
+$CreatedBy = "Creato da";
+$DropboxHideGeneralCoachTitle = "-";
+$DropboxHideGeneralCoachComment = "-";
+$UploadMyAssignment = "Carica il mio compito";
+$Inserted = "Inserito";
+$OtherTeachers = "Altri insegnanti";
+$CourseCategory = "Categoria del corso";
 ?>

+ 11 - 0
main/lang/spanish/trad4all.inc.php

@@ -7536,10 +7536,21 @@ $ShowFullSkillNameOnSkillWheelTitle = "Mostrar nombre completo de la competencia
 $ShowFullSkillNameOnSkillWheelComment = "En la rueda de competencias, permite mostrar el nombre de la competencia cuando ésta tiene código corto.";
 $DBPort = "Puerto";
 $CreatedBy = "Creado por";
+$DropboxHideGeneralCoachTitle = "Esconder tutor general en compartir documentos";
+$DropboxHideGeneralCoachComment = "Esconder el nombre del tutor general en la herramienta Compartir Documentos cuando es quien ha subido el documento.";
 $UploadMyAssignment = "Enviar mi tarea";
 $Inserted = "Añadido";
 $YourBroswerDoesNotSupportWebRTC = "Su navegador no soporta nativamente la transmisión por videoconferencia.";
 $OtherTeachers = "Otros profesores";
 $CourseCategory = "Categoría de curso";
 $VideoChatBetweenUserXAndUserY = "Videollamada entre %s y %s";
+$Enable = "Activar";
+$Disable = "Desactivar";
+$AvoidChangingPageAsThisWillCutYourCurrentVideoChatSession = "Evite cambiar de página ya que esto puede cortar tu videollamada actual";
+$ConnectingToPeer = "Conectando";
+$ConnectionEstablished = "Conexión establecida";
+$ConnectionFailed = "Conexión fallida";
+$ConnectionClosed = "Conexión cerrada";
+$LocalConnectionFailed = "Conexión local fallida";
+$RemoteConnectionFailed = "Conexión remota fallida";
 ?>

+ 4 - 1
main/newscorm/learnpath.class.php

@@ -3113,7 +3113,10 @@ class learnpath
         $hide_teacher_icons_lp = api_get_configuration_value('hide_teacher_icons_lp');
 
         if ($is_allowed_to_edit && $hide_teacher_icons_lp == false) {
-            $gradebook = Security :: remove_XSS($_GET['gradebook']);
+            $gradebook = '';
+            if (!empty($_GET['gradebook'])) {
+                $gradebook = Security:: remove_XSS($_GET['gradebook']);
+            }
             if ($this->get_lp_session_id() == api_get_session_id()) {
                 $html .= '<div id="actions_lp" class="actions_lp">';
                 $html .= '<div class="btn-group">';

+ 88 - 18
main/template/default/chat/video.tpl

@@ -1,16 +1,22 @@
 <div id="chat-video-panel">
+    <div class="alert alert-warning alert-dismissible fade in">
+        <button type="button" class="close" data-dismiss="alert" aria-label="{{ 'Close'|get_lang }}">
+            <span aria-hidden="true">&times;</span>
+        </button>
+        <h4>{{ 'Warning'|get_lang }}</h4>
+        <p>
+            <i class="fa fa-warning"></i> {{ 'AvoidChangingPageAsThisWillCutYourCurrentVideoChatSession'|get_lang }}
+        </p>
+    </div>
     <div class="row">
         <div class="col-md-4">
-            <div id="chat-local-video"></div>
-            <div class="username-local">
-                {% if user_local.user_is_online_in_chat == 1 %}
-                    <img src="{{ 'online.png' | icon(16) }}" />
-                {% else %}
-                <img src="{{ 'offline.png' | icon(16) }}" />
-                {% endif %}
-                {{ user_local.complete_name }} ( {{ user_local.username }} )
+            <div class="thumbnail">
+                <div id="chat-local-video"></div>
+                <div class="caption">
+                    <p class="text-muted text-center">{{ user_local.complete_name }}</p>
+                </div>
             </div>
-
+            <div id="connection-status"></div>
             <div class="chat-friends">
                 <div class="panel-group" id="blocklistFriends" role="tablist" aria-multiselectable="true">
                     <div class="panel panel-default">
@@ -31,37 +37,97 @@
             </div>
         </div>
         <div class="col-md-8">
-            <div id="chat-remote-video"></div>
-            <div class="chat-user-remote">{{ "ChatWithXUser"|get_lang|format(chat_user.complete_name) }}</div>
+            <div class="thumbnail video-chat-user">
+                <div id="chat-remote-video"></div>
+                <div class="caption">
+                    <p class="text-muted text-center">{{ "ChatWithXUser"|get_lang|format(chat_user.complete_name) }}</p>
+                </div>
+            </div>
         </div>
     </div>
 </div>
 <script>
-    (function() {
+    (function () {
         var VideoChat = {
-            init: function() {
+            init: function () {
                 var isCompatible = !!Modernizr.prefixed('RTCPeerConnection', window);
 
-                var notifyNotSupport = function() {
+                var notifyNotSupport = function () {
                     $.get('{{ _p.web_ajax }}chat.ajax.php', {
                         action: 'notify_not_support',
-                        to: {{ chat_user.id }}
+                        to:{{ chat_user.id }}
                     });
                 };
 
-                var startVideoChat = function() {
+                var startVideoChat = function () {
                     var webRTC = new SimpleWebRTC({
                         localVideoEl: 'chat-local-video',
                         remoteVideosEl: '',
                         autoRequestMedia: true
                     });
 
-                    webRTC.on('readyToCall', function() {
+                    webRTC.on('readyToCall', function () {
                         webRTC.joinRoom('{{ room_name }}');
                     });
                     webRTC.on('videoAdded', function (video, peer) {
                         $(video).addClass('skip');
                         $('#chat-remote-video').html(video);
+
+                        if (peer && peer.pc) {
+                            peer.pc.on('iceConnectionStateChange', function () {
+                                var alertDiv = $('<div>')
+                                        .addClass('alert');
+
+                                switch (peer.pc.iceConnectionState) {
+                                    case 'checking':
+                                        alertDiv
+                                            .addClass('alert-info')
+                                            .html('<i class="fa fa-spinner fa-spin"></i> ' + "{{ 'ConnectingToPeer'|get_lang }}");
+                                        break;
+                                    case 'connected':
+                                        //no break
+                                    case 'completed':
+                                        alertDiv
+                                            .addClass('alert-success')
+                                            .html('<i class="fa fa-commenting"></i> ' + "{{ 'ConnectionEstablished'|get_lang }}");
+                                        break;
+                                    case 'disconnected':
+                                        alertDiv
+                                            .addClass('alert-info')
+                                            .html('<i class="fa fa-frown-o"></i> ' + "{{ 'Disconnected'|get_lang }}");
+                                        break;
+                                    case 'failed':
+                                        alertDiv
+                                            .addClass('alert-danger')
+                                            .html('<i class="fa fa-times"></i> ' + "{{ 'ConnectionFailed'|get_lang }}");
+                                        break;
+                                    case 'closed':
+                                        alertDiv
+                                            .addClass('alert-danger')
+                                            .html('<i class="fa fa-close"></i> ' + "{{ 'ConnectionClosed'|get_lang }}");
+                                        break;
+                                }
+
+                                $('#connection-status').html(alertDiv);
+                            });
+                        }
+                    });
+                    webRTC.on('videoRemoved', function (video, peer) {
+                        video.src = '';
+                    });
+                    webRTC.on('iceFailed', function (peer) {
+                        var alertDiv = $('<div>')
+                            .addClass('alert-danger')
+                            .html('<i class="fa fa-close"></i> ' + "{{ 'LocalConnectionFailed'|get_lang }}");
+
+                        $('#connection-status').html(alertDiv);
+                    });
+                    webRTC.on('connectivityError', function (peer) {
+                        var alertDiv = $('<div>')
+                            .addClass('alert-danger')
+                            .html('<i class="fa fa-close"></i> ' + "{{ 'RemoteConnectionFailed'|get_lang }}");
+
+                        $('#connection-status').html(alertDiv);
                     });
                 };
 
@@ -75,10 +141,14 @@
                 $('#messages').remove();
 
                 startVideoChat();
+
+                window.onbeforeunload = function () {
+                    return "{{ 'AvoidChangingPageAsThisWillCutYourCurrentVideoChatSession'|get_lang }}";
+                };
             }
         };
 
-        $(document).on('ready', function() {
+        $(document).on('ready', function () {
             VideoChat.init();
         });
     })();

+ 6 - 6
main/template/default/social/user_block.tpl

@@ -5,18 +5,18 @@
             {{ user.firstname }}<br>{{ user.lastname }}
         </p>
         <ul class="list-unstyled user-details">
-            <li>
-                <a href="{{ vcard_user_link }}">
-                    <img src="{{ "vcard.png" | icon(22) }}" alt="{{ "UserInfo" | get_lang }}">
-                    {{ "UserInfo" | get_lang }}
-                </a>
-            </li>
             <li>
                 <a href="{{ _p.web }}main/messages/new_message.php">
                     <img src="{{ "instant_message.png" | icon }}" alt="{{ "Email" | get_lang }}">
                     {{ user.email}}
                 </a>
             </li>
+            <li>
+                <a href="{{ vcard_user_link }}">
+                    <img src="{{ "vcard.png" | icon(22) }}" alt="{{ "UserInfo" | get_lang }}" width="22" height="22">
+                    {{ "UserInfo" | get_lang }}
+                </a>
+            </li>
             {% if chat_enabled == 1 %}
                 <li>
                     {% if user.user_is_online_in_chat != 0 %}

برخی فایل ها در این مقایسه diff نمایش داده نمی شوند زیرا تعداد فایل ها بسیار زیاد است