390d1d5be6
xmlControlfield.js was always fetching the "en" xml file, preventing the translations from working. http://bugs.koha-community.org/show_bug.cgi?id=6715 Signed-off-by: Katrin Fischer <Katrin.Fischer.83@web.de> - Apply patch - Install language files, example: perl translate install de-DE - Edit .xml files for value builders 006 and 008 - Test by creating a new record and using value builders Signed-off-by: Chris Cormack <chrisc@catalyst.net.nz>
342 lines
15 KiB
JavaScript
342 lines
15 KiB
JavaScript
|
|
|
|
// Add an option to a select form field
|
|
function add_option(select, text, value, selected)
|
|
{
|
|
var option = document.createElement('option');
|
|
option.text = text;
|
|
option.value = value;
|
|
if (selected) option.selected = true;
|
|
try {
|
|
select.add(option, null);
|
|
}
|
|
catch(ex) {
|
|
select.add(option);
|
|
}
|
|
}//add_option
|
|
|
|
|
|
// Return the value of a parameter from the url
|
|
function returnValueParam(param)
|
|
{
|
|
var params = location.search.substr(1);
|
|
var arr = params.split("&");
|
|
var pattern = param + "=";
|
|
for (var i=0; i < arr.length; i++) {
|
|
if (arr[i].indexOf(pattern) == 0) {
|
|
return unescape(arr[i].substr(pattern.length));
|
|
}
|
|
}
|
|
return "";
|
|
}//returnValueParam
|
|
|
|
|
|
// Return a value from a position on the result string
|
|
function returnValuePosFromResult(result, pos)
|
|
{
|
|
var index;
|
|
if ((index = pos.indexOf("-")) > 0) {
|
|
var ini = parseInt(pos.substring(0, index) ,10);
|
|
var end = parseInt(pos.substr(index + 1) ,10);
|
|
return result.substring(ini, end + 1);
|
|
} else {
|
|
return result.substr(pos, 1);
|
|
}
|
|
}//returnValuePosFromResult
|
|
|
|
|
|
// Build string from form fields
|
|
function returnResultFromValues(form)
|
|
{
|
|
var resultStr = form.result.value;
|
|
var pos;
|
|
var value;
|
|
for (var i=0; i < form.elements.length; i++) {
|
|
var pattern = new RegExp("f[0-9]+(?:[0-9]+)?");
|
|
if (pattern.test(form.elements[i].name)) {
|
|
pos = form.elements[i].name.substr(1);
|
|
value = (pos.indexOf("-") > 0)?form.elements[i].value:form.elements[i].options[form.elements[i].selectedIndex].value;
|
|
resultStr = changePosResult(pos, value, resultStr);
|
|
}
|
|
}
|
|
return resultStr;
|
|
}//returnResultFromValues
|
|
|
|
|
|
// Build/modify result string for a position and a value
|
|
function changePosResult(pos, value, resultStr)
|
|
{
|
|
var index;
|
|
var result = "";
|
|
if ((index = pos.indexOf("-")) > 0) {
|
|
var ini = parseInt(pos.substring(0, index) ,10);
|
|
var end = parseInt(pos.substr(index + 1) ,10);
|
|
var roffset = (1 + end - ini)- value.length;
|
|
if (roffset > 0) for (var i=0; i < roffset; i++) value += " ";
|
|
if (ini == 0)
|
|
result = value + resultStr.substr(end + 1);
|
|
else {
|
|
result = resultStr.substring(0, ini) + value;
|
|
if (end < resultStr.length)
|
|
result += resultStr.substr(end + 1);
|
|
}
|
|
} else {
|
|
var ini = parseInt(pos, 10);
|
|
if (ini == 0)
|
|
result = value + resultStr.substr(1);
|
|
else {
|
|
result = resultStr.substring(0, ini) + value;
|
|
if (ini < resultStr.length)
|
|
result += resultStr.substr(ini + 1);
|
|
}
|
|
}
|
|
result = result.replace(/#/g, " ");
|
|
return result;
|
|
}//changePosResult
|
|
|
|
|
|
// Display the result string on a row of a table indicating positions and coloring them if they are incorrect or they are selected
|
|
function renderResult(tr_result, result)
|
|
{
|
|
if (tr_result) {
|
|
var td;
|
|
if (tr_result.cells.length != result.length) {
|
|
for (var i = tr_result.cells.length - 1; i >= 0; i--)
|
|
tr_result.deleteCell(i);
|
|
for (var i=0; i < result.length; i++) {
|
|
value = result.charAt(i);
|
|
td = tr_result.insertCell(tr_result.cells.length);
|
|
}
|
|
}
|
|
var value;
|
|
var ini = -1;
|
|
var end = -1;
|
|
var args = renderResult.arguments;
|
|
var whiteAllTD = false;
|
|
if (args.length > 2) {
|
|
if (typeof(args[2]) == "boolean") {
|
|
whiteAllTD = args[2];
|
|
} else {
|
|
var index;
|
|
if ((index = args[2].indexOf("-")) > 0) {
|
|
ini = parseInt(args[2].substring(0, index) ,10);
|
|
end = parseInt(args[2].substr(index + 1) ,10);
|
|
} else ini = parseInt(args[2], 10);
|
|
}
|
|
}
|
|
for (var i=0; i < result.length; i++) {
|
|
value = result.charAt(i);
|
|
td = tr_result.cells[i];
|
|
if (td.style.backgroundColor != "yellow" || whiteAllTD) td.style.backgroundColor = "white";
|
|
td.innerHTML = (value == " ")?" ":value;
|
|
td.title = "Pos " + i + ". Value: \"" + value + "\"";
|
|
if (ini >= 0) {
|
|
if (end > 0) {
|
|
if (ini <= i && i <= end) td.style.backgroundColor = "#cccccc";
|
|
} else if (i == ini) td.style.backgroundColor = "#cccccc";
|
|
} else {
|
|
var pos = (i < 10)?'0' + i:i + '';
|
|
var obj;
|
|
if ((obj = document.getElementById('f' + pos)) != null) {
|
|
var found = false;
|
|
for (var j=0; j < obj.options.length && !found; j++)
|
|
if (obj.options[j].value == value) found = true;
|
|
if (!found) {
|
|
td.style.backgroundColor = "yellow";
|
|
td.title = "Pos " + i + ". Incorrect Value: \"" + value + "\"";
|
|
}
|
|
}
|
|
}
|
|
}//for
|
|
}
|
|
}//renderResult
|
|
|
|
|
|
// Change displaying of result in the page
|
|
function changeH4Result(form, h4_result, tr_result, pos, value)
|
|
{
|
|
var resultStr = form.result.value;
|
|
var result = changePosResult(pos, value, resultStr);
|
|
renderResult(tr_result, result, pos);
|
|
h4_result.innerHTML = """ + result + """;
|
|
form.result.value = result;
|
|
}//changeH4Result
|
|
|
|
|
|
|
|
// Class to read the xml and render the type of material
|
|
(function()
|
|
{
|
|
|
|
xmlControlField = function(tagfield, form_id, select, table, h4_result, tr_result, idMaterial, themelang)
|
|
{
|
|
this.tagfield = tagfield;
|
|
this.idMaterial = idMaterial;
|
|
this.form_id = form_id;
|
|
this.form = document.getElementById(form_id);
|
|
this.select = select;
|
|
this.table = table;
|
|
this.h4_result = h4_result;
|
|
this.tr_result = tr_result;
|
|
this.themelang = themelang;
|
|
};//xmlControlField
|
|
|
|
|
|
xmlControlField.prototype =
|
|
{
|
|
tagfield: "",
|
|
idMaterial: "",
|
|
root: null,
|
|
form_id: "",
|
|
form: null,
|
|
select: null,
|
|
table: null,
|
|
h4_result: "",
|
|
tr_result: "",
|
|
themelang: "",
|
|
|
|
|
|
setIdMaterial: function(idMaterial)
|
|
{
|
|
this.idMaterial = idMaterial;
|
|
},//setIdMaterial
|
|
|
|
loadXmlValues: function()
|
|
{
|
|
this.xmlDoc = $.ajax({
|
|
type: "GET",
|
|
url: this.themelang + "/modules/cataloguing/value_builder/marc21_field_" + this.tagfield + ".xml",
|
|
dataType: "xml",
|
|
async: false
|
|
}).responseXML;
|
|
if (this.xmlDoc) this.renderTemplate();
|
|
$("*").ajaxError(function(evt, request, settings){
|
|
alert(_("AJAX error: receiving data from ") + settings.url);
|
|
});
|
|
},//loadXmlValues
|
|
|
|
|
|
renderTemplate: function()
|
|
{
|
|
this.root = this.xmlDoc.documentElement;
|
|
if (this.root.nodeName == "Tagfield" && this.root.nodeType == 1 && this.root.hasChildNodes()) {
|
|
var tag = this.root.attributes.getNamedItem("tag").nodeValue;
|
|
var nodeMaterial = this.root.getElementsByTagName('Material');
|
|
if (nodeMaterial != null && nodeMaterial.length > 0) {
|
|
if (this.idMaterial == "") this.idMaterial = nodeMaterial[0].attributes.getNamedItem("id").nodeValue;
|
|
this.renderSelectMaterial(nodeMaterial);
|
|
this.renderPositions(nodeMaterial, (this.form.result.value != "")?this.form.result.value:returnValueParam("result"));
|
|
}
|
|
}
|
|
},//renderTemplate
|
|
|
|
|
|
renderSelectMaterial: function(nodeMaterial)
|
|
{
|
|
if (this.select != null && nodeMaterial != null && nodeMaterial.length > 0) {
|
|
if (this.select.options.length <= 1) {
|
|
var id;
|
|
var name;
|
|
var arrSort = new Array();
|
|
var arrEquiv = new Array();
|
|
for (var i=0; i < nodeMaterial.length; i++) {
|
|
id = nodeMaterial[i].attributes.getNamedItem("id").nodeValue;
|
|
name = nodeMaterial[i].attributes.getNamedItem("name").nodeValue;
|
|
arrEquiv[id] = i;
|
|
arrSort.push(id);
|
|
}
|
|
arrSort.sort();
|
|
var j;
|
|
for (var i=0; i < arrSort.length; i++) {
|
|
j = arrEquiv[arrSort[i]];
|
|
add_option(this.select, arrSort[i] + " - " + nodeMaterial[j].attributes.getNamedItem("name").nodeValue, arrSort[i], (this.idMaterial != "" && arrSort[i] == this.idMaterial)?true:false);
|
|
}
|
|
} else if (this.idMaterial != "") {
|
|
for (var i=0; i < this.select.options.length; i++) {
|
|
if (this.select.options[i].value == this.idMaterial) this.select.options[i].selected = true;
|
|
}
|
|
}
|
|
}
|
|
},//renderSelectMaterial
|
|
|
|
|
|
renderPositions: function(nodeMaterial, result)
|
|
{
|
|
var materialNode;
|
|
try {
|
|
var resultXPath = this.xmlDoc.evaluate("//a:Material[@id='" + this.idMaterial + "']", this.xmlDoc.documentElement, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null);
|
|
materialNode = resultXPath.singleNodeValue;
|
|
} catch (e) {
|
|
for (var i=0; i < nodeMaterial.length; i++) {
|
|
if (this.idMaterial == nodeMaterial[i].attributes.getNamedItem("id").nodeValue) {
|
|
materialNode = nodeMaterial[i];
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
if (this.table != null) { // Render table
|
|
var tbody = this.table.tBodies[0];
|
|
// Clean up table
|
|
if (tbody.rows.length > 0)
|
|
for (var i = tbody.rows.length - 1; i >= 1; i--)
|
|
tbody.deleteRow(i);
|
|
// Parse Material node
|
|
if (materialNode != undefined && materialNode != null && materialNode.nodeType == 1 && materialNode.hasChildNodes()) {
|
|
var nodePos = materialNode.firstChild;
|
|
var tr;
|
|
var td;
|
|
var title;
|
|
var pos;
|
|
var value;
|
|
var strInnerHTML = "";
|
|
var selected;
|
|
var index;
|
|
var url;
|
|
while (nodePos != null) {
|
|
if (nodePos.nodeType == 1 && nodePos.nodeName == "Position") {
|
|
tr = tbody.insertRow(tbody.rows.length);
|
|
td = tr.insertCell(tr.cells.length);
|
|
pos = nodePos.attributes.getNamedItem("pos").nodeValue;
|
|
title = ((nodePos.getAttributeNode("description") || nodePos.hasAttribute("description")) && nodePos.getAttribute("description") != "")?nodePos.attributes.getNamedItem("description").nodeValue:nodePos.attributes.getNamedItem("name").nodeValue;
|
|
try {
|
|
url = ((nodePos.getAttributeNode("url") || nodePos.hasAttribute("url")) && nodePos.getAttribute("url") != "" && nodePos.getAttribute("urltext") != "")?" <a href='" + nodePos.attributes.getNamedItem("url").nodeValue + "' target='_blank'>" + nodePos.attributes.getNamedItem("urltext").nodeValue + "</a>":"";
|
|
} catch (e) { url = "";}
|
|
td.innerHTML = "<label for='" + pos + "' title='" + title + "'>" + pos + " - " + nodePos.attributes.getNamedItem("name").nodeValue + url + "</label>";
|
|
td = tr.insertCell(tr.cells.length);
|
|
value = returnValuePosFromResult(result, pos);
|
|
if ((index = pos.indexOf("-")) > 0) { // Position interval
|
|
var ini = parseInt(pos.substring(0, index) ,10);
|
|
var end = parseInt(pos.substr(index + 1) ,10);
|
|
value = value.replace(/ /g, "#");
|
|
strInnerHTML = "<input type='text' name='f" + pos + "' id='f" + pos + "' value='" + value + "' size='" + (1 + end - ini) + "' maxlength='" + (1 + end - ini) + "' onkeyup='this.value = this.value.replace(/ /g, \"#\"); changeH4Result(document.getElementById(\"" + this.form_id + "\"), document.getElementById(\"" + this.h4_result + "\"), document.getElementById(\"" + this.tr_result + "\"), \"" + pos + "\", this.value)' onfocus='changeH4Result(document.getElementById(\"" + this.form_id + "\"), document.getElementById(\"" + this.h4_result + "\"), document.getElementById(\"" + this.tr_result + "\"), \"" + pos + "\", this.value)' />";
|
|
} else {
|
|
strInnerHTML = "<select name='f" + pos + "' id='f" + pos + "' style='width:400px' onchange='changeH4Result(document.getElementById(\"" + this.form_id + "\"), document.getElementById(\"" + this.h4_result + "\"), document.getElementById(\"" + this.tr_result + "\"), \"" + pos + "\", this.options[this.selectedIndex].value)' onfocus='changeH4Result(document.getElementById(\"" + this.form_id + "\"), document.getElementById(\"" + this.h4_result + "\"), document.getElementById(\"" + this.tr_result + "\"), \"" + pos + "\", this.options[this.selectedIndex].value)'>";
|
|
value = value.replace("#", " ");
|
|
if (nodePos.hasChildNodes()) {
|
|
var nodeValue = nodePos.firstChild;
|
|
while (nodeValue != null) {
|
|
if (nodeValue.nodeType == 1 && nodeValue.nodeName == "Value" && nodeValue.hasChildNodes()) {
|
|
var valNode = nodeValue.firstChild.nodeValue;
|
|
valNode = valNode.replace("#", " ");
|
|
selected = (value == valNode)?"selected='selected'":"";
|
|
strInnerHTML += "<option value='" + valNode + "' " + selected + ">" + nodeValue.firstChild.nodeValue + " - " + nodeValue.attributes.getNamedItem("description").nodeValue + "</option>";
|
|
}
|
|
nodeValue = nodeValue.nextSibling;
|
|
}
|
|
} else {
|
|
strInnerHTML += "<option value=' ' " + ((value == " ")?"selected='selected'":"") + "># - " + title + "</option>";
|
|
strInnerHTML += "<option value='|' " + ((value == "|")?"selected='selected'":"") + ">| - " + title + "</option>";
|
|
}
|
|
strInnerHTML += "</select>";
|
|
}
|
|
td.innerHTML = strInnerHTML;
|
|
}
|
|
nodePos = nodePos.nextSibling;
|
|
}
|
|
}
|
|
}
|
|
}//renderPositions
|
|
};
|
|
|
|
})();
|
|
|