// Generated by CoffeeScript 1.12.7
							 | 
						|
								(function() {
							 | 
						|
								  "use strict";
							 | 
						|
								  var builder, defaults, escapeCDATA, requiresCDATA, wrapCDATA,
							 | 
						|
								    hasProp = {}.hasOwnProperty;
							 | 
						|
								
							 | 
						|
								  builder = require('xmlbuilder');
							 | 
						|
								
							 | 
						|
								  defaults = require('./defaults').defaults;
							 | 
						|
								
							 | 
						|
								  requiresCDATA = function(entry) {
							 | 
						|
								    return typeof entry === "string" && (entry.indexOf('&') >= 0 || entry.indexOf('>') >= 0 || entry.indexOf('<') >= 0);
							 | 
						|
								  };
							 | 
						|
								
							 | 
						|
								  wrapCDATA = function(entry) {
							 | 
						|
								    return "<![CDATA[" + (escapeCDATA(entry)) + "]]>";
							 | 
						|
								  };
							 | 
						|
								
							 | 
						|
								  escapeCDATA = function(entry) {
							 | 
						|
								    return entry.replace(']]>', ']]]]><![CDATA[>');
							 | 
						|
								  };
							 | 
						|
								
							 | 
						|
								  exports.Builder = (function() {
							 | 
						|
								    function Builder(opts) {
							 | 
						|
								      var key, ref, value;
							 | 
						|
								      this.options = {};
							 | 
						|
								      ref = defaults["0.2"];
							 | 
						|
								      for (key in ref) {
							 | 
						|
								        if (!hasProp.call(ref, key)) continue;
							 | 
						|
								        value = ref[key];
							 | 
						|
								        this.options[key] = value;
							 | 
						|
								      }
							 | 
						|
								      for (key in opts) {
							 | 
						|
								        if (!hasProp.call(opts, key)) continue;
							 | 
						|
								        value = opts[key];
							 | 
						|
								        this.options[key] = value;
							 | 
						|
								      }
							 | 
						|
								    }
							 | 
						|
								
							 | 
						|
								    Builder.prototype.buildObject = function(rootObj) {
							 | 
						|
								      var attrkey, charkey, render, rootElement, rootName;
							 | 
						|
								      attrkey = this.options.attrkey;
							 | 
						|
								      charkey = this.options.charkey;
							 | 
						|
								      if ((Object.keys(rootObj).length === 1) && (this.options.rootName === defaults['0.2'].rootName)) {
							 | 
						|
								        rootName = Object.keys(rootObj)[0];
							 | 
						|
								        rootObj = rootObj[rootName];
							 | 
						|
								      } else {
							 | 
						|
								        rootName = this.options.rootName;
							 | 
						|
								      }
							 | 
						|
								      render = (function(_this) {
							 | 
						|
								        return function(element, obj) {
							 | 
						|
								          var attr, child, entry, index, key, value;
							 | 
						|
								          if (typeof obj !== 'object') {
							 | 
						|
								            if (_this.options.cdata && requiresCDATA(obj)) {
							 | 
						|
								              element.raw(wrapCDATA(obj));
							 | 
						|
								            } else {
							 | 
						|
								              element.txt(obj);
							 | 
						|
								            }
							 | 
						|
								          } else if (Array.isArray(obj)) {
							 | 
						|
								            for (index in obj) {
							 | 
						|
								              if (!hasProp.call(obj, index)) continue;
							 | 
						|
								              child = obj[index];
							 | 
						|
								              for (key in child) {
							 | 
						|
								                entry = child[key];
							 | 
						|
								                element = render(element.ele(key), entry).up();
							 | 
						|
								              }
							 | 
						|
								            }
							 | 
						|
								          } else {
							 | 
						|
								            for (key in obj) {
							 | 
						|
								              if (!hasProp.call(obj, key)) continue;
							 | 
						|
								              child = obj[key];
							 | 
						|
								              if (key === attrkey) {
							 | 
						|
								                if (typeof child === "object") {
							 | 
						|
								                  for (attr in child) {
							 | 
						|
								                    value = child[attr];
							 | 
						|
								                    element = element.att(attr, value);
							 | 
						|
								                  }
							 | 
						|
								                }
							 | 
						|
								              } else if (key === charkey) {
							 | 
						|
								                if (_this.options.cdata && requiresCDATA(child)) {
							 | 
						|
								                  element = element.raw(wrapCDATA(child));
							 | 
						|
								                } else {
							 | 
						|
								                  element = element.txt(child);
							 | 
						|
								                }
							 | 
						|
								              } else if (Array.isArray(child)) {
							 | 
						|
								                for (index in child) {
							 | 
						|
								                  if (!hasProp.call(child, index)) continue;
							 | 
						|
								                  entry = child[index];
							 | 
						|
								                  if (typeof entry === 'string') {
							 | 
						|
								                    if (_this.options.cdata && requiresCDATA(entry)) {
							 | 
						|
								                      element = element.ele(key).raw(wrapCDATA(entry)).up();
							 | 
						|
								                    } else {
							 | 
						|
								                      element = element.ele(key, entry).up();
							 | 
						|
								                    }
							 | 
						|
								                  } else {
							 | 
						|
								                    element = render(element.ele(key), entry).up();
							 | 
						|
								                  }
							 | 
						|
								                }
							 | 
						|
								              } else if (typeof child === "object") {
							 | 
						|
								                element = render(element.ele(key), child).up();
							 | 
						|
								              } else {
							 | 
						|
								                if (typeof child === 'string' && _this.options.cdata && requiresCDATA(child)) {
							 | 
						|
								                  element = element.ele(key).raw(wrapCDATA(child)).up();
							 | 
						|
								                } else {
							 | 
						|
								                  if (child == null) {
							 | 
						|
								                    child = '';
							 | 
						|
								                  }
							 | 
						|
								                  element = element.ele(key, child.toString()).up();
							 | 
						|
								                }
							 | 
						|
								              }
							 | 
						|
								            }
							 | 
						|
								          }
							 | 
						|
								          return element;
							 | 
						|
								        };
							 | 
						|
								      })(this);
							 | 
						|
								      rootElement = builder.create(rootName, this.options.xmldec, this.options.doctype, {
							 | 
						|
								        headless: this.options.headless,
							 | 
						|
								        allowSurrogateChars: this.options.allowSurrogateChars
							 | 
						|
								      });
							 | 
						|
								      return render(rootElement, rootObj).end(this.options.renderOpts);
							 | 
						|
								    };
							 | 
						|
								
							 | 
						|
								    return Builder;
							 | 
						|
								
							 | 
						|
								  })();
							 | 
						|
								
							 | 
						|
								}).call(this);
							 |