<!DOCTYPE html>
<html>
<head>
	<title>{% block title %}Device {{ device }}{% endblock %}</title>
	<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
	<meta http-equiv="X-UA-Compatible" content="IE=edge"/>
	<link rel="stylesheet" type="text/css" href="codebase/dhtmlx.css"/>
   <script type=text/javascript src="{{ url_for('static', filename='jquery-2.2.1.js') }}"></script>
	<script src="codebase/dhtmlx.js"></script>
   <script src="pcilib_tree.js"></script>
	<script>
      var propsTree
      
      function checkError(json)
      {
         if(json.error)
            alert('Error:\n' + json.error)
      }
      
      function createPropertyTree(branch, id)
      {
         function getPropertyItemsOnLevel(branch, id)
         {
            pathToProperties = "{{ url_for('get_property_list_json') }}"
            completePath = pathToProperties + '?branch=' + branch
            
            $.getJSON(completePath, 
                      function(json) {
                         checkError(json)
                         parsePropertyItems(json, branch, id)
                         });
         }
         
         function parsePropertyItems(json, branch, id)
         {
            function updatePropertyValue(id, path)
            {
               pathToGetProperty = "{{ url_for('get_property_json') }}"
               completePath = pathToGetProperty + '?prop=' + path
               
               $.getJSON(completePath, function(json){
                           checkError(json)
                           propsTree.updateItem(id, 'value: ' + json.value);
                        })
            }
         
            function writePropertyValue(id, path)
            {
               value = window.prompt("Enter new property value");
               
               if(value != null)
               {
                  pathToGetProperty = "{{ url_for('set_property_json') }}"
                  completePath = pathToGetProperty + '?prop=' + path +'&val=' + value
                  
                  $.getJSON(completePath, 
                            function(json) {
                              checkError(json)
                              updatePropertyValue(id, path)
                             })
               }
               else
                  updatePropertyValue(id, path)
            }
            
            function setCurrentValueField(id, path, mode)
            {
               var propValId = id + 'CurrVal'
               var func = 0
               
               if(mode)
                  func = function(){writePropertyValue(propValId, path)}
               else
                  func = function(){updatePropertyValue(propValId, path)}
                  
               propsTree.insertNewItem(id, propValId,
                                    'value: ', 
                                    func);
               
               updatePropertyValue(propValId, path)
            }
            
            for(var i = 0; i < json.length; i++)
            {
               propsTree.insertNewItem(id, json[i].path, json[i].name, 0);
               
               if(json[i].flags.indexOf("childs") != -1)
               {
                  getPropertyItemsOnLevel(json[i].path, json[i].path)
               }
               else
               {
                  if(json[i].mode.indexOf("R") != -1)
                  {
                     var mode = (json[i].mode.indexOf("W") != -1)
                     setCurrentValueField(json[i].path, json[i].path, mode)
                  }
               }
               
               //show aviable info
               if(json[i].description)
                  propsTree.insertNewItem(json[i].path, json[i].path + 'Desc',
                                       'description:\n' + json[i].description, 0);
               if(json[i].type)
                  propsTree.insertNewItem(json[i].path, json[i].path + 'Type',
                                       'type: ' + json[i].type, 0);
               if(json[i].unit)
                  propsTree.insertNewItem(json[i].path, json[i].path + 'Unit',
                                       'unit: ' + json[i].unit, 0);
                                       
               if(json[i].mode)
               {
                  var modeId = json[i].path + 'Mode'
                  propsTree.insertNewItem(json[i].path, modeId,
                                       'mode', 0);
                  
                  for(var j = 0; j < json[i].mode.length; j++)
                     propsTree.insertNewItem(modeId, modeId + j,
                                       json[i].mode[j], 0);
                  propsTree.closeItem(modeId)
               }
               
               if(json[i].path)
                  propsTree.insertNewItem(json[i].path, json[i].path + 'Path',
                                       'path: ' + json[i].path, 0);
                                       
               propsTree.closeItem(json[i].path);
            }  
      }
         
         getPropertyItemsOnLevel(branch, id)
      }
      
      var regTree
      function createRegistersList()
      {
         function parseJsonRegisterList(json)
         {
            checkError(json)
            
            function compareRegistersByBank(a,b) 
            {
               if (a.bank < b.bank)
                  return -1;
               else if (a.bank > b.bank)
                  return 1;
               else 
                  return 0;
            }
            
            if(json.lenght <= 0)
               return
            
            //sort registers by bank
            json.sort(compareRegistersByBank)
            
            //create bank dirs
            var curBankName = json[0].bank
            var created = 0
            for(var i = 0; i < json.length; i++)
            {
               //create new bank tab if it has not created already
               if(json[i].bank != curBankName)
               {
                  curBankName = json[i].bank
                  created = 0
               }
               if(!created)
               {
                  regTree.insertNewItem(0, json[i].bank, json[i].bank, 0);
                  created = 1
               }
               
               //insert register info to bank
               var itemId = json[i].bank + "_" + json[i].name
               regTree.insertNewItem(json[i].bank, itemId, json[i].name)
               
               function updateRegisterValue(id, bank, name)
               {
                  pathToGetProperty = "{{ url_for('read_register_json') }}"
                  completePath = pathToGetProperty + '?bank=' + bank +
                                 '&name=' + name
                  
                  $.getJSON(completePath, function(json){
                              checkError(json)
                              regTree.updateItem(id, 'value: ' + json.value);
                           })
               }
         

               function writeRegisterValue(id, bank, name)
               {
                  value = window.prompt("Enter new register value");
                  
                  if(value != null)
                  {
                     pathToGetProperty = "{{ url_for('write_register_json') }}"
                     completePath = pathToGetProperty + '?bank=' + bank +
                                    '&name=' + name + '&val=' + value;
                     
                     $.getJSON(completePath, 
                               function(json) {
                                 checkError(json)
                                 updateRegisterValue(id, bank, name)
                                })
                  }
                  else
                     updateRegisterValue(id, bank, name)
               }

               function setCurrentValueField(id, bank, name, mode)
               {
                  var regValId = id + 'CurrVal'
                  var func = 0
                  
                  if(mode)
                     func = function(){writeRegisterValue(regValId, bank, name)}
                  else
                     func = function(){updateRegisterValue(regValId, bank, name)}
                     
                  regTree.insertNewItem(id, regValId,
                                       'value: ', 
                                       func);
                  updateRegisterValue(regValId, bank, name)
               }
               
               if(json[i].mode.indexOf("R") != -1)
               {
                  var mode = (json[i].mode.indexOf("W") != -1)
                  setCurrentValueField(itemId, json[i].bank, json[i].name, mode)
               }
               
               //show aviable info
               if(json[i].description)
                  regTree.insertNewItem(itemId, itemId + 'Desc',
                                        'description:\n' + json[i].description, 0);
               if(json[i].defvalue)
                  regTree.insertNewItem(itemId, itemId + 'Defvalue',
                                       'defvalue: ' + json[i].defvalue, 0);
               
               if(json[i].mode)
               {
                  var modeId = itemId + 'Mode'
                  regTree.insertNewItem(itemId, modeId,
                                       'mode', 0);
                  
                  for(var j = 0; j < json[i].mode.length; j++)
                     regTree.insertNewItem(modeId, modeId + j,
                                       json[i].mode[j], 0);
                  regTree.closeItem(modeId)
               }
               
               if(json[i].range)
               {
                  var rangeId = itemId + 'Range'
                  regTree.insertNewItem(itemId, rangeId,
                                       'range', 0);
                  regTree.insertNewItem(rangeId, rangeId + 'Min',
                                       'min: ' + json[i].range.min, 0);
                  regTree.insertNewItem(rangeId, rangeId + 'Max',
                                       'max: ' + json[i].range.max, 0);
                  regTree.closeItem(rangeId)
               }
               
               if(json[i].values)
               {
                  var valuesId = itemId + 'Values'
                  regTree.insertNewItem(itemId, valuesId,
                                       'values', 0);
                                       
                  function addValueInfo(valuesId, value)
                  {
                     var valueId = valuesId + value.name
                     regTree.insertNewItem(valuesId, valueId, value.name, 0);
                     
                     if(value.description)
                        regTree.insertNewItem(valueId, valueId + 'Desc',
                                              'description: ' + value.description, 0);
                     if(value.value)
                        regTree.insertNewItem(valueId, valueId + 'Value',
                                              'value: ' + value.value, 0);
                     if(value.min)
                        regTree.insertNewItem(valueId, valueId + 'Min',
                                              'min: ' + value.min, 0);
                     if(value.max)
                        regTree.insertNewItem(valueId, valueId + 'Max',
                                              'max: ' + value.max, 0);   
                  }
                  
                  for(var j = 0; j < json[i].values.length; j++)
                  {
                     addValueInfo(valuesId, json[i].values[j])
                  }
                  regTree.closeItem(valuesId)
               }
                                       
               propsTree.closeItem(json[i].path);
               
               regTree.closeItem(itemId);
            }
         }
         
         //get registers json list
         getRegistersListPath = "{{ url_for('get_registers_list_json') }}" 
         $.getJSON(getRegistersListPath, parseJsonRegisterList);
      }
      
		function doOnLoad()
      {
			propsTree = new dhtmlXTreeObject("treeboxbox_tree","100%","100%",0);
			propsTree.setImagePath("codebase/imgs/dhxtree_skyblue/");
         //generating properties list
         createPropertyTree('', 0)
         
			regTree = new dhtmlXTreeObject("treeboxbox_tree2","100%","100%",0,0,0,0,'SELECT')
			regTree.setImagePath("codebase/imgs/dhxtree_skyblue/");
         createRegistersList()
		}
	</script>
</head>
<body onload="doOnLoad()">
	{% block info %}
      <h2>Device {{ device }} model={{ model }} control page </h2>
   {% endblock %}
   
   {% block content %}
   {% endblock %}
	<table>
		<tr>
         <td>
            <h3>Properties Tree</h3>
         </td>
         <td>
            <h3>Registers Tree</h3>
         </td>
		</tr>
		<tr>
         <td valign="top">
				<div id="treeboxbox_tree" style="background-color:#f5f5f5;border :1px solid Silver; overflow:auto;"></div>
			</td>
			<td valign="top">
				<div id="treeboxbox_tree2" style="background-color:#f5f5f5;border :1px solid Silver; overflow:auto;"></div>
			</td>
		</tr>
	</table>
</body>
</html>