/*
Some functions to pretty-print dates.
requires XRegExp: http://stevenlevithan.com/regex/xregexp/
*/

// based on http://delete.me.uk/2005/03/iso8601.html
function parseISODate(string) {    
    var regexp = "(?<year>[0-9]{4})(-(?<month>[0-9]{2})(-(?<day>[0-9]{2})" +
        "(T(?<hours>[0-9]{2}):(?<minutes>[0-9]{2})(:(?<seconds>[0-9]{2})(\.(?<milliseconds>[0-9]+))?)?" +
        "((?<tzsign>[\-\+])(?<tzhours>[0-9]{2}):(?<tzminutes>[0-9]{2})))?)?)?"
    
    //var d = string.match(new RegExp(regexp));
    var parser = new XRegExp(regexp);
    var d = parser.exec(string);

    if (!d) {
        return
    }
    
    var offset = 0;    
    var date = new Date(d.year, 0, 1);

    if (d.month) { date.setMonth(d.month - 1); }
    if (d.day) { date.setDate(d.day); }
    if (d.hours) { date.setHours(d.hours); }
    if (d.minutes) { date.setMinutes(d.minutes); }
    if (d.seconds) { date.setSeconds(d.seconds); }
    if (d.milliseconds) { date.setMilliseconds(Number("0." + d.milliseconds) * 1000); }
    
    if (d.tzsign) {        
        offset = Number(d.tzhours)*60 + Number(d.tzminutes),
        offset *= (d.tzsign == '-') ? 1 : -1;
    }
    
    offset -= date.getTimezoneOffset();
    time = (Number(date) + (offset * 60 * 1000));
    
    ret = new Date();
    ret.setTime(Number(time));
    return ret
}

function pluralize(one, many, amount) {
    return (amount == 1) ? one : many;
}

// based on django's timesince template filter (mostly just a translation)
function timesince(time) {    
    var date = parseISODate(time); 
    if (isNaN(date)) {
        return;
    }
    
    var diff = (((new Date()).getTime() - date.getTime()) / 1000);

    if (isNaN(diff)) {                
        return;
    }

    if (diff <= 0) {        
        return 'a moment ago';
    }
    
    chunks = [
        [60 * 60 * 24 * 365, function(n) {return pluralize('year', 'years', n);}],
        [60 * 60 * 24 * 30, function(n) {return pluralize('month', 'months', n);}],
        [60 * 60 * 24 * 7, function(n) {return pluralize('week', 'weeks', n);}],
        [60 * 60 * 24, function(n) {return pluralize('day', 'days', n);}],
        [60 * 60, function(n) {return pluralize('hour', 'hours', n);}],
        [60, function(n) {return pluralize('minute', 'minutes', n);}]
    ];
    
    var i = 0;
    var seconds = 0;
    var name = 0;
    
    for (i=0; i<chunks.length; i++) {
        chunk = chunks[i];
        seconds = chunk[0];
        name = chunk[1];
        
        count = Math.floor(diff / seconds);
        if (count != 0)
            break;        
    }
    s = count + ' ' + name(count);
    
    if (i+1 < chunks.length) {
        // second item
        chunk2 = chunks[i+1];
        seconds2 = chunk2[0];
        name2 = chunk2[1];
        count2 = Math.floor((diff - (seconds*count)) / seconds2);
        if (count2 != 0)
            s += ', ' + count2 + ' ' + name2(count2);
    }

    s += ' ago';
    
    return s;    
}

// If jQuery is included in the page, adds a jQuery plugin to handle it as well
if (typeof jQuery != "undefined") {
    jQuery.fn.timesince = function() {
        return this.each(function() {
            var date = timesince(this.title);
            if (date) {
                jQuery(this).text(date);                
            }
        });
    };
}
