# Copyright 2002-2008 Josh Clark and Global Moxie, LLC. This code cannot be 
# redistributed without permission from globalmoxie.com.  For more
# information, consult your Big Medium license.
#
# $Id: FileTypes.pm 3043 2008-03-31 14:00:38Z josh $

package BigMed::FileTypes;
use strict;
use warnings;
use utf8;

my %CATEGORIES = (
    'doc' => {
        'HTML'             => ['html', 'htm', 'xhtml'],
        'Lotus 1-2-3'      => ['wk1',  'wk3', 'wk4'],
        'Microsoft Office' => ['doc'],
        'Microsoft Excel'       => ['xls', 'xlw'],
        'Microsoft PowerPoint'  => ['ppt', 'pps'],
        'Microsoft Project'     => ['mpp'],
        'Microsoft Publisher'   => ['pub'],
        'Microsoft Works'       => ['wps', 'wks'],
        'Microsoft Write'       => ['wri'],
        'Rich Text Format'      => ['rtf'],
        'StarOffice/OpenOffice' => [
            'sxw', 'stw',  'sdw', 'sgl', 'sxc', 'sxd', 'sxi', 'sxm',
            'sxg', 'stcm', 'sdc', 'sti', 'sdd', 'sdp', 'std', 'sda'
        ],
        'Text'        => ['txt', 'asc', 'csv'],
        'WordPerfect' => ['wpd'],
        'XML'         => ['xml'],
        'PDF'         => ['pdf'],
    },
    'image' => {
        'Windows icon' => ['ico'],
        'GIF image'    => ['gif'],
        'Bitmap image' => ['bmp'],
        'JPEG image'   => ['jpg', 'jpeg', 'jfif'],
        'TIFF image'          => ['tif', 'tiff'],
        'PNG image'           => ['png'],
        'PhotoShop'           => ['psd'],
        'EPS postscript file' => ['eps'],
    },
    'media' => {
        'QuickTime video'   => ['qt',   'qtm',  'mov', 'moov'],
        'MPEG video'        => ['mpeg', 'mpe',  'mpg', 'mp4'],
        'MP3 and MP4 audio' => ['mp3',  'mpu',  'm4a'],
        'MIDI music'        => ['mid',  'midi', 'rmi'],
        'AAC audio'         => ['m4p',  'aac'],
        'AVI video'         => ['avi'],
        'AIFF audio'             => ['aif', 'aiff', 'aifc'],
        'Real Audio'             => ['rm', 'ram'],
        'Windows WAV audio'      => ['wav'],
        'Windows Media video'    => ['wmv'],
        'Windows Media audio'    => ['wma'],
        'MacroMedia Flash movie' => ['swf'],
    },
    'zip' => {
        'GNU-Zipped (Gzip) file' => ['gz', 'gzip', 'taz', 'tgz'],
        'Zipped file'            => ['zip'],
        'Stuffit archive'        => ['sit', 'sitx'],
        'BinHex-encoded file'    => ['hqx'],
        'Macintosh disk image'   => ['dmg'],
        'MacBinary-encoded file' => ['bin'],
        'Unix file archive'      => ['tar'],
    },
);

