2 ============LICENSE_START==========================================
3 ===================================================================
4 Copyright (C) 2018 AT&T Intellectual Property. All rights reserved.
5 ===================================================================
7 Unless otherwise specified, all software contained herein is licensed
8 under the Apache License, Version 2.0 (the License);
9 you may not use this software except in compliance with the License.
10 You may obtain a copy of the License at
12 http://www.apache.org/licenses/LICENSE-2.0
14 Unless required by applicable law or agreed to in writing, software
15 distributed under the License is distributed on an "AS IS" BASIS,
16 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
17 See the License for the specific language governing permissions and
18 limitations under the License.
20 ============LICENSE_END============================================
23 import { Component, Input, OnInit, ViewChild } from '@angular/core';
24 import { HttpUtilService } from '../../../../shared/services/httpUtil/http-util.service';
25 import { MappingEditorService } from '../../../../shared/services/mapping-editor.service';
26 import { ArtifactRequest } from '../../../../shared/models/index';
27 import { ActivatedRoute, Router } from '@angular/router';
28 import { saveAs } from 'file-saver';
29 import { NotificationService } from '../../../../shared/services/notification.service';
30 import { NotificationsService } from 'angular2-notifications';
31 import { ParamShareService } from '../../../../shared/services/paramShare.service';
32 import { DialogService } from 'ng2-bootstrap-modal';
33 import { ConfirmComponent } from '../../../../shared/confirmModal/confirm.component';
34 import { BuildDesignComponent } from '../../build-artifacts.component';
35 import { environment } from '../../../../../environments/environment';
36 import { ModalComponent } from 'ng2-bs3-modal/ng2-bs3-modal';
37 import { NgProgress } from 'ngx-progressbar';
40 @Component({ selector: 'app-golden-configuration', templateUrl: './template-configuration.component.html', styleUrls: ['./template-configuration.component.css'] })
41 export class GoldenConfigurationComponent implements OnInit {
42 @ViewChild('templateeditor') templateeditor;
43 @Input() configMappingEditorContent: string;
44 @Input() isMappingComp: boolean;
45 @ViewChild('myInput') myInputVariable: any;
46 @ViewChild('myModal') modal: ModalComponent;
49 showTemplateVersionDiv: any;
50 downloadedTemplateFileName: any;
51 downloadedParamFileName: any;
52 templateVersionNo: any = '0.0.1';
53 saveToGuiCacheFlag = 'false';
55 public referenceData: Array<Object> = [];
56 public scopeName: any;
57 public subscription: any;
58 public item: any = {};
59 public goldenActions: Array<string> = [];
60 public refNameObj = {};
62 public artifactName = '';
64 public showError: boolean = false;
65 public tempretrieveFlag: boolean = false;
66 public fileNameForTempSave;
68 showDownloadDiv: boolean = false;
70 enableBrowse: boolean = true;
71 enableMerge: boolean = false;
72 uploadValidationSuccess: boolean = false;
73 fileExtension: any = "xml";
74 apiToken = localStorage['apiToken'];
75 public appDataObject: any;
76 public downloadDataObject: any;
77 public checkNameEntered: boolean = true;
78 public selectedWord: any = this.mappingEditorService.getSelectedWord();
80 { action: "ConfigBackup", value: "ConfigBackup" },
81 { action: "ConfigModify", value: "ConfigModify" },
82 { action: "ConfigRestore", value: "ConfigRestore" },
83 { action: "Configure", value: "Configure" },
84 { action: "GetRunningConfig", value: "GetRunningConfig" },
85 { action: "HealthCheck", value: "HealthCheck" },
86 { action: "StartApplication", value: "StartApplication" },
87 { action: "StopApplication", value: "StopApplication" }
91 showProgressBar: true,
97 public enableDownloadButtons: boolean = false;
98 constructor(private buildDesignComponent: BuildDesignComponent, private paramShareService: ParamShareService, private dialogService: DialogService, private notificationService: NotificationService, private httpUtil: HttpUtilService, private mappingEditorService: MappingEditorService, private activeRoutes: ActivatedRoute, private router: Router, private nService: NotificationsService, private ngProgress: NgProgress) {
99 this.artifactRequest.action = '';
100 this.artifactRequest.version = '';
101 this.artifactRequest.paramsContent = '{}';
102 this.artifactRequest.paramKeysContent = '';
104 public templateEditor: any;
105 public fileType: any = '';
106 public actionType: any;
107 public myfileName: any;
108 userId = localStorage['userId'];
109 public artifactRequest: ArtifactRequest = new ArtifactRequest();
110 public showUploadStatus: boolean = false;
111 public uploadStatus: boolean = false;
112 public uploadTypes = [
114 value: 'Generated Template',
115 display: 'Sample Json Param File'
118 value: 'Mapping Data',
119 display: 'Sample Json Param File'
129 enableValidateTemplate: boolean = false;;
130 public selectedUploadType: string = this.uploadTypes[0].value;
132 public tempRetrievalResponse: any;
133 public mergeStatus: boolean = false;
135 //======================================Start of ngOnInit() Method============================================
137 var refObj = this.refObj = this.prepareFileName();
138 if (refObj && refObj != undefined) {
141 this.vnfType = this.item.scope["vnf-type"];
142 this.vnfcType = this.item.scope["vnfc-type"];
143 this.protocol = this.item['device-protocol'];
144 this.action = this.item.action;
145 this.artifactRequest.action = this.item.action;
146 this.artifactRequest.vnfType = this.vnfType;
147 if (this.vnfcType != undefined && this.vnfcType.length != 0) {
148 this.scopeName = this.vnfcType;
151 this.scopeName = this.vnfType;
155 this.item = { "action": "", "scope": { "vnf-type": "", "vnfc-type": "" }, "vm": [], "protocol": "", "download-dg-reference": "", "user-name": "", "port-number": "", "artifact-list": [], "deviceTemplate": "", "scopeType": "" };
157 this.initialAction = this.item.action;
158 this.activeRoutes.url.subscribe(UrlSegment => {
159 this.actionType = UrlSegment[0].path
161 this.mappingEditorService.fromScreen = 'MappingScreen';
162 this.identifier = this.mappingEditorService.identifier;
164 //========================== End of ngOnInit() Method============================================
166 if (this.refObj && this.refObj != undefined) {
167 if (this.configMappingEditorContent && this.configMappingEditorContent != undefined) {
169 this.prepareAppData();
170 this.prepareDownloadData();
171 this.mappingEditorService.changeNavAppData(this.appDataObject);
172 this.mappingEditorService.changeNavDownloadData(this.downloadDataObject);
176 //========================== End of ngOnDestroy() Method============================================
178 if (this.mappingEditorService.latestAction) {
179 this.refNameObj = this.mappingEditorService.latestAction;
180 if (this.vnfcType !== 'null') {
181 this.type = this.vnfcType;
184 this.type = this.vnfType;
186 for (let i = 0; i < this.refNameObj['artifact-list'].length; i++) {
187 let artifactList = this.refNameObj['artifact-list'];
188 if (artifactList[i]['artifact-type'] === 'config_template') {
189 var artifactName = artifactList[i]['artifact-name'];
190 var artifactNameWithoutExtension = '';
191 if (artifactName) artifactNameWithoutExtension = artifactName.substring(0, artifactName.lastIndexOf("."))
192 var identifier = artifactNameWithoutExtension.split("_");
194 if (identifier) id = identifier[identifier.length - 1];
195 if (this.mappingEditorService.identifier) {
196 if (id === this.mappingEditorService.identifier) this.artifactName = artifactName;
199 this.artifactName = artifactName;
206 this.templateEditor = self.templateeditor.getEditor();
207 this.templateeditor.getEditor().commands.addCommand({
208 name: 'annotateCommandAlternate',
209 bindKey: { win: 'CTRL-4', mac: 'Command-4' },
210 exec: (editor: any) => {
211 this.handleAnnotation(this.modal);
214 if (this.mappingEditorService.fromScreen === 'MappingScreen') {
215 this.configMappingEditorContent = this.mappingEditorService.getTemplateMappingDataFromStore();
216 this.fileType = sessionStorage.getItem('fileType');
218 if (this.configMappingEditorContent) {
219 this.artifactRequest.templateContent = this.configMappingEditorContent;
220 this.mappingEditorService.initialise(this.templateeditor.getEditor(), this.artifactRequest.templateContent, this.modal);
223 if (this.mappingEditorService.getTemplateMappingDataFromStore() && this.mappingEditorService.getTemplateMappingDataFromStore() != undefined) {
224 this.configMappingEditorContent = this.mappingEditorService.getTemplateMappingDataFromStore();
227 if (this.artifactName) this.retrieveTemplateFromAppc();
232 this.enableBrowse = false;
233 this.nService.error("Error", "Please enter Action and VNF type in Reference Data screen");
237 //========================== End of ngAfterViewInit() Method============================================
239 $("#inputFile").trigger('click');
241 //========================== End of browseOption() Method============================================
243 public saveTemplate() {
244 this.saveToGuiCacheFlag = 'true';
245 this.mappingEditorService.paramData = [];
246 if (this.configMappingEditorContent) {
247 this.initialData = this.configMappingEditorContent;
248 this.mappingEditorService.refreshEditor();
249 let paramArr: any = []
250 if (this.mappingEditorService.paramData && this.mappingEditorService.paramData != undefined) {
251 if (this.mappingEditorService.paramData.length === 0 && this.mappingEditorService.hasErrorCode === true) {
252 this.nService.error("Error", 'Special characters error', 'Error')
256 this.showError = false;
259 this.showTemplateVersionDiv = true;
261 if (this.mappingEditorService.fromScreen === 'MappingScreen') {
262 this.mappingEditorService.setTemplateMappingDataFromStore(this.configMappingEditorContent);
264 if (this.fileType === 'text/xml') {
265 sessionStorage.setItem('fileType', 'text/xml');
267 if (this.fileType === '') {
268 sessionStorage.setItem('fileType', '');
272 //========================== End of saveTemplate() Method============================================
273 retrieveTemplateFromAppc() {
274 let refObj = this.refObj;
275 if (refObj && refObj != undefined) {
277 let fileName = this.artifactName;
278 let payload = '{"userID": "' + this.userId + '","action": "' + this.item.action + '", "vnf-type" : "' + this.vnfType + '", "artifact-type":"APPC-CONFIG", "artifact-name":"' + fileName + '"}';
282 "request-id": this.apiToken,
283 "action": "getArtifact",
288 let artifactContent: any;
289 this.ngProgress.start();
291 url: environment.getDesigns,
293 }).subscribe(resp => {
294 if (resp.output.status.code === '400' && resp.output.status.message === "success") {
295 this.nService.success("Success", "Template retrieved successfully from APPC");
296 this.tempRetrievalResponse = resp;
297 let result = JSON.parse(resp.output.data.block).artifactInfo[0];
298 result = result['artifact-content'];
299 if ('Generated Template' === this.selectedUploadType) {
300 this.configMappingEditorContent = result
301 this.artifactRequest.templateContent = this.configMappingEditorContent;
302 this.notificationService.notifySuccessMessage('Configuration Template file successfully uploaded..');
303 if (this.artifactRequest.templateContent) {
304 this.mappingEditorService.initialise(this.templateeditor.getEditor(), this.artifactRequest.templateContent, this.modal);
307 this.tempretrieveFlag = true;
308 this.fileNameForTempSave = fileName;
309 this.enableDownloadButtons = true;
310 this.initialData = result;
314 this.nService.info("Information", "There is no template saved in APPC for the selected action!");
316 this.ngProgress.done();
318 error => this.nService.error("Error", "Error in connecting to APPC Server"));
320 this.ngProgress.done();
324 //========================== End of retrieveTemplateFromAppc() Method============================================
326 let refObj = this.refObj;
327 if (refObj && refObj != undefined) {
328 let paramsKeyValueFromEditor: JSON;
330 paramsKeyValueFromEditor = JSON.parse(localStorage["paramsContent"]);
333 console.log("Could not parse name value pairs==" + error);
335 if (paramsKeyValueFromEditor) {
336 this.showTemplateVersionDiv = true;
337 let action = this.item.action;
338 var scopeName = this.scopeName.replace(/ /g, '').replace(new RegExp('/', "g"), '_').replace(/ /g, '');
340 let id = this.mappingEditorService.identifier;
341 if (id) fileName = this.updateFileNameForConfigScaleOut(this.item.action, scopeName, this.templateVersionNo, id);
342 else fileName = this.updateParamFileName(this.item.action, scopeName, this.templateVersionNo);
344 let vnfType = this.vnfType;
345 let Json = [paramsKeyValueFromEditor];
346 let slashedPayload = this.appendSlashes(JSON.stringify(Json));
349 "userID": this.userId,
350 "vnf-type": this.vnfType,
352 "artifact-name": fileName,
353 "artifact-type": "APPC-CONFIG",
354 "artifact-version": this.templateVersionNo,
355 "artifact-contents": slashedPayload
361 "request-id": this.apiToken,
362 "action": "uploadArtifact",
363 "payload": JSON.stringify(newPayload)
368 this.appDataObject.template.nameValueData = data;
370 if (this.configMappingEditorContent) {
371 let actualContent = this.configMappingEditorContent;
372 this.mappingEditorService.generateTemplate(this.templateEditor);
373 this.showTemplateVersionDiv = true;
374 let action = this.item.action;
375 let versionandFileType: any;
376 if (this.fileType === "text/xml") {
378 versionandFileType = this.templateVersionNo + 'V.xml'
381 versionandFileType = this.templateVersionNo + 'V.json'
384 if (this.tempretrieveFlag) {
385 fileName = this.fileNameForTempSave;
388 fileName = this.artifactName;
390 let vnfType = this.vnfType;
393 "userID": this.userId,
394 "vnf-type": this.vnfType,
396 "artifact-name": fileName,
397 "artifact-type": "APPC-CONFIG",
398 "artifact-version": this.templateVersionNo,
399 "artifact-contents": this.configMappingEditorContent.replace(/\(([^()]|(R))*\)=\(/g, '').replace(/\)}/g, '}')
406 "request-id": this.apiToken,
407 "action": "uploadArtifact",
408 "payload": JSON.stringify(newPayload)
413 this.appDataObject.template.templateData = data;
414 this.mappingEditorService.initialise(this.templateeditor.getEditor(), actualContent, this.modal);
418 //========================== End of prepareAppData() Method============================================
419 prepareFileName(): any {
420 let fileNameObject: any = this.mappingEditorService.latestAction;
421 this.appDataObject = this.mappingEditorService.appDataObject;
422 this.downloadDataObject = this.mappingEditorService.downloadDataObject;
423 this.referenceData = fileNameObject;
424 return fileNameObject;
426 //========================== End of prepareFileName() Method============================================
427 onDownloadParameter() {
428 let refObj = this.refObj;
430 let paramsKeyValueFromEditor: JSON;
432 paramsKeyValueFromEditor = JSON.parse(localStorage["paramsContent"]);
435 console.log("Could not parse name value pairs==" + error);
437 let theJSON = JSON.stringify(paramsKeyValueFromEditor, null, "\t")
438 var blob = new Blob([theJSON], {
441 this.showTemplateVersionDiv = true;
443 var scopeName = this.scopeName.replace(/ /g, '').replace(new RegExp('/', "g"), '_').replace(/ /g, '');
444 let id = this.mappingEditorService.identifier;
445 if (id) fileName = this.updateFileNameForConfigScaleOut(this.item.action, scopeName, this.templateVersionNo, id);
446 else fileName = this.updateParamFileName(this.item.action, scopeName, this.templateVersionNo);
448 this.downloadDataObject.template.nameValueData = theJSON;
449 this.downloadDataObject.template.nameValueFileName = fileName;
452 this.nService.error("Error", "Please enter Action and VNF type in Reference Data screen");
456 //========================== End of onDownloadParameter() Method============================================
457 updateParamFileName(action: any, scopeName: any, versionNo: any) {
458 let fileName = 'param_' + action + '_' + scopeName + '_' + versionNo + 'V.json';
459 this.downloadedParamFileName = fileName;
462 //========================== End of updateParamFileName() Method============================================
463 updateFileNameForConfigScaleOut(action: any, scopeName: any, versionNo: any, id: any) {
464 let fileName = 'param_' + action + '_' + scopeName + '_' + versionNo + 'V_' + id + '.json';
465 this.downloadedParamFileName = fileName;
468 //========================== End of updateFileNameForConfigScaleOut() Method============================================
469 public onDownloadTemplate(artifact: string) {
470 let actualContent = this.configMappingEditorContent;
471 var textToSaveAsBlob: any;
472 var config_template_fileName: any
473 let refObj = this.refObj;
474 let versionandFileType: string;
475 if (artifact == 'Template' && this.artifactRequest && this.configMappingEditorContent && refObj) {
476 this.showTemplateVersionDiv = true;
477 if (this.fileType === "text/xml") {
478 textToSaveAsBlob = new Blob([this.configMappingEditorContent], {
481 versionandFileType = this.templateVersionNo + 'V.xml'
483 if (this.fileType === "text/plain") {
484 textToSaveAsBlob = new Blob([this.configMappingEditorContent], {
487 versionandFileType = this.templateVersionNo + 'V.txt'
489 if (this.fileType === "text/json") {
490 textToSaveAsBlob = new Blob([this.configMappingEditorContent], {
493 versionandFileType = this.templateVersionNo + 'V.json'
495 if (this.tempretrieveFlag) {
496 config_template_fileName = this.fileNameForTempSave;
497 var filextension = config_template_fileName.substring(config_template_fileName.indexOf("V") + 2, config_template_fileName.length);
499 textToSaveAsBlob = new Blob([this.configMappingEditorContent], {
500 type: "text/" + filextension
504 config_template_fileName = this.artifactName;
506 this.mappingEditorService.initialise(this.templateeditor.getEditor(), actualContent, this.modal);
507 this.downloadDataObject.template.templateData = this.configMappingEditorContent.replace(/\(([^()]|(R))*\)=\(/g, '').replace(/\)}/g, '}');
508 this.downloadDataObject.template.templateFileName = config_template_fileName;
512 //========================== End of onDownloadTemplate() Method============================================
516 let refObj = this.refObj;
517 this.enableValidateTemplate = true;
519 if (refObj && refObj != undefined) {
520 if (input.files && input.files[0]) {
521 this.myfileName = input.files[0].name;
522 this.fileName = input.files[0].name;
523 this.fileType = input.files[0].type;
524 let reader = new FileReader();
525 this.readFile(input.files[0], reader, (result) => {
526 if (this.fileType === 'text/xml') {
527 sessionStorage.setItem('fileType', 'text/xml');
529 if (this.fileName.endsWith(".json")) {
530 this.fileType = "text/json";
531 sessionStorage.setItem('fileType', 'text/json');
533 if (this.fileType === '') {
534 sessionStorage.setItem('fileType', '');
538 if ('Generated Template' === this.selectedUploadType) {
539 this.configMappingEditorContent = result
540 this.artifactRequest.templateContent = this.configMappingEditorContent;
541 this.notificationService.notifySuccessMessage('Configuration Template file successfully uploaded..');
542 if (this.artifactRequest.templateContent) {
543 this.mappingEditorService.initialise(this.templateeditor.getEditor(), this.artifactRequest.templateContent, this.modal);
546 this.enableDownloadButtons = true;
547 this.initialData = result;
553 this.nService.error("Error", "Failed to read file");
555 this.myInputVariable.nativeElement.value = "";
558 this.nService.error("Error", "Please enter Action and VNF type in Reference Data screen");
562 //========================== End of fileChange() Method============================================
563 public readFile(file, reader, callback) {
564 // Set a callback funtion to fire after the file is fully loaded
565 reader.onload = () => {
566 // callback with the results
567 callback(reader.result);
569 this.notificationService.notifySuccessMessage('Uploading File ' + file.name + ':' + file.type + ':' + file.size);
571 reader.readAsText(file, "UTF-8");
573 //========================== End of readFile() Method============================================
574 validateUploadedFile(fileExtension) {
576 if (fileExtension.toUpperCase() === 'json'.toUpperCase() || fileExtension.toUpperCase() === 'xml'.toUpperCase()) {
584 //========================== End of validateUploadedFile() Method============================================
585 appendSlashes(artifactData) {
586 let x = artifactData.replace(new RegExp(',"', "g"), ',\"');
587 let y = x.replace(new RegExp('":', 'g'), '\":');
588 let z = y.replace(new RegExp('{"', 'g'), '{\"')
589 let t = z.replace(new RegExp(':"', 'g'), ':\"')
590 let m = t.replace(new RegExp('",', 'g'), '\",');
591 let n = y.replace(new RegExp('"}', 'g'), '\"}')
592 let nw = n.replace(new RegExp('{"', 'g'), '{\"');
593 let nw1 = nw.replace(new RegExp(':"', 'g'), ':\"');
594 let nw2 = nw1.replace(new RegExp('",', 'g'), '\",');
597 //========================== End of appendSlashes() Method============================================
598 prepareDownloadData() {
599 this.onDownloadParameter();
600 this.onDownloadTemplate('Template');
602 //========================== End of prepareDownloadData() Method============================================
604 this.mappingEditorService.replaceNamesWithBlankValues();
607 var templateData = this.mappingEditorService.paramData; //template data array
608 var pdData = this.paramShareService.getSessionParamData(); //PD data array
609 var paramsContent = localStorage["paramsContent"];
611 if (paramsContent && paramsContent != undefined) {
613 var paramTabData = JSON.parse(paramsContent);
616 console.log("error is : " + error)
621 var resultParamObj = {};
622 let checkNamesOnlyCondition: boolean = true;
624 if (templateData && templateData != undefined) {
625 templateData.forEach(function (item) {
626 if (item.paramValue !== "" && item.paramValue != undefined && item.paramValue != null) {
627 checkNamesOnlyCondition = false;
632 templateData.forEach(function (item) {
633 resultParamObj[item.paramName] = item.paramValue;
635 if (paramTabData && paramTabData != undefined) {
636 templateData.forEach(function (item) {
637 for (var index in paramTabData) {
638 if (item.paramName === index) {
639 if (checkNamesOnlyCondition) {
640 resultParamObj[index] = paramTabData[index];
643 if (item.paramValue === "") {
644 resultParamObj[index] = paramTabData[index];
647 resultParamObj[index] = item.paramValue;
657 localStorage["paramsContent"] = JSON.stringify(resultParamObj);
658 templateData = Array.from(new Set(templateData.map((itemInArray) => itemInArray.paramName)))
660 //reformatting arr1 to match with PD
661 templateData.forEach(function (item) {
697 "ruleTypeValues": [null]
702 if (pdData && pdData != undefined) {
703 for (var i = 0; i < resultArr.length; i++) {
705 pdData.forEach(function (arr2item) {
706 if (resultArr[i].name === arr2item.name) {
709 "name": arr2item.name,
710 "type": arr2item.type,
711 "description": arr2item.description,
712 "required": arr2item.required,
713 "default": arr2item.default,
714 "source": arr2item.source,
715 "rule-type": arr2item["rule-type"],
716 "request-keys": arr2item["request-keys"],
717 "response-keys": arr2item["response-keys"],
718 "ruleTypeValues": arr2item.ruleTypeValues
720 resultArr.splice(i, 1, json)
728 this.paramShareService.setSessionParamData(resultArr);
729 this.mappingEditorService.paramData = [];
730 //navigate to PD page after sync
733 .navigate(['../../../vnfs/design/parameterDefinitions/create']);
736 //========================== End of syncTemplate() Method============================================
738 this.mergeStatus = this.mappingEditorService.autoAnnotateDataForParams();
739 if (this.mergeStatus) {
740 this.nService.success("Success", "Merge Successful");
743 this.nService.error("Error", "Merge Unsuccessful");
747 //========================== End of mergeParams() Method============================================
748 public handleAnnotation(modal) {
750 this.selectedWord = this.templateeditor.getEditor().session.getTextRange(this.templateeditor.getEditor().selectionRange);
751 if (this.selectedWord && this.selectedWord != undefined) modal.open();
753 //========================== End of handleAnnotations() Method============================================
754 public submitNameValues() {
756 this.checkNameEntered = true;
758 if (this.selectedWord) {
759 if (this.selectedWord.startsWith('${(')) {
760 var replaceWord: any = this.replaceWord = this.selectedWord.substring(3, this.selectedWord.indexOf(')=(')) + this.tempName;
761 this.templateeditor.getEditor().session.replace(this.templateeditor.getEditor().session.selection.getRange(), replaceWord);
764 let mappingKey = this.mappingEditorService.getKeysForValues(this.selectedWord);
765 var replaceWord: any = this.replaceWord = '${(' + this.selectedWord + ')=(' + this.tempName + ')}';
766 this.templateeditor.getEditor().session.replace(this.templateeditor.getEditor().session.selection.getRange(), replaceWord);
770 this.mappingEditorService.refreshEditor();
776 this.checkNameEntered = false;
780 //========================== End of submitNameValues() Method============================================