#!/bin/bash

##
# Usage
##
usage()
{
	echo ""
	echo -e "  \033[1;33mMinify scripts using YUI compressor or UglifyJS (requires node.js)\033[0m"
	echo -e "  Usage: system/bin/minify <command> [<file>]"
	echo ""
	echo -e "  \033[1;33m<command>\033[0m"
	echo -e "  \033[0;36mall\033[0m           Execute all the functions"
	echo ""
	echo -e "  Contao"
	echo -e "  \033[0;36mcontao\033[0m        Minify the Contao assets (assets/contao)"
	echo -e "  \033[0;36mtheme\033[0m         Minify the default back end theme (system/themes/default)"
	echo -e "  \033[0;36mtypolinks\033[0m     Minify the TYPOlinks plugin (assets/tinymce/plugins/typolinks)"
	echo ""
	echo -e "  jQuery"
	echo -e "  \033[0;36mjquery\033[0m        Minify the jQuery core (assets/jquery/core|ui)"
	echo -e "  \033[0;36mcolorbox\033[0m      Minify the colorbox plugin (assets/jquery/colorbox)"
	echo -e "  \033[0;36mmediaelement\033[0m  Minify the mediaelement plugin (assets/jquery|mootools/mediaelement)"
	echo -e "  \033[0;36mtablesorter\033[0m   Minify the tablesorter plugin (assets/jquery/tablesorter)"
	echo ""
	echo -e "  MooTools"
	echo -e "  \033[0;36mmootools\033[0m      Minify the MooTools core (assets/mootools/core)"
	echo -e "  \033[0;36mchosen\033[0m        Minify the chosen plugin (assets/mootools/chosen)"
	echo -e "  \033[0;36mcolorpicker\033[0m   Minify the colorpicker plugin (assets/mootools/colorpicker)"
	echo -e "  \033[0;36mdatepicker\033[0m    Minify the datepicker plugin (assets/mootools/datepicker)"
	echo -e "  \033[0;36mmediabox\033[0m      Minify the mediabox plugin (assets/mootools/mediabox)"
	echo -e "  \033[0;36mmediaelement\033[0m  Minify the mediaelement plugin (assets/jquery|mootools/mediaelement)"
	echo -e "  \033[0;36mmootao\033[0m        Minify the Contao MooTools enhancements (assets/mootools/mootao)"
	echo -e "  \033[0;36msimplemodal\033[0m   Minify the SimpleModal plugin (assets/mootools/simplemodal)"
	echo -e "  \033[0;36mslimbox\033[0m       Minify the slimbox plugin (assets/mootools/slimbox)"
	echo -e "  \033[0;36mstylect\033[0m       Minify the stylect plugin (assets/mootools/stylect)"
	echo -e "  \033[0;36mtablesort\033[0m     Minify the tablesort plugin (assets/mootools/tablesort)"
	echo ""
	echo -e "  Other"
	echo -e "  \033[0;36mcodemirror\033[0m    Minify the CodeMirror plugin (assets/codemirror)"
	echo -e "  \033[0;36mhighlighter\033[0m   Minify the SyntaxHighlighter plugin (assets/highlighter)"
	echo ""
}

##
# assets/contao
##
contao()
{
	version=$folder/assets/contao
	copyright="/* Contao Open Source CMS, (C) 2005-2012 Leo Feyer, LGPL license */"

	# CSS
	for file in `ls $version/css | grep "\-uncompressed"`; do
		echo "$copyright" > $version/css/${file/-uncompressed/}
		$css $version/css/$file >> $version/css/${file/-uncompressed/}
		echo "  Created $version/css/${file/-uncompressed/}"
	done

	# JavaScript
	for file in `ls $version/js | grep "\-uncompressed"`; do
		echo "$copyright" > $version/js/${file/-uncompressed/}
		$js $version/js/$file >> $version/js/${file/-uncompressed/}
		echo "  Created $version/js/${file/-uncompressed/}"
	done
}

