/**
 * Javascript Countdown
 * Copyright (c) 2009 Markus Hedlund
 * Version 1.1
 * Licensed under MIT license
 * http://www.opensource.org/licenses/mit-license.php
 * http://labs.mimmin.com/countdown
 */
define([], function() {
    var remaining = {
        /**
         * Get the difference of the passed date, and now. The different formats of the taget parameter are:
         * January 12, 2009 15:14:00     (Month dd, yyyy hh:mm:ss)
         * January 12, 2009              (Month dd, yyyy)
         * 09,00,12,15,14,00             (yy,mm,dd,hh,mm,ss) Months range from 0-11, not 1-12.
         * 09,00,12                      (yy,mm,dd)          Months range from 0-11, not 1-12.
         * 500                           (milliseconds)
         * 2009-01-12 15:14:00           (yyyy-mm-dd hh-mm-ss)
         * 2009-01-12 15:14              (yyyy-mm-dd hh-mm)
         * @param target Target date. Can be either a date object or a string (formated like '24 December, 2010 15:00:00')
         * @return Difference in seconds
         */
        getSeconds: function(target) {
            var today = new Date();

            if (typeof(target) == 'object') {
                var targetDate = target;
            } else {
                var matches = target.match(/(\d{4})-(\d{2})-(\d{2}) (\d{2}):(\d{2})(:(\d{2}))?/);   // YYYY-MM-DD HH-MM-SS
                if (matches != null) {
                    matches[7] = typeof(matches[7]) == 'undefined' ? '00' : matches[7];
                    var targetDate = new Date(matches[1], matches[2] - 1, matches[3], matches[4], matches[5], matches[7]);
                } else {
                    var targetDate = new Date(target);
                }
            }

            return Math.floor((targetDate.getTime() - today.getTime()) / 1000);
        },

        /**
         * @param seconds Difference in seconds
         * @param i18n A language object (see code)
         * @param onlyLargestUnit Return only the largest unit (see documentation)
         * @param hideEmpty Hide empty units (see documentation)
         * @return String formated something like '1 week, 1 hours, 1 second'
         */
        getString: function(seconds, i18n, onlyLargestUnit, hideEmpty) {
            if (seconds < 1) {
                return '';
            }

            if (typeof(hideEmpty) == 'undefined' || hideEmpty == null) {
                hideEmpty = true;
            }
            if (typeof(onlyLargestUnit) == 'undefined' || onlyLargestUnit == null) {
                onlyLargestUnit = false;
            }
            if (typeof(i18n) == 'undefined' || i18n == null) {
                i18n = {
                    weeks: ['week', 'weeks'],
                    days: ['day', 'days'],
                    hours: ['hour', 'hours'],
                    minutes: ['minute', 'minutes'],
                    seconds: ['second', 'seconds']
                };
            }

            var units = {
                weeks: 7 * 24 * 60 * 60,
                days: 24 * 60 * 60,
                hours: 60 * 60,
                minutes: 60,
                seconds: 1
            };

            var returnArray = [];
            var value;
            for (unit in units) {
                value = units[unit];
                if (seconds / value >= 1 || unit == 'seconds' || !hideEmpty) {
                    secondsConverted = Math.floor(seconds / value);
                    var i18nUnit = i18n[unit][secondsConverted == 1 ? 0 : 1];
                    returnArray.push(secondsConverted + ' ' + i18nUnit);
                    seconds -= secondsConverted * value;

                    if (onlyLargestUnit) {
                        break;
                    }
                }
            }
            ;

            return returnArray.join(', ');
        },

        /**
         * @param seconds Difference in seconds
         * @return String formated something like '169:00:01'
         */
        getStringDigital: function(seconds) {
            if (seconds < 1) {
                return '';
            }

            remainingTime = remaining.getArray(seconds);

            for (index in remainingTime) {
                remainingTime[index] = remaining.padNumber(remainingTime[index]);
            }
            ;

            return remainingTime.join(':');
        },

        /**
         * @param seconds Difference in seconds
         * @return Array with hours, minutes and seconds
         */
        getArray: function(seconds) {
            if (seconds < 1) {
                return [];
            }

            var units = [60 * 60, 60, 1];

            var returnArray = [];
            var value;
            for (index in units) {
                value = units[index];
                secondsConverted = Math.floor(seconds / value);
                returnArray.push(secondsConverted);
                seconds -= secondsConverted * value;
            }
            ;

            return returnArray;
        },

        /**
         * @param number An integer
         * @return Integer padded with a 0 if necessary
         */
        padNumber: function(number) {
            return (number >= 0 && number < 10) ? '0' + number : number;
        }
    };
    return remaining;
});