Bläddra i källkod

replace uploader to the Monoblock project

KoKiii 4 år sedan
förälder
incheckning
545ea2f9de

BIN
web_interface/dist/upload/error.html


BIN
web_interface/dist/upload/ieupload.js


BIN
web_interface/dist/upload/index.html


BIN
web_interface/dist/upload/login.html


BIN
web_interface/dist/upload/success.html


BIN
web_interface/dist/upload/upload.css


BIN
web_interface/dist/upload/upload.html


BIN
web_interface/dist/upload/upload.js


+ 0 - 25
web_interface/src/upload/error.html

@@ -1,25 +0,0 @@
-<!DOCTYPE html>
-<html lang="">
-<head>
-<meta charset="utf-8">
-<meta http-equiv="X-UA-Compatible" content="IE=edge">
-<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0">
-<link rel="stylesheet" href="upload.css">
-<title>Ошибка обновления</title>
-</head>
-<body>
-<nav class="navbar"></nav>
-<div class="wrapper">
-<h1>Обновление прошивки</h1>
-<div class="upload-form">
-<div class="guide" style="text-align:center;">
-  <p style="color:#d9534f;"><b>При обновлении программного обеспечения возникла ошибка.</b><br> Пожалуйста, попробуйте ещё раз через <span id="count-number">5</span> секунд</p>
-</div>
-</div>
-<script type="text/javascript" src="upload.js"></script>
-<script>
-  countdown();
-</script>
-</div>
-</body>
-</html>

+ 77 - 0
web_interface/src/upload/ieupload.js

@@ -0,0 +1,77 @@
+var uploadIndex = 0;
+
+function stoneAgeUpload(elements, url, formData, callback) {
+  formData = formData || {};
+
+  var iframeName = ['stoneage-fileupload', uploadIndex].join('-');
+  uploadIndex++;
+
+  // create iframe
+  var iframe = document.createElement('iframe');
+  iframe.id = iframeName;
+  iframe.name = iframeName;
+  iframe.style.display = 'none';
+  iframe.src = 'javascript:false;'; // to prevent warning in IE6
+  document.body.appendChild(iframe);
+
+  // create form
+  var form = document.createElement('form');
+  form.method = 'POST';
+  form.action = url;
+  form.target = iframeName;
+  form.encoding = form.enctype = 'multipart/form-data';
+  form.style.display = 'none';
+
+  // submit additional formData in hidden inputs
+  for (name in formData) {
+    var input = document.createElement('input');
+    input.type = 'hidden';
+    input.name = name;
+    input.value = formData[name];
+    form.appendChild(input);
+  }
+
+  document.body.appendChild(form);
+
+  // move elements into the form, submit, move element back to original position,
+  // and remove form
+  var i;
+  var l = elements.length;
+  var nextSiblings = [];
+  var unnamedInputs = [];
+  var parents = [];
+  for (i = 0; i < l; ++i) {
+    // set 'files[]' as default name for inputs without name
+    if (!elements[i].name) {
+      unnamedInputs.push(elements[i]);
+      elements[i].name = 'files[]';
+    }
+    nextSiblings.push(elements[i].nextSibling);
+    parents.push(elements[i].parentNode);
+    form.appendChild(elements[i]);
+  }
+
+  form.submit();
+
+  iframe.onerror = iframe.onload = function() {
+    // try to parse response, remove iframe, and pass response to callback
+    var response;
+    try {
+      var responseStr = iframe.contentWindow.document.body.innerHTML;
+      response = JSON.parse(responseStr);
+    } catch(e) {
+      response = responseStr;
+    }
+    iframe.parentNode.removeChild(iframe);
+    callback(response);
+  };
+
+  for (i = l - 1; i >= 0; --i) {
+    // unset default name attributes
+    if (unnamedInputs.indexOf(elements[i]) >= 0) {
+      elements[i].removeAttribute('name');
+    }
+    parents[i].insertBefore(elements[i], nextSiblings[i]);
+  }
+  form.parentNode.removeChild(form);
+};

+ 6 - 32
web_interface/src/upload/index.html

@@ -4,41 +4,15 @@
 <meta charset="utf-8">
 <meta http-equiv="X-UA-Compatible" content="IE=edge">
 <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0">
-<link rel="stylesheet" href="upload.css">
 <title>Обновление ПО</title>
+<style type="text/css">
+  body, html { margin: 0; padding: 0; height: 100%; overflow: hidden; }
+  #content { position:absolute; left: 0; right: 0; bottom: 0; top: 0px; }
+</style>
 </head>
 <body>
-<nav class="navbar"></nav>
-<div id="count-wrap">
-  <div id='countdown'>
-    <p>Контроллер будет перезагружен через <span id="count-number">5</span> секунд.</p>
+  <div id="content">
+    <iframe width="100%" height="100%" frameborder="0" src="upload.html" />
   </div>
