text: /*jshint node:true*/
  module.exports = function( grunt ) {
  	"use strict";
  
  	var banner,
  		umdStart,
  		umdMiddle,
  		umdEnd,
  		umdStandardDefine,
  		umdAdditionalDefine,
  		umdLocalizationDefine;
  
  	banner = "/*!\n" +
  		" * jQuery JSON Presenter Plugin v<%= pkg.version %>\n" +
  		" *\n" +
  		" * <%= pkg.homepage %>\n" +
  		" *\n" +
  		" * Copyright (c) <%= grunt.template.today('yyyy') %> <%= pkg.author.name %>\n" +
  		" * Released under the <%= _.map(pkg.licenses, 'type').join(', ') %> license\n" +
  		" */\n";
  
  	// Define UMD wrapper variables
  
  	umdStart = "(function( factory ) {\n" +
  		"\tif ( typeof define === \"function\" && define.amd ) {\n";
  
  	umdMiddle = "\t} else if (typeof module === \"object\" && module.exports) {\n" +
  		"\t\tmodule.exports = factory( require( \"jquery\" ) );\n" +
  		"\t} else {\n" +
  		"\t\tfactory( jQuery );\n" +
  		"\t}\n" +
  		"}(function( $ ) {\n\n";
  
  	umdEnd = "return $;" +
  		"\n}));";
  
  	umdStandardDefine = "\t\tdefine( [\"jquery\"], factory );\n";
  	umdAdditionalDefine = "\t\tdefine( [\"jquery\", \"./jquery.jsonPresenter\"], factory );\n";
  	umdLocalizationDefine = "\t\tdefine( [\"jquery\", \"../jquery.jsonPresenter\"], factory );\n";
  
  	grunt.initConfig( {
  		pkg: grunt.file.readJSON( "package.json" ),
  		concat: {
  
  			// Used to copy to dist folder
  			dist: {
  				options: {
  					banner: banner +
  						umdStart +
  						umdStandardDefine +
  						umdMiddle,
  					footer: umdEnd
  				},
  				files: {
  					"dist/jquery.jsonPresenter.js": [ "src/*.js" ]
  				}
  			},
  			extra: {
  				options: {
  					banner: banner +
  						umdStart +
  						umdAdditionalDefine +
  						umdMiddle,
  					footer: umdEnd
  				},
  				files: {
  					"dist/additional-methods.js": [ "src/additional/additional.js", "src/additional/*.js" ]
  				}
  			}
  		},
  		uglify: {
  			options: {
  				preserveComments: false,
  				banner: "/*! <%= pkg.title || pkg.name %> - v<%= pkg.version %> - " +
  					"<%= grunt.template.today('m/d/yyyy') %>\n" +
  					" * <%= pkg.homepage %>\n" +
  					" * Copyright (c) <%= grunt.template.today('yyyy') %> <%= pkg.author.name %>;" +
  					" Licensed <%= _.map(pkg.licenses, 'type').join(', ') %> */\n"
  			},
  			dist: {
  				files: {
  					"dist/jquery.jsonPresenter.min.js": "dist/jquery.jsonPresenter.js"
  				}
  			},
  			all: {
  				expand: true,
  				src: "**/*.js",
  				dest: "dist/localization",
  				ext: ".min.js"
  			}
  		},
  		compress: {
  			dist: {
  				options: {
  					mode: "zip",
  					level: 1,
  					archive: "dist/<%= pkg.name %>-<%= pkg.version %>.zip",
  					pretty: true
  				},
  				src: [
  					"changelog.txt",
  					"demo/**/*.*",
  					"dist/**/*.js",
  					"Gruntfile.js",
  					"lib/**/*.*",
  					"package.json",
  					"README.md",
  					"src/**/*.*",
  					"test/**/*.*"
  				]
  			}
  		},
  		qunit: {
  			files: "test/index.html"
  		},
  		jshint: {
  			options: {
  				jshintrc: true
  			},
  			core: {
  				src: "src/*.js"
  			},
  			test: {
  				src: [ "test/*.js" ]
  			},
  			grunt: {
  				src: "Gruntfile.js"
  			}
  		},
  		watch: {
  			options: {
  				atBegin: true
  			},
  			src: {
  				files: "<%= jshint.core.src %>",
  				tasks: [
  					"concat"
  				]
  			}
  		},
  		jscs: {
  			all: [ "<%= jshint.core.src %>", "<%= jshint.test.src %>", "<%= jshint.grunt.src %>" ]
  		},
  		copy: {
  			dist: {
  				options: {
  
  					// Append UMD wrapper
  					process: function( content ) {
  						return umdStart + umdLocalizationDefine + umdMiddle + content + umdEnd;
  					}
  				},
  				src: "src/*",
  				dest: "dist",
  				expand: true,
  				flatten: true,
  				filter: "isFile"
  			}
  		},
  		replace: {
  			dist: {
  				src: "dist/*.min.js",
  				overwrite: true,
  				replacements: [
  					{
  						from: "./jquery.jsonPresenter",
  						to: "./jquery.jsonPresenter.min"
  					}
  				]
  			}
  		}
  	} );
  
  	grunt.loadNpmTasks( "grunt-contrib-jshint" );
  	grunt.loadNpmTasks( "grunt-contrib-qunit" );
  	grunt.loadNpmTasks( "grunt-contrib-uglify" );
  	grunt.loadNpmTasks( "grunt-contrib-concat" );
  	grunt.loadNpmTasks( "grunt-contrib-compress" );
  	grunt.loadNpmTasks( "grunt-contrib-watch" );
  	grunt.loadNpmTasks( "grunt-jscs" );
  	grunt.loadNpmTasks( "grunt-contrib-copy" );
  	grunt.loadNpmTasks( "grunt-text-replace" );
  
  	grunt.registerTask( "default", [ "concat", "copy", "jscs", "jshint", "qunit" ] );
  	grunt.registerTask( "release", [ "default", "uglify", "replace", "compress" ] );
  	grunt.registerTask( "start", [ "concat", "watch" ] );
  
  };
  