﻿/*! File Type parser
 * When a file type extension is found, the equivalent name is
 * prefixed into the parsed data, so sorting occurs in groups
 */
/*global jQuery: false */
;(function($){
"use strict";

  // basic list from http://en.wikipedia.org/wiki/List_of_file_formats
  // To add a custom equivalent, define:
  // $.tablesorter.fileTypes.equivalents['xx'] = "A|B|C";
  $.tablesorter.fileTypes = {
    // divides filetype extensions in the equivalent list below
    separator : '|',
    equivalents : {
      "3D Image"     : "3dm|3ds|dwg|max|obj",
      "Audio"        : "aif|aac|ape|flac|la|m4a|mid|midi|mp2|mp3|ogg|ra|raw|rm|wav|wma",
      "Compressed"   : "7z|bin|cab|cbr|gz|gzip|iso|lha|lz|rar|tar|tgz|zip|zipx|zoo",
      "Database"     : "csv|dat|db|dbf|json|ldb|mdb|myd|pdb|sql|tsv|wdb|wmdb|xlr|xls|xlsx|xml",
      "Development"  : "asm|c|class|cls|cpp|cc|cs|cxx|cbp|cs|dba|fla|h|java|lua|pl|py|pyc|pyo|sh|sln|r|rb|vb",
      "Document"     : "doc|docx|odt|ott|pages|pdf|rtf|tex|wpd|wps|wrd|wri",
      "Executable"   : "apk|app|com|exe|gadget|lnk|msi",
      "Fonts"        : "eot|fnt|fon|otf|ttf|woff",
      "Icons"        : "ani|cur|icns|ico",
      "Images"       : "bmp|gif|jpg|jpeg|jpe|jp2|pic|png|psd|tga|tif|tiff|wmf|webp",
      "Presentation" : "pps|ppt",
      "Published"    : "chp|epub|lit|pub|ppp|fm|mobi",
      "Script"       : "as|bat|cgi|cmd|jar|js|lua|scpt|scptd|sh|vbs|vb|wsf",
      "Styles"       : "css|less|sass",
      "Text"         : "info|log|md|markdown|nfo|tex|text|txt",
      "Vectors"      : "awg|ai|eps|cdr|ps|svg",
      "Video"        : "asf|avi|flv|m4v|mkv|mov|mp4|mpe|mpeg|mpg|ogg|rm|rv|swf|vob|wmv",
      "Web"          : "asp|aspx|cer|cfm|htm|html|php|url|xhtml"
    }
  };

  $.tablesorter.addParser({
    id: 'filetype',
    is: function() {
      return false;
    },
    format: function(s, table) {
      var t,
        c = table.config,
        wo = c.widgetOptions,
        i = s.lastIndexOf('.'),
        sep = $.tablesorter.fileTypes.separator,
        m = $.tablesorter.fileTypes.matching,
        types = $.tablesorter.fileTypes.equivalents;
      if (!m) {
        // make a string to "quick" match the existing equivalents
        var t = [];
        $.each(types, function(i,v){
          t.push(v);
        });
        m = $.tablesorter.fileTypes.matching = sep + t.join(sep) + sep;
      }
      if (i >= 0) {
        t = sep + s.substring(i + 1, s.length) + sep;
        if (m.indexOf(t) >= 0) {
          for (i in types) {
            if ((sep + types[i] + sep).indexOf(t) >= 0) {
              return i + (wo.group_separator ? wo.group_separator : '-') + s;
            }
          }
        }
      }
      return s;
    },
    type: 'text'
  });

})(jQuery);
