module.exports = function (ns) { // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ var HeaderProperty = function(name, type, size, defaultValue) { this.name = name; this.type = type; this.size = size; this.length = type == 'N' ? size*4 : (type == 'n' ? size*2 : size ); this.value = defaultValue; }; // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ var HeaderDef = function(mapData) { var map = []; mapData.forEach(function (def) { map.push(new HeaderProperty(def[0], def[1], def[2], def[3])); }); this.map = map; var keys = []; var indexes = {}; var offset = 0; var index = 0; this.map.forEach(function(prop) { prop.offset = offset; keys[keys.length] = prop.name; offset += prop.length; indexes[prop.name] = index++; }); this.indexes = indexes; this.keys = keys; this.length = offset; this.getProperty = function(key) { return this.map[this.indexes[key]]; } }; // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ns.Header = function(def) { this.def = new HeaderDef(def); this.value = function(key) { return this.def.getProperty(key).value; }; this.buildProperties = function(properties) { this.def.map.forEach(function(prop) { if (prop.name != 'signature') { if (typeof properties[prop.name] != 'undefined') { prop.value = properties[prop.name]; } } }); }; } }