//hierarchy storage object
//Find first ancestor element by tag name
function findAncestorByTagName (element, tagName) {
while ((element.tagName != tagName) && (element = element.parentElement));
return element;
}
// Function to set Id as TEXTAREA value
function chooseHierarchyOption(a)
{
var metaValue = a.getAttribute("metavalue");
var metaTitle = a.getAttribute("metatitle");
// If ID defined and not null
if (metaValue && (metaValue != null))
{
//find TR Ancestor to get TEXTAREA
var tr = findAncestorByTagName(a,"TR");
//Set value to id of clicked element
$(tr.getElementsByTagName("TEXTAREA")).val(metaValue);
// Set button name
setHierarchyButtonText(tr, metaTitle);
removeSuggestionsMenu(tr);
//Hide menu after click
$(tr).find(".metaDataHierarchyMenu").find("ul li ul li").hide();
//Set focus on textarea
tr.getElementsByTagName("TEXTAREA")[0].focus();
createSuggestionsMenu(tr);
}
}
function openHierarchyMenuLevel(menuItem)
{
var tr = findAncestorByTagName(menuItem,"TR");
//get current MetaDataName
var metaName = getMetaName(tr);
//Get current hierarchy from storages
var hierarchyData = hierarchyStorage[metaName];
menuItem = $(menuItem);
if (menuItem.find('ul').length == 0)
{
//Expression to extract hierarchy identifier from menu item id
var getIdExp = /[0-9.]+/;
//Extracted hierarchy identifier
var id;
//Expression to get childs
var childExpr;
if (menuItem.attr('id'))
{
id = menuItem.attr('id').match(getIdExp);
}
if (id == null)
{
childExpr = /^[0-9]+$/;
}
else
{
childExpr = new RegExp("^" + id + "." + "[0-9]+$");
}
var levelItems = {};
for(var key in hierarchyData)
{
if(childExpr.test(key)){
levelItems[key]='
';
}
}
//If no elements in hierarchy level
if (jQuery.isEmptyObject(levelItems))
{
//add empty menu. Invisible. Used by checks in setHierarchyEventsWrappers focusout to prevent menu hiding while choosing suggestion menu item leaf
menuItem.append("
");
}
else {
//wrap elements in hierarchy level
var levelMenu = '
';
for(var key in levelItems)
{
//Fill menu with items
levelMenu += levelItems[key];
}
levelMenu += "
";
menuItem.append(levelMenu);
menuItem.find("li")
.on("mouseenter", function()
{
openHierarchyMenuLevel(this);
})
.on("mouseleave", function()
{
closeHierarchyMenuLevel(this);
});
//menuItem.find('ul');
menuItem.children('ul').slideDown();
}
} else {
//stop animation
menuItem.find('ul').stop(true, true);
//show menu items
menuItem.children('ul').children('li').show();
//slide down menu
menuItem.children('ul').slideDown();
}
menuItem.addClass("active");
}
function closeHierarchyMenuLevel(menuItem)
{
$(menuItem).removeClass("active");
$(menuItem).find('ul').hide();
}
// Download hierarchy file and process it
function downloadAndProcessHierarchyFile(hierarchyFileName,metaName)
{
var xmlhttp=new XMLHttpRequest();
xmlhttp.open("GET",hierarchyFileName,true);
xmlhttp.send();
xmlhttp.onreadystatechange=function()
{
if (xmlhttp.readyState==4 && xmlhttp.status==200)
{
var hierarchyFile = xmlhttp.responseText;
var StringData = [];
var hierarchyData = {};
var expr = /^(\S*|\"[^\"]*\")\ +([0-9]+(?:\.[0-9]+)*)\ +(.*)/m;
StringData = hierarchyFile.split('\n');
for (var i = 0; i < StringData.length; i++) {
var result = StringData[i].match(expr);
// If result not null
if (result != null && result.length == 4) {
// populate hierarchy object
hierarchyData[result[2]] = [ result[1].replace(/^\"|\"$/g, ''), result[3].replace(/^\"|\"$/g, '') ];
}
}
addHierarchyToStorage(metaName, hierarchyData);
setHierarchyEventsWrappers(metaName);
}
}
}
function setHierarchyHoverEvent(father,className)
{
$(father).find(className)
.on("mouseenter", function()
{
openHierarchyMenuLevel(this);
})
.on("mouseleave", function()
{
closeHierarchyMenuLevel(this);
});
}
function createHierarchyMenuButton(row)
{
//get current MetaDataName
var metaName = getMetaName(row);
defaultHierarchyButtonText = gs.text.de.top_level_menu; //'Top level menu';
var hierarchyButtonText = defaultHierarchyButtonText;
// Check if textarea already contain right menu key
var textAreaValue = $(row).find('TEXTAREA').val();
//Get current hierarchy from storages
var hierarchyData = hierarchyStorage[metaName];
//TODO Modificate
for(var key in hierarchyData)
{
if (hierarchyData[key][0] == textAreaValue)
{
hierarchyButtonText = hierarchyData[key][1];
break;
}
}
//Menu element
var mainmenu = '
'
//Insert hierarchy menu
$(row).find('.metaTableCellRemove').after(mainmenu);
//Set hover event on hierarchy menu
$(row).each(function(){setHierarchyHoverEvent($(this),".metaDataHierarchyMenu ul li")});
//Set menu name or SuggestionsMenu on change of textarea set menu name to appropriate menu item if exists
$(row).find('.metaTableCellArea').on('input propertychange',function()
{
var input = $(this).val();
var hierarchyButtonText;
var row = this.parentElement.parentElement;
//RegExp to test a valid key in input
var KeyExp = /^[0-9]+(?:\.[0-9]+)*$/;
//RegExp to test a valid key start in input
var KeyStartExp = /^(?:[0-9]+(?:\.[0-9]+)*)?\.$/;
//if input valid and key found
removeSuggestionsMenu(row);
createSuggestionsMenu(row);
/*if ( KeyExp.test(input) && hierarchyData[input] || KeyStartExp.test(input))
{
createSuggestionsMenu(row);
}
*/
if (hierarchyData[input]){
hierarchyButtonText = hierarchyData[input][1];
} else {
hierarchyButtonText = defaultHierarchyButtonText;
}
setHierarchyButtonText(row, hierarchyButtonText);
});
//Show created menu
$(row).find('.metaDataHierarchyMenu').show();
}
function createSuggestionsMenu(row)
{
//get current MetaDataName
var metaName = getMetaName(row);
//Get current hierarchy from storage
var hierarchyData = hierarchyStorage[metaName];
//Hierarchy suggestions menu
var SuggestionsMenu = "";
var input = $(row.getElementsByClassName("metaTableCellArea")[0]).val();
if (input.replace(/[0-9\.\s]/g, '') === "")
{
//RegExp to get SuggestionsMenu
var SuggestionsMenuExp = new RegExp("^0*" + input.replace(/\./g, '\\.0*') + "\\.?[0-9]+$")
for(var key in hierarchyData)
{
if (SuggestionsMenuExp.test(key))
{
SuggestionsMenu +='';
}
}
} else {
var escapedInput = input.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g, "\\$&");
//RegExp to get SuggestionsMenu
var SuggestionsMenuExp = new RegExp( escapedInput,"i");
for(var key in hierarchyData)
{
if (SuggestionsMenuExp.test(hierarchyData[key][1]) && input !== hierarchyData[key][0])
{
SuggestionsMenu +='';
}
}
}
//Append new SuggestionsMenu
$(row).find(".metaDataHierarchyMenu ul").append(SuggestionsMenu);
//Register event
$(row).each(function(){setHierarchyHoverEvent($(this),".hierarchySuggestionsMenu")});
}
//function removeSuggestionsMenu(row,menuNewText)
function removeSuggestionsMenu(row)
{
$(row).find(".hierarchySuggestionsMenu").remove();
}
function setHierarchyButtonText(row, title){
$(row).find(".hierarchyMenuButton").text(title);
}
function setHierarchyEventsWrappers(metaName)
{
//Loop through every metaTableCell
$(".metaTableCellName").each(function() {
//Check if it is a hierarchy row
var currentMetaName = $(this).text();
if (currentMetaName in hierarchyStorage && currentMetaName == metaName)
{
var row = this.parentElement;
var textArea = row.getElementsByClassName("metaTableCellArea")[0];
//Mouse leave row
$(row).mouseleave(function() {
//textArea = this.getElementsByClassName("metaTableCellArea")[0];
if (this.getElementsByClassName("metaDataHierarchyMenu").length != 0 && document.activeElement.tagName != "TEXTAREA")
{
$(this).find('ul').stop(true, true);
//Remove hierarchy menu
$(this).find('.metaDataHierarchyMenu').hide();
}
});
// Mouse enter row
$(row).mouseenter(
function()
{
var row = this;
var table = row.parentElement;
//If focused on TEXTAREA do nothing
if (document.activeElement.tagName != "TEXTAREA")
{
//Hide all menus in table except this one
$(table).find('.metaDataHierarchyMenu').each(function() {
var currentRow = this.parentElement;
if (!$(currentRow).is($(row)) )
{
$(this).hide();
}
});
// createHierarchyMenuButton($(row));
if ( $(row).find('ul').length == 0 )
{
createHierarchyMenuButton(row);
createSuggestionsMenu(row);
}
else
{
//Unhide menu
$(row).find('.metaDataHierarchyMenu').show();
//Minimize nested menus
$(row).find('.metaDataHierarchyMenu ul').find('ul').hide();
}
}
}
);
// Textarea focus
$(textArea).focus(
function()
{
var row = this.parentElement.parentElement;
var table = row.parentElement;
//Hide all menus in table except this one
$(table).find('.metaDataHierarchyMenu').each(function() {
var currentRow = this.parentElement;
if (!$(currentRow).is($(row)) )
{
$(this).hide();
}
});
//Create button
if ( $(row).find('ul').length == 0 )
{
createHierarchyMenuButton(row);
createSuggestionsMenu(row);
}
else
{
//Unhide menu
$(row).find('.metaDataHierarchyMenu').show();
//Minimize nested menus
$(row).find('.metaDataHierarchyMenu ul').find('ul').slideUp();
}
}
);
$(textArea).focusout(
function()
{
var row = this.parentElement.parentElement;
var found = $(row).find('.metaDataHierarchyMenu ul li ul').filter(":visible")[0];
//Test if there are open submenu and cursor left tr element
if ( found === undefined && !$(row).is(':hover'))
{
//Hide hierarchy menu if there are no open submenus
$(row).find('.metaDataHierarchyMenu').hide();
//Set metadata value if textarea contains hierarchy path
substituteHierarchyMetaValue(row);
}
}
);
}
});
}
function substituteHierarchyMetaValue(row){
var text = $(row).find('TEXTAREA').val();
var metaName = getMetaName(row);
var hierarchyData = hierarchyStorage[metaName];
if (hierarchyData[text]){
var metaValue = hierarchyData[text][0];
$(row).find('TEXTAREA').val(metaValue);
}
}
function getMetaName(row){
return $(row.getElementsByClassName("metaTableCellName")[0]).text();
}
var hierarchyStorage = {};
function addHierarchyToStorage(metaDataName,processedHierarchy)
{
hierarchyStorage[metaDataName] = processedHierarchy;
}