123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538 |
- /*##############################################################################
- # HPCC SYSTEMS software Copyright (C) 2012 HPCC Systems.
- #
- # Licensed under the Apache License, Version 2.0 (the "License");
- # you may not use this file except in compliance with the License.
- # You may obtain a copy of the License at
- #
- # http://www.apache.org/licenses/LICENSE-2.0
- #
- # Unless required by applicable law or agreed to in writing, software
- # distributed under the License is distributed on an "AS IS" BASIS,
- # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- # See the License for the specific language governing permissions and
- # limitations under the License.
- ############################################################################## */
- var command;
- var component;
- var xmlDoc;
- var schemaNode;
- var objNode;
- var bAdd;
-
- function onLoad()
- {
- var form = document.forms[0];
- component = form.component.value;
- command = form.command.value;
- schemaNode = xmlSchema.documentElement.selectSingleNode('//Arguments');
- if (schemaNode == null)
- {
- alert('No arguments node found in XML schema!');
- return;
- }
-
- var prevArgsDoc = document.all.xmlPrevArgsDoc;
- if (prevArgsDoc != undefined && prevArgsDoc != null)
- {
- xmlDoc = prevArgsDoc;
- objNode = prevArgsDoc.documentElement;
-
- if (objNode == null)
- {
- bAdd = true;
- objNode = xmlDoc.createElement('Arguments');
- xmlDoc.documentElement.appendChild(objNode);
- }
- else
- {
- bAdd = false;
- initializeHtmlObjects(objNode, schemaNode);
- }
- }
- else
- {
- bAdd = true;
-
- //create xml fragment that would be passed to any child dialogs for them to fill in
- //and is sent back as hidden input field 'xmlArgs'
- xmlDoc = new ActiveXObject("Microsoft.XMLDOM");
- xmlDoc.async = false;
- xmlDoc.loadXML('<Arguments/>');
-
- objNode = xmlDoc.documentElement.selectSingleNode('//Arguments');
- }
- }
-
- function onSubmit()
- {
- /*
- if (bAdd)
- {
- //add immediate children to our data island. Note that nested data is updated
- //as a result of add/delete handlers
- //
- if (!addImmediateChildrenFromHtmlObjects(schemaNode, objNode, xmlDoc))
- return false;
- }
- else
- replaceImmediateChildrenFromHtmlObjects(objNode. schemaNode);
-
- //update the value of our hidden HTML control that gets sent back with the submission
- //
- document.forms[0].xmlArgs.value = xmlDoc.xml;
- alert(xmlDoc.xml);
- */
- //alert(document.forms[0].outerHTML);
- return true;
- }
- function initializeHtmlObjects(objNode, schemaNode)
- {
- for (var childSchemaNode = schemaNode.firstChild;
- childSchemaNode != null;
- childSchemaNode = childSchemaNode.nextSibling)
- {
- var name = childSchemaNode.nodeName;
- var maxOccursAttr = childSchemaNode.attributes.getNamedItem('maxOccurs');
- var maxOccurs = maxOccursAttr ? maxOccursAttr.nodeValue : null;
-
- if (maxOccurs == "unbounded")
- {
- var argsTableObj = document.all.ArgumentsTable;
- var tableObj = argsTableObj.all[name];
-
- var targetNodes = objNode.selectNodes(name);
- //append rows in table
- var nNodes = targetNodes.length;
- var rowId = tableObj.rows.length;
- for (var i=0; i<nNodes; i++)
- insertRowInTable(tableObj, rowId++, targetNodes[i], childSchemaNode, name, true, false);
- }
- else
- {
- var htmlObj = document.forms[0].elements[name];
- var targetNode = objNode.selectSingleNode(name);
- var dataTypeAttr = childSchemaNode.attributes.getNamedItem('dataType');
- var dataType = dataTypeAttr ? dataTypeAttr.nodeValue : null;
-
- if (dataType)
- {
- if (dataType == 'boolean')
- {
- var checked = targetNode.text == '1';
- htmlObj.value = checked ? 1 : 0;
- if (checked)
- htmlObj.checked = 'true';
- }
- }
- else
- htmlObj.value = targetNode.text;
- }
- }
- }
- function addImmediateChildrenFromHtmlObjects(schemaNode, objNode, xmlDoc)
- {
- //keep xmlDoc in sync with contents of this page
- //so create elements corresponding to all immediate input fields
-
- for (var childSchemaNode = schemaNode.firstChild;
- childSchemaNode != null;
- childSchemaNode = childSchemaNode.nextSibling)
- {
- //only process nodes which don't have children since those would be processed
- //by add/delete/edit button handlers
- if (!childSchemaNode.hasChildNodes())
- {
- var name = childSchemaNode.nodeName;
- var newNode = xmlDoc.createElement(name);
- var htmlObj = document.forms[0].elements[name];
-
- //we may have already added this node if we had errored out
- //in last try. So only add if it does not exist.
- //
- if (!objNode.selectSingleNode(name))
- {
- newNode.text = htmlObj.value;
- objNode.appendChild(newNode);
- }
- }
- }
- return true;
- }
- function replaceImmediateChildrenFromHtmlObjects(objNode, schemaNode)
- {
- for (var childNode = objNode.firstChild;
- childNode != null;
- childNode = childNode.nextSibling)
- {
- var name = childNode.nodeName;
- if (childNode.selectSingleNode('*') == null)
- {
- var htmlObj = document.forms[0].elements[name];
- var schemaChildNode = schemaNode.selectSingleNode(name);
- var dataTypeAttr = schemaChildNode.attributes.getNamedItem('dataType');
- var dataType = dataTypeAttr ? dataTypeAttr.nodeValue : null;
- if (dataType)
- {
- if (dataType == 'boolean')
- childNode.text = htmlObj.checked ? '1' : '0';
- else
- childNode.text = htmlObj.value;
- }
- else
- childNode.text = htmlObj.value;
- }
- }
- }
- function isNumber(str)
- {
- return parseInt(str).toString()==str;
- }
- function updateNestedData(operation, strXPath, index)
- {
- //Get a pointer to the specific note to pass to the modal dialog.
- var targetNode;
-
- if (operation == "add")
- {
- var tokens = new Array();
- tokens = strXPath.split('.');
- //find out child node in xmlSchema (our schema) corresponding to the
- //node for which we would add the table row:
- //
- var childSchemaNode = schemaNode;
- var targetNode = objNode;
- for (var i=0; i<tokens.length; i++)
- if (!isNumber(tokens[i]))
- {
- childSchemaNode = childSchemaNode.selectSingleNode(tokens[i]);
- var newNode = xmlDoc.createElement(tokens[i]);
- targetNode = targetNode.appendChild(newNode);
- }
- var nodeName = targetNode.nodeName;
- var argsTableObj = document.all.ArgumentsTable;
- var tableName = strXPath;
- var tableObj = argsTableObj.all[tableName];
- var rowId = tableObj.rows.length;//row 0 is header
- insertRowInTable(tableObj, rowId, targetNode, childSchemaNode, strXPath, true, false);
- }
- else//delete
- {
- var objNodes = objNode.selectNodes(strXPath);
- targetNode = objNodes.item(index);
-
- if (targetNode == null)
- alert('No matching data available!');
- if (confirm('Are you sure you want to delete this item?'))
- {
- deleteRowFromTable(index+1, targetNode); //row 0 is header
- targetNode.parentNode.removeChild(targetNode);
- enableDeleteButton(strXPath+".Delete", false);
- }
- }
-
- return true;
- }
- function createTable(domNodes, schemaNode)
- {
- tableObj = document.createElement('table');
- tableObj.border = 1;
-
- //make header
- var rowId = 0;
-
- var row = tableObj.insertRow(rowId++);
-
- //insert checkbox header
- //col = row.insertCell();
- for (var childSchemaNode = schemaNode.firstChild;
- childSchemaNode != null;
- childSchemaNode = childSchemaNode.nextSibling)
- {
- var targetNode = domNodes[0].selectSingleNode(childSchemaNode.nodeName);
-
- var thObj = document.createElement('th');
- thObj.innerText = targetNode.nodeName;
-
- col = row.insertCell();
- col.appendChild(thObj);
- }
-
- var nNodes = domNodes.length;
-
- for (var i=0; i<nNodes; i++)
- insertRowInTable(tableObj, rowId++, domNodes[i], schemaNode, false, false);
- return tableObj;
- }
- function insertRowInTable(tableObj, rowId, domNode, schemaNode, strXPath, bDrawCheckBox, bChecked)
- {
- var nodeName = domNode.nodeName;
- var row = tableObj.insertRow(rowId);//insert after last row
- var lastRowIndex = tableObj.lastRowIndex ? parseInt(tableObj.lastRowIndex) + 1 : 0;
- tableObj.lastRowIndex = lastRowIndex.toString();
- row.id = strXPath + '.' + tableObj.lastRowIndex;
- updateItemList(tableObj, tableObj.lastRowIndex, null);
- if (bDrawCheckBox == true)
- {
- //insert checkbox
- var col = row.insertCell();
-
- //it isn't funny. better leave that trailing space if you wish to get
- //the checkbox created:
- var cbName = strXPath + ".checkbox";
- col.innerHTML = '<input type="checkbox" id="' + cbName + '" name="' + cbName + '" value=""' + (bChecked ? ' checked="true"' : '') + ' onclick="onCheck(this)"> ';
- }
-
- for (var childSchemaNode = schemaNode.firstChild;
- childSchemaNode != null;
- childSchemaNode = childSchemaNode.nextSibling)
- {
- var targetNode = domNode.selectSingleNode(childSchemaNode.nodeName);
- if (targetNode == null)
- {
- targetNode = xmlDoc.createElement(childSchemaNode.nodeName);
- domNode.appendChild(targetNode);
- }
- insertCellsInRow(row, targetNode, childSchemaNode, strXPath + '.' + tableObj.lastRowIndex);
- }
- return row;
- }
- function updateItemList(tableObj, addItem, delItem)
- {
- var id = tableObj.id + ".itemlist";
- var itemListInput = document.forms[0].all[id];
- if (itemListInput == null)
- {
- itemListInput = document.createElement("input");
- itemListInput.type = "hidden";
- itemListInput.id = id;
- itemListInput.name = id;
- itemListInput.value = "+";
- document.forms[0].appendChild( itemListInput );
- }
- if (addItem)
- itemListInput.value += addItem + '+';
- else
- {
- var list = itemListInput.value;
- var begin = list.indexOf('+' + delItem + '+');
- if (begin == -1)
- alert("Item list management error!");
- begin++;
- var end = list.indexOf('+', begin);
- if (end == -1)
- alert("Item list management error!");
- itemListInput.value = list.substring(0, begin) + list.substring(end+1);
- }
- }
- function insertCellsInRow(row, targetNode, schemaNode, strXPath)
- {
- var maxOccursAttr = schemaNode.attributes.getNamedItem('maxOccurs');
- var maxOccurs = maxOccursAttr ? maxOccursAttr.nodeValue : null;
-
- if (maxOccurs == "unbounded")
- {
- var targetNodes = domNode.selectNodes(childSchemaNode.nodeName);
- if (targetNodes != null && targetNodes.length > 0)
- {
- var tableObj = createTable(targetNodes, childSchemaNode);
- cell.appendChild(tableObj);
- }
- }
- else
- if (maxOccurs == "1" && schemaNode.selectNodes("*"))
- {
- var xpath = strXPath + '.' + schemaNode.nodeName;
- for (var childSchemaNode = schemaNode.firstChild;
- childSchemaNode != null;
- childSchemaNode = childSchemaNode.nextSibling)
- {
- var name = childSchemaNode.nodeName;
- var targetNode2 = targetNode.selectSingleNode(name);
- if (targetNode2 == null)
- {
- targetNode2 = xmlDoc.createElement(name);
- targetNode.appendChild(targetNode2);
- }
- insertCellsInRow(row, targetNode2, childSchemaNode, xpath);
- }
- }
- else
- {
- //create an HTML object corresponding to this element
- //
- var cell = row.insertCell();
- var input = createInputControlForNode(cell, strXPath, targetNode, schemaNode);
- cell.appendChild(input);
- }
- }
- function createInputControlForNode(cell, idPrefix, node, schemaNode)
- {
- var id = node.nodeName;
- var dataTypeAttr = schemaNode.attributes.getNamedItem('dataType');
- var dataType = dataTypeAttr ? dataTypeAttr.nodeValue : null;
- var value = node.text;
- if (value == null)
- {
- var defaultAttr = schemaNode.attributes.getNamedItem('default');
- value = defaultAttr ? defaultAttr.nodeValue : "";
- }
- var type;
- var checked = false;
- if (dataType == "boolean")
- {
- type = "checkbox";
- //debugger;
- if (value == "1" || value == "yes" || value=="true")
- {
- checked = true;
- value = "1";
- }
- else
- value = "0";
- }
- else
- {
- type = "text";
- value = value;
- }
- var input = document.createElement("input");
- input.name = idPrefix + '.' + id;
- input.type = type;
- input.value = value;
- if (type == "checkbox")
- {
- if (checked)
- input.checked = "true";
- input.onclick=function(){this.value=1-this.value;};
- }
- else
- input.width=cell.clientWidth ? cell.clientWidth-2 : 70;
- return input;
- }
- function deleteRowFromTable(rowId, domNode)
- {
- var argsTableObj = document.all.ArgumentsTable;
-
- var tableName = domNode.nodeName;
- var tableObj = argsTableObj.all[tableName];
- var id = tableObj.rows[rowId].id;
- var pos = id.lastIndexOf('.');
- if (pos == -1)
- alert('Invalid row id!');
- updateItemList(tableObj, null, id.substring(pos+1));
- tableObj.deleteRow(rowId);
- }
- function onAdd(nodeSetName)
- {
- //if (!addImmediateChildrenFromHtmlObjects(schemaNode, objNode, xmlDoc))
- // return;
-
- updateNestedData("add", nodeSetName, -1);
- //alert(document.all.ArgumentsTable.outerHTML);
- }
- function onDelete(nodeSetName)
- {
- var nSelectedRow = getCheckedBoxWithId(nodeSetName+".checkbox");
- updateNestedData("delete", nodeSetName, nSelectedRow);
- }
-
- function onCheck(cb)
- {
- //the user checked on one so we have at least one checkbox
- //However, we may have only that checkbox and length is 0 in that case
-
- checkBoxes = document.forms[0].all[ cb.id ];
-
- //if we have only one checkbox then length is undefined in that case
- if (checkBoxes.length != undefined)
- {
- //uncheck any previously selected checkbox
- var nCheckBoxes = checkBoxes.length;
- for (var i=0; i<nCheckBoxes; i++)
- if (checkBoxes[i].checked && checkBoxes[i] != cb)
- {
- checkBoxes[i].checked = false;
- break;
- }
- }
-
- //enable delete and edit buttons
- var pos = cb.id.lastIndexOf(".checkbox");
- var delId = cb.id.substring(0, pos) + ".Delete";
- enableDeleteButton(delId, cb.checked);
- }
- function getCheckedBoxWithId(id)
- {
- var checkBoxes = document.forms[0].all[id];
-
- //if we have only one checkbox then length is undefined in that case
- if (checkBoxes.length == undefined)
- {
- //we (un)checked the same checkbox so toggle selection
- return checkBoxes.checked ? 0 : -1;
- }
- else
- {
- var nCheckBoxes = checkBoxes.length;
- for (var i=0; i<nCheckBoxes; i++)
- if (checkBoxes[i].checked)
- return i;
-
- return -1;
- }
- }
- function enableDeleteButton(id, enable)
- {
- var btn = document.all[id];
- btn.disabled = !enable;
- }
|