##
# system/themes/default
##
theme()
{
	# Single file only
	if [ "$1" != "" ]; then
		jsgrep="$1.js"
		cssgrep="$1.css"
	else
		jsgrep=".js"
		cssgrep=".css"
	fi

	version=$folder/system/themes/default
	copyright="/* Contao Open Source CMS, (C) 2005-2012 Leo Feyer, LGPL license */"

	# CSS
	for file in `ls $version/src | grep "$cssgrep"`; do
		echo "$copyright" > $version/$file
		$css $version/src/$file >> $version/$file
		echo "  Created $version/$file"
	done

	# JS
	for file in `ls $version/src | grep "$jsgrep"`; do
		echo "$copyright" > $version/$file
		$js $version/src/$file >> $version/$file
		echo "  Created $version/$file"
	done
}

##
# assets/tinymce/plugins/typolinks
##
typolinks()
{
	version=$folder/assets/tinymce/plugins/typolinks
	copyright="/* Contao Open Source CMS, (C) 2005-2012 Leo Feyer, LGPL license */"

	files=('editor_plugin' 'js/typolinks' 'js/typobox')
	for file in ${files[@]}; do
		echo "$copyright" > $version/$file.js
		$js $version/${file}_src.js >> $version/$file.js
		echo "  Created $version/$file.js"
	done
}

##
# assets/jquery/core|ui
##
jquery()
{
	# core
	for version in `ls -d $folder/assets/jquery/core/*`; do
		copyright="/* jQuery v$(basename $version) http://jquery.com | jquery.org/license */"
		echo "$copyright" > $version/jquery.min.js
		$js $version/jquery.js >> $version/jquery.min.js
		echo "  Created $version/jquery.min.js"
	done

	# ui
	for version in `ls -d $folder/assets/jquery/ui/*`; do
		copyright="/* jQuery UI v$(basename $version) http://docs.jquery.com/UI | jquery.org/license */"
		echo "$copyright" > $version/jquery-ui.min.js
		$js $version/jquery-ui.js >> $version/jquery-ui.min.js
		echo "  Created $version/jquery-ui.min.js"
	done
}

##
# assets/jquery/colorbox
##
colorbox()
{
	for version in `ls -d $folder/assets/jquery/colorbox/*`; do
		copyright="/* ColorBox v$(basename $version), (c) 2011 Jack Moore - jacklmoore.com, MIT license */"

		# CSS
		echo "$copyright" > $version/css/colorbox.min.css
		$css $version/css/colorbox.css >> $version/css/colorbox.min.css
		echo "  Created $version/css/colorbox.min.css"

		# JavaScript
		echo "$copyright" > $version/js/colorbox.min.js
		$js $version/js/colorbox.js >> $version/js/colorbox.min.js
		echo "  Created $version/js/colorbox.min.js"
	done
}

##
# assets/jquery|mootools/mediaelement
##
mediaelement()
{
	# jQuery
	for version in `ls -d $folder/assets/jquery/mediaelement/*`; do
		copyright="/* MediaElement.js $(basename $version), (c) 2010-2012 John Dyer <http://j.hn>, MIT/GPLv2 */"

		# CSS
		for file in `ls $version/css | grep -v ".min"`; do
			echo "$copyright" > $version/css/${file/.css/.min.css}
			$css $version/css/$file >> $version/css/${file/.css/.min.css}
			echo "  Created $version/css/${file/.css/.min.css}"
		done

		# JavaScript
		for file in `ls $version/js | grep -v ".min"`; do
			echo "$copyright" > $version/js/${file/.js/.min.js}
			$js $version/js/$file >> $version/js/${file/.js/.min.js}
			echo "  Created $version/js/${file/.js/.min.js}"
		done

		# Concat the mediaelement.js and mediaelementplayer.js files
		{ cat $version/js/mediaelement.js; echo ""; cat $version/js/mediaelementplayer.js; } > $version/js/mediaelement-and-player.js
		{ cat $version/js/mediaelement.min.js; echo ""; cat $version/js/mediaelementplayer.min.js; } > $version/js/mediaelement-and-player.min.js
	done

	# MooTools
	for version in `ls -d $folder/assets/mootools/mediaelement/*`; do
		adapter="/* MooToolsAdapter 0.1, (c) 2011 Inkling Systems, Inc. <http://github.com/inkling/backbone-mootools>, Apache License 2.0 */"
		copyright="/* MediaElement.js $(basename $version), (c) 2010-2012 John Dyer <http://j.hn>, MIT/GPLv2 */"

		# CSS
		for file in `ls $version/css | grep -v ".min"`; do
			echo "$copyright" > $version/css/${file/.css/.min.css}
			$css $version/css/$file >> $version/css/${file/.css/.min.css}
			echo "  Created $version/css/${file/.css/.min.css}"
		done

		# JavaScript
		for file in `ls $version/js | grep -v ".min"`; do
			if [ $file == "MooToolsAdapter.js" ]; then
				echo "$adapter" > $version/js/${file/.js/.min.js}
			else
				echo "$copyright" > $version/js/${file/.js/.min.js}
			fi
			$js $version/js/$file >> $version/js/${file/.js/.min.js}
			echo "  Created $version/js/${file/.js/.min.js}"
		done

		# Concat the mediaelement.js and mediaelementplayer.js files
		{ cat $version/js/MooToolsAdapter.js; echo ""; cat $version/js/mediaelement.js; echo ""; cat $version/js/mediaelementplayer.js; } > $version/js/mediaelement-and-player.js
		{ cat $version/js/MooToolsAdapter.min.js; echo ""; cat $version/js/mediaelement.min.js; echo ""; cat $version/js/mediaelementplayer.min.js; } > $version/js/mediaelement-and-player.min.js
	done
}