-</div>
-<div class="wrapper">
-<h1>Обновление ПО</h1>
-<form  action="/upload.cgi" method="post" enctype="multipart/form-data" onsubmit="return Validate(this);">
-<div class="upload-form">
-<div class="guide">
-  <p>Для обновления ПО необходимо:</p>
-  <ol>
-    <li>Скопировать на компьютер или внешний носитель, файл ПО с расширением *.bin</li>
-    <li>Указать путь к файлу ПО</li>
-    <li>Нажать кнопку "Загрузить"</li>
-  </ol>
-  <p>Для возврата в основной интерфейс контроллера нажмите "Отменить"</p>
-</div>
-  <div class="upload-wrapper">
-    <input id="uploadFile" placeholder="Файл" disabled="disabled" class="file-name" />
-    <div class="fileUpload btn btn-primary">
-      <span>Выбор</span>
-      <input id="uploadBtn" type="file" class="upload" name="datafile"/>
-    </div>
-  </div>
-</div>
-  <input class="btn btn-primary" type="submit" value="Загрузить">
-  <input class="btn btn-danger" type="button" value="Отменить" id="goback" >
-</form>
-<script type="text/javascript" src="upload.js"></script>
-</div>
 </body>
 </html>

+ 0 - 20
web_interface/src/upload/login.html

@@ -1,20 +0,0 @@
-<!DOCTYPE html>
-<html lang="">
-<head>
-<meta charset="utf-8">
-<meta http-equiv="X-UA-Compatible" content="IE=edge">
-<meta name="viewport" content="width=device-width, initial-scale=1">
-<link rel="stylesheet" href="fwstyle.css">
-<title></title>
-</head>
-<body>
-<h2 style="text-align: center; padding-top: 100px;">Авторизация</h2>
-<form class="upload-form" action="/checklogin.cgi" method="post">
-    <input id="uploadFile" type="text" placeholder="Логин" class="login" size="20" name="username"/>
-    <input id="uploadFile" type="password" placeholder="Пароль" class="login" size="20" name="password"/>
-  <ul>
-    <input class="btn" type="submit" value="Войти">
-  </ul>
-</form>
-</body>
-</html>

+ 14 - 0
web_interface/src/upload/status.cgi

@@ -0,0 +1,14 @@
+#!C:\Python34\python.exe
+# -*- coding: utf-8 -*-
+import json
+import time
+print("Content-Type: application/json")
+print("")
+JSON = {
+  "file1": "NONE",
+  "file2": "RTPS_05502xx.bin",
+  "updtmr": "37",
+  "upload": "0",
+  "wrtmr": "20"
+}
+print(json.dumps(JSON))

+ 0 - 25
web_interface/src/upload/success.html

@@ -1,25 +0,0 @@
-<!DOCTYPE html>
-<html lang="">
-<head>
-<meta charset="utf-8">
-<meta http-equiv="X-UA-Compatible" content="IE=edge">
-<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0">
-<link rel="stylesheet" href="upload.css">
-<title>Успешное обновление</title>
-</head>
-<body>
-<nav class="navbar"></nav>
-<div class="wrapper">
-<h1>Обновление ПО</h1>
-<div class="upload-form">
-<div class="guide" style="text-align:center;">
-  <p style="color:#33CC00;"><b>Обновление программного обеспечения успешно завершено.</b><br> Контроллер будет перезагружен через <span id="count-number">5</span> секунд</p>
-</div>
-</div>
-<script type="text/javascript" src="upload.js"></script>
-<script>
-  countdown();
-</script>
-</div>
-</body>
-</html>

+ 16 - 0
web_interface/src/upload/upload.cgi

@@ -0,0 +1,16 @@
+#!C:\Python27\python.exe
+import cgi
+form = cgi.FieldStorage()
+print "Content-Type: text/html"
+print ""
+# print "<html>"
+# print "<p>"
+print str(form)
+# if form["password"].value == "12345":
+#   print "1"
+# else:
+#   print "0"
+# print "The user entered data are:<br>"
+# print "<b>Password:</b> " + type(form["password"].value) + "<br>"
+# print "</p>"
+# print "</html>"

+ 260 - 27
web_interface/src/upload/upload.css

