cadviewer-angular
Version:
CADViewer - JavaScript CAD Viewer Library
170 lines (160 loc) • 5.09 kB
JavaScript
var Templater = function(list) {
var itemSource,
templater = this;
var init = function() {
itemSource = templater.getItemSource(list.item);
itemSource = templater.clearSourceItem(itemSource, list.valueNames);
};
this.clearSourceItem = function(el, valueNames) {
for(var i = 0, il = valueNames.length; i < il; i++) {
var elm;
if (valueNames[i].data) {
for (var j = 0, jl = valueNames[i].data.length; j < jl; j++) {
el.setAttribute('data-'+valueNames[i].data[j], '');
}
} else if (valueNames[i].attr && valueNames[i].name) {
elm = list.utils.getByClass(el, valueNames[i].name, true);
if (elm) {
elm.setAttribute(valueNames[i].attr, "");
}
} else {
elm = list.utils.getByClass(el, valueNames[i], true);
if (elm) {
elm.innerHTML = "";
}
}
elm = undefined;
}
return el;
};
this.getItemSource = function(item) {
if (item === undefined) {
var nodes = list.list.childNodes,
items = [];
for (var i = 0, il = nodes.length; i < il; i++) {
// Only textnodes have a data attribute
if (nodes[i].data === undefined) {
return nodes[i].cloneNode(true);
}
}
} else if (/^tr[\s>]/.exec(item)) {
var table = document.createElement('table');
table.innerHTML = item;
return table.firstChild;
} else if (item.indexOf("<") !== -1) {
var div = document.createElement('div');
div.innerHTML = item;
return div.firstChild;
} else {
var source = document.getElementById(list.item);
if (source) {
return source;
}
}
throw new Error("The list need to have at list one item on init otherwise you'll have to add a template.");
};
this.get = function(item, valueNames) {
templater.create(item);
var values = {};
for(var i = 0, il = valueNames.length; i < il; i++) {
var elm;
if (valueNames[i].data) {
for (var j = 0, jl = valueNames[i].data.length; j < jl; j++) {
values[valueNames[i].data[j]] = list.utils.getAttribute(item.elm, 'data-'+valueNames[i].data[j]);
}
} else if (valueNames[i].attr && valueNames[i].name) {
elm = list.utils.getByClass(item.elm, valueNames[i].name, true);
values[valueNames[i].name] = elm ? list.utils.getAttribute(elm, valueNames[i].attr) : "";
} else {
elm = list.utils.getByClass(item.elm, valueNames[i], true);
values[valueNames[i]] = elm ? elm.innerHTML : "";
}
elm = undefined;
}
return values;
};
this.set = function(item, values) {
var getValueName = function(name) {
for (var i = 0, il = list.valueNames.length; i < il; i++) {
if (list.valueNames[i].data) {
var data = list.valueNames[i].data;
for (var j = 0, jl = data.length; j < jl; j++) {
if (data[j] === name) {
return { data: name };
}
}
} else if (list.valueNames[i].attr && list.valueNames[i].name && list.valueNames[i].name == name) {
return list.valueNames[i];
} else if (list.valueNames[i] === name) {
return name;
}
}
};
var setValue = function(name, value) {
var elm;
var valueName = getValueName(name);
if (!valueName)
return;
if (valueName.data) {
item.elm.setAttribute('data-'+valueName.data, value);
} else if (valueName.attr && valueName.name) {
elm = list.utils.getByClass(item.elm, valueName.name, true);
if (elm) {
elm.setAttribute(valueName.attr, value);
}
} else {
elm = list.utils.getByClass(item.elm, valueName, true);
if (elm) {
elm.innerHTML = value;
}
}
elm = undefined;
};
if (!templater.create(item)) {
for(var v in values) {
if (values.hasOwnProperty(v)) {
setValue(v, values[v]);
}
}
}
};
this.create = function(item) {
if (item.elm !== undefined) {
return false;
}
/* If item source does not exists, use the first item in list as
source for new items */
var newItem = itemSource.cloneNode(true);
newItem.removeAttribute('id');
item.elm = newItem;
templater.set(item, item.values());
return true;
};
this.remove = function(item) {
if (item.elm.parentNode === list.list) {
list.list.removeChild(item.elm);
}
};
this.show = function(item) {
templater.create(item);
list.list.appendChild(item.elm);
};
this.hide = function(item) {
if (item.elm !== undefined && item.elm.parentNode === list.list) {
list.list.removeChild(item.elm);
}
};
this.clear = function() {
/* .innerHTML = ''; fucks up IE */
if (list.list.hasChildNodes()) {
while (list.list.childNodes.length >= 1)
{
list.list.removeChild(list.list.firstChild);
}
}
};
init();
};
module.exports = function(list) {
return new Templater(list);
};