Explorar o código

2022-11-29 / ct_chen

Action:
1. Webservice add function of file upload for PnC

Files:
1. EVSE/Modularization/WebService.c
   EVSE/rootfs/var/www/lang.db
   EVSE/rootfs/var/www/set_backend.php
   EVSE/rootfs/var/www/set_backend_action.php
ct_chen %!s(int64=2) %!d(string=hai) anos
pai
achega
b0060edca2

+ 104 - 8
EVSE/Modularization/WebService.c

@@ -1983,8 +1983,14 @@ int main(int argc, char *argv[]) {
 		struct json_object *PowerSharingServerIP;
 		struct json_object *OcppReceiptrURL;
 		struct json_object *MaintainServerURL;
-		struct json_object *Private_Key;
-		struct json_object *Certificate;
+		struct json_object *ChargePointPrivateKey;
+		struct json_object *ChargePointCertificate;
+		struct json_object *V2GPrivateKey;
+		struct json_object *V2GRootCertificate;
+		struct json_object *V2GCertificateChain;
+		struct json_object *MORootCertificate;
+		struct json_object *CSRootCertificate;
+		struct json_object *ManufacturerRootCertificate;
 		/*for TTIA*/
 		struct json_object *isEnableTTIA;
 		struct json_object *server_addr;
@@ -2689,7 +2695,7 @@ int main(int argc, char *argv[]) {
 		MaintainServerURL = json_object_new_string((char *)&ShmSysConfigAndInfo->SysConfig.MaintainServerURL);
 		FILE *file;
 		char line[0];
-		Private_Key = json_object_new_string("");
+		ChargePointPrivateKey = json_object_new_string("");
 		file = popen("sha256sum /Storage/OCPP/certCP.key", "r");
 		if (NULL != file)
 		{
@@ -2697,13 +2703,13 @@ int main(int argc, char *argv[]) {
 			while (fgets(line, 65, file) != NULL)
 			{
 				if(i==0){
-					Private_Key = json_object_new_string(line);
+					ChargePointPrivateKey = json_object_new_string(line);
 				}
 				i++;
 			}
 		}
 		pclose(file);
-		Certificate = json_object_new_string("");
+		ChargePointCertificate = json_object_new_string("");
 		file = popen("sha256sum /Storage/OCPP/certCP.pem", "r");
 		if (NULL != file)
 		{
@@ -2711,7 +2717,91 @@ int main(int argc, char *argv[]) {
 			while (fgets(line, 65, file) != NULL)
 			{
 				if(i==0){
-					Certificate = json_object_new_string(line);
+					ChargePointCertificate = json_object_new_string(line);
+				}
+				i++;
+			}
+		}
+		pclose(file);
+		V2GPrivateKey = json_object_new_string("");
+		file = popen("sha256sum /Storage/certV2G.key", "r");
+		if (NULL != file)
+		{
+			int i=0;
+			while (fgets(line, 65, file) != NULL)
+			{
+				if(i==0){
+					V2GPrivateKey = json_object_new_string(line);
+				}
+				i++;
+			}
+		}
+		pclose(file);
+		V2GRootCertificate = json_object_new_string("");
+		file = popen("sha256sum /Storage/rootCaV2g.pem", "r");
+		if (NULL != file)
+		{
+			int i=0;
+			while (fgets(line, 65, file) != NULL)
+			{
+				if(i==0){
+					V2GRootCertificate = json_object_new_string(line);
+				}
+				i++;
+			}
+		}
+		pclose(file);
+		V2GCertificateChain = json_object_new_string("");
+		file = popen("sha256sum /Storage/certV2g.pem", "r");
+		if (NULL != file)
+		{
+			int i=0;
+			while (fgets(line, 65, file) != NULL)
+			{
+				if(i==0){
+					V2GCertificateChain = json_object_new_string(line);
+				}
+				i++;
+			}
+		}
+		pclose(file);
+		MORootCertificate = json_object_new_string("");
+		file = popen("sha256sum /Storage/rootCaMo.pem", "r");
+		if (NULL != file)
+		{
+			int i=0;
+			while (fgets(line, 65, file) != NULL)
+			{
+				if(i==0){
+					MORootCertificate = json_object_new_string(line);
+				}
+				i++;
+			}
+		}
+		pclose(file);
+		CSRootCertificate = json_object_new_string("");
+		file = popen("sha256sum /Storage/OCPP/rootCaCs.pem", "r");
+		if (NULL != file)
+		{
+			int i=0;
+			while (fgets(line, 65, file) != NULL)
+			{
+				if(i==0){
+					CSRootCertificate = json_object_new_string(line);
+				}
+				i++;
+			}
+		}
+		pclose(file);
+		ManufacturerRootCertificate = json_object_new_string("");
+		file = popen("sha256sum /Storage/OCPP/rootCaMf.pem", "r");
+		if (NULL != file)
+		{
+			int i=0;
+			while (fgets(line, 65, file) != NULL)
+			{
+				if(i==0){
+					ManufacturerRootCertificate = json_object_new_string(line);
 				}
 				i++;
 			}
@@ -3157,8 +3247,14 @@ int main(int argc, char *argv[]) {
 		json_object_object_add(jobj4,"MaintainServerSecurityProfile",MaintainServerSecurityProfile);
 		json_object_object_add(jobj4,"MaintainServerSecurityPassword",MaintainServerSecurityPassword);
 		json_object_object_add(jobj4,"MaintainServerURL",MaintainServerURL);
-		json_object_object_add(jobj4,"Private_Key",Private_Key);
-		json_object_object_add(jobj4,"Certificate",Certificate);
+		json_object_object_add(jobj4,"ChargePointPrivateKey",ChargePointPrivateKey);
+		json_object_object_add(jobj4,"ChargePointCertificate",ChargePointCertificate);
+		json_object_object_add(jobj4,"V2GPrivateKey",V2GPrivateKey);
+		json_object_object_add(jobj4,"V2GRootCertificate",V2GRootCertificate);
+		json_object_object_add(jobj4,"V2GCertificateChain",V2GCertificateChain);
+		json_object_object_add(jobj4,"MORootCertificate",MORootCertificate);
+		json_object_object_add(jobj4,"CSRootCertificate",CSRootCertificate);
+		json_object_object_add(jobj4,"ManufacturerRootCertificate",ManufacturerRootCertificate);
 		if(strcmp(IsDO, "AX") == 0 || strcmp(IsDO, "AW") == 0 || strcmp(IsAcDc, "D") == 0){
 			json_object_object_add(jobj4,"isEnableLocalPowerSharging",isEnableLocalPowerSharging);
 			json_object_object_add(jobj4,"PowerSharingCapacity",PowerSharingCapacity);

BIN=BIN
EVSE/rootfs/var/www/lang.db


+ 728 - 658
EVSE/rootfs/var/www/set_backend.php

@@ -1,658 +1,728 @@
-<?php
-	ini_set('error_reporting', E_ALL | E_STRICT);
-	$tag_header = 'set';
-	include 'head.php';
-	$obj = json_decode(trim($output[3]));//var_dump($obj);
-	$system = json_decode(trim($output[0]));
-	$ModelName = $system->{'ModelName'};
-	$OcppConnStatus='';
-	switch ($obj->{'OcppConnStatus'}){
-		case 0:
-			$OcppConnStatus=$lang->showWord('disconnected');
-			break;
-		case 1:
-			$OcppConnStatus=$lang->showWord('connected');
-			break;
-	}
-	$MaintainServerConnStatus='';
-	switch ($obj->{'MaintainServerConnStatus'}){
-		case 0:
-			$MaintainServerConnStatus=$lang->showWord('disconnected');
-			break;
-		case 1:
-			$MaintainServerConnStatus=$lang->showWord('connected');
-			break;
-	}
-?>
-
-<style>
-img {
-  display: block;
-  margin-left: auto;
-  margin-right: auto;
-}
-<?php if(substr($ModelName,0,1)=="D" && substr($ModelName,3,1)=="C"){?>
-/* Colors: Default (blue) */
-.toggle-switchy {color:#fff;}
-.toggle-switchy > input + .toggle:before {content:'Yes';}
-.toggle-switchy > input + .toggle:after {content:'No';}
-.toggle-switchy > input + .toggle > .switch {background:#fff;}
-.toggle-switchy > input + .toggle + .label {color:#000;}
-.toggle-switchy > input:checked + .toggle {background:#3498db;}
-.toggle-switchy > input:not(:checked) + .toggle {background:#ccc;}
-.toggle-switchy > input:checked + .toggle > .switch {border:3px solid #3498db;}
-.toggle-switchy > input:not(:checked) + .toggle > .switch {border:3px solid #ccc;}
-.toggle-switchy > input:focus + .toggle,
-.toggle-switchy > input:active + .toggle {box-shadow:0 0 5px 3px rgba(0, 119, 200, 0.50);}
-
-/* Rounded switch corners */
-.toggle-switchy > input + .toggle {border-radius:4px;}
-.toggle-switchy > input + .toggle .switch {border-radius:6px;}
-
-/* //////////////////////////
-CORE STYLES BELOW - NO TOUCHY
-////////////////////////// */
-.toggle-switchy {display:inline-flex; align-items:center; user-select:none; position:relative;}
-.toggle-switchy:hover {cursor:pointer;}
-.toggle-switchy > input {position:absolute; opacity:0;}
-.toggle-switchy > input + .toggle {align-items:center; position:relative;}
-.toggle-switchy > input + .toggle {overflow:hidden; position:relative; flex-shrink:0;}
-.toggle-switchy > input[disabled] + .toggle {opacity:0.5;}
-.toggle-switchy > input[disabled] + .toggle:hover {cursor:not-allowed;}
-.toggle-switchy > input + .toggle {width:100%; height:100%; margin:0; cursor:pointer;}
-.toggle-switchy > input + .toggle > .switch {display:block; height:100%; position:absolute; right:0; z-index:3;}
-
-/* Labels */
-.toggle-switchy > input + .toggle:before,
-.toggle-switchy > input + .toggle:after {display:flex; align-items:center; position:absolute; z-index:2; height:100%;}
-.toggle-switchy > input + .toggle:before {right:55%;}
-.toggle-switchy > input + .toggle:after {left:50%;}
-.toggle-switchy > input + .toggle + .label {margin-left:10px;}
-.toggle-switchy[data-label='left'] > input + .toggle {order:2;}
-.toggle-switchy[data-label='left'] > input + .toggle + .label {order:1; margin-left:0; margin-right:10px;}
-
-/* Show / Hide */
-.toggle-switchy > input + .toggle:before {opacity:0;}
-.toggle-switchy > input:checked + .toggle:before {opacity:1;}
-.toggle-switchy > input:checked + .toggle:after {opacity:0;}
-
-/* Transitions */
-.toggle-switchy > input + .toggle {transition:background 200ms linear, box-shadow 200ms linear;}
-.toggle-switchy > input + .toggle:before,
-.toggle-switchy > input + .toggle:after {transition:all 200ms linear;}
-.toggle-switchy > input + .toggle > .switch {transition:right 200ms linear, border-color 200ms linear;}
-/* //////////////////////////
-CORE STYLES ABOVE - NO TOUCHY
-////////////////////////// */
-
-/* Size: Extra Large */
-.toggle-switchy[data-size='xl'] > input + .toggle							{width:85px; height:40px;}
-.toggle-switchy[data-size='xl'] > input + .toggle > .switch					{width:40px;}
-.toggle-switchy[data-size='xl'] > input + .toggle:before,
-.toggle-switchy[data-size='xl'] > input + .toggle:after						{font-size:1.2rem;}
-.toggle-switchy[data-size='xl'] > input:not(:checked) + .toggle > .switch	{right:calc(100% - 40px);}
-
-/* Size: Large */
-.toggle-switchy[data-size='lg'] > input + .toggle							{width:75px; height:35px;}
-.toggle-switchy[data-size='lg'] > input + .toggle > .switch					{width:35px;}
-.toggle-switchy[data-size='lg'] > input + .toggle:before,
-.toggle-switchy[data-size='lg'] > input + .toggle:after						{font-size:1rem;}
-.toggle-switchy[data-size='lg'] > input:not(:checked) + .toggle > .switch	{right:calc(100% - 35px);}
-
-/* Size: Default (Medium) */
-.toggle-switchy > input + .toggle											{width:100px; height:30px;}
-.toggle-switchy > input + .toggle	> .switch								{width:30px;}
-.toggle-switchy > input + .toggle:before,
-.toggle-switchy > input + .toggle:after										{font-size:0.8rem;}
-.toggle-switchy > input:not(:checked) + .toggle > .switch					{right:calc(100% - 30px);}
-
-/* Size: Small */
-.toggle-switchy[data-size='sm'] > input + .toggle							{width:55px; height:25px;}
-.toggle-switchy[data-size='sm'] > input + .toggle > .switch					{width:25px;}
-.toggle-switchy[data-size='sm'] > input + .toggle:before,
-.toggle-switchy[data-size='sm'] > input + .toggle:after						{font-size:0.7rem;}
-.toggle-switchy[data-size='sm'] > input:not(:checked) + .toggle > .switch	{right:calc(100% - 25px);}
-
-/* Size: Extra Small */
-.toggle-switchy[data-size='xs'] > input + .toggle							{width:45px; height:20px;}
-.toggle-switchy[data-size='xs'] > input + .toggle > .switch					{width:20px;}
-.toggle-switchy[data-size='xs'] > input + .toggle:before,
-.toggle-switchy[data-size='xs'] > input + .toggle:after						{font-size:0.5rem;}
-.toggle-switchy[data-size='xs'] > input:not(:checked) + .toggle > .switch	{right:calc(100% - 20px);}
-
-/* Style: Rounded */
-.toggle-switchy[data-style='rounded'] > input + .toggle,
-.toggle-switchy[data-style='rounded'] > input + .toggle > .switch			{border-radius:50px;}
-.toggle-switchy[data-style='rounded'] > input + .toggle:before				{right:30%;}
-.toggle-switchy[data-style='rounded'] > input + .toggle:after				{left:40%;}
-
-/* Style: Square */
-.toggle-switchy[data-style='square'] > input + .toggle						{border-radius:0;}
-.toggle-switchy[data-style='square'] > input + .toggle .switch				{border-radius:0;}
-
-/* Text: Off */
-.toggle-switchy[data-text='false'] > input + .toggle:before,
-.toggle-switchy[data-text='false'] > input + .toggle:after					{content:'';}
-.toggle-switchy[data-text='false'][data-size='xl'] > input + .toggle		{width:80px;}
-.toggle-switchy[data-text='false'][data-size='lg'] > input + .toggle		{width:70px;}
-.toggle-switchy[data-text='false'] > input + .toggle						{width:60px;}
-.toggle-switchy[data-text='false'][data-size='sm'] > input + .toggle		{width:50px;}
-.toggle-switchy[data-text='false'][data-size='xs'] > input + .toggle		{width:40px;}
-
-/* Color: Red */
-.toggle-switchy[data-color='red'] > input:checked + .toggle					{background:#e74c3c;}
-.toggle-switchy[data-color='red'] > input:checked + .toggle > .switch		{border-color:#e74c3c;}
-
-/* Color: Orange */
-.toggle-switchy[data-color='orange'] > input:checked + .toggle				{background:#e67e22;}
-.toggle-switchy[data-color='orange'] > input:checked + .toggle > .switch	{border-color:#e67e22;}
- 
- /* Color: Yellow */
-.toggle-switchy[data-color='yellow'] > input:checked + .toggle				{background:#f1c40f;}
-.toggle-switchy[data-color='yellow'] > input:checked + .toggle > .switch	{border-color:#f1c40f;}
-
-/* Color: Green */
-.toggle-switchy[data-color='green'] > input:checked + .toggle				{background:#2ecc71;}
-.toggle-switchy[data-color='green'] > input:checked + .toggle > .switch		{border-color:#2ecc71;}
-
-/* Color: Blue */
-.toggle-switchy[data-color='blue'] > input:checked + .toggle				{background:#3498db;}
-.toggle-switchy[data-color='blue'] > input:checked + .toggle > .switch		{border-color:#3498db;}
-
-/* Color: Purple */
-.toggle-switchy[data-color='purple'] > input:checked + .toggle				{background:#9b59b6;}
-.toggle-switchy[data-color='purple'] > input:checked + .toggle > .switch	{border-color:#9b59b6;}
-
-/* Color: Gray */
-.toggle-switchy[data-color='gray'] > input:checked + .toggle				{background:#555;}
-.toggle-switchy[data-color='gray'] > input:checked + .toggle > .switch		{border-color:#555;}
-<?php } ?>
-</style>
-	<div class="envor-content">
-		<!--
-		Page Title start
-		//-->
-		<section class="envor-page-title-1" data-stellar-background-ratio="0.5">
-			<div class="container">
-				<div class="row">
-					<div class="col-lg-9 col-md-9 col-sm-9">
-						<h1><?php echo $lang->showWord("backend"); ?></h1>
-					</div>
-				</div>
-			</div>
-		<!--
-		Page Title end
-		//-->
-		</section>
-		<!--
-		Main Content start
-		//-->
-		<a id="loadinghref"><div id="loading" style="display:none;"><img src="img/giphy.gif"/></div></a>
-		<section class="envor-section">
-			<div class="container">
-				<div class="row">
-					<div class="col-lg-12">
-						<div class="envor-sorting" id="faq-sorting">
-							<div class="envor-toggle">
-								<!--Common Information-->
-								<article class="envor-sorting-item css">
-									<header><?php echo $lang->showWord("common_information"); ?><i class="fa fa-plus"></i></header>
-									<section>
-										<div class="form-group" style="display:<?php echo $am101;?>">
-											<label><?php echo $lang->showWord("backend_connection_timeout"); ?></label>
-											<input type="number" name="BackendConnTimeout" id="BackendConnTimeout" class="form-control" value="<?php echo $obj->{'BackendConnTimeout'};?>">
-											<small class="form-text text-muted-red">seconds</small>
-										</div>
-										<div class="form-group" style="display:<?php echo $am101;?>">
-											<label><?php echo $lang->showWord("offline_policy"); ?></label>
-											<select class="form-control" id="OfflinePolicy" name="OfflinePolicy">
-												<option value="0" <?php echo $obj->{'OfflinePolicy'}=="0"?"selected":""?>><?php echo $lang->showWord("local_list"); ?></option>
-<?php /*												<option value="1" <?php echo $obj->{'OfflinePolicy'}=="1"?"selected":""?>>Phihong RFID tag</option>*/?>
-												<option value="2" <?php echo $obj->{'OfflinePolicy'}=="2"?"selected":""?>><?php echo $lang->showWord("free_charging"); ?></option>
-												<option value="3" <?php echo $obj->{'OfflinePolicy'}=="3"?"selected":""?>><?php echo $lang->showWord("no_charging"); ?></option>
-											</select>
-										</div>
-										<div class="form-group" style="display:<?php echo $am101;?>">
-											<label><?php echo $lang->showWord("offline_max_charge_energy"); ?></label>
-											<small class="form-text text-muted-red">kWh</small>
-											<input type="number" name="OfflineMaxChargeEnergy" id="OfflineMaxChargeEnergy" class="form-control" value="<?php echo $obj->{'OfflineMaxChargeEnergy'};?>">
-										</div>
-										<div class="form-group" style="display:<?php echo $am101;?>">
-											<label><?php echo $lang->showWord("offline_max_charge_duration"); ?></label>
-											<small class="form-text text-muted-red">minutes</small>
-											<input type="number" name="OfflineMaxChargeDuration" id="OfflineMaxChargeDuration" class="form-control" value="<?php echo $obj->{'OfflineMaxChargeDuration'};?>">
-										</div>
-									</section>
-								</article>
-								<!--OCPP Backend-->
-								<article class="envor-sorting-item css">
-									<header><?php echo $lang->showWord("OCPP_backend"); ?><i class="fa fa-plus"></i></header>
-									<section>
-										<div class="form-group" style="display:<?php echo $am101;?>">
-											<label><?php echo $lang->showWord("ocpp_connection_status"); ?></label>
-											<input type="text" readonly class="form-control" placeholder="<?php echo $OcppConnStatus;?>">
-											<input type="hidden" name="OcppConnStatus" id="OcppConnStatus" value="<?php echo $obj->{'OcppConnStatus'};?>">
-										</div>
-										<div class="form-group" style="display:<?php echo $am101;?>">
-											<label><?php echo $lang->showWord("central_system_url"); ?></label>
-											<input type="text" name="OcppServerURL" id="OcppServerURL" class="form-control" value="<?php echo $obj->{'OcppServerURL'};?>">
-										</div>
-										<div class="form-group" style="display:<?php echo $am101;?>">
-											<label>Charge Box Id</label>
-											<input type="text" name="ChargeBoxId" id="ChargeBoxId" class="form-control" value="<?php echo htmlspecialchars($obj->{'ChargeBoxId'});?>">
-										</div>
-										<div class="form-group" style="display:<?php echo $am101;?>">
-											<label><?php echo $lang->showWord("charge_point_vendor"); ?></label>
-											<input type="text" name="chargePointVendor" id="chargePointVendor" class="form-control" value="<?php echo htmlspecialchars($obj->{'chargePointVendor'});?>">
-										</div>
-										<div class="form-group" style="display:<?php echo $am101;?>">
-											<label><?php echo $lang->showWord("ocpp_security_profile"); ?></label>
-											<select class="form-control" id="OcppSecurityProfile" name="OcppSecurityProfile" onchange="OcppSecurityProfile_changed()">
-												<option value="0" <?php echo $obj->{'OcppSecurityProfile'}=="0"?"selected":""?>><?php echo $lang->showWord("none_security"); ?></option>
-												<option value="1" <?php echo $obj->{'OcppSecurityProfile'}=="1"?"selected":""?>><?php echo $lang->showWord("unsecured_transport_with_basic_atuentication"); ?></option>
-												<option value="2" <?php echo $obj->{'OcppSecurityProfile'}=="2"?"selected":""?>><?php echo $lang->showWord("tls_with_basic_authentication"); ?></option>
-												<option value="3" <?php echo $obj->{'OcppSecurityProfile'}=="3"?"selected":""?>><?php echo $lang->showWord("tls_with_client_side_certificates"); ?></option>
-											</select>
-										</div>
-										<div id="OcppSecurityPasswordDiv" class="form-group" style="display:<?php echo $am101;?>">
-											<label><?php echo $lang->showWord("ocpp_security_password"); ?></label>
-											<input type="text" name="OcppSecurityPassword" id="OcppSecurityPassword" class="form-control" value="<?php echo htmlspecialchars($obj->{'OcppSecurityPassword'});?>">
-										</div>
-										<div id="TLSwithClientSideCertificatesDiv" class="form-group file-upload" style="display:<?php echo $am101;?>">
-											<div class="file-upload">
-												<label><?php echo $lang->showWord("private_key_file"); ?> sha256 hash: <font color="#ff0000">(<?php echo strlen($obj->{'Private_Key'})>0?$obj->{'Private_Key'}:'File not found'?>)</font></label>
-												<div class="file-loading">
-													<input name="private_key" id="private_key" type="file" class="file" data-show-preview="false" data-show-upload="false">
-												</div>
-											</div>
-											<div class="file-upload">
-												<label><?php echo $lang->showWord("certificate_file"); ?> sha256 hash: <font color="#ff0000">(<?php echo strlen($obj->{'Certificate'})>0?$obj->{'Certificate'}:"File not found"?>)</font></label>
-												<div class="file-loading">
-													<input name="certificate" id="certificate" type="file" class="file" data-show-preview="false" data-show-upload="false">
-												</div>
-											</div>
-										</div>
-<?php if(substr($ModelName,0,2)=="AX" || substr($ModelName,0,2)=="AW" || substr($ModelName,0,1)=="D"){?>
-										<div class="form-group" style="display:block">
-											<label><?php echo $lang->showWord("ocpp_receipt_url"); ?></label>
-											<input type="text" name="OcppReceiptrURL" id="OcppReceiptrURL" class="form-control" value="<?php echo $obj->{'OcppReceiptrURL'};?>">
-										</div>
-										<div class="form-group" style="display:block">
-											<label><?php echo $lang->showWord("local_loading_balance"); ?></label>
-											<select class="form-control" id="isEnableLocalPowerSharging" name="isEnableLocalPowerSharging" onChange="isEnableLocalPowerSharging_changed()">
-												<option value="0" <?php echo $obj->{'isEnableLocalPowerSharging'}=="0"?"selected":""?>><?php echo $lang->showWord("disable"); ?></option>
-												<option value="1" <?php echo $obj->{'isEnableLocalPowerSharging'}=="1"?"selected":""?>><?php echo $lang->showWord("master"); ?></option>
-												<option value="2" <?php echo $obj->{'isEnableLocalPowerSharging'}=="2"?"selected":""?>><?php echo $lang->showWord("slave"); ?></option>
-											</select>
-										</div>
-										<div id="PowerSharingCapacityDiv" class="form-group" style="display:<?php echo $am101;?>">
-											<label>Power Sharing Capacity</label><small class="form-text text-muted-red"> W</small>
-											<input type="number" min="0" max="5000000" name="PowerSharingCapacity" id="PowerSharingCapacity" class="form-control" value="<?php echo $obj->{'PowerSharingCapacity'};?>">											
-											<small class="form-text text-muted-red">'0' means follow rating power from model name</small>
-										</div>
-										<div id="PowerSharingServerIPDiv" class="form-group" style="display:<?php echo $am101;?>">
-											<label><?php echo $lang->showWord("power_sharing_server_ip"); ?></label>
-											<input type="text" name="PowerSharingServerIP" id="PowerSharingServerIP" class="form-control" value="<?php echo $obj->{'PowerSharingServerIP'};?>">
-										</div>
-
-<?php } ?>
-										<div class="form-group" style="display:<?php echo $am101;?>">
-											<label><?php echo $lang->showWord("maintain_server_connection_status"); ?></label>
-											<input type="text" readonly class="form-control" placeholder="<?php echo $MaintainServerConnStatus;?>">
-											<input type="hidden" name="MaintainServerConnStatus" id="MaintainServerConnStatus" value="<?php echo $obj->{'MaintainServerConnStatus'};?>">
-										</div>
-										<div class="form-group" style="display:<?php echo $am101;?>">
-											<label><?php echo $lang->showWord("maintain_server_url"); ?></label>
-											<input type="text" name="MaintainServerURL" id="MaintainServerURL" class="form-control" value="<?php echo $obj->{'MaintainServerURL'};?>">
-										</div>
-										
-										<div class="form-group" style="display:<?php echo $am101;?>">
-											<label><?php echo $lang->showWord("maintain_server_security_profile"); ?></label>
-											<select class="form-control" id="MaintainServerSecurityProfile" name="MaintainServerSecurityProfile" onchange="MaintainServerSecurityProfile_changed()">
-												<option value="0" <?php echo $obj->{'MaintainServerSecurityProfile'}=="0"?"selected":""?>><?php echo $lang->showWord("none_security"); ?></option>
-												<option value="1" <?php echo $obj->{'MaintainServerSecurityProfile'}=="1"?"selected":""?>><?php echo $lang->showWord("unsecured_transport_with_basic_atuentication"); ?></option>
-												<option value="2" <?php echo $obj->{'MaintainServerSecurityProfile'}=="2"?"selected":""?>><?php echo $lang->showWord("tls_with_basic_authentication"); ?></option>
-												<!--<option value="3" <?php echo $obj->{'MaintainServerSecurityProfile'}=="3"?"selected":""?>><?php echo $lang->showWord("tls_with_client_side_certificates"); ?></option>-->
-											</select>
-										</div>
-										<div id="MaintainServerSecurityPasswordDiv" class="form-group" style="display:<?php echo $am101;?>">
-											<label><?php echo $lang->showWord("maintain_server_security_password"); ?></label>
-											<input type="text" name="MaintainServerSecurityPassword" id="MaintainServerSecurityPassword" class="form-control" value="<?php echo htmlspecialchars($obj->{'MaintainServerSecurityPassword'});?>">
-										</div>
-									</section>
-								</article>
-<?php if(substr($ModelName,0,1)=="D" && substr($ModelName,3,1)=="C"){ ?>
-								<!--TTIA-->
-								<article class="envor-sorting-item css">
-									<header>TTIA<i class="fa fa-plus"></i></header>
-									<section>
-										<div class="form-group" style="display:<?php echo $am101;?>">
-											<label>TTIA</label>
-											<label class="toggle-switchy" for="isEnableTTIA" data-size="" data-style="rounded">
-												<input type="checkbox" id="isEnableTTIA" <?php echo $obj->{'isEnableTTIA'}==1?"checked":"";?> onclick="isEnableTTIAChecked()">
-												<span class="toggle">
-												  <span class="switch"></span>
-												</span>
-											</label>
-										</div>
-										<div id="server_addrDiv" class="form-group">
-											<label>Server Address</label>
-											<input type="text" name="server_addr" id="server_addr" class="form-control" value="<?php echo $obj->{'server_addr'};?>">
-										</div>
-										<div id="server_portDiv" class="form-group">
-											<label>Server Port</label>
-											<input type="text" name="server_port" id="server_port" class="form-control" value="<?php echo $obj->{'server_port'};?>">
-										</div>
-										<div id="busVenderIdDiv" class="form-group">
-											<label>Bus Vender Id</label>
-											<input type="text" name="busVenderId" id="busVenderId" class="form-control" value="<?php echo $obj->{'busVenderId'};?>">
-										</div>
-										<div id="EquipmentProviderDiv" class="form-group">
-											<label>Equipment Provider</label>
-											<input type="text" name="EquipmentProvider" id="EquipmentProvider" class="form-control" value="<?php echo $obj->{'EquipmentProvider'};?>">
-										</div>
-										<div id="TransportationCompanyNoDiv" class="form-group">
-											<label>TransportationCompanyNo</label>
-											<input type="text" name="TransportationCompanyNo" id="TransportationCompanyNo" class="form-control" value="<?php echo $obj->{'TransportationCompanyNo'};?>">
-										</div>
-										<div id="ChargeBoxIdDiv" class="form-group">
-											<label>Charge Box Id</label>
-											<input type="text" name="TTIAChargeBoxId" id="TTIAChargeBoxId" class="form-control" value="<?php echo $obj->{'TTIAChargeBoxId'};?>">
-										</div>
-										<div id="evseStationDiv" class="form-group">
-											<label>EVSE Station</label>
-											<input type="text" name="evseStation" id="evseStation" class="form-control" value="<?php echo $obj->{'evseStation'};?>">
-										</div>
-									</section>
-								</article>
-<?php } ?>
-								<article class="envor-sorting-item css">
-									<div align="center"><button id="save"><?php echo $lang->showWord("set")?></button></div>
-								</article>
-							</div>
-						</div>
-					</div>
-				</div>
-			</div>
-		</section>
-	</div>
-
-<?php
-	include 'foot.php';
-?>
-
-<script type="text/JavaScript">
-<?php if(substr($ModelName,0,2)=="AX" || substr($ModelName,0,2)=="AW" || substr($ModelName,0,1)=="D"){?>
-	$(document).ready(function(){
-		isEnableLocalPowerSharging_changed();
-	});
-<?php } ?>
-<?php if(substr($ModelName,0,1)=="D" && substr($ModelName,3,1)=="C"){?>
-	$(document).ready(function(){
-		isEnableTTIAChecked();
-	});
-<?php } ?>
-	OcppSecurityProfile_changed();
-	MaintainServerSecurityProfile_changed();
-	document.getElementById("save").onclick = function() {
-		if(formCheck())
-		{
-			window.location="#loadinghref";
-			document.getElementById("loading").style.display="block";
-			// 發送 Ajax 查詢請求並處理
-			var request = new XMLHttpRequest();
-			request.open("POST", "set_backend_action.php");
-
-			// POST 參數須使用 send() 發送
-			var formData = new FormData();
-			var fileInput = document.getElementById('private_key');
-			var file = fileInput.files[0];
-			formData.append("private_key", file);
-			var fileInput = document.getElementById('certificate');
-			var file = fileInput.files[0];
-			formData.append("certificate", file);
-			formData.append("BackendConnTimeout", document.getElementById("BackendConnTimeout").value);
-			formData.append("OfflinePolicy", document.getElementById("OfflinePolicy").value);
-			formData.append("OfflineMaxChargeEnergy", document.getElementById("OfflineMaxChargeEnergy").value);
-			formData.append("OfflineMaxChargeDuration", document.getElementById("OfflineMaxChargeDuration").value);
-			formData.append("OcppServerURL", escapeHtml(document.getElementById("OcppServerURL").value));
-			formData.append("MaintainServerURL", escapeHtml(document.getElementById("MaintainServerURL").value));
-			formData.append("ChargeBoxId", escapeHtml(document.getElementById("ChargeBoxId").value));
-			formData.append("chargePointVendor", escapeHtml(document.getElementById("chargePointVendor").value));
-			formData.append("OcppSecurityProfile", document.getElementById("OcppSecurityProfile").value);
-			formData.append("OcppSecurityPassword", escapeHtml(document.getElementById("OcppSecurityPassword").value));
-			//formData.append("file", file);
-			formData.append("MaintainServerSecurityProfile", document.getElementById("MaintainServerSecurityProfile").value);
-			formData.append("MaintainServerSecurityPassword", escapeHtml(document.getElementById("MaintainServerSecurityPassword").value));
-<?php if(substr($ModelName,0,2)=="AX" || substr($ModelName,0,2)=="AW" || substr($ModelName,0,1)=="D"){?>
-			formData.append("isEnableLocalPowerSharging", document.getElementById("isEnableLocalPowerSharging").value);
-			formData.append("PowerSharingServerIP", document.getElementById("PowerSharingServerIP").value);
-			formData.append("PowerSharingCapacity", document.getElementById("PowerSharingCapacity").value);
-			formData.append("OcppReceiptrURL", escapeHtml(document.getElementById("OcppReceiptrURL").value));
-<?php } ?>
-<?php if(substr($ModelName,0,1)=="D" && substr($ModelName,3,1)=="C"){?>
-			formData.append("isEnableTTIA", (document.getElementById("isEnableTTIA").checked?"1":"0"));
-			formData.append("server_addr", document.getElementById("server_addr").value);
-			formData.append("server_port", document.getElementById("server_port").value);
-			formData.append("busVenderId", document.getElementById("busVenderId").value);
-			formData.append("EquipmentProvider", document.getElementById("EquipmentProvider").value);
-			formData.append("TransportationCompanyNo", document.getElementById("TransportationCompanyNo").value);
-			formData.append("TTIAChargeBoxId", document.getElementById("TTIAChargeBoxId").value);
-			formData.append("evseStation", document.getElementById("evseStation").value);
-<?php } ?>
-
-			// POST 請求必須設置表頭在 open() 下面,send() 上面
-//			request.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
-			request.send(formData);
-
-			request.onreadystatechange = function() {
-				// 伺服器請求完成
-				if (request.readyState == 4) {
-					 document.getElementById("loading").style.display="none";
-					// 伺服器回應成功
-					if (request.status == 200 && JSON.parse(request.responseText).result=="Success") {
-						alert("<?php echo $lang->showWord("done")?>");
-						location.href="set_backend.php";
-					} else {
-						alert(JSON.parse(request.responseText).message);
-					}
-					request = null;
-				}
-			}
-		}
-	}
-	
-	function formCheck()
-	{
-		var OcppServerURL = document.getElementById("OcppServerURL").value;
-		var MaintainServerURL = document.getElementById("MaintainServerURL").value;
-		var ChargeBoxId = document.getElementById("ChargeBoxId").value;
-		var chargePointVendor = document.getElementById("chargePointVendor").value;
-		var tests=/^(ws|wss):\/\/((([0-9]{1,3}\.){3}[0-9]{1,3})|(([a-zA-Z0-9]+(([\-]?[a-zA-Z0-9]+)*\.)+)*[a-zA-Z]{2,}))+/;
-		if(OcppServerURL!=""){
-			if(OcppServerURL.match(tests)==null){
-				alert("OcppServerURL format error!");
-				document.getElementById("OcppServerURL").focus();
-				return false;
-			}
-		}
-		if(MaintainServerURL!=""){
-			if(MaintainServerURL.match(tests)==null){
-				alert("MaintainServerURL format error!");
-				document.getElementById("MaintainServerURL").focus();
-				return false;
-			}
-		}
-		if(ChargeBoxId!=""){
-			if(ChargeBoxId.length>25){
-				alert("Length of ChargeBoxId should be less than 25!");
-				document.getElementById("ChargeBoxId").focus();
-				return false;
-			}
-		}
-		if(chargePointVendor!=""){
-			if(chargePointVendor.length>20){
-				alert("Length of chargePointVendor should be less than 20!");
-				document.getElementById("chargePointVendor").focus();
-				return false;
-			}
-		}
-<?php if(substr($ModelName,0,1)=="D" && substr($ModelName,3,1)=="C"){?>
-		var server_port = document.getElementById("server_port").value;
-		if(server_port!=""){
-			if(server_port>65535){
-				alert("Value of Server Port should be less than 65535!");
-				document.getElementById("server_port").focus();
-				return false;
-			}
-		}
-		var busVenderId = document.getElementById("busVenderId").value;
-		if(busVenderId!=""){
-			if(busVenderId>65535){
-				alert("Value of Bus Vender Id should be less than 65535!");
-				document.getElementById("busVenderId").focus();
-				return false;
-			}
-		}
-		var EquipmentProvider = document.getElementById("EquipmentProvider").value;
-		if(EquipmentProvider!=""){
-			if(UTF8Length(EquipmentProvider)>15){
-				alert("Length of Equipment Provider should be less than 15(Chinese 5 words)!");
-				document.getElementById("EquipmentProvider").focus();
-				return false;
-			}
-		}
-		var evseStation = document.getElementById("evseStation").value;
-		if(evseStation!=""){
-			if(UTF8Length(evseStation)>15){
-				alert("Length of EVSE Station should be less than 15(Chinese 5 words)!");
-				document.getElementById("evseStation").focus();
-				return false;
-			}
-		}
-		var TransportationCompanyNo = document.getElementById("TransportationCompanyNo").value;
-		if(TransportationCompanyNo!=""){
-			if(TransportationCompanyNo>255){
-				alert("Value of Transportation Company No should be less than 255!");
-				document.getElementById("TransportationCompanyNo").focus();
-				return false;
-			}
-		}
-		var TTIAChargeBoxId = document.getElementById("TTIAChargeBoxId").value;
-		if(TTIAChargeBoxId!=""){
-			if(TTIAChargeBoxId>255){
-				alert("Value of Charge Box Id should be less than 255!");
-				document.getElementById("TTIAChargeBoxId").focus();
-				return false;
-			}
-		}
-<?php } ?>
-		return true;
-	}
-	function OcppSecurityProfile_changed(){
-		if(document.getElementById("OcppSecurityProfile").value == "1" || document.getElementById("OcppSecurityProfile").value == "2" || document.getElementById("OcppSecurityProfile").value == "3"){
-			document.getElementById("OcppSecurityPasswordDiv").style.display="block";
-			if(document.getElementById("OcppSecurityProfile").value == "3"){
-				document.getElementById("TLSwithClientSideCertificatesDiv").style.display="block";
-			}
-			else{
-				document.getElementById("TLSwithClientSideCertificatesDiv").style.display="none";
-			}
-		}
-		else{
-			document.getElementById("OcppSecurityPasswordDiv").style.display="none";
-			document.getElementById("TLSwithClientSideCertificatesDiv").style.display="none";
-		}
-	}
-	function MaintainServerSecurityProfile_changed(){
-		if(document.getElementById("MaintainServerSecurityProfile").value == "1" || document.getElementById("MaintainServerSecurityProfile").value == "2" || document.getElementById("MaintainServerSecurityProfile").value == "3"){
-			document.getElementById("MaintainServerSecurityPasswordDiv").style.display="block";
-		}
-		else{
-			document.getElementById("MaintainServerSecurityPasswordDiv").style.display="none";
-		}
-	}
-
-<?php if(substr($ModelName,0,2)=="AX" || substr($ModelName,0,2)=="AW" || substr($ModelName,0,1)=="D"){?>
-	function isEnableLocalPowerSharging_changed(){
-		/*
-		if(document.getElementById("isEnableLocalPowerSharging").selectedIndex!=0){
-			document.getElementById("OcppServerURL").setAttribute("readOnly","true");
-			document.getElementById("MaintainServerURL").setAttribute("readOnly","true");
-			document.getElementById("ChargeBoxId").setAttribute("readOnly","true");
-			document.getElementById("chargePointVendor").setAttribute("readOnly","true");
-		}
-		else{
-			document.getElementById("OcppServerURL").removeAttribute("readOnly");
-			document.getElementById("MaintainServerURL").removeAttribute("readOnly");
-			document.getElementById("ChargeBoxId").removeAttribute("readOnly");
-			document.getElementById("chargePointVendor").removeAttribute("readOnly");
-		}*/
-
-		if(document.getElementById("isEnableLocalPowerSharging").selectedIndex==1)
-		{
-			document.getElementById("PowerSharingCapacityDiv").style.display="block";	
-			document.getElementById("PowerSharingServerIPDiv").style.display="none";	
-		}
-		else if(document.getElementById("isEnableLocalPowerSharging").selectedIndex==2)
-		{
-			document.getElementById("PowerSharingCapacityDiv").style.display="none";	
-			document.getElementById("PowerSharingServerIPDiv").style.display="block";				
-		}
-		else
-		{
-			document.getElementById("PowerSharingCapacityDiv").style.display="none";	
-			document.getElementById("PowerSharingServerIPDiv").style.display="none";
-		}
-	}
-<?php } ?>
-<?php if(substr($ModelName,0,1)=="D" && substr($ModelName,3,1)=="C"){?>
-	function isEnableTTIAChecked(){
-		if(document.getElementById("isEnableTTIA").checked){
-			document.getElementById("server_addrDiv").style.display="block";
-			document.getElementById("server_portDiv").style.display="block";
-			document.getElementById("busVenderIdDiv").style.display="block";
-			document.getElementById("EquipmentProviderDiv").style.display="block";
-			document.getElementById("TransportationCompanyNoDiv").style.display="block";
-			document.getElementById("ChargeBoxIdDiv").style.display="block";
-			document.getElementById("evseStationDiv").style.display="block";
-		}
-		else{
-			document.getElementById("server_addrDiv").style.display="none";
-			document.getElementById("server_portDiv").style.display="none";
-			document.getElementById("busVenderIdDiv").style.display="none";
-			document.getElementById("EquipmentProviderDiv").style.display="none";
-			document.getElementById("TransportationCompanyNoDiv").style.display="none";
-			document.getElementById("ChargeBoxIdDiv").style.display="none";
-			document.getElementById("evseStationDiv").style.display="none";
-		}
-	}
-<?php } ?>
-	function isNumberKey(evt)
-	{
-		var charCode = (evt.which) ? evt.which : event.keyCode
-		
-		if (charCode > 31 && (charCode < 48 || charCode > 57) && (charCode != 46))
-			return false;
-		
-		return true;
-	}
-	function UTF8Length(tx){
-		var str = encodeURIComponent(tx);
-		len = str.replace(/%[A-F\d]{2}/g, 'U').length;
-		return len;
-	}
-	function escapeHtml(text) {
-		var map = {
-			'&': '&amp;',
-			'<': '&lt;',
-			'>': '&gt;',
-			'"': '&quot;',
-			"'": '&#039;'
-		};
-		return text.replace(/[&<>"']/g, function(m) { return map[m]; });
-	}
-</script>
-
-
-</html>
+<?php
+	ini_set('error_reporting', E_ALL | E_STRICT);
+	$tag_header = 'set';
+	include 'head.php';
+	$obj = json_decode(trim($output[3]));//var_dump($obj);
+	$system = json_decode(trim($output[0]));
+	$ModelName = $system->{'ModelName'};
+	$OcppConnStatus='';
+	switch ($obj->{'OcppConnStatus'}){
+		case 0:
+			$OcppConnStatus=$lang->showWord('disconnected');
+			break;
+		case 1:
+			$OcppConnStatus=$lang->showWord('connected');
+			break;
+	}
+	$MaintainServerConnStatus='';
+	switch ($obj->{'MaintainServerConnStatus'}){
+		case 0:
+			$MaintainServerConnStatus=$lang->showWord('disconnected');
+			break;
+		case 1:
+			$MaintainServerConnStatus=$lang->showWord('connected');
+			break;
+	}
+?>
+
+<style>
+img {
+  display: block;
+  margin-left: auto;
+  margin-right: auto;
+}
+<?php if(substr($ModelName,0,1)=="D" && substr($ModelName,3,1)=="C"){?>
+/* Colors: Default (blue) */
+.toggle-switchy {color:#fff;}
+.toggle-switchy > input + .toggle:before {content:'Yes';}
+.toggle-switchy > input + .toggle:after {content:'No';}
+.toggle-switchy > input + .toggle > .switch {background:#fff;}
+.toggle-switchy > input + .toggle + .label {color:#000;}
+.toggle-switchy > input:checked + .toggle {background:#3498db;}
+.toggle-switchy > input:not(:checked) + .toggle {background:#ccc;}
+.toggle-switchy > input:checked + .toggle > .switch {border:3px solid #3498db;}
+.toggle-switchy > input:not(:checked) + .toggle > .switch {border:3px solid #ccc;}
+.toggle-switchy > input:focus + .toggle,
+.toggle-switchy > input:active + .toggle {box-shadow:0 0 5px 3px rgba(0, 119, 200, 0.50);}
+
+/* Rounded switch corners */
+.toggle-switchy > input + .toggle {border-radius:4px;}
+.toggle-switchy > input + .toggle .switch {border-radius:6px;}
+
+/* //////////////////////////
+CORE STYLES BELOW - NO TOUCHY
+////////////////////////// */
+.toggle-switchy {display:inline-flex; align-items:center; user-select:none; position:relative;}
+.toggle-switchy:hover {cursor:pointer;}
+.toggle-switchy > input {position:absolute; opacity:0;}
+.toggle-switchy > input + .toggle {align-items:center; position:relative;}
+.toggle-switchy > input + .toggle {overflow:hidden; position:relative; flex-shrink:0;}
+.toggle-switchy > input[disabled] + .toggle {opacity:0.5;}
+.toggle-switchy > input[disabled] + .toggle:hover {cursor:not-allowed;}
+.toggle-switchy > input + .toggle {width:100%; height:100%; margin:0; cursor:pointer;}
+.toggle-switchy > input + .toggle > .switch {display:block; height:100%; position:absolute; right:0; z-index:3;}
+
+/* Labels */
+.toggle-switchy > input + .toggle:before,
+.toggle-switchy > input + .toggle:after {display:flex; align-items:center; position:absolute; z-index:2; height:100%;}
+.toggle-switchy > input + .toggle:before {right:55%;}
+.toggle-switchy > input + .toggle:after {left:50%;}
+.toggle-switchy > input + .toggle + .label {margin-left:10px;}
+.toggle-switchy[data-label='left'] > input + .toggle {order:2;}
+.toggle-switchy[data-label='left'] > input + .toggle + .label {order:1; margin-left:0; margin-right:10px;}
+
+/* Show / Hide */
+.toggle-switchy > input + .toggle:before {opacity:0;}
+.toggle-switchy > input:checked + .toggle:before {opacity:1;}
+.toggle-switchy > input:checked + .toggle:after {opacity:0;}
+
+/* Transitions */
+.toggle-switchy > input + .toggle {transition:background 200ms linear, box-shadow 200ms linear;}
+.toggle-switchy > input + .toggle:before,
+.toggle-switchy > input + .toggle:after {transition:all 200ms linear;}
+.toggle-switchy > input + .toggle > .switch {transition:right 200ms linear, border-color 200ms linear;}
+/* //////////////////////////
+CORE STYLES ABOVE - NO TOUCHY
+////////////////////////// */
+
+/* Size: Extra Large */
+.toggle-switchy[data-size='xl'] > input + .toggle							{width:85px; height:40px;}
+.toggle-switchy[data-size='xl'] > input + .toggle > .switch					{width:40px;}
+.toggle-switchy[data-size='xl'] > input + .toggle:before,
+.toggle-switchy[data-size='xl'] > input + .toggle:after						{font-size:1.2rem;}
+.toggle-switchy[data-size='xl'] > input:not(:checked) + .toggle > .switch	{right:calc(100% - 40px);}
+
+/* Size: Large */
+.toggle-switchy[data-size='lg'] > input + .toggle							{width:75px; height:35px;}
+.toggle-switchy[data-size='lg'] > input + .toggle > .switch					{width:35px;}
+.toggle-switchy[data-size='lg'] > input + .toggle:before,
+.toggle-switchy[data-size='lg'] > input + .toggle:after						{font-size:1rem;}
+.toggle-switchy[data-size='lg'] > input:not(:checked) + .toggle > .switch	{right:calc(100% - 35px);}
+
+/* Size: Default (Medium) */
+.toggle-switchy > input + .toggle											{width:100px; height:30px;}
+.toggle-switchy > input + .toggle	> .switch								{width:30px;}
+.toggle-switchy > input + .toggle:before,
+.toggle-switchy > input + .toggle:after										{font-size:0.8rem;}
+.toggle-switchy > input:not(:checked) + .toggle > .switch					{right:calc(100% - 30px);}
+
+/* Size: Small */
+.toggle-switchy[data-size='sm'] > input + .toggle							{width:55px; height:25px;}
+.toggle-switchy[data-size='sm'] > input + .toggle > .switch					{width:25px;}
+.toggle-switchy[data-size='sm'] > input + .toggle:before,
+.toggle-switchy[data-size='sm'] > input + .toggle:after						{font-size:0.7rem;}
+.toggle-switchy[data-size='sm'] > input:not(:checked) + .toggle > .switch	{right:calc(100% - 25px);}
+
+/* Size: Extra Small */
+.toggle-switchy[data-size='xs'] > input + .toggle							{width:45px; height:20px;}
+.toggle-switchy[data-size='xs'] > input + .toggle > .switch					{width:20px;}
+.toggle-switchy[data-size='xs'] > input + .toggle:before,
+.toggle-switchy[data-size='xs'] > input + .toggle:after						{font-size:0.5rem;}
+.toggle-switchy[data-size='xs'] > input:not(:checked) + .toggle > .switch	{right:calc(100% - 20px);}
+
+/* Style: Rounded */
+.toggle-switchy[data-style='rounded'] > input + .toggle,
+.toggle-switchy[data-style='rounded'] > input + .toggle > .switch			{border-radius:50px;}
+.toggle-switchy[data-style='rounded'] > input + .toggle:before				{right:30%;}
+.toggle-switchy[data-style='rounded'] > input + .toggle:after				{left:40%;}
+
+/* Style: Square */
+.toggle-switchy[data-style='square'] > input + .toggle						{border-radius:0;}
+.toggle-switchy[data-style='square'] > input + .toggle .switch				{border-radius:0;}
+
+/* Text: Off */
+.toggle-switchy[data-text='false'] > input + .toggle:before,
+.toggle-switchy[data-text='false'] > input + .toggle:after					{content:'';}
+.toggle-switchy[data-text='false'][data-size='xl'] > input + .toggle		{width:80px;}
+.toggle-switchy[data-text='false'][data-size='lg'] > input + .toggle		{width:70px;}
+.toggle-switchy[data-text='false'] > input + .toggle						{width:60px;}
+.toggle-switchy[data-text='false'][data-size='sm'] > input + .toggle		{width:50px;}
+.toggle-switchy[data-text='false'][data-size='xs'] > input + .toggle		{width:40px;}
+
+/* Color: Red */
+.toggle-switchy[data-color='red'] > input:checked + .toggle					{background:#e74c3c;}
+.toggle-switchy[data-color='red'] > input:checked + .toggle > .switch		{border-color:#e74c3c;}
+
+/* Color: Orange */
+.toggle-switchy[data-color='orange'] > input:checked + .toggle				{background:#e67e22;}
+.toggle-switchy[data-color='orange'] > input:checked + .toggle > .switch	{border-color:#e67e22;}
+ 
+ /* Color: Yellow */
+.toggle-switchy[data-color='yellow'] > input:checked + .toggle				{background:#f1c40f;}
+.toggle-switchy[data-color='yellow'] > input:checked + .toggle > .switch	{border-color:#f1c40f;}
+
+/* Color: Green */
+.toggle-switchy[data-color='green'] > input:checked + .toggle				{background:#2ecc71;}
+.toggle-switchy[data-color='green'] > input:checked + .toggle > .switch		{border-color:#2ecc71;}
+
+/* Color: Blue */
+.toggle-switchy[data-color='blue'] > input:checked + .toggle				{background:#3498db;}
+.toggle-switchy[data-color='blue'] > input:checked + .toggle > .switch		{border-color:#3498db;}
+
+/* Color: Purple */
+.toggle-switchy[data-color='purple'] > input:checked + .toggle				{background:#9b59b6;}
+.toggle-switchy[data-color='purple'] > input:checked + .toggle > .switch	{border-color:#9b59b6;}
+
+/* Color: Gray */
+.toggle-switchy[data-color='gray'] > input:checked + .toggle				{background:#555;}
+.toggle-switchy[data-color='gray'] > input:checked + .toggle > .switch		{border-color:#555;}
+<?php } ?>
+</style>
+	<div class="envor-content">
+		<!--
+		Page Title start
+		//-->
+		<section class="envor-page-title-1" data-stellar-background-ratio="0.5">
+			<div class="container">
+				<div class="row">
+					<div class="col-lg-9 col-md-9 col-sm-9">
+						<h1><?php echo $lang->showWord("backend"); ?></h1>
+					</div>
+				</div>
+			</div>
+		<!--
+		Page Title end
+		//-->
+		</section>
+		<!--
+		Main Content start
+		//-->
+		<a id="loadinghref"><div id="loading" style="display:none;"><img src="img/giphy.gif"/></div></a>
+		<section class="envor-section">
+			<div class="container">
+				<div class="row">
+					<div class="col-lg-12">
+						<div class="envor-sorting" id="faq-sorting">
+							<div class="envor-toggle">
+								<!--Common Information-->
+								<article class="envor-sorting-item css">
+									<header><?php echo $lang->showWord("common_information"); ?><i class="fa fa-plus"></i></header>
+									<section>
+										<div class="form-group" style="display:<?php echo $am101;?>">
+											<label><?php echo $lang->showWord("backend_connection_timeout"); ?></label>
+											<input type="number" name="BackendConnTimeout" id="BackendConnTimeout" class="form-control" value="<?php echo $obj->{'BackendConnTimeout'};?>">
+											<small class="form-text text-muted-red">seconds</small>
+										</div>
+										<div class="form-group" style="display:<?php echo $am101;?>">
+											<label><?php echo $lang->showWord("offline_policy"); ?></label>
+											<select class="form-control" id="OfflinePolicy" name="OfflinePolicy">
+												<option value="0" <?php echo $obj->{'OfflinePolicy'}=="0"?"selected":""?>><?php echo $lang->showWord("local_list"); ?></option>
+<?php /*												<option value="1" <?php echo $obj->{'OfflinePolicy'}=="1"?"selected":""?>>Phihong RFID tag</option>*/?>
+												<option value="2" <?php echo $obj->{'OfflinePolicy'}=="2"?"selected":""?>><?php echo $lang->showWord("free_charging"); ?></option>
+												<option value="3" <?php echo $obj->{'OfflinePolicy'}=="3"?"selected":""?>><?php echo $lang->showWord("no_charging"); ?></option>
+											</select>
+										</div>
+										<div class="form-group" style="display:<?php echo $am101;?>">
+											<label><?php echo $lang->showWord("offline_max_charge_energy"); ?></label>
+											<small class="form-text text-muted-red">kWh</small>
+											<input type="number" name="OfflineMaxChargeEnergy" id="OfflineMaxChargeEnergy" class="form-control" value="<?php echo $obj->{'OfflineMaxChargeEnergy'};?>">
+										</div>
+										<div class="form-group" style="display:<?php echo $am101;?>">
+											<label><?php echo $lang->showWord("offline_max_charge_duration"); ?></label>
+											<small class="form-text text-muted-red">minutes</small>
+											<input type="number" name="OfflineMaxChargeDuration" id="OfflineMaxChargeDuration" class="form-control" value="<?php echo $obj->{'OfflineMaxChargeDuration'};?>">
+										</div>
+									</section>
+								</article>
+								<!--OCPP Backend-->
+								<article class="envor-sorting-item css">
+									<header><?php echo $lang->showWord("OCPP_backend"); ?><i class="fa fa-plus"></i></header>
+									<section>
+										<div class="form-group" style="display:<?php echo $am101;?>">
+											<label><?php echo $lang->showWord("ocpp_connection_status"); ?></label>
+											<input type="text" readonly class="form-control" placeholder="<?php echo $OcppConnStatus;?>">
+											<input type="hidden" name="OcppConnStatus" id="OcppConnStatus" value="<?php echo $obj->{'OcppConnStatus'};?>">
+										</div>
+										<div class="form-group" style="display:<?php echo $am101;?>">
+											<label><?php echo $lang->showWord("central_system_url"); ?></label>
+											<input type="text" name="OcppServerURL" id="OcppServerURL" class="form-control" value="<?php echo $obj->{'OcppServerURL'};?>">
+										</div>
+										<div class="form-group" style="display:<?php echo $am101;?>">
+											<label>Charge Box Id</label>
+											<input type="text" name="ChargeBoxId" id="ChargeBoxId" class="form-control" value="<?php echo htmlspecialchars($obj->{'ChargeBoxId'});?>">
+										</div>
+										<div class="form-group" style="display:<?php echo $am101;?>">
+											<label><?php echo $lang->showWord("charge_point_vendor"); ?></label>
+											<input type="text" name="chargePointVendor" id="chargePointVendor" class="form-control" value="<?php echo htmlspecialchars($obj->{'chargePointVendor'});?>">
+										</div>
+										<div class="form-group" style="display:<?php echo $am101;?>">
+											<label><?php echo $lang->showWord("ocpp_security_profile"); ?></label>
+											<select class="form-control" id="OcppSecurityProfile" name="OcppSecurityProfile" onchange="OcppSecurityProfile_changed()">
+												<option value="0" <?php echo $obj->{'OcppSecurityProfile'}=="0"?"selected":""?>><?php echo $lang->showWord("none_security"); ?></option>
+												<option value="1" <?php echo $obj->{'OcppSecurityProfile'}=="1"?"selected":""?>><?php echo $lang->showWord("unsecured_transport_with_basic_atuentication"); ?></option>
+												<option value="2" <?php echo $obj->{'OcppSecurityProfile'}=="2"?"selected":""?>><?php echo $lang->showWord("tls_with_basic_authentication"); ?></option>
+												<option value="3" <?php echo $obj->{'OcppSecurityProfile'}=="3"?"selected":""?>><?php echo $lang->showWord("tls_with_client_side_certificates"); ?></option>
+											</select>
+										</div>
+										<div id="OcppSecurityPasswordDiv" class="form-group" style="display:<?php echo $am101;?>">
+											<label><?php echo $lang->showWord("ocpp_security_password"); ?></label>
+											<input type="text" name="OcppSecurityPassword" id="OcppSecurityPassword" class="form-control" value="<?php echo htmlspecialchars($obj->{'OcppSecurityPassword'});?>">
+										</div>
+										<div id="TLSwithClientSideCertificatesDiv" class="form-group file-upload" style="display:<?php echo $am101;?>">
+											<div class="file-upload">
+												<label><?php echo $lang->showWord("private_key_file"); ?> sha256 hash: <font color="#ff0000">(<?php echo strlen($obj->{'ChargePointPrivateKey'})>0?$obj->{'ChargePointPrivateKey'}:'File not found'?>)</font></label>
+												<div class="file-loading">
+													<input name="private_key" id="private_key" type="file" class="file" data-show-preview="false" data-show-upload="false" accept=".key">
+												</div>
+											</div>
+											<div class="file-upload">
+												<label><?php echo $lang->showWord("certificate_file"); ?> sha256 hash: <font color="#ff0000">(<?php echo strlen($obj->{'ChargePointCertificate'})>0?$obj->{'ChargePointCertificate'}:"File not found"?>)</font></label>
+												<div class="file-loading">
+													<input name="certificate" id="certificate" type="file" class="file" data-show-preview="false" data-show-upload="false" accept=".pem">
+												</div>
+											</div>
+											<div class="file-upload">
+												<label><?php echo $lang->showWord("V2GPrivateKey_file"); ?> sha256 hash: <font color="#ff0000">(<?php echo strlen($obj->{'V2GPrivateKey'})>0?$obj->{'V2GPrivateKey'}:'File not found'?>)</font></label>
+												<div class="file-loading">
+													<input name="V2GPrivateKey" id="V2GPrivateKey" type="file" class="file" data-show-preview="false" data-show-upload="false" accept=".key">
+												</div>
+											</div>
+											<div class="file-upload">
+												<label><?php echo $lang->showWord("V2GRootCertificate_file"); ?> sha256 hash: <font color="#ff0000">(<?php echo strlen($obj->{'V2GRootCertificate'})>0?$obj->{'V2GRootCertificate'}:"File not found"?>)</font></label>
+												<div class="file-loading">
+													<input name="V2GRootCertificate" id="V2GRootCertificate" type="file" class="file" data-show-preview="false" data-show-upload="false" accept=".pem">
+												</div>
+											</div>
+											<div class="file-upload">
+												<label><?php echo $lang->showWord("V2GCertificateChain_file"); ?> sha256 hash: <font color="#ff0000">(<?php echo strlen($obj->{'V2GCertificateChain'})>0?$obj->{'V2GCertificateChain'}:"File not found"?>)</font></label>
+												<div class="file-loading">
+													<input name="V2GCertificateChain" id="V2GCertificateChain" type="file" class="file" data-show-preview="false" data-show-upload="false" accept=".pem">
+												</div>
+											</div>
+											<div class="file-upload">
+												<label><?php echo $lang->showWord("MORootCertificate_file"); ?> sha256 hash: <font color="#ff0000">(<?php echo strlen($obj->{'MORootCertificate'})>0?$obj->{'MORootCertificate'}:"File not found"?>)</font></label>
+												<div class="file-loading">
+													<input name="MORootCertificate" id="MORootCertificate" type="file" class="file" data-show-preview="false" data-show-upload="false" accept=".pem">
+												</div>
+											</div>
+											<div class="file-upload">
+												<label><?php echo $lang->showWord("CSRootCertificate_file"); ?> sha256 hash: <font color="#ff0000">(<?php echo strlen($obj->{'CSRootCertificate'})>0?$obj->{'CSRootCertificate'}:"File not found"?>)</font></label>
+												<div class="file-loading">
+													<input name="CSRootCertificate" id="CSRootCertificate" type="file" class="file" data-show-preview="false" data-show-upload="false" accept=".pem">
+												</div>
+											</div>
+											<div class="file-upload">
+												<label><?php echo $lang->showWord("ManufacturerRootCertificate_file"); ?> sha256 hash: <font color="#ff0000">(<?php echo strlen($obj->{'ManufacturerRootCertificate'})>0?$obj->{'ManufacturerRootCertificate'}:"File not found"?>)</font></label>
+												<div class="file-loading">
+													<input name="ManufacturerRootCertificate" id="ManufacturerRootCertificate" type="file" class="file" data-show-preview="false" data-show-upload="false" accept=".pem">
+												</div>
+											</div>
+										</div>
+<?php if(substr($ModelName,0,2)=="AX" || substr($ModelName,0,2)=="AW" || substr($ModelName,0,1)=="D"){?>
+										<div class="form-group" style="display:block">
+											<label><?php echo $lang->showWord("ocpp_receipt_url"); ?></label>
+											<input type="text" name="OcppReceiptrURL" id="OcppReceiptrURL" class="form-control" value="<?php echo $obj->{'OcppReceiptrURL'};?>">
+										</div>
+										<div class="form-group" style="display:block">
+											<label><?php echo $lang->showWord("local_loading_balance"); ?></label>
+											<select class="form-control" id="isEnableLocalPowerSharging" name="isEnableLocalPowerSharging" onChange="isEnableLocalPowerSharging_changed()">
+												<option value="0" <?php echo $obj->{'isEnableLocalPowerSharging'}=="0"?"selected":""?>><?php echo $lang->showWord("disable"); ?></option>
+												<option value="1" <?php echo $obj->{'isEnableLocalPowerSharging'}=="1"?"selected":""?>><?php echo $lang->showWord("master"); ?></option>
+												<option value="2" <?php echo $obj->{'isEnableLocalPowerSharging'}=="2"?"selected":""?>><?php echo $lang->showWord("slave"); ?></option>
+											</select>
+										</div>
+										<div id="PowerSharingCapacityDiv" class="form-group" style="display:<?php echo $am101;?>">
+											<label>Power Sharing Capacity</label><small class="form-text text-muted-red"> W</small>
+											<input type="number" min="0" max="5000000" name="PowerSharingCapacity" id="PowerSharingCapacity" class="form-control" value="<?php echo $obj->{'PowerSharingCapacity'};?>">											
+											<small class="form-text text-muted-red">'0' means follow rating power from model name</small>
+										</div>
+										<div id="PowerSharingServerIPDiv" class="form-group" style="display:<?php echo $am101;?>">
+											<label><?php echo $lang->showWord("power_sharing_server_ip"); ?></label>
+											<input type="text" name="PowerSharingServerIP" id="PowerSharingServerIP" class="form-control" value="<?php echo $obj->{'PowerSharingServerIP'};?>">
+										</div>
+
+<?php } ?>
+										<div class="form-group" style="display:<?php echo $am101;?>">
+											<label><?php echo $lang->showWord("maintain_server_connection_status"); ?></label>
+											<input type="text" readonly class="form-control" placeholder="<?php echo $MaintainServerConnStatus;?>">
+											<input type="hidden" name="MaintainServerConnStatus" id="MaintainServerConnStatus" value="<?php echo $obj->{'MaintainServerConnStatus'};?>">
+										</div>
+										<div class="form-group" style="display:<?php echo $am101;?>">
+											<label><?php echo $lang->showWord("maintain_server_url"); ?></label>
+											<input type="text" name="MaintainServerURL" id="MaintainServerURL" class="form-control" value="<?php echo $obj->{'MaintainServerURL'};?>">
+										</div>
+										
+										<div class="form-group" style="display:<?php echo $am101;?>">
+											<label><?php echo $lang->showWord("maintain_server_security_profile"); ?></label>
+											<select class="form-control" id="MaintainServerSecurityProfile" name="MaintainServerSecurityProfile" onchange="MaintainServerSecurityProfile_changed()">
+												<option value="0" <?php echo $obj->{'MaintainServerSecurityProfile'}=="0"?"selected":""?>><?php echo $lang->showWord("none_security"); ?></option>
+												<option value="1" <?php echo $obj->{'MaintainServerSecurityProfile'}=="1"?"selected":""?>><?php echo $lang->showWord("unsecured_transport_with_basic_atuentication"); ?></option>
+												<option value="2" <?php echo $obj->{'MaintainServerSecurityProfile'}=="2"?"selected":""?>><?php echo $lang->showWord("tls_with_basic_authentication"); ?></option>
+												<!--<option value="3" <?php echo $obj->{'MaintainServerSecurityProfile'}=="3"?"selected":""?>><?php echo $lang->showWord("tls_with_client_side_certificates"); ?></option>-->
+											</select>
+										</div>
+										<div id="MaintainServerSecurityPasswordDiv" class="form-group" style="display:<?php echo $am101;?>">
+											<label><?php echo $lang->showWord("maintain_server_security_password"); ?></label>
+											<input type="text" name="MaintainServerSecurityPassword" id="MaintainServerSecurityPassword" class="form-control" value="<?php echo htmlspecialchars($obj->{'MaintainServerSecurityPassword'});?>">
+										</div>
+									</section>
+								</article>
+<?php if(substr($ModelName,0,1)=="D" && substr($ModelName,3,1)=="C"){ ?>
+								<!--TTIA-->
+								<article class="envor-sorting-item css">
+									<header>TTIA<i class="fa fa-plus"></i></header>
+									<section>
+										<div class="form-group" style="display:<?php echo $am101;?>">
+											<label>TTIA</label>
+											<label class="toggle-switchy" for="isEnableTTIA" data-size="" data-style="rounded">
+												<input type="checkbox" id="isEnableTTIA" <?php echo $obj->{'isEnableTTIA'}==1?"checked":"";?> onclick="isEnableTTIAChecked()">
+												<span class="toggle">
+												  <span class="switch"></span>
+												</span>
+											</label>
+										</div>
+										<div id="server_addrDiv" class="form-group">
+											<label>Server Address</label>
+											<input type="text" name="server_addr" id="server_addr" class="form-control" value="<?php echo $obj->{'server_addr'};?>">
+										</div>
+										<div id="server_portDiv" class="form-group">
+											<label>Server Port</label>
+											<input type="text" name="server_port" id="server_port" class="form-control" value="<?php echo $obj->{'server_port'};?>">
+										</div>
+										<div id="busVenderIdDiv" class="form-group">
+											<label>Bus Vender Id</label>
+											<input type="text" name="busVenderId" id="busVenderId" class="form-control" value="<?php echo $obj->{'busVenderId'};?>">
+										</div>
+										<div id="EquipmentProviderDiv" class="form-group">
+											<label>Equipment Provider</label>
+											<input type="text" name="EquipmentProvider" id="EquipmentProvider" class="form-control" value="<?php echo $obj->{'EquipmentProvider'};?>">
+										</div>
+										<div id="TransportationCompanyNoDiv" class="form-group">
+											<label>TransportationCompanyNo</label>
+											<input type="text" name="TransportationCompanyNo" id="TransportationCompanyNo" class="form-control" value="<?php echo $obj->{'TransportationCompanyNo'};?>">
+										</div>
+										<div id="ChargeBoxIdDiv" class="form-group">
+											<label>Charge Box Id</label>
+											<input type="text" name="TTIAChargeBoxId" id="TTIAChargeBoxId" class="form-control" value="<?php echo $obj->{'TTIAChargeBoxId'};?>">
+										</div>
+										<div id="evseStationDiv" class="form-group">
+											<label>EVSE Station</label>
+											<input type="text" name="evseStation" id="evseStation" class="form-control" value="<?php echo $obj->{'evseStation'};?>">
+										</div>
+									</section>
+								</article>
+<?php } ?>
+								<article class="envor-sorting-item css">
+									<div align="center"><button id="save"><?php echo $lang->showWord("set")?></button></div>
+								</article>
+							</div>
+						</div>
+					</div>
+				</div>
+			</div>
+		</section>
+	</div>
+
+<?php
+	include 'foot.php';
+?>
+
+<script type="text/JavaScript">
+<?php if(substr($ModelName,0,2)=="AX" || substr($ModelName,0,2)=="AW" || substr($ModelName,0,1)=="D"){?>
+	$(document).ready(function(){
+		isEnableLocalPowerSharging_changed();
+	});
+<?php } ?>
+<?php if(substr($ModelName,0,1)=="D" && substr($ModelName,3,1)=="C"){?>
+	$(document).ready(function(){
+		isEnableTTIAChecked();
+	});
+<?php } ?>
+	OcppSecurityProfile_changed();
+	MaintainServerSecurityProfile_changed();
+	document.getElementById("save").onclick = function() {
+		if(formCheck())
+		{
+			window.location="#loadinghref";
+			document.getElementById("loading").style.display="block";
+			// 發送 Ajax 查詢請求並處理
+			var request = new XMLHttpRequest();
+			request.open("POST", "set_backend_action.php");
+
+			// POST 參數須使用 send() 發送
+			var formData = new FormData();
+			if(document.getElementById("private_key").value != ""){
+				var fileInput = document.getElementById('private_key');
+				var file = fileInput.files[0];
+				formData.append("private_key", file);
+			}
+			if(document.getElementById("certificate").value != ""){
+				var fileInput = document.getElementById('certificate');
+				var file = fileInput.files[0];
+				formData.append("certificate", file);
+			}
+			if(document.getElementById("V2GPrivateKey").value != ""){
+				var fileInput = document.getElementById('V2GPrivateKey');
+				var file = fileInput.files[0];
+				formData.append("V2GPrivateKey", file);
+			}
+			if(document.getElementById("V2GRootCertificate").value != ""){
+				var fileInput = document.getElementById('V2GRootCertificate');
+				var file = fileInput.files[0];
+				formData.append("V2GRootCertificate", file);
+			}
+			if(document.getElementById("V2GCertificateChain").value != ""){
+				var fileInput = document.getElementById('V2GCertificateChain');
+				var file = fileInput.files[0];
+				formData.append("V2GCertificateChain", file);
+			}
+			if(document.getElementById("MORootCertificate").value != ""){
+				var fileInput = document.getElementById('MORootCertificate');
+				var file = fileInput.files[0];
+				formData.append("MORootCertificate", file);
+			}
+			if(document.getElementById("CSRootCertificate").value != ""){
+				var fileInput = document.getElementById('CSRootCertificate');
+				var file = fileInput.files[0];
+				formData.append("CSRootCertificate", file);
+			}
+			if(document.getElementById("ManufacturerRootCertificate").value != ""){
+				var fileInput = document.getElementById('ManufacturerRootCertificate');
+				var file = fileInput.files[0];
+				formData.append("ManufacturerRootCertificate", file);
+			}
+			formData.append("BackendConnTimeout", document.getElementById("BackendConnTimeout").value);
+			formData.append("OfflinePolicy", document.getElementById("OfflinePolicy").value);
+			formData.append("OfflineMaxChargeEnergy", document.getElementById("OfflineMaxChargeEnergy").value);
+			formData.append("OfflineMaxChargeDuration", document.getElementById("OfflineMaxChargeDuration").value);
+			formData.append("OcppServerURL", escapeHtml(document.getElementById("OcppServerURL").value));
+			formData.append("MaintainServerURL", escapeHtml(document.getElementById("MaintainServerURL").value));
+			formData.append("ChargeBoxId", escapeHtml(document.getElementById("ChargeBoxId").value));
+			formData.append("chargePointVendor", escapeHtml(document.getElementById("chargePointVendor").value));
+			formData.append("OcppSecurityProfile", document.getElementById("OcppSecurityProfile").value);
+			formData.append("OcppSecurityPassword", escapeHtml(document.getElementById("OcppSecurityPassword").value));
+			//formData.append("file", file);
+			formData.append("MaintainServerSecurityProfile", document.getElementById("MaintainServerSecurityProfile").value);
+			formData.append("MaintainServerSecurityPassword", escapeHtml(document.getElementById("MaintainServerSecurityPassword").value));
+<?php if(substr($ModelName,0,2)=="AX" || substr($ModelName,0,2)=="AW" || substr($ModelName,0,1)=="D"){?>
+			formData.append("isEnableLocalPowerSharging", document.getElementById("isEnableLocalPowerSharging").value);
+			formData.append("PowerSharingServerIP", document.getElementById("PowerSharingServerIP").value);
+			formData.append("PowerSharingCapacity", document.getElementById("PowerSharingCapacity").value);
+			formData.append("OcppReceiptrURL", escapeHtml(document.getElementById("OcppReceiptrURL").value));
+<?php } ?>
+<?php if(substr($ModelName,0,1)=="D" && substr($ModelName,3,1)=="C"){?>
+			formData.append("isEnableTTIA", (document.getElementById("isEnableTTIA").checked?"1":"0"));
+			formData.append("server_addr", document.getElementById("server_addr").value);
+			formData.append("server_port", document.getElementById("server_port").value);
+			formData.append("busVenderId", document.getElementById("busVenderId").value);
+			formData.append("EquipmentProvider", document.getElementById("EquipmentProvider").value);
+			formData.append("TransportationCompanyNo", document.getElementById("TransportationCompanyNo").value);
+			formData.append("TTIAChargeBoxId", document.getElementById("TTIAChargeBoxId").value);
+			formData.append("evseStation", document.getElementById("evseStation").value);
+<?php } ?>
+
+			// POST 請求必須設置表頭在 open() 下面,send() 上面
+//			request.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
+			request.send(formData);
+
+			request.onreadystatechange = function() {
+				// 伺服器請求完成
+				if (request.readyState == 4) {
+					 document.getElementById("loading").style.display="none";
+					// 伺服器回應成功
+					if (request.status == 200 && JSON.parse(request.responseText).result=="Success") {
+						alert("<?php echo $lang->showWord("done")?>");
+						location.href="set_backend.php";
+					} else {
+						alert(JSON.parse(request.responseText).message);
+					}
+					request = null;
+				}
+			}
+		}
+	}
+	
+	function formCheck()
+	{
+		var OcppServerURL = document.getElementById("OcppServerURL").value;
+		var MaintainServerURL = document.getElementById("MaintainServerURL").value;
+		var ChargeBoxId = document.getElementById("ChargeBoxId").value;
+		var chargePointVendor = document.getElementById("chargePointVendor").value;
+		var tests=/^(ws|wss):\/\/((([0-9]{1,3}\.){3}[0-9]{1,3})|(([a-zA-Z0-9]+(([\-]?[a-zA-Z0-9]+)*\.)+)*[a-zA-Z]{2,}))+/;
+		if(OcppServerURL!=""){
+			if(OcppServerURL.match(tests)==null){
+				alert("OcppServerURL format error!");
+				document.getElementById("OcppServerURL").focus();
+				return false;
+			}
+		}
+		if(MaintainServerURL!=""){
+			if(MaintainServerURL.match(tests)==null){
+				alert("MaintainServerURL format error!");
+				document.getElementById("MaintainServerURL").focus();
+				return false;
+			}
+		}
+		if(ChargeBoxId!=""){
+			if(ChargeBoxId.length>25){
+				alert("Length of ChargeBoxId should be less than 25!");
+				document.getElementById("ChargeBoxId").focus();
+				return false;
+			}
+		}
+		if(chargePointVendor!=""){
+			if(chargePointVendor.length>20){
+				alert("Length of chargePointVendor should be less than 20!");
+				document.getElementById("chargePointVendor").focus();
+				return false;
+			}
+		}
+<?php if(substr($ModelName,0,1)=="D" && substr($ModelName,3,1)=="C"){?>
+		var server_port = document.getElementById("server_port").value;
+		if(server_port!=""){
+			if(server_port>65535){
+				alert("Value of Server Port should be less than 65535!");
+				document.getElementById("server_port").focus();
+				return false;
+			}
+		}
+		var busVenderId = document.getElementById("busVenderId").value;
+		if(busVenderId!=""){
+			if(busVenderId>65535){
+				alert("Value of Bus Vender Id should be less than 65535!");
+				document.getElementById("busVenderId").focus();
+				return false;
+			}
+		}
+		var EquipmentProvider = document.getElementById("EquipmentProvider").value;
+		if(EquipmentProvider!=""){
+			if(UTF8Length(EquipmentProvider)>15){
+				alert("Length of Equipment Provider should be less than 15(Chinese 5 words)!");
+				document.getElementById("EquipmentProvider").focus();
+				return false;
+			}
+		}
+		var evseStation = document.getElementById("evseStation").value;
+		if(evseStation!=""){
+			if(UTF8Length(evseStation)>15){
+				alert("Length of EVSE Station should be less than 15(Chinese 5 words)!");
+				document.getElementById("evseStation").focus();
+				return false;
+			}
+		}
+		var TransportationCompanyNo = document.getElementById("TransportationCompanyNo").value;
+		if(TransportationCompanyNo!=""){
+			if(TransportationCompanyNo>255){
+				alert("Value of Transportation Company No should be less than 255!");
+				document.getElementById("TransportationCompanyNo").focus();
+				return false;
+			}
+		}
+		var TTIAChargeBoxId = document.getElementById("TTIAChargeBoxId").value;
+		if(TTIAChargeBoxId!=""){
+			if(TTIAChargeBoxId>255){
+				alert("Value of Charge Box Id should be less than 255!");
+				document.getElementById("TTIAChargeBoxId").focus();
+				return false;
+			}
+		}
+<?php } ?>
+		return true;
+	}
+	function OcppSecurityProfile_changed(){
+		if(document.getElementById("OcppSecurityProfile").value == "1" || document.getElementById("OcppSecurityProfile").value == "2" || document.getElementById("OcppSecurityProfile").value == "3"){
+			document.getElementById("OcppSecurityPasswordDiv").style.display="block";
+			if(document.getElementById("OcppSecurityProfile").value == "3"){
+				document.getElementById("TLSwithClientSideCertificatesDiv").style.display="block";
+			}
+			else{
+				document.getElementById("TLSwithClientSideCertificatesDiv").style.display="none";
+			}
+		}
+		else{
+			document.getElementById("OcppSecurityPasswordDiv").style.display="none";
+			document.getElementById("TLSwithClientSideCertificatesDiv").style.display="none";
+		}
+	}
+	function MaintainServerSecurityProfile_changed(){
+		if(document.getElementById("MaintainServerSecurityProfile").value == "1" || document.getElementById("MaintainServerSecurityProfile").value == "2" || document.getElementById("MaintainServerSecurityProfile").value == "3"){
+			document.getElementById("MaintainServerSecurityPasswordDiv").style.display="block";
+		}
+		else{
+			document.getElementById("MaintainServerSecurityPasswordDiv").style.display="none";
+		}
+	}
+
+<?php if(substr($ModelName,0,2)=="AX" || substr($ModelName,0,2)=="AW" || substr($ModelName,0,1)=="D"){?>
+	function isEnableLocalPowerSharging_changed(){
+		/*
+		if(document.getElementById("isEnableLocalPowerSharging").selectedIndex!=0){
+			document.getElementById("OcppServerURL").setAttribute("readOnly","true");
+			document.getElementById("MaintainServerURL").setAttribute("readOnly","true");
+			document.getElementById("ChargeBoxId").setAttribute("readOnly","true");
+			document.getElementById("chargePointVendor").setAttribute("readOnly","true");
+		}
+		else{
+			document.getElementById("OcppServerURL").removeAttribute("readOnly");
+			document.getElementById("MaintainServerURL").removeAttribute("readOnly");
+			document.getElementById("ChargeBoxId").removeAttribute("readOnly");
+			document.getElementById("chargePointVendor").removeAttribute("readOnly");
+		}*/
+
+		if(document.getElementById("isEnableLocalPowerSharging").selectedIndex==1)
+		{
+			document.getElementById("PowerSharingCapacityDiv").style.display="block";	
+			document.getElementById("PowerSharingServerIPDiv").style.display="none";	
+		}
+		else if(document.getElementById("isEnableLocalPowerSharging").selectedIndex==2)
+		{
+			document.getElementById("PowerSharingCapacityDiv").style.display="none";	
+			document.getElementById("PowerSharingServerIPDiv").style.display="block";				
+		}
+		else
+		{
+			document.getElementById("PowerSharingCapacityDiv").style.display="none";	
+			document.getElementById("PowerSharingServerIPDiv").style.display="none";
+		}
+	}
+<?php } ?>
+<?php if(substr($ModelName,0,1)=="D" && substr($ModelName,3,1)=="C"){?>
+	function isEnableTTIAChecked(){
+		if(document.getElementById("isEnableTTIA").checked){
+			document.getElementById("server_addrDiv").style.display="block";
+			document.getElementById("server_portDiv").style.display="block";
+			document.getElementById("busVenderIdDiv").style.display="block";
+			document.getElementById("EquipmentProviderDiv").style.display="block";
+			document.getElementById("TransportationCompanyNoDiv").style.display="block";
+			document.getElementById("ChargeBoxIdDiv").style.display="block";
+			document.getElementById("evseStationDiv").style.display="block";
+		}
+		else{
+			document.getElementById("server_addrDiv").style.display="none";
+			document.getElementById("server_portDiv").style.display="none";
+			document.getElementById("busVenderIdDiv").style.display="none";
+			document.getElementById("EquipmentProviderDiv").style.display="none";
+			document.getElementById("TransportationCompanyNoDiv").style.display="none";
+			document.getElementById("ChargeBoxIdDiv").style.display="none";
+			document.getElementById("evseStationDiv").style.display="none";
+		}
+	}
+<?php } ?>
+	function isNumberKey(evt)
+	{
+		var charCode = (evt.which) ? evt.which : event.keyCode
+		
+		if (charCode > 31 && (charCode < 48 || charCode > 57) && (charCode != 46))
+			return false;
+		
+		return true;
+	}
+	function UTF8Length(tx){
+		var str = encodeURIComponent(tx);
+		len = str.replace(/%[A-F\d]{2}/g, 'U').length;
+		return len;
+	}
+	function escapeHtml(text) {
+		var map = {
+			'&': '&amp;',
+			'<': '&lt;',
+			'>': '&gt;',
+			'"': '&quot;',
+			"'": '&#039;'
+		};
+		return text.replace(/[&<>"']/g, function(m) { return map[m]; });
+	}
+</script>
+
+
+</html>

+ 128 - 4
EVSE/rootfs/var/www/set_backend_action.php

@@ -116,26 +116,150 @@
 			checkLength("evseStation",15);
 			$json['evseStation']				= str_replace("&amp;","&",str_replace("&quot;",'"',str_replace("&#039;","'",str_replace("&lt;","<",str_replace("&gt;",">",$_REQUEST['evseStation'])))));
 		}
-//			$fCount = count($_FILES['private_key']['name']);
 		$fCount = empty($_FILES['private_key']['tmp_name'][0]);
 		if($fCount!=1){
 			if ($_FILES["private_key"]["error"] > 0)
 			{
-				echo "Return Code: " . $_FILES["private_key"]["error"] . "<br />";
+				$jsone['result'] = "Error";
+				$jsone['message'] = $_FILES["private_key"]["error"];
+				echo json_encode($jsone);
+				exit;
+			}
+			else if(strpos(exec('openssl rsa -noout -modulus -in '.$_FILES['private_key']['name']),"Modulus")===false){	//unable to load Private Key
+				$jsone['result'] = "Error";
+				$jsone['message'] = "format of Private Key is incorrect";
+				echo json_encode($jsone);
+				exit;
 			}
 			sleep(1);
 			move_uploaded_file($_FILES["private_key"]["tmp_name"],"/Storage/OCPP/certCP.key");
 		}
-//			$fCount = count($_FILES['certificate']['name']);
 		$fCount = empty($_FILES['certificate']['tmp_name'][0]);
 		if($fCount!=1){
 			if ($_FILES["certificate"]["error"] > 0)
 			{
-				echo "Return Code: " . $_FILES["certificate"]["error"] . "<br />";
+				$jsone['result'] = "Error";
+				$jsone['message'] = $_FILES["certificate"]["error"];
+				echo json_encode($jsone);
+				exit;
+			}
+			else if(strpos(exec('openssl x509 -noout -modulus -in '.$_FILES['certificate']['name']),"Modulus")===false){	//unable to load certificate
+				$jsone['result'] = "Error";
+				$jsone['message'] = "format of Certificate is incorrect";
+				echo json_encode($jsone);
+				exit;
 			}
 			sleep(1);
 			move_uploaded_file($_FILES["certificate"]["tmp_name"],"/Storage/OCPP/certCP.pem");
 		}
+		$fCount = empty($_FILES['V2GPrivateKey']['tmp_name'][0]);
+		if($fCount!=1){
+			if ($_FILES["V2GPrivateKey"]["error"] > 0)
+			{
+				$jsone['result'] = "Error";
+				$jsone['message'] = $_FILES["V2GPrivateKey"]["error"];
+				echo json_encode($jsone);
+				exit;
+			}
+			else if(strpos(exec('openssl rsa -noout -modulus -in '.$_FILES['V2GPrivateKey']['name']),"Modulus")===false){	//unable to load V2GPrivateKey
+				$jsone['result'] = "Error";
+				$jsone['message'] = "format of V2G Private Key is incorrect";
+				echo json_encode($jsone);
+				exit;
+			}
+			sleep(1);
+			move_uploaded_file($_FILES["V2GPrivateKey"]["tmp_name"],"/Storage/certV2G.key");
+		}
+		$fCount = empty($_FILES['V2GRootCertificate']['tmp_name'][0]);
+		if($fCount!=1){
+			if ($_FILES["V2GRootCertificate"]["error"] > 0)
+			{
+				$jsone['result'] = "Error";
+				$jsone['message'] = $_FILES["V2GRootCertificate"]["error"];
+				echo json_encode($jsone);
+				exit;
+			}
+			else if(strpos(exec('openssl x509 -noout -modulus -in '.$_FILES['V2GRootCertificate']['name']),"Modulus")===false){	//unable to load V2GRootCertificate
+				$jsone['result'] = "Error";
+				$jsone['message'] = "format of V2G Root Certificate is incorrect";
+				echo json_encode($jsone);
+				exit;
+			}
+			sleep(1);
+			move_uploaded_file($_FILES["V2GRootCertificate"]["tmp_name"],"/Storage/rootCaV2g.pem");
+		}
+		$fCount = empty($_FILES['V2GCertificateChain']['tmp_name'][0]);
+		if($fCount!=1){
+			if ($_FILES["V2GCertificateChain"]["error"] > 0)
+			{
+				$jsone['result'] = "Error";
+				$jsone['message'] = $_FILES["V2GCertificateChain"]["error"];
+				echo json_encode($jsone);
+				exit;
+			}
+			else if(strpos(exec('openssl x509 -noout -modulus -in '.$_FILES['V2GCertificateChain']['name']),"Modulus")===false){	//unable to load V2GCertificateChain
+				$jsone['result'] = "Error";
+				$jsone['message'] = "format of V2G Certificate Chain is incorrect";
+				echo json_encode($jsone);
+				exit;
+			}
+			sleep(1);
+			move_uploaded_file($_FILES["V2GCertificateChain"]["tmp_name"],"/Storage/certV2g.pem");
+		}
+		$fCount = empty($_FILES['MORootCertificate']['tmp_name'][0]);
+		if($fCount!=1){
+			if ($_FILES["MORootCertificate"]["error"] > 0)
+			{
+				$jsone['result'] = "Error";
+				$jsone['message'] = $_FILES["MORootCertificate"]["error"];
+				echo json_encode($jsone);
+				exit;
+			}
+			else if(strpos(exec('openssl x509 -noout -modulus -in '.$_FILES['MORootCertificate']['name']),"Modulus")===false){	//unable to load MORootCertificate
+				$jsone['result'] = "Error";
+				$jsone['message'] = "format of MO Root Certificate is incorrect";
+				echo json_encode($jsone);
+				exit;
+			}
+			sleep(1);
+			move_uploaded_file($_FILES["MORootCertificate"]["tmp_name"],"/Storage/rootCaMo.pem");
+		}
+		$fCount = empty($_FILES['CSRootCertificate']['tmp_name'][0]);
+		if($fCount!=1){
+			if ($_FILES["CSRootCertificate"]["error"] > 0)
+			{
+				$jsone['result'] = "Error";
+				$jsone['message'] = $_FILES["CSRootCertificate"]["error"];
+				echo json_encode($jsone);
+				exit;
+			}
+			else if(strpos(exec('openssl x509 -noout -modulus -in '.$_FILES['CSRootCertificate']['name']),"Modulus")===false){	//unable to load CSRootCertificate
+				$jsone['result'] = "Error";
+				$jsone['message'] = "format of CS Root Certificate is incorrect";
+				echo json_encode($jsone);
+				exit;
+			}
+			sleep(1);
+			move_uploaded_file($_FILES["CSRootCertificate"]["tmp_name"],"/Storage/OCPP/rootCaCs.pem");
+		}
+		$fCount = empty($_FILES['ManufacturerRootCertificate']['tmp_name'][0]);
+		if($fCount!=1){
+			if ($_FILES["ManufacturerRootCertificate"]["error"] > 0)
+			{
+				$jsone['result'] = "Error";
+				$jsone['message'] = $_FILES["ManufacturerRootCertificate"]["error"];
+				echo json_encode($jsone);
+				exit;
+			}
+			else if(strpos(exec('openssl x509 -noout -modulus -in '.$_FILES['ManufacturerRootCertificate']['name']),"Modulus")===false){	//unable to load ManufacturerRootCertificate
+				$jsone['result'] = "Error";
+				$jsone['message'] = "format of Manufacturer Root Certificate is incorrect";
+				echo json_encode($jsone);
+				exit;
+			}
+			sleep(1);
+			move_uploaded_file($_FILES["ManufacturerRootCertificate"]["tmp_name"],"/Storage/OCPP/rootCaMf.pem");
+		}
 //		ob_start();
 		
 		shell_exec('sync;sync;sync');