##
# assets/jquery/tablesorter
##
tablesorter()
{
	for version in `ls -d $folder/assets/jquery/tablesorter/*`; do

  	# CSS
  	copyright="/* Contao Open Source CMS, (C) 2005-2012 Leo Feyer, LGPL license */"
	  echo "$copyright" > $version/css/tablesorter.min.css
	  $css $version/css/tablesorter.css >> $version/css/tablesorter.min.css
	  echo "  Created $version/css/tablesorter.min.css"

	  # JS
	  copyright="/* TableSorter 2.0.5b, (c) 2007 Christian Bach, http://tablesorter.com, MIT license */"
	  echo "$copyright" > $version/js/tablesorter.min.js
	  $js $version/js/tablesorter.js >> $version/js/tablesorter.min.js
	  echo "  Created $version/js/tablesorter.min.js"
	done
}

##
# assets/mootools/core
##
mootools()
{
	# Minify
	for version in `ls -d $folder/assets/mootools/core/*`; do
		mobile="/* MooTools mobile, (c) Christoph Pojer (@cpojer), MIT-style license */"
		copyright="/* MooTools $(basename $version), <http://mootools.net>, MIT-style license */"
		for file in `ls $version | grep "\-uncompressed"`; do
			if [ $file == "mootools-mobile-uncompressed.js" ]; then
				echo "$mobile" > $version/${file/-uncompressed/}
			else
				echo "$copyright" > $version/${file/-uncompressed/}
			fi
			$js $version/$file >> $version/${file/-uncompressed/}
			echo "  Created $version/${file/-uncompressed/}"
		done
	done

	# Concat the mootools-core.js and mootools-more.js files
	{ cat $version/mootools-core-uncompressed.js; echo ""; cat $version/mootools-more-uncompressed.js; echo ""; cat $version/mootools-mobile-uncompressed.js; } > $version/mootools-uncompressed.js
	{ cat $version/mootools-core.js; echo ""; cat $version/mootools-more.js; echo ""; cat $version/mootools-mobile.js; } > $version/mootools.js
}

##
# assets/mootools/chosen
##
chosen()
{
	version=$folder/assets/mootools/chosen
	copyright="/* Chosen by Patrick Filler, Jules Janssen, Jonnathan Soares, MIT-style license */"

	# CSS
	echo "$copyright" > $version/chosen.css
	$css $version/chosen-uncompressed.css >> $version/chosen.css
	echo "  Created $version/chosen.css"

	# JavaScript
	echo "$copyright" > $version/chosen.js
	$js $version/chosen-uncompressed.js >> $version/chosen.js
	echo "  Created $version/chosen.js"
}

##
# assets/mootools/colorpicker
##
colorpicker()
{
	for version in `ls -d $folder/assets/mootools/colorpicker/*`; do
		copyright="/* MooRainbow $(basename $version) by Djamil Legato (w00fz) and Christopher Beloch, MIT-style license */"

		# CSS
		echo "$copyright" > $version/css/mooRainbow.css
		$css $version/css/mooRainbow-uncompressed.css >> $version/css/mooRainbow.css
		echo "  Created $version/css/mooRainbow.css"

		# JavaScript
		echo "$copyright" > $version/js/mooRainbow.js
		$js $version/js/mooRainbow-uncompressed.js >> $version/js/mooRainbow.js
		echo "  Created $version/js/mooRainbow.js"
	done
}

