! function(t, e) { "function" == typeof define && define.amd ? define([], e) : "object" == typeof module && module.exports ? module.exports = e() : t.CSV = e() }(this, function() {"use strict"; function t(t) { var e = typeof t; return "function" === e || "object" === e && !!t } function e(t) { return "string" == typeof t } function n(t) { return !isNaN(+t) } function i(t) { return 0 == t || 1 == t } function r(t) { return null == t } function o(t) { return null != t } function c(t, e) { return o(t) ? t : e } function u(t, e) { for (var n = 0, i = t.length; i > n && e(t[n], n) !== !1; n += 1); } function s(t) { return t.replace(/"/g, '\\"') } function a(t) { return "attrs[" + t + "]" } function l(t, e) { return n(t) ? "Number(" + a(e) + ")" : i(t) ? "Boolean(" + a(e) + " == true)" : "String(" + a(e) + ")" } function f(t, n, i, r) { var o = []; return 3 == arguments.length ? (n ? g(n) ? u(i, function(i, r) { e(n[r]) ? n[r] = n[r].toLowerCase() : t[n[r]] = n[r], o.push("deserialize[cast[" + r + "]](" + a(r) + ")") }) : u(i, function(t, e) { o.push(l(t, e)) }) : u(i, function(t, e) { o.push(a(e)) }), o = "return [" + o.join(",") + "]") : (n ? g(n) ? u(i, function(i, c) { e(n[c]) ? n[c] = n[c].toLowerCase() : t[n[c]] = n[c], o.push('"' + s(r[c]) + '": deserialize[cast[' + c + "]](" + a(c) + ")") }) : u(i, function(t, e) { o.push('"' + s(r[e]) + '": ' + l(t, e)) }) : u(i, function(t, e) { o.push('"' + s(r[e]) + '": ' + a(e)) }), o = "return {" + o.join(",") + "}"), Function("attrs", "deserialize", "cast", o) } function h(t, e) { var n, i = 0; return u(e, function(e) { var r, o = e; - 1 != p.indexOf(e) && (o = "\\" + o), r = t.match(RegExp(o, "g")), r && r.length > i && (i = r.length, n = e) }), n || e[0] } var p = ["|", "^"], d = [",", ";", " ", "|", "^"], m = ["\r\n", "\r", "\n"], g = Array.isArray || function(t) { return "[object Array]" === toString.call(t) }, y = function() { function n(t, n) { if (n || (n = {}), g(t)) this.mode = "encode"; else { if (!e(t)) throw Error("Incompatible format!"); this.mode = "parse" } this.data = t, this.options = { header: c(n.header, !1), cast: c(n.cast, !0) }; var i = n.lineDelimiter || n.line, r = n.cellDelimiter || n.delimiter; this.isParser() ? (this.options.lineDelimiter = i || h(this.data, m), this.options.cellDelimiter = r || h(this.data, d), this.data = o(this.data, this.options.lineDelimiter)) : this.isEncoder() && (this.options.lineDelimiter = i || "\r\n", this.options.cellDelimiter = r || ",") } function i(t, e, n, i, r) { t(new e(n, i, r)) } function o(t, e) { return t.slice(-e.length) != e && (t += e), t } function s(n) { return g(n) ? "array" : t(n) ? "object" : e(n) ? "string" : r(n) ? "null" : "primitive" } return n.prototype.set = function(t, e) { return this.options[t] = e }, n.prototype.isParser = function() { return "parse" == this.mode }, n.prototype.isEncoder = function() { return "encode" == this.mode }, n.prototype.parse = function(t) { function e() { s = { escaped: !1, quote: !1, cell: !0 } } function n() { m.cell = "" } function r() { m.line = [] } function o(t) { m.line.push(s.escaped ? t.slice(1, -1).replace(/""/g, '"') : t), n(), e() } function c(t) { o(t.slice(0, 1 - p.lineDelimiter.length)) } function u() { d ? g(d) ? (a = f(y, p.cast, m.line, d), (u = function() { i(t, a, m.line, y, p.cast) })()) : d = m.line : (a || (a = f(y, p.cast, m.line)), (u = function() { i(t, a, m.line, y, p.cast) })()) } if ("parse" == this.mode) { if (0 === this.data.trim().length) return []; var s, a, l, h = this.data, p = this.options, d = p.header, m = { cell: "", line: [] }, y = this.deserialize; t || (l = [], t = function(t) { l.push(t) }), 1 == p.lineDelimiter.length && (c = o); var v, A, D, b = h.length, j = p.cellDelimiter.charCodeAt(0), w = p.lineDelimiter.charCodeAt(p.lineDelimiter.length - 1); for (e(), v = 0, A = 0; b > v; v++) D = h.charCodeAt(v), s.cell && (s.cell = !1, 34 == D) ? s.escaped = !0 : s.escaped && 34 == D ? s.quote = !s.quote : (s.escaped && s.quote || !s.escaped) && (D == j ? (o(m.cell + h.slice(A, v)), A = v + 1) : D == w && (c(m.cell + h.slice(A, v)), A = v + 1, (m.line.length > 1 || "" !== m.line[0]) && u(), r())); return l ? l : this } }, n.prototype.deserialize = { string: function(t) { return t + "" }, number: function(t) { return +t }, "boolean": function(t) { return !!t } }, n.prototype.serialize = { object: function(t) { var e = this, n = Object.keys(t), i = Array(n.length); return u(n, function(n, r) { i[r] = e[s(t[n])](t[n]) }), i }, array: function(t) { var e = this, n = Array(t.length); return u(t, function(t, i) { n[i] = e[s(t)](t) }), n }, string: function(t) { return '"' + (t + "").replace(/"/g, '""') + '"' }, "null": function() { return "" }, primitive: function(t) { return t } }, n.prototype.encode = function(t) { function n(t) { return t.join(c.cellDelimiter) } if ("encode" == this.mode) { if (0 == this.data.length) return ""; var i, r, o = this.data, c = this.options, a = c.header, l = o[0], f = this.serialize, h = 0; t || (r = Array(o.length), t = function(t, e) { r[e + h] = t }), a && (g(a) || (i = Object.keys(l), a = i), t(n(f.array(a)), 0), h = 1); var p, d = s(l); return "array" == d ? (g(c.cast) ? (p = Array(c.cast.length), u(c.cast, function(t, n) { e(t) ? p[n] = t.toLowerCase() : (p[n] = t, f[t] = t) })) : (p = Array(l.length), u(l, function(t, e) { p[e] = s(t) })), u(o, function(e, i) { var r = Array(p.length); u(e, function(t, e) { r[e] = f[p[e]](t) }), t(n(r), i) })) : "object" == d && (i = Object.keys(l), g(c.cast) ? (p = Array(c.cast.length), u(c.cast, function(t, n) { e(t) ? p[n] = t.toLowerCase() : (p[n] = t, f[t] = t) })) : (p = Array(i.length), u(i, function(t, e) { p[e] = s(l[t]) })), u(o, function(e, r) { var o = Array(i.length); u(i, function(t, n) { o[n] = f[p[n]](e[t]) }), t(n(o), r) })), r ? r.join(c.lineDelimiter) : this } }, n.prototype.forEach = function(t) { return this[this.mode](t) }, n }(); return y.parse = function(t, e) { return new y(t, e).parse() }, y.encode = function(t, e) { return new y(t, e).encode() }, y.forEach = function(t, e, n) { return 2 == arguments.length && (n = e), new y(t, e).forEach(n) }, y });