// Set source-map.js sourceMap to uglify.js MOZ_SourceMap MOZ_SourceMap = sourceMap;

function comments(option) {

if (Object.prototype.toString.call(option) === '[object Array]') {
  return new RegExp(option[0], option[1]);
} else if (option == "jsdoc") {
  return function(node, comment) {
    if (comment.type == "comment2") {
      return /@preserve|@license|@cc_on/i.test(comment.value);
    } else {
      return false;
    }
  };
} else {
  return option;
}

}

function readNameCache(key) {

return UglifyJS.readNameCache(null, key);

}

function writeNameCache(key, cache) {

return UglifyJS.writeNameCache(null, key, cache);

}

function regexOption(options) {

if (typeof options === 'object' && options.regex) {
  return new RegExp(options.regex[0], options.regex[1]);
} else {
  return null;
}

}

function parse(source, options) {

UglifyJS.base54.reset();
var ast = UglifyJS.parse(source, options.parse_options);

if (options.compress) {
  var compress = { warnings: false };
  UglifyJS.merge(compress, options.compress);
  ast.figure_out_scope(options.mangle);
  var compressor = UglifyJS.Compressor(compress);
  ast = compressor.compress(ast);
  ast.figure_out_scope();
}

if (options.mangle) {
  ast.figure_out_scope(options.mangle);
  ast.compute_char_frequency();
  ast.mangle_names(options.mangle);
}

if (options.mangle_properties) {
  var regex = regexOption(options.mangle_properties);
  UglifyJS.mangle_properties(ast, {
    reserved: [],
    only_cache: false,
    regex: regex,
    debug: options.mangle_properties.debug,
    ignore_quoted: options.mangle_properties.ignore_quoted
  });
}

if (options.enclose) {
  ast = ast.wrap_enclose(options.enclose);
}
return ast;

}

function copySourcesContent(sourceMap, options) {

sourceMap.get().setSourceContent(options.parse_options.filename, options.source);

var original = options.source_map_options.orig;

if (original && original.sources && original.sourcesContent) {
  for(var i = 0; i < original.sources.length; i++) {
    sourceMap.get().setSourceContent(original.sources[i], original.sourcesContent[i]);
  }
}

}

function uglifier(options) {

var source = options.source;
var ast = parse(source, options);
var source_map;

var gen_code_options = options.output;
gen_code_options.comments = comments(options.output.comments);

if (options.generate_map) {
  source_map = UglifyJS.SourceMap(options.source_map_options);
  gen_code_options.source_map = source_map;

  if (options.source_map_options.sources_content) {
    copySourcesContent(source_map, options);
  }
}

var stream = UglifyJS.OutputStream(gen_code_options);
ast.print(stream);

if (options.source_map_options.map_url) {
  stream += "\n//# sourceMappingURL=" + options.source_map_options.map_url;
}

if (options.source_map_options.url) {
  stream += "\n//# sourceURL=" + options.source_map_options.url;
}

if (options.generate_map) {
  if (options.source_map_options.sources_content) {
    source_map.get().setSourceContent(options.parse_options.filename, options.source);
  }
  return [stream.toString(), source_map.toString()];
} else {
  return stream.toString();
}

}