module.exports = function(grunt) {

  "use strict";
  
  // List required source files that will be built into wysihtml5x.js
  var base = [
    "src/polyfills.js",
    "src/wysihtml5.js",
    "node_modules/rangy/lib/rangy-core.js",
    "node_modules/rangy/lib/rangy-selectionsaverestore.js",
    "lib/base/base.js",
    "src/browser.js",
    "src/lang/array.js",
    "src/lang/dispatcher.js",
    "src/lang/object.js",
    "src/lang/string.js",
    "src/dom/auto_link.js",
    "src/dom/class.js",
    "src/dom/contains.js",
    "src/dom/convert_to_list.js",
    "src/dom/copy_attributes.js",
    "src/dom/copy_styles.js",
    "src/dom/delegate.js",
    "src/dom/dom_node.js",
    "src/dom/get_as_dom.js",
    "src/dom/get_parent_element.js",
    "src/dom/get_style.js",
    "src/dom/get_textnodes.js",
    "src/dom/has_element_with_tag_name.js",
    "src/dom/has_element_with_class_name.js",
    "src/dom/insert.js",
    "src/dom/insert_css.js",
    "src/dom/line_breaks.js",
    "src/dom/observe.js",
    "src/dom/parse.js",
    "src/dom/remove_empty_text_nodes.js",
    "src/dom/rename_element.js",
    "src/dom/replace_with_child_nodes.js",
    "src/dom/resolve_list.js",
    "src/dom/sandbox.js",
    "src/dom/contenteditable_area.js",
    "src/dom/set_attributes.js",
    "src/dom/set_styles.js",
    "src/dom/simulate_placeholder.js",
    "src/dom/text_content.js",
    "src/dom/get_attribute.js",
    "src/dom/get_attributes.js",
    "src/dom/is_loaded_image.js",
    "src/dom/table.js",
    "src/dom/query.js",
    "src/dom/compare_document_position.js",
    "src/dom/unwrap.js",
    "src/dom/get_pasted_html.js",
    "src/quirks/clean_pasted_html.js",
    "src/quirks/ensure_proper_clearing.js",
    "src/quirks/get_correct_inner_html.js",
    "src/quirks/redraw.js",
    "src/quirks/table_cells_selection.js",
    "src/quirks/style_parser.js",
    "src/selection/selection.js",
    "src/selection/html_applier.js",
    "src/commands.js",
    "src/commands/bold.js",
    "src/commands/createLink.js",
    "src/commands/removeLink.js",
    "src/commands/fontSize.js",
    "src/commands/fontSizeStyle.js",
    "src/commands/foreColor.js",
    "src/commands/foreColorStyle.js",
    "src/commands/bgColorStyle.js",
    "src/commands/formatBlock.js",
    "src/commands/formatCode.js",
    "src/commands/formatInline.js",
    "src/commands/insertBlockQuote.js",
    "src/commands/insertHTML.js",
    "src/commands/insertImage.js",
    "src/commands/insertLineBreak.js",
    "src/commands/insertOrderedList.js",
    "src/commands/insertUnorderedList.js",
    "src/commands/insertList.js",
    "src/commands/italic.js",
    "src/commands/justifyCenter.js",
    "src/commands/justifyLeft.js",
    "src/commands/justifyRight.js",
    "src/commands/justifyFull.js",
    "src/commands/alignRightStyle.js",
    "src/commands/alignLeftStyle.js",
    "src/commands/alignCenterStyle.js",
    "src/commands/redo.js",
    "src/commands/underline.js",
    "src/commands/undo.js",
    "src/commands/createTable.js",
    "src/commands/mergeTableCells.js",
    "src/commands/addTableCells.js",
    "src/commands/deleteTableCells.js",
    "src/commands/indentList.js",
    "src/commands/outdentList.js",
    "src/undo_manager.js",
    "src/views/view.js",
    "src/views/composer.js",
    "src/views/composer.style.js",
    "src/views/composer.observe.js",
    "src/views/synchronizer.js",
    "src/views/textarea.js",
    "src/editor.js"
  ];
  
  // List of optional source files that will be built to wysihtml5x-toolbar.js
  var toolbar = [
    "src/toolbar/dialog.js",
    "src/toolbar/speech.js",
    "src/toolbar/toolbar.js",
    "src/toolbar/dialog_createTable.js",
    "src/toolbar/dialog_foreColorStyle.js",
    "src/toolbar/dialog_fontSizeStyle.js"
  ];

  // Project configuration.
  grunt.initConfig({
    pkg: grunt.file.readJSON('package.json'),
    concat: {
      options: {
        separator: ';',
        process: function(src, filepath) {
          return src.replace(/@VERSION/g, grunt.config.get('pkg.version'));
        }
      },
      dist: {
        src: base,
        dest: 'dist/<%= pkg.name %>.js'
      },
      toolbar: {
        src: base.concat(toolbar),
        dest: 'dist/<%= pkg.name %>-toolbar.js'
      }
    },
    uglify: {
      options: {
        banner: '/*! <%= pkg.name %> - v<%= pkg.version %> (<%= grunt.template.today("yyyy-mm-dd") %>) */\n',
        sourceMap: true
      },
      build: {
        files: {
          'dist/<%= pkg.name %>.min.js': 'dist/<%= pkg.name %>.js',
          'dist/<%= pkg.name %>-toolbar.min.js': 'dist/<%= pkg.name %>-toolbar.js'
        }
      }
    }
  });

  grunt.loadNpmTasks('grunt-contrib-concat');
  grunt.loadNpmTasks('grunt-contrib-uglify');

  grunt.registerTask('default', ['concat', 'uglify']);
};
