//
//  TimeIntervalFormatter.m
//  MYUtilities
//
//  Copyright 2008 Jens Alfke. All rights reserved.
//

#import "TimeIntervalFormatter.h"


@implementation TimeIntervalFormatter


- (id) init
{
    self = [super init];
    if (self != nil) {
        _showsMinutes = YES;
    }
    return self;
}

- (void) awakeFromNib
{
    _showsMinutes = YES;
}

- (void) setShowsMinutes: (BOOL)show                {_showsMinutes = show;}
- (void) setShowsFractionalSeconds: (BOOL)show      {_showsFractionalSeconds = show;}

+ (NSString*) formatTimeInterval: (NSTimeInterval)interval
{
    TimeIntervalFormatter *fmt = [[self alloc] init];
    NSString *result = [fmt stringForObjectValue: [NSNumber numberWithDouble: interval]];
    [fmt release];
    return result;
}


- (NSString*) stringForObjectValue: (id)object
{
    if (![object isKindOfClass:[NSNumber class]])
        return nil;
    NSTimeInterval time = [object doubleValue];
    NSString *sign;
    if( time==0.0 )
        return nil;
    else if( time < 0.0 ) {
        sign = @"-";
        time = -time;
    } else
        sign = @"";
    if( ! _showsFractionalSeconds )
        time = floor(time);
    int minutes = (int)floor(time / 60.0);
    if( _showsMinutes || minutes>0 ) {
        double seconds = time - 60.0*minutes;
        return [NSString stringWithFormat: (_showsFractionalSeconds ?@"%@%d:%06.3lf" :@"%@%d:%02.0lf"),
                                           sign,minutes,seconds];
    } else {
        return [NSString stringWithFormat: (_showsFractionalSeconds ?@"%@%.3lf" :@"%@%.0lf"),
                                           sign,time];
    }
}


- (BOOL)getObjectValue:(id *)anObject
             forString:(NSString *)string 
      errorDescription:(NSString **)error
{
    NSScanner *scanner = [NSScanner scannerWithString: string];
    [scanner setCharactersToBeSkipped: [NSCharacterSet whitespaceCharacterSet]];
    double seconds;
    if( [scanner isAtEnd] ) {
        seconds = 0.0;
    } else {
        if( ! [scanner scanDouble: &seconds] || seconds<0.0 ) goto error;
        if( [scanner scanString: @":" intoString: NULL] ) {
            double minutes = seconds;
            if( ! [scanner scanDouble: &seconds] || seconds<0.0 ) goto error;
            seconds += 60*minutes;
        }
        if( ! [scanner isAtEnd] ) goto error;
    }
    *anObject = [NSNumber numberWithDouble: seconds];
    return YES;
    
error:
    *anObject = nil;
    if( error )
        *error = @"Not a valid time interval";
    return NO;
}


- (BOOL)isPartialStringValid:(NSString **)partialStringPtr 
       proposedSelectedRange:(NSRangePointer)proposedSelRangePtr
              originalString:(NSString *)origString 
       originalSelectedRange:(NSRange)origSelRange 
            errorDescription:(NSString **)error
{
    static NSCharacterSet *sIllegalChars;
    if( ! sIllegalChars )
        sIllegalChars = [[[NSCharacterSet characterSetWithCharactersInString: @"0123456789.:"] 
                                invertedSet] retain];
    return [*partialStringPtr rangeOfCharacterFromSet: sIllegalChars].length == 0;
}


@end