my %EXT_LOOKUP = (
    'htm'   => ['doc',   'HTML'],
    'html'  => ['doc',   'HTML'],
    'xhtml' => ['doc',   'HTML'],
    'wk1'   => ['doc',   'Lotus 1-2-3'],
    'wk3'   => ['doc',   'Lotus 1-2-3'],
    'wk4'   => ['doc',   'Lotus 1-2-3'],
    'xls'   => ['doc',   'Microsoft Excel'],
    'xlw'   => ['doc',   'Microsoft Excel'],
    'doc'   => ['doc',   'Microsoft Office'],
    'pps'   => ['doc',   'Microsoft PowerPoint'],
    'ppt'   => ['doc',   'Microsoft PowerPoint'],
    'mpp'   => ['doc',   'Microsoft Project'],
    'pub'   => ['doc',   'Microsoft Publisher'],
    'wks'   => ['doc',   'Microsoft Works'],
    'wps'   => ['doc',   'Microsoft Works'],
    'wri'   => ['doc',   'Microsoft Write'],
    'pdf'   => ['doc',   'PDF'],
    'rtf'   => ['doc',   'Rich Text Format'],
    'sda'   => ['doc',   'StarOffice/OpenOffice'],
    'sdc'   => ['doc',   'StarOffice/OpenOffice'],
    'sdd'   => ['doc',   'StarOffice/OpenOffice'],
    'sdp'   => ['doc',   'StarOffice/OpenOffice'],
    'sdw'   => ['doc',   'StarOffice/OpenOffice'],
    'sgl'   => ['doc',   'StarOffice/OpenOffice'],
    'stcm'  => ['doc',   'StarOffice/OpenOffice'],
    'std'   => ['doc',   'StarOffice/OpenOffice'],
    'sti'   => ['doc',   'StarOffice/OpenOffice'],
    'stw'   => ['doc',   'StarOffice/OpenOffice'],
    'sxc'   => ['doc',   'StarOffice/OpenOffice'],
    'sxd'   => ['doc',   'StarOffice/OpenOffice'],
    'sxg'   => ['doc',   'StarOffice/OpenOffice'],
    'sxi'   => ['doc',   'StarOffice/OpenOffice'],
    'sxm'   => ['doc',   'StarOffice/OpenOffice'],
    'sxw'   => ['doc',   'StarOffice/OpenOffice'],
    'asc'   => ['doc',   'Text'],
    'csv'   => ['doc',   'Text'],
    'txt'   => ['doc',   'Text'],
    'wpd'   => ['doc',   'WordPerfect'],
    'xml'   => ['doc',   'XML'],
    'bmp'   => ['image', 'Bitmap image'],
    'eps'   => ['image', 'EPS postscript file'],
    'gif'   => ['image', 'GIF image'],
    'jfif'  => ['image', 'JPEG image'],
    'jpeg'  => ['image', 'JPEG image'],
    'jpg'   => ['image', 'JPEG image'],
    'png'   => ['image', 'PNG image'],
    'psd'   => ['image', 'PhotoShop'],
    'tif'   => ['image', 'TIFF image'],
    'tiff'  => ['image', 'TIFF image'],
    'ico'   => ['image', 'Windows icon'],
    'aac'   => ['media', 'AAC audio'],
    'm4p'   => ['media', 'AAC audio'],
    'aif'   => ['media', 'AIFF audio'],
    'aifc'  => ['media', 'AIFF audio'],
    'aiff'  => ['media', 'AIFF audio'],
    'avi'   => ['media', 'AVI video'],
    'mid'   => ['media', 'MIDI music'],
    'midi'  => ['media', 'MIDI music'],
    'rmi'   => ['media', 'MIDI music'],
    'm4a'   => ['media', 'MP3 and MP4 audio'],
    'mp3'   => ['media', 'MP3 and MP4 audio'],
    'mpu'   => ['media', 'MP3 and MP4 audio'],
    'mp4'   => ['media', 'MPEG video'],
    'mpe'   => ['media', 'MPEG video'],
    'mpeg'  => ['media', 'MPEG video'],
    'mpg'   => ['media', 'MPEG video'],
    'ram'   => ['media', 'Real Audio'],
    'rm'    => ['media', 'Real Audio'],
    'swf'   => ['media', 'MacroMedia Flash movie'],
    'moov'  => ['media', 'QuickTime video'],
    'mov'   => ['media', 'QuickTime video'],
    'qt'    => ['media', 'QuickTime video'],
    'qtm'   => ['media', 'QuickTime video'],
    'wma'   => ['media', 'Windows Media audio'],
    'wmv'   => ['media', 'Windows Media video'],
    'wav'   => ['media', 'Windows WAV audio'],
    'hqx'   => ['zip',   'BinHex-encoded file'],
    'gz'    => ['zip',   'GNU-Zipped (Gzip) file'],
    'gzip'  => ['zip',   'GNU-Zipped (Gzip) file'],
    'taz'   => ['zip',   'GNU-Zipped (Gzip) file'],
    'tgz'   => ['zip',   'GNU-Zipped (Gzip) file'],
    'bin'   => ['zip',   'MacBinary-encoded file'],
    'dmg'   => ['zip',   'Macintosh disk image'],
    'sit'   => ['zip',   'Stuffit archive'],
    'sitx'  => ['zip',   'Stuffit archive'],
    'tar'   => ['zip',   'Unix file archive'],
    'zip'   => ['zip',   'Zipped file'],
);

sub categories {
    return %CATEGORIES;
}

sub flag_categories {
    my $class = shift;
    my $rsuffixes = shift or return;
    my %flag;
    foreach my $suffix (@{$rsuffixes}) {
        my $rlookup = $EXT_LOOKUP{$suffix};
        if ($rlookup) {
            $flag{$rlookup->[0]}->{$rlookup->[1]} = 1;
        }
        else {
            $flag{_ADDL}->{$suffix} = 1;
        }
    }
    return %flag;
}

1;

__END__