##
# assets/mootools/datepicker
##
datepicker()
{
	for version in `ls -d $folder/assets/mootools/datepicker/*`; do
		copyright="/* DatePicker $(basename $version) by Arian Stolwijk, <http://mootools.net/forge/p/mootools_datepicker>, MIT license */"

		# CSS
		echo "$copyright" > $version/dashboard.css
		$css $version/src/dashboard.css >> $version/dashboard.css
		echo "  Created $version/dashboard.css"

		# JavaScript
		files=('Picker.js' 'Picker.Attach.js' 'Picker.Date.js')
		echo "$copyright" > $version/datepicker.js
		for file in ${files[@]}; do
			$js $version/src/$file >> $version/datepicker.js
		done
		echo "  Created $version/datepicker.js"
	done
}

##
# assets/mootools/mediabox
##
mediabox()
{
	for version in `ls -d $folder/assets/mootools/mediabox/*`; do
		copyright="/* mediaboxAdvanced v$(basename $version), (c) 2007-2010 John Einselen <http://iaian7.com>, MIT-style license */"

		# CSS
		for file in `ls $version/css | grep "\-uncompressed.css"`; do
			echo "$copyright" > $version/css/${file/-uncompressed/}
			$css $version/css/$file >> $version/css/${file/-uncompressed/}
			echo "  Created $version/css/${file/-uncompressed/}"
		done

		# JavaScript
		echo "$copyright" > $version/js/mediabox.js
		$js $version/js/mediabox-uncompressed.js >> $version/js/mediabox.js
		echo "  Created $version/js/mediabox.js"
	done
}

##
# assets/mootools/mootao
##
mootao()
{
	version=$folder/assets/mootools/mootao
	copyright="/* Contao Open Source CMS, (c) 2005-2012 Leo Feyer, LGPL license */"
	echo "$copyright" > $version/Mootao.js
	$js $version/Mootao-uncompressed.js >> $version/Mootao.js
	echo "  Created $version/Mootao.js"
}

##
# assets/mootools/simplemodal
##
simplemodal()
{
	for version in `ls -d $folder/assets/mootools/simplemodal/*`; do
		copyright="/* Simple Modal $(basename $version), (c) 2011 Marco Dell’Anna <http://www.plasm.it>, MIT-style license */"

		# CSS
		echo "$copyright" > $version/css/simplemodal.css
		$css $version/css/simplemodal-uncompressed.css >> $version/css/simplemodal.css
		echo "  Created $version/css/simplemodal.css"

		# JavaScript
		echo "$copyright" > $version/js/simplemodal.js
		$js $version/js/simplemodal-uncompressed.js >> $version/js/simplemodal.js
		echo "  Created $version/js/simplemodal.js"
	done
}

##
# assets/mootools/slimbox
##
slimbox()
{
	for version in `ls -d $folder/assets/mootools/slimbox/*`; do
		copyright="/* Slimbox v$(basename $version), (c) 2007-2009 Christophe Beyls <http://www.digitalia.be>, MIT-style license */"

		# CSS
		echo "$copyright" > $version/css/slimbox.css
		$css $version/css/slimbox-uncompressed.css >> $version/css/slimbox.css
		echo "  Created $version/css/slimbox.css"

		# JavaScript
		echo "$copyright" > $version/js/slimbox.js
		$js $version/js/slimbox-uncompressed.js >> $version/js/slimbox.js
		echo "  Created $version/js/slimbox.js"
	done
}

##
# assets/mootools/stylect
##
stylect()
{
	version=$folder/assets/mootools/stylect
	copyright="/* Contao Open Source CMS, (C) 2005-2012 Leo Feyer, LGPL license */"

	# CSS
	echo "$copyright" > $version/css/stylect.css
	$css $version/css/stylect-uncompressed.css >> $version/css/stylect.css
	echo "  Created $version/css/stylect.css"

	# JS
	echo "$copyright" > $version/js/stylect.js
	$js $version/js/stylect-uncompressed.js >> $version/js/stylect.js
	echo "  Created $version/js/stylect.js"
}