@@ -8,42 +8,129 @@ body{color: #333;}
 .wrapper{width:960px;margin: 0 auto;}
 .guide{
   display: block;
+  border: 1px solid #e2e2e2;
   padding: 0 30px;
+  margin-bottom: 20px;
 }
-.guide > ul {
-  list-style: none;
+.guide > ol {
+  padding-left: 1.8em;
 }
+
 .guide p{padding: 10px 0;}
 h1{font-family:Arial, sans-serif;text-transform: uppercase;font-weight: normal;color: #747589; margin: .67em 0;}
-.upload-form{font-family:sans-serif;background-color:#fff;padding:30px;margin:20px auto;box-shadow: 0 1px 5px rgba(0,0,0,0.15);position: relative;}
-.fileUpload {position: relative; overflow: hidden;}
-.fileUpload input.upload {position: absolute;top: 0;right: 0;margin: 0;padding: 0;font-size: 20px;cursor: pointer;opacity: 0;filter: alpha(opacity=0);}
-button,html input[type="button"],input[type="reset"],input[type="submit"] {-webkit-appearance: button;cursor: pointer;}
+.upload-form{
+  position: relative;
+  margin:20px auto;
+  padding:30px;
+  background-color:#fff;
+  box-shadow: 0 1px 5px rgba(0,0,0,0.15);
+  font-family:sans-serif;
+}
+.fileUpload {
+  position: relative;
+  overflow: hidden;
+}
+.fileUpload input.upload {
+  position: absolute;
+  top:     0;
+  right:   0;
+  margin:  0;
+  padding: 0;
+  opacity: 0;
+  filter: alpha(opacity=0);
+  font-size: 20px;
+  cursor: pointer;
+}
+button,
+html input[type="button"],
+input[type="reset"],
+input[type="submit"] {
+  -webkit-appearance: button;
+  cursor: pointer;
+}
 /*button[disabled],html input[disabled] {cursor: default; background-color: rgb(235, 235, 228);}*/
 button::-moz-focus-inner,input::-moz-focus-inner {padding: 0;border: 0;}
 input {line-height: normal;}
-input.file-name{height: 30px;font-size: 12px;line-height: 1.5;padding:3px 10px;border: 1px solid #337ab7; border-radius: 0;display: block;float: left;}
-input.login{height: 30px;font-size: 12px;line-height: 1.5;padding:3px 10px;border: none; border-radius: 0; margin-bottom: 25px;width: 280px}
-.upload-wrapper{padding:10px 0px 30px 30px;width: 100%;}
-/*  .upload-form ul{list-style:none;margin:0 -30px -30px; border-top:1px solid #2b2e31;}
-.upload-form ul > input{width:100%;height: 50px;color: #fff;background-color: #337ab7;}
-.upload-form ul > input:hover{color: #d2d2d2;background-color: #2e6ea5;}*/
+input.file-name{
+  height: 29px;
+  font-size: 12px;
+  line-height: 1.5;
+  padding:3px 10px;
+  border: 1px solid #337ab7;
+  // border-top-right-radius:0px;
+  // border-top-left-radius:5px;
+  // border-bottom-right-radius:0px;
+  // border-bottom-left-radius:5px;
+  display: block;
+  float: left;
+}
+input.login {
+  width: 280px;
+  height: 30px;
+  padding:3px 10px;
+  margin-bottom: 25px;
+  border: none;
+  border-radius: 0;
+  font-size: 12px;
+  line-height: 1.5;
+}
+.upload-wrapper{
+  padding:10px 0px 20px 5px;
+  width: 100%;
+  height: 39px
+}
+.fileUpload.btn {
+  float: left;
+  border: 1px solid;
+  // border-top-right-radius:5px;
+  // border-top-left-radius:0px;
+  // border-bottom-right-radius:5px;
+  // border-bottom-left-radius:0px;
+  border-color: #3d7ab7;
+}
 .btn {
   display: inline-block;
-  padding: 0.51em 12px;
+  padding: 6px 12px;
   margin-bottom: 0;
   font-size: 0.9em;
   font-weight: normal;
-  line-height: 1.5em;
+  line-height: 1.6em;
   text-align: center;
   white-space: nowrap;
   vertical-align: middle;
+  -ms-touch-action: manipulation;
+      touch-action: manipulation;
   cursor: pointer;
-  -ms-touch-action: manipulation;touch-action: manipulation;
-  -webkit-user-select: none;-moz-user-select: none;-ms-user-select: none;user-select: none;
+  -webkit-user-select: none;
+     -moz-user-select: none;
+      -ms-user-select: none;
+          user-select: none;
   background-image: none;
   border: 1px solid transparent;
-  border-radius: 0;
+  // border-radius: 5px;
+}
+.btn:focus,
+.btn:active:focus,
+.btn.active:focus,
+.btn.focus,
+.btn:active.focus,
+.btn.active.focus {
+  outline: thin dotted;
+  outline: 5px auto -webkit-focus-ring-color;
+  outline-offset: -2px;
+}
+.btn:hover,
+.btn:focus,
+.btn.focus {
+  color: #333;
+  text-decoration: none;
+}
+.btn:active,
+.btn.active {
+  background-image: none;
+  outline: 0;
+  -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);
+          box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);
 }
 .btn.disabled,
 .btn[disabled],
@@ -55,11 +142,23 @@ fieldset[disabled] .btn {
           box-shadow: none;
   opacity: .65;
 }
-.btn:focus,.btn:active:focus,.btn.active:focus,.btn.focus,.btn:active.focus,.btn.active.focus {outline: thin dotted;outline: 5px auto -webkit-focus-ring-color;outline-offset: -2px;}
-.btn:hover,.btn:focus,.btn.focus {color: #333;text-decoration: none;}
-.btn-primary {color: #fff;background-color: #337ab7;border-color: #3d7ab7;}
-.btn-primary:hover,.btn-primary:focus,.btn-primary.focus,.btn-primary:active,
-.btn-primary.active,.open > .dropdown-toggle.btn-primary {color: #fff;background-color: #2e6ea5;border-color: #2C5884;}
+.btn-primary {
+  color: #fff;
+  background-color: #337ab7;
+  border-color: #fff;
+}
+/*.btn-primary {
+  color: #fff;
+  background-color: #337ab7;
+  border-color: #3d7ab7;
+}*/
+.btn-primary:hover,.btn-primary:focus,
+.btn-primary.focus,.btn-primary:active,
+.btn-primary.active,.open > .dropdown-toggle.btn-primary {
+  color: #fff;
+  background-color: #2e6ea5;
+  // border-color: #F1F1F1;
+}
 .btn-primary:active,.btn-primary.active,.open > .dropdown-toggle.btn-primary {background-image: none;}
 .btn-primary.disabled,.btn-primary[disabled],fieldset[disabled] .btn-primary,.btn-primary.disabled:hover,
 .btn-primary[disabled]:hover,fieldset[disabled] .btn-primary:hover,.btn-primary.disabled:focus,.btn-primary[disabled]:focus,
@@ -69,8 +168,8 @@ fieldset[disabled] .btn-primary:focus,.btn-primary.disabled.focus,.btn-primary[d
   background-color: #337ab7;
   border-color: #2C5884;
 }
-.btn-danger {color: #fff;background-color: #d9534f;border-color: #d43f3a;}
-.btn-danger:hover,.btn-danger:focus,.btn-danger.focus,.btn-danger:active,.btn-danger.active,.open > .dropdown-toggle.btn-danger {color: #fff;background-color: #c9302c;border-color: #ac2925;}
+.btn-danger {color: #fff;background-color: #d9534f;border-color: #fff;}
+.btn-danger:hover,.btn-danger:focus,.btn-danger.focus,.btn-danger:active,.btn-danger.active,.open > .dropdown-toggle.btn-danger {color: #fff;background-color: #c9302c;border-color: #f1f1f1;}
 .btn-danger:active,.btn-danger.active,.open > .dropdown-toggle.btn-danger {background-image: none;}
 .btn-danger.disabled,.btn-danger[disabled],fieldset[disabled] .btn-danger,.btn-danger.disabled:hover,.btn-danger[disabled]:hover,
 fieldset[disabled] .btn-danger:hover,.btn-danger.disabled:focus,.btn-danger[disabled]:focus,fieldset[disabled] .btn-danger:focus,.btn-danger.disabled.focus,
@@ -79,7 +178,91 @@ fieldset[disabled] .btn-danger:hover,.btn-danger.disabled:focus,.btn-danger[disa
   background-color: #d9534f;
   border-color: #d43f3a;
 }
-a.btn {text-decoration: none;}
+.btn-primary-inverted {
+  color: #3d7ab7;
+  background-color: transparent;
+  border-color: #3d7ab7;
+  transition: all 0.3s ease-in-out;
+}
+.btn-primary-inverted:hover,
+.btn-primary-inverted:focus,
+.btn-primary-inverted.focus,
+.btn-primary-inverted:active,
+.btn-primary-inverted.active,
+.open > .dropdown-toggle.btn-primary-inverted {
+  color: #fff;
+  background-color: #2e6ea5;
+  border-color: #2C5884;
+}
+.btn-primary-inverted:active,
+.btn-primary-inverted.active,
+.open > .dropdown-toggle.btn-primary-inverted {
+  background-image: none;
+}
+.btn-primary-inverted.disabled,
+.btn-primary-inverted[disabled],
+fieldset[disabled] .btn-primary-inverted,
+.btn-primary-inverted.disabled:hover,
+.btn-primary-inverted[disabled]:hover,
+fieldset[disabled] .btn-primary-inverted:hover,
+.btn-primary-inverted.disabled:focus,
+.btn-primary-inverted[disabled]:focus,
+fieldset[disabled] .btn-primary-inverted:focus,
+.btn-primary-inverted.disabled.focus,
+.btn-primary-inverted[disabled].focus,
+fieldset[disabled] .btn-primary-inverted.focus,
+.btn-primary-inverted.disabled:active,
+.btn-primary-inverted[disabled]:active,
+fieldset[disabled] .btn-primary-inverted:active,
+.btn-primary-inverted.disabled.active,
+.btn-primary-inverted[disabled].active,
+fieldset[disabled] .btn-primary-inverted.active {
+  background-color: #337ab7;
+  border-color: #3d7ab7;
+}
+.btn-danger-inverted {
+  color: #d43f3a;
+  background-color: transparent;
+  border-color: #d43f3a;
+  transition: all 0.3s ease-in-out;
+}
+.btn-danger-inverted:hover,
+.btn-danger-inverted:focus,
+.btn-danger-inverted.focus,
+.btn-danger-inverted:active,
+.btn-danger-inverted.active,
+.open > .dropdown-toggle.btn-danger-inverted {
+  color: #fff;
+  background-color: #c9302c;
+  border-color: #ac2925;
+}
+.btn-danger-inverted:active,
+.btn-danger-inverted.active,
+.open > .dropdown-toggle.btn-danger-inverted {
+  background-image: none;
+}
+.btn-danger-inverted.disabled,
+.btn-danger-inverted[disabled],
+fieldset[disabled] .btn-danger-inverted,
+.btn-danger-inverted.disabled:hover,
+.btn-danger-inverted[disabled]:hover,
+fieldset[disabled] .btn-danger-inverted:hover,
+.btn-danger-inverted.disabled:focus,
+.btn-danger-inverted[disabled]:focus,
+fieldset[disabled] .btn-danger-inverted:focus,
+.btn-danger-inverted.disabled.focus,
+.btn-danger-inverted[disabled].focus,
+fieldset[disabled] .btn-danger-inverted.focus,
+.btn-danger-inverted.disabled:active,
+.btn-danger-inverted[disabled]:active,
+fieldset[disabled] .btn-danger-inverted:active,
+.btn-danger-inverted.disabled.active,
+.btn-danger-inverted[disabled].active,
+fieldset[disabled] .btn-danger-inverted.active {
+  background-color: #d9534f;
+  border-color: #d43f3a;
+}
+a.btn {text-decoration: none; }
 [role="button"] {cursor: pointer;}
 #count-wrap {
   display: none;
@@ -94,7 +277,6 @@ a.btn {text-decoration: none;}
   opacity:.80;
   filter: alpha(opacity=80);*/
 }
-
 #countdown{
   display: none;
   position: relative;
@@ -110,10 +292,61 @@ a.btn {text-decoration: none;}
   z-index:102;
   overflow: auto;
 }
+#firmware-update{
+  display: none;
+  position: relative;
+  text-align: center;
+  top: 40%;
+  margin: 0 auto;
+  padding: 16px;
+  border: 16px solid #f0ad4e;
+  background-color: white;
+  box-shadow:0 1px 5px rgba(0,0,0,0.15);
+  z-index:102;
+  overflow: auto;
+}
+#firmware-update p{ padding: 20px 10px;}
+#firmware-update img{ padding: 10px 20px;}
 @media only screen and (max-width : 768px) {
   .navbar {display: none;}
   .wrapper{
     width:95%;
     padding: 0 0.5em;
   }
-}
+}
+label {font-weight: bold; padding-left: 10px;}
+div.log { padding: 10px 250px;}
+
+.pb_wrapper {
+  position: relative;
+  left: 0;
+  width: 100%;
+  height: 20px;
+}
+
+#progressbar {
+  position: relative;
+  top: 0;
+  width: 100%;
+  height: 100%;
+  border: 1px solid #e2e2e2;
+  // border-radius: 5px;
+}
+#progressbar #progress {
+  position: absolute;
+  top: 0;
+  left: 0;
+  width: 0;
+  height: 100%;
+  background: #5cb85c;
+  // border-radius: 5px;
+  -webkit-transition: all .1s linear;
+  transition: all .1s linear;
+}
+#progressbar div.step {
+  position: relative;
+  border-right: 1px solid #e2e2e2;
+  height: 100%;
+  float: left;
+  z-index: 0;
+}

+ 70 - 0
web_interface/src/upload/upload.html

@@ -0,0 +1,70 @@
+<!DOCTYPE html>
+<html lang="">
+<head>
+<meta charset="utf-8">
+<meta http-equiv="X-UA-Compatible" content="IE=edge">
+<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0">
+<link rel="stylesheet" href="upload.css">
+<!--[if lte IE 9]>
+  <script type="text/javascript" src="ieupload.js"></script>
+<![endif]-->
+<script type="text/javascript" src="upload.js"></script>
+<title>Обновление ПО</title>
+</head>
+<body>
+<nav class="navbar"></nav>
+<div id="count-wrap">
+  <div id='countdown'>
+    <p>Контроллер будет перезагружен через <span id="count-number">5</span> секунд.</p>
+  </div>
+  <div id='firmware-update'>
+    <p>Идет обновление ПО. Пожалуйста подождите.</p>
+  </div>
+</div>
+<div class="wrapper">
+<h1>Обновление ПО</h1>
+<form name="upload">
+<div class="upload-form">
+<div class="guide">
+  <p>Для обновления ПО необходимо:</p>
+  <ol>
+    <li>Скопировать на компьютер или внешний носитель, файлы с расширением *.bin</li>
+    <li>Указать путь к файлу</li>
+    <li>Нажать кнопку «Загрузить»</li>
+  </ol>
+  <p>Для возврата в основной интерфейс контроллера нажмите «Отменить»</p>
+</div>
+  <div id="uf1">
+    <label for="uploadFile" id="uf1lbl">RTPS_05605xx.bin</label>
+    <div class="upload-wrapper">
+      <input id="uploadFile" placeholder="Файл" disabled="disabled" class="file-name" />
+      <div class="fileUpload btn btn-primary">
+        <span>Выбор</span>
+        <input id="uploadBtn" type="file" class="upload" name="datafile"/>
+      </div>
+      <div id="log1" class="log"></div>
+    </div>
+  </div>
+  <div id="uf2">
+    <label for="uploadFile2" id="uf2lbl">RTPS_05601xx.bin</label>
+    <div class="upload-wrapper">
+      <input id="uploadFile2" placeholder="Файл" disabled="disabled" class="file-name" />
+      <div class="fileUpload btn btn-primary">
+        <span>Выбор</span>
+        <input id="uploadBtn2" type="file" class="upload" name="datafile2"/>
+      </div>
+      <div id="log2" class="log"></div>
+    </div>
+  </div>
+  <div class="pb_wrapper">
+    <div id="progressbar">
+      <div id="progress"></div>
+    </div>
+  </div>
+</div>
+  <input class="btn btn-primary-inverted" type="submit" value="Загрузить">
+  <input class="btn btn-danger-inverted" type="button" value="Отменить" id="goback" >
+</form>
+</div>
+</body>
+</html>

+ 286 - 55
web_interface/src/upload/upload.js

@@ -1,78 +1,309 @@
-function $(id) {return document.getElementById(id);}
-var timeout;
-document.onmousemove = function(){
-  clearTimeout(timeout);
-  timeout = setTimeout(function(){
-    if (getCGI('goback.cgi?') === true) {
-      $('count-wrap').style.display = 'block';
-      $('countdown').style.display = 'block';
-      countdown();
-    }
-  }, 1800000);
-};
+function $(id) { return document.getElementById(id); }
+(function() {
+  if (getCookie('file1').length == 0) {
+    window.location.href = '/';
+  }
+})();
+
 function countdown() {
   var countDown = 5;
-  setInterval(function () {
+  setInterval(function() {
     if (countDown == 1) { window.location.href = '/'; }
-    if (countDown > 0){ countDown--; }
+    if (countDown > 0) { countDown--; }
     document.getElementById('count-number').innerHTML = countDown;
     return countDown;
   }, 1000);
 }
+
+function getCookie(name) {
+  'use strict';
+  var strCookie = document.cookie,
+    arrCookie = strCookie.split('; ');
+  for (var i = 0; i < arrCookie.length; i++) {
+    var arr = arrCookie[i].split('=');
+    if (arr[0] == name) return unescape(arr[1]);
+  }
+  return '';
+}
+
+function setCookie(name, value, expirehours) {
+  'use strict';
+  var cookieString = name + '=' + escape(value);
+  if (expirehours > 0) {
+    var date = new Date();
+    date.setTime(date.getTime() + expirehours * 3600 * 1000);
+    cookieString = cookieString + '; expires=' + date.toGMTString();
+  }
+  document.cookie = cookieString;
+}
+
 function getCGI(url) {
-  var q,a,xmlhttp;
+  var question;
+  var canceled = 'Возврат отменен.';
   if (url == 'goback.cgi') {
-    q = confirm('Вы уверены что хотите вернуться в основной интерфейс?');
-    a = 'Возврат отменен.';
-  } else {q = true;}
-  if (q) {
-    if (window.XMLHttpRequest) {
-      xmlhttp = new XMLHttpRequest();
-    } else {
-      xmlhttp = new ActiveXObject('Microsoft.XMLHTTP');
-    }
-    // xmlhttp.onreadystatechange = true;
+    question = confirm('Вы уверены что хотите вернуться в основной интерфейс?');
+  } else {
+    question = true;
+  }
+
+  if (question) {
+    xmlhttp = new XMLHttpRequest();
     xmlhttp.open('GET', url, true);
     xmlhttp.send();
     return true;
   } else {
-    alert(a);
+    alert(canceled);
   }
 }
+// http://192.168.14.26:8095/upload
+// /upload.cgi
+function log(html) {
+  document.getElementById('log1').innerHTML = html;
+}
+
+function log2(html) {
+  document.getElementById('log2').innerHTML = html;
+}
+
+function upload(file1, file2) {
+  var fl = new FormData();
+  fl.append('file1', file1);
+  var xhr = window.XMLHttpRequest ? new XMLHttpRequest() : new ActiveXObject('Microsoft.XMLHTTP');
+  xhr.open('POST', '/upload.cgi', true);
+  // обработчик для закачки
+  xhr.upload.onprogress = function(event) {
+
+    var progress = Math.floor((event.loaded / event.total) * 100);
+    if (progress == 100) {
+      log(progress + '%');
+      updateProgressBar(progress);
+      log('Идет проверка...');
+    } else {
+      log(progress + '%');
+      updateProgressBar(progress);
+    }
+  };
+  xhr.onload = xhr.onerror = function() {
+    if (this.status == 200) {
+      if (xhr.responseText == '1') {
+        log('Успешно');
+        upload2(file2);
+      } else {
+        log('Ошибка установки');
+      }
+    } else {
+      log('Ошибка соединения с контроллером');
+    }
+  };
+  xhr.send(fl);
+}
+
+function upload2(file) {
+  var fl = new FormData();
+  fl.append('file2', file);
+  var xhr = window.XMLHttpRequest ? new XMLHttpRequest() : new ActiveXObject('Microsoft.XMLHTTP');
+  xhr.open('POST', '/upload.cgi', true);
+  xhr.upload.onprogress = function(event) {
+    var progress = Math.floor((event.loaded / event.total) * 100);
+    if (progress == 100) {
+      log2(progress + '%');
+      updateProgressBar(getCookie('file1') === 'NONE' ? progress : 100 + progress);
+      log2('Идет проверка...');
+    } else {
+      log2(progress + '%');
+      updateProgressBar(getCookie('file1') === 'NONE' ? progress : 100 + progress);
+    }
+  };
+  xhr.onload = xhr.onerror = function() {
+    if (this.status == 200) {
+      if (xhr.responseText == '1') {
+        log2('Успешно');
+        setTimeout(runCount, 2000);
+      } else {
+        log2('Ошибка установки');
+      }
+    } else {
+      log2('Ошибка соединения с контроллером');
+    }
+  };
+  xhr.send(fl);
+}
 
-function Validate(oForm) {
-  var arrInputs = oForm.getElementsByTagName('input');
-  for (var i = 0; i < arrInputs.length; i++) {
-    var oInput = arrInputs[i];
-    var blnValid = false;
-    if (oInput.type == 'file') {
-      if (oInput.files.length === 0) {
-        alert('Путь к файлу не указан');
-        blnValid = false;
-        return false;
-      }else{
-        var sFileName = oInput.files[0].name;
-        if (/\.(bin)$/.test(sFileName)) {
-          blnValid = true;
-          $('goback').className += ' disabled';
-          break;
+function runCount() {
+  $('count-wrap').style.display = 'block';
+  $('countdown').style.display = 'block';
+  countdown();
+}
+
+var FileApiSupported = !!(window.File && window.FileReader && window.FileList && window.Blob);
+
+document.addEventListener('DOMContentLoaded', function(event) {
+  if (getCookie('file1') === 'NONE') {
+    $('uf1').style.display = 'none';
+  }
+  $('uf1lbl').innerHTML = getCookie('file1');
+  $('uf2lbl').innerHTML = getCookie('file2');
+
+  if (FileApiSupported) {
+    document.forms.upload.onsubmit = function() {
+      var file1 = this.elements.datafile.files[0];
+      var file2 = this.elements.datafile2.files[0];
+      // var f1nmreg = /RTPS_05605(..)\.bin/g;
+      // var f2nmreg = /RTPS_05601(..)\.bin/g;
+      log('');
+      log2('');
+      resetProgressBar();
+      if (getCookie('file1') !== 'NONE') {
+        if (file1 && file1.name === getCookie('file1')) {
+          if (file2 && file2.name === getCookie('file2')) {
+            upload(file1, file2);
+          } else {
+            log2('Не указан файл ПО!');
+          }
+        } else {
+          log('Не указан файл ПО!');
         }
-        if (!blnValid) {
-          alert('Файл ' + sFileName + ' не валиден, расширение и имя файла должно соответствовать: [ *.bin ]');
-          return false;
+      } else {
+        if (file2 && file2.name === getCookie('file2')) {
+          upload2(file2);
+        } else {
+          log2('Не указан файл ПО!');
         }
       }
-    }
+      return false;
+    };
+  } else {
+    // IE 9 upload
+    var myFileInput = $('uploadBtn');
+    var myFileInput2 = $('uploadBtn2');
+    var handleUpload = function(response) {
+      if ('' + response === '1') {
+        log2('Успешно');
+        setTimeout(runCount, 2000);
+      } else {
+        log2('Ошибка установки');
+      }
+    };
+    var handleUploadTwoFW = function(response) {
+      if ('' + response === '1') {
+        log('Успешно');
+        updateProgressBar(200);
+        log2('Идет проверка...');
+        stoneAgeUpload([myFileInput2], '/upload.cgi', null, handleUpload);
+      } else {
+        log('Ошибка установки');
+      }
+    };
+    document.forms.upload.onsubmit = function() {
+      var file1 = $('uploadFile');
+      var file2 = $('uploadFile2');
+      if (getCookie('file1') !== 'NONE') {
+        if (file1 && file1.value === getCookie('file1')) {
+          if (file2 && file2.value === getCookie('file2')) {
+            stoneAgeUpload([myFileInput], '/upload.cgi', null, handleUploadTwoFW);
+            updateProgressBar(100);
+            log('Идет проверка...');
+          } else {
+            log2('Не указан файл ПО!');
+          }
+        } else {
+          log('Не указан файл ПО!');
+        }
+      } else {
+        if (file2 && file2.value === getCookie('file2')) {
+          stoneAgeUpload([myFileInput2], '/upload.cgi', null, handleUpload);
+          updateProgressBar(getCookie('file1') === 'NONE' ? 100 : 200);
+          log2('Идет проверка...');
+        } else {
+          log2('Не указан файл ПО!');
+        }
+      }
+      return false;
+    };
   }
 
-  return true;
-}
-$('goback').onclick = function(){
-  var a = 'goback.cgi';
-  if (getCGI(a) === true) {
-    $('count-wrap').style.display = 'block';
-    $('countdown').style.display = 'block';
-    countdown();
+  $('uploadBtn').onchange = function() { $('uploadFile').value = this.files ? this.files[0].name : this.value.match(/[^\/\\]*$/)[0]; };
+  $('uploadBtn2').onchange = function() { $('uploadFile2').value = this.files ? this.files[0].name : this.value.match(/[^\/\\]*$/)[0]; };
+  $('goback').onclick = function() {
+    if (getCGI('goback.cgi') === true) { runCount(); }
+  };
+  //################ Progress Bar handlers ##############
+
+  var progressbar = $('progressbar');
+  var progress = $('progress');
+  window.parent = progressbar.parentNode;
+  var nbSlide = getCookie('file1') === 'NONE' ? 1 : 2;
+  // var nbSlide = 1;
+  window.step = parent.offsetWidth / nbSlide;
+
+  // Draw separatiion line
+  var steps = document.getElementsByClassName('step');
+  for (i = 0; i < nbSlide - 1; i++) {
+    var node = document.createElement('div');
+    node.className = 'step';
+    progressbar.appendChild(node);
   }
+  for (index = 0; index < steps.length; index++) {
+    steps[index].style.width = (window.step - 1) * 100 / window.parent.offsetWidth + '%';
+  }
+
+});
+
+function updateProgressBar(percent) {
+  progress.style.width = (window.step * percent) / window.parent.offsetWidth + '%';
+}
+
+function resetProgressBar() {
+  progress.style.width = 0;
+}
+
+
+//polyfill window.offsetWidth and window.offsetHeight
+
+var windowOffset = function() {
+  var getOffset = function() {
+    if (typeof(_cacheResize) === 'function') {
+      _cacheResize;
+    }
+
+    window.offsetWidth = (function() {
+      if (window.innerWidth != undefined) {
+        return window.innerWidth;
+      } else {
+        var _b = document.body,
+          _d = document.documentElement;
+        return Math.max(_d.clientWidth, _b.clientWidth);
+      }
+    })();
+
+    window.parent.offsetWidth = (function() {
+      if (window.parent.innerWidth != undefined) {
+        return window.parent.innerWidth;
+      } else {
+        var _b = document.body,
+          _d = document.documentElement;
+        return Math.max(_d.clientWidth, _b.clientWidth);
+      }
+    })();
+
+    window.offsetHeight = (function() {
+      if (window.innerHeight != undefined) {
+        return window.innerHeight;
+      } else {
+        var _b = document.body,
+          _d = document.documentElement;
+        return Math.max(_d.clientHeight, _b.clientHeight);
+      }
+    })();
+  };
+
+  var _cacheResize = window.onresize;
+  window.onresize = function() {
+    _cacheResize();
+    getOffset();
+  };
+  getOffset();
 };
-$('uploadBtn').onchange = function () {document.getElementById('uploadFile').value = this.files[0].name;};
+
+//invoke function
+windowOffset();