##
# assets/mootools/tablesort
##
tablesort()
{
	version=$folder/assets/mootools/tablesort
	copyright="/* Contao Open Source CMS, (C) 2005-2012 Leo Feyer, LGPL license */"

	# CSS
	echo "$copyright" > $version/css/tablesort.css
	$css $version/css/tablesort-uncompressed.css >> $version/css/tablesort.css
	echo "  Created $version/css/tablesort.css"

	# JS
	echo "$copyright" > $version/js/tablesort.js
	$js $version/js/tablesort-uncompressed.js >> $version/js/tablesort.js
	echo "  Created $version/js/tablesort.js"
}

##
# assets/codemirror
##
codemirror()
{
	for version in `ls -d $folder/assets/codemirror/*`; do
		copyright="/* CodeMirror $(basename $version), (C) 2011 by Marijn Haverbeke, MIT-style license */"

		# CSS
		echo "$copyright" > $version/codemirror.css
		$css $version/src/codemirror.css >> $version/codemirror.css
		echo "  Created $version/codemirror.css"

		# JavaScript
		echo "$copyright" > $version/codemirror.js
		files=('codemirror.js' 'runmode.js' 'overlay.js' 'clike.js' 'css.js' 'diff.js' 'htmlmixed.js' 'javascript.js' 'markdown.js' 'mysql.js' 'php.js' 'xml.js')
		for file in ${files[@]}; do
			$js $version/src/$file >> $version/codemirror.js
		done
		echo "  Created $version/codemirror.js"
	done
}

##
# assets/highlighter
##
highlighter()
{
	for version in `ls -d $folder/assets/highlighter/*`; do
		xregexp="/* XRegExp 1.5.0, (c) 2007-2010 Steven Levithan, http://xregexp.com */"
		apacheconf="/* ApacheConf for SyntaxHighlighter, (c) 2010-2011 Sandro Bilbeisi */"
		copyright="/* SyntaxHighlighter $(basename $version), (c) 2004-2010 Alex Gorbatchev, http://alexgorbatchev.com/SyntaxHighlighter */"

		# CSS
		echo "$copyright" > $version/shCore.css
		$css $version/src/shCore.css >> $version/shCore.css
		echo "  Created $version/shCore.css"

		# JavaScript
		for file in `ls $version/src | grep ".js"`; do
			if [ $file == "XRegExp.js" ]; then
				echo "$xregexp" > $version/$file
			elif [ $file == "shBrushApacheConf.js" ]; then
				echo "$apacheconf" > $version/$file
			else
				echo "$copyright" > $version/$file
			fi
			$js $version/src/$file >> $version/$file
			echo "  Created $version/$file"
		done
	done
}

##
# Dispatch
##
if [ "$1" == "" ]; then
	usage
else

	# Get the installation path
	folder=$(cd $(dirname "$0") && pwd)
	folder=${folder/\/system\/bin/}

	# Check whether java is available
	if [ $(which java) == "" ]; then
		echo -e "  \033[0;31mJava is required to run this script\033[0m"
		exit 1
	fi

	# Check whether uglifyjs is available
	if [ $(which uglifyjs) != "" ]; then
		js="uglifyjs -nc --max-line-len 0"
		echo -e "  \033[0;33mWill be using uglifyjs to minify .js files\033[0m"
	else
		js="java -jar $folder/system/bin/yuicompressor-2.4.6.jar --charset UTF-8"
		echo -e "  \033[0;33mWill be using yuicompressor to minify .js files\033[0m"
	fi

	# CSS minifier
	css="java -jar $folder/system/bin/yuicompressor-2.4.6.jar --charset UTF-8"

	# Execute all functions
	if [ "$1" == "all" ]; then
		typeset -F | while read line; do
			func=${line/declare -f/}
			if [ $func != "usage" ]; then
				$func
			fi
		done
	else
		$1 $2
	fi

	# Purge the assets/js folder
	if [ -d "$folder/assets/js" ]; then
		for i in `ls $folder/assets/js`; do
			if [ "$i" != "index.html" ]; then
				unlink $folder/assets/js/$i
			fi
		done
	fi

	# Purge the assets/css folder
	if [ -d "$folder/assets/css" ]; then
		for i in `ls $folder/assets/css`; do
			if ([ "$i" != "index.html" ] && [ "$i" != "basic.css" ] && [ "$i" != "default.css" ] && [ "$i" != "mobile.css" ] && [ "$i" != "print.css" ]); then
				unlink $folder/assets/css/$i
			fi
		done
	fi
fi
