/*
   commons.js
   ----------------------------
   Common utility functions.
*/

/*
   Mime-types/file extensions association.
*/
var mimeMapping = {
   "123":        "application/vnd.lotus-1-2-3",
   "3dml":       "text/vnd.in3d.3dml",
   "3g2":        "video/3gpp2",
   "3gp":        "video/3gpp",
   "ace":        "application/x-ace-compressed",
   "acu":        "application/vnd.acucobol",
   "acutc":      "application/vnd.acucorp",
   "aep":        "application/vnd.audiograph",
   "afp":        "application/vnd.ibm.modcap",
   "ai":         "application/postscript",
   "aif":        "audio/x-aiff",
   "aifc":       "audio/x-aiff",
   "aiff":       "audio/x-aiff",
   "ami":        "application/vnd.amiga.ami",
   "apr":        "application/vnd.lotus-approach",
   "asc":        "application/pgp-signature",
   "asf":        "video/x-ms-asf",
   "asm":        "text/x-asm",
   "aso":        "application/vnd.accpac.simply.aso",
   "asx":        "video/x-ms-asf",
   "atc":        "application/vnd.acucorp",
   "atom":       "application/atom+xml",
   "atomcat":    "application/atomcat+xml",
   "atomsvc":    "application/atomsvc+xml",
   "atx":        "application/vnd.antix.game-component",
   "au":         "audio/basic",
   "avi":        "video/x-msvideo",
   "bat":        "application/x-msdownload",
   "bcpio":      "application/x-bcpio",
   "bdm":        "application/vnd.syncml.dm+wbxml",
   "bh2":        "application/vnd.fujitsu.oasysprs",
   "bin":        "application/octet-stream",
   "bmi":        "application/vnd.bmi",
   "bmp":        "image/bmp",
   "box":        "application/vnd.previewsystems.box",
   "boz":        "application/x-bzip2",
   "bpk":        "application/octet-stream",
   "btif":       "image/prs.btif",
   "bz2":        "application/x-bzip2",
   "bz":         "application/x-bzip",
   "c4d":        "application/vnd.clonk.c4group",
   "c4f":        "application/vnd.clonk.c4group",
   "c4g":        "application/vnd.clonk.c4group",
   "c4p":        "application/vnd.clonk.c4group",
   "c4u":        "application/vnd.clonk.c4group",
   "c":          "text/x-c",
   "cab":        "application/vnd.ms-cab-compressed",
   "cc":         "text/x-c",
   "ccxml":      "application/ccxml+xml",
   "cdbcmsg":    "application/vnd.contact.cmsg",
   "cdf":        "application/x-netcdf",
   "cdkey":      "application/vnd.mediastation.cdkey",
   "cdx":        "chemical/x-cdx",
   "cdxml":      "application/vnd.chemdraw+xml",
   "cdy":        "application/vnd.cinderella",
   "cer":        "application/pkix-cert",
   "cgm":        "image/cgm",
   "chat":       "application/x-chat",
   "chm":        "application/vnd.ms-htmlhelp",
   "chrt":       "application/vnd.kde.kchart",
   "cif":        "chemical/x-cif",
   "cii":        "application/vnd.anser-web-certificate-issue-initiation",
   "cil":        "application/vnd.ms-artgalry",
   "cla":        "application/vnd.claymore",
   "class":      "application/octet-stream",
   "clkk":       "application/vnd.crick.clicker.keyboard",
   "clkp":       "application/vnd.crick.clicker.palette",
   "clkt":       "application/vnd.crick.clicker.template",
   "clkw":       "application/vnd.crick.clicker.wordbank",
   "clkx":       "application/vnd.crick.clicker",
   "clp":        "application/x-msclip",
   "cmc":        "application/vnd.cosmocaller",
   "cmdf":       "chemical/x-cmdf",
   "cml":        "chemical/x-cml",
   "cmp":        "application/vnd.yellowriver-custom-menu",
   "cmx":        "image/x-cmx",
   "com":        "application/x-msdownload",
   "conf":       "text/plain",
   "cpio":       "application/x-cpio",
   "cpp":        "text/x-c",
   "cpt":        "application/mac-compactpro",
   "crd":        "application/x-mscardfile",
   "crl":        "application/pkix-crl",
   "crt":        "application/x-x509-ca-cert",
   "csh":        "application/x-csh",
   "csml":       "chemical/x-csml",
   "csp":        "application/vnd.commonspace",
   "css":        "text/css",
   "cst":        "application/vnd.commonspace",
   "csv":        "text/csv",
   "curl":       "application/vnd.curl",
   "cww":        "application/prs.cww",
   "cxx":        "text/x-c",
   "daf":        "application/vnd.mobius.daf",
   "davmount":   "application/davmount+xml",
   "dcr":        "application/x-director",
   "dd2":        "application/vnd.oma.dd2+xml",
   "ddd":        "application/vnd.fujixerox.ddd",
   "def":        "text/plain",
   "der":        "application/x-x509-ca-cert",
   "dfac":       "application/vnd.dreamfactory",
   "dic":        "text/x-c",
   "dir":        "application/x-director",
   "dis":        "application/vnd.mobius.dis",
   "dist":       "application/octet-stream",
   "distz":      "application/octet-stream",
   "djv":        "image/vnd.djvu",
   "djvu":       "image/vnd.djvu",
   "dll":        "application/x-msdownload",
   "dmg":        "application/octet-stream",
   "dms":        "application/octet-stream",
   "dna":        "application/vnd.dna",
   "doc":        "application/msword",
   "dot":        "application/msword",
   "dp":         "application/vnd.osgi.dp",
   "dpg":        "application/vnd.dpgraph",
   "dsc":        "text/prs.lines.tag",
   "dtd":        "application/xml-dtd",
   "dump":       "application/octet-stream",
   "dvi":        "application/x-dvi",
   "dwf":        "model/vnd.dwf",
   "dwg":        "image/vnd.dwg",
   "dxf":        "image/vnd.dxf",
   "dxp":        "application/vnd.spotfire.dxp",
   "dxr":        "application/x-director",
   "ecelp4800":  "audio/vnd.nuera.ecelp4800",
   "ecelp7470":  "audio/vnd.nuera.ecelp7470",
   "ecelp9600":  "audio/vnd.nuera.ecelp9600",
   "ecma":       "application/ecmascript",
   "edm":        "application/vnd.novadigm.edm",
   "edx":        "application/vnd.novadigm.edx",
   "efif":       "application/vnd.picsel",
   "ei6":        "application/vnd.pg.osasli",
   "elc":        "application/octet-stream",
   "eml":        "message/rfc822",
   "eol":        "audio/vnd.digital-winds",
   "eot":        "application/vnd.ms-fontobject",
   "eps":        "application/postscript",
   "es3":        "application/vnd.eszigno3+xml",
   "esf":        "application/vnd.epson.esf",
   "et3":        "application/vnd.eszigno3+xml",
   "etx":        "text/x-setext",
   "exe":        "application/x-msdownload",
   "ext":        "application/vnd.novadigm.ext",
   "ez2":        "application/vnd.ezpix-album",
   "ez3":        "application/vnd.ezpix-package",
   "ez":         "application/andrew-inset",
   "f77":        "text/x-fortran",
   "f90":        "text/x-fortran",
   "f":          "text/x-fortran",
   "fbs":        "image/vnd.fastbidsheet",
   "fdf":        "application/vnd.fdf",
   "fe_launch":  "application/vnd.denovo.fcselayout-link",
   "fg5":        "application/vnd.fujitsu.oasysgp",
   "fgd":        "application/x-director",
   "fli":        "video/x-fli",
   "flo":        "application/vnd.micrografx.flo",
   "flv":        "video/x-flv",
   "flw":        "application/vnd.kde.kivio",
   "flx":        "text/vnd.fmi.flexstor",
   "fly":        "text/vnd.fly",
   "fm":         "application/vnd.framemaker",
   "fnc":        "application/vnd.frogans.fnc",
   "for":        "text/x-fortran",
   "fpx":        "image/vnd.fpx",
   "frame":      "application/vnd.framemaker",
   "fsc":        "application/vnd.fsc.weblaunch",
   "fst":        "image/vnd.fst",
   "ftc":        "application/vnd.fluxtime.clip",
   "fti":        "application/vnd.anser-web-funds-transfer-initiation",
   "fvt":        "video/vnd.fvt",
   "fzs":        "application/vnd.fuzzysheet",
   "g3":         "image/g3fax",
   "gac":        "application/vnd.groove-account",
   "gdl":        "model/vnd.gdl",
   "ghf":        "application/vnd.groove-help",
   "gif":        "image/gif",
   "gim":        "application/vnd.groove-identity-message",
   "gph":        "application/vnd.flographit",
   "gqf":        "application/vnd.grafeq",
   "gqs":        "application/vnd.grafeq",
   "gram":       "application/srgs",
   "grv":        "application/vnd.groove-injector",
   "grxml":      "application/srgs+xml",
   "gtar":       "application/x-gtar",
   "gtm":        "application/vnd.groove-tool-message",
   "gtw":        "model/vnd.gtw",
   "h261":       "video/h261",
   "h263":       "video/h263",
   "h264":       "video/h264",
   "h":          "text/x-c",
   "hbci":       "application/vnd.hbci",
   "hdf":        "application/x-hdf",
   "hh":         "text/x-c",
   "hlp":        "application/winhlp",
   "hpgl":       "application/vnd.hp-hpgl",
   "hpid":       "application/vnd.hp-hpid",
   "hps":        "application/vnd.hp-hps",
   "hqx":        "application/mac-binhex40",
   "htke":       "application/vnd.kenameaapp",
   "htm":        "text/html",
   "html":       "text/html",
   "hvd":        "application/vnd.yamaha.hv-dic",
   "hvp":        "application/vnd.yamaha.hv-voice",
   "hvs":        "application/vnd.yamaha.hv-script",
   "ice":        "x-conference/x-cooltalk",
   "ico":        "image/x-icon",
   "ics":        "text/calendar",
   "ief":        "image/ief",
   "ifb":        "text/calendar",
   "ifm":        "application/vnd.shana.informed.formdata",
   "iges":       "model/iges",
   "igl":        "application/vnd.igloader",
   "igs":        "model/iges",
   "igx":        "application/vnd.micrografx.igx",
   "iif":        "application/vnd.shana.informed.interchange",
   "imp":        "application/vnd.accpac.simply.imp",
   "ims":        "application/vnd.ms-ims",
   "in":         "text/plain",
   "ipk":        "application/vnd.shana.informed.package",
   "irm":        "application/vnd.ibm.rights-management",
   "irp":        "application/vnd.irepository.package+xml",
   "iso":        "application/octet-stream",
   "itp":        "application/vnd.shana.informed.formtemplate",
   "ivp":        "application/vnd.immervision-ivp",
   "ivu":        "application/vnd.immervision-ivu",
   "jad":        "text/vnd.sun.j2me.app-descriptor",
   "jam":        "application/vnd.jam",
   "jar":        "application/java-archive",
   "java":       "text/x-java-source",
   "jisp":       "application/vnd.jisp",
   "jlt":        "application/vnd.hp-jlyt",
   "joda":       "application/vnd.joost.joda-archive",
   "jpe":        "image/jpeg",
   "jpeg":       "image/jpeg",
   "jpg":        "image/jpeg",
   "jpgm":       "video/jpm",
   "jpgv":       "video/jpeg",
   "jpm":        "video/jpm",
   "js":         "application/javascript",
   "json":       "application/json",
   "kar":        "audio/midi",
   "karbon":     "application/vnd.kde.karbon",
   "kfo":        "application/vnd.kde.kformula",
   "kia":        "application/vnd.kidspiration",
   "kml":        "application/vnd.google-earth.kml+xml",
   "kmz":        "application/vnd.google-earth.kmz",
   "kne":        "application/vnd.kinar",
   "knp":        "application/vnd.kinar",
   "kon":        "application/vnd.kde.kontour",
   "kpr":        "application/vnd.kde.kpresenter",
   "kpt":        "application/vnd.kde.kpresenter",
   "ksp":        "application/vnd.kde.kspread",
   "ktr":        "application/vnd.kahootz",
   "ktz":        "application/vnd.kahootz",
   "kwd":        "application/vnd.kde.kword",
   "kwt":        "application/vnd.kde.kword",
   "latex":      "application/x-latex",
   "lbd":        "application/vnd.llamagraphics.life-balance.desktop",
   "lbe":        "application/vnd.llamagraphics.life-balance.exchange+xml",
   "les":        "application/vnd.hhe.lesson-player",
   "lha":        "application/octet-stream",
   "list3820":   "application/vnd.ibm.modcap",
   "list":       "text/plain",
   "listafp":    "application/vnd.ibm.modcap",
   "log":        "text/plain",
   "lrm":        "application/vnd.ms-lrm",
   "ltf":        "application/vnd.frogans.ltf",
   "lvp":        "audio/vnd.lucent.voice",
   "lwp":        "application/vnd.lotus-wordpro",
   "lzh":        "application/octet-stream",
   "m13":        "application/x-msmediaview",
   "m14":        "application/x-msmediaview",
   "m1v":        "video/mpeg",
   "m2a":        "audio/mpeg",
   "m2v":        "video/mpeg",
   "m3a":        "audio/mpeg",
   "m3u":        "audio/x-mpegurl",
   "m4u":        "video/vnd.mpegurl",
   "ma":         "application/mathematica",
   "mag":        "application/vnd.ecowin.chart",
   "maker":      "application/vnd.framemaker",
   "man":        "text/troff",
   "mathml":     "application/mathml+xml",
   "mb":         "application/mathematica",
   "mbk":        "application/vnd.mobius.mbk",
   "mbox":       "application/mbox",
   "mc1":        "application/vnd.medcalcdata",
   "mcd":        "application/vnd.mcd",
   "mdb":        "application/x-msaccess",
   "mdi":        "image/vnd.ms-modi",
   "me":         "text/troff",
   "mesh":       "model/mesh",
   "mfm":        "application/vnd.mfmp",
   "mgz":        "application/vnd.proteus.magazine",
   "mid":        "audio/midi",
   "midi":       "audio/midi",
   "mif":        "application/vnd.mif",
   "mime":       "message/rfc822",
   "mj2":        "video/mj2",
   "mjp2":       "video/mj2",
   "mlp":        "application/vnd.dolby.mlp",
   "mmd":        "application/vnd.chipnuts.karaoke-mmd",
   "mmf":        "application/vnd.smaf",
   "mmr":        "image/vnd.fujixerox.edmics-mmr",
   "mny":        "application/x-msmoney",
   "mov":        "video/quicktime",
   "movie":      "video/x-sgi-movie",
   "mp2":        "audio/mpeg",
   "mp2a":       "audio/mpeg",
   "mp3":        "audio/mpeg",
   "mp4":        "video/mp4",
   "mp4a":       "audio/mp4",
   "mp4s":       "application/mp4",
   "mp4v":       "video/mp4",
   "mpc":        "application/vnd.mophun.certificate",
   "mpe":        "video/mpeg",
   "mpeg":       "video/mpeg",
   "mpg4":       "video/mp4",
   "mpg":        "video/mpeg",
   "mpga":       "audio/mpeg",
   "mpkg":       "application/vnd.apple.installer+xml",
   "mpm":        "application/vnd.blueice.multipass",
   "mpn":        "application/vnd.mophun.application",
   "mpp":        "application/vnd.ms-project",
   "mpt":        "application/vnd.ms-project",
   "mpy":        "application/vnd.ibm.minipay",
   "mqy":        "application/vnd.mobius.mqy",
   "mrc":        "application/marc",
   "ms":         "text/troff",
   "mscml":      "application/mediaservercontrol+xml",
   "mseq":       "application/vnd.mseq",
   "msf":        "application/vnd.epson.msf",
   "msh":        "model/mesh",
   "msi":        "application/x-msdownload",
   "msl":        "application/vnd.mobius.msl",
   "msty":       "application/vnd.muvee.style",
   "mts":        "model/vnd.mts",
   "mus":        "application/vnd.musician",
   "mvb":        "application/x-msmediaview",
   "mwf":        "application/vnd.mfer",
   "mxf":        "application/mxf",
   "mxl":        "application/vnd.recordare.musicxml",
   "mxml":       "application/xv+xml",
   "mxs":        "application/vnd.triscape.mxs",
   "mxu":        "video/vnd.mpegurl",
   "nb":         "application/mathematica",
   "nc":         "application/x-netcdf",
   "ngdat":      "application/vnd.nokia.n-gage.data",
   "n-gage":     "application/vnd.nokia.n-gage.symbian.install",
   "nlu":        "application/vnd.neurolanguage.nlu",
   "nml":        "application/vnd.enliven",
   "nnd":        "application/vnd.noblenet-directory",
   "nns":        "application/vnd.noblenet-sealer",
   "nnw":        "application/vnd.noblenet-web",
   "npx":        "image/vnd.net-fpx",
   "nsf":        "application/vnd.lotus-notes",
   "oa2":        "application/vnd.fujitsu.oasys2",
   "oa3":        "application/vnd.fujitsu.oasys3",
   "oas":        "application/vnd.fujitsu.oasys",
   "obd":        "application/x-msbinder",
   "oda":        "application/oda",
   "odc":        "application/vnd.oasis.opendocument.chart",
   "odf":        "application/vnd.oasis.opendocument.formula",
   "odg":        "application/vnd.oasis.opendocument.graphics",
   "odi":        "application/vnd.oasis.opendocument.image",
   "odp":        "application/vnd.oasis.opendocument.presentation",
   "ods":        "application/vnd.oasis.opendocument.spreadsheet",
   "odt":        "application/vnd.oasis.opendocument.text",
   "ogg":        "application/ogg",
   "oprc":       "application/vnd.palm",
   "org":        "application/vnd.lotus-organizer",
   "otc":        "application/vnd.oasis.opendocument.chart-template",
   "otf":        "application/vnd.oasis.opendocument.formula-template",
   "otg":        "application/vnd.oasis.opendocument.graphics-template",
   "oth":        "application/vnd.oasis.opendocument.text-web",
   "oti":        "application/vnd.oasis.opendocument.image-template",
   "otm":        "application/vnd.oasis.opendocument.text-master",
   "otp":        "application/vnd.oasis.opendocument.presentation-template",
   "ots":        "application/vnd.oasis.opendocument.spreadsheet-template",
   "ott":        "application/vnd.oasis.opendocument.text-template",
   "oxt":        "application/vnd.openofficeorg.extension",
   "p10":        "application/pkcs10",
   "p12":        "application/x-pkcs12",
   "p7b":        "application/x-pkcs7-certificates",
   "p7c":        "application/pkcs7-mime",
   "p7m":        "application/pkcs7-mime",
   "p7r":        "application/x-pkcs7-certreqresp",
   "p7s":        "application/pkcs7-signature",
   "p":          "text/x-pascal",
   "pas":        "text/x-pascal",
   "pbd":        "application/vnd.powerbuilder6",
   "pbm":        "image/x-portable-bitmap",
   "pcl":        "application/vnd.hp-pcl",
   "pclxl":      "application/vnd.hp-pclxl",
   "pct":        "image/x-pict",
   "pcx":        "image/x-pcx",
   "pdb":        "chemical/x-pdb",
   "pdf":        "application/pdf",
   "pfr":        "application/font-tdpfr",
   "pfx":        "application/x-pkcs12",
   "pgm":        "image/x-portable-graymap",
   "pgn":        "application/x-chess-pgn",
   "pgp":        "application/pgp-encrypted",
   "pic":        "image/x-pict",
   "pkg":        "application/octet-stream",
   "pki":        "application/pkixcmp",
   "pkipath":    "application/pkix-pkipath",
   "plb":        "application/vnd.3gpp.pic-bw-large",
   "plc":        "application/vnd.mobius.plc",
   "plf":        "application/vnd.pocketlearn",
   "pls":        "application/pls+xml",
   "pml":        "application/vnd.ctc-posml",
   "png":        "image/png",
   "pnm":        "image/x-portable-anymap",
   "portpkg":    "application/vnd.macports.portpkg",
   "pot":        "application/vnd.ms-powerpoint",
   "ppd":        "application/vnd.cups-ppd",
   "ppm":        "image/x-portable-pixmap",
   "pps":        "application/vnd.ms-powerpoint",
   "ppt":        "application/vnd.ms-powerpoint",
   "pqa":        "application/vnd.palm",
   "prc":        "application/vnd.palm",
   "pre":        "application/vnd.lotus-freelance",
   "prf":        "application/pics-rules",
   "ps":         "application/postscript",
   "psb":        "application/vnd.3gpp.pic-bw-small",
   "psd":        "image/vnd.adobe.photoshop",
   "ptid":       "application/vnd.pvi.ptid1",
   "pub":        "application/x-mspublisher",
   "pvb":        "application/vnd.3gpp.pic-bw-var",
   "pwn":        "application/vnd.3m.post-it-notes",
   "qam":        "application/vnd.epson.quickanime",
   "qbo":        "application/vnd.intu.qbo",
   "qfx":        "application/vnd.intu.qfx",
   "qps":        "application/vnd.publishare-delta-tree",
   "qt":         "video/quicktime",
   "qwd":        "application/vnd.quark.quarkxpress",
   "qwt":        "application/vnd.quark.quarkxpress",
   "qxb":        "application/vnd.quark.quarkxpress",
   "qxd":        "application/vnd.quark.quarkxpress",
   "qxl":        "application/vnd.quark.quarkxpress",
   "qxt":        "application/vnd.quark.quarkxpress",
   "ra":         "audio/x-pn-realaudio",
   "ram":        "audio/x-pn-realaudio",
   "rar":        "application/x-rar-compressed",
   "ras":        "image/x-cmu-raster",
   "rcprofile":  "application/vnd.ipunplugged.rcprofile",
   "rdf":        "application/rdf+xml",
   "rdz":        "application/vnd.data-vision.rdz",
   "rep":        "application/vnd.businessobjects",
   "rgb":        "image/x-rgb",
   "rif":        "application/reginfo+xml",
   "rl":         "application/resource-lists+xml",
   "rlc":        "image/vnd.fujixerox.edmics-rlc",
   "rm":         "application/vnd.rn-realmedia",
   "rmi":        "audio/midi",
   "rmp":        "audio/x-pn-realaudio-plugin",
   "rms":        "application/vnd.jcp.javame.midlet-rms",
   "rnc":        "application/relax-ng-compact-syntax",
   "roff":       "text/troff",
   "rpss":       "application/vnd.nokia.radio-presets",
   "rpst":       "application/vnd.nokia.radio-preset",
   "rq":         "application/sparql-query",
   "rs":         "application/rls-services+xml",
   "rsd":        "application/rsd+xml",
   "rss":        "application/rss+xml",
   "rtf":        "application/rtf",
   "rtx":        "text/richtext",
   "s":          "text/x-asm",
   "saf":        "application/vnd.yamaha.smaf-audio",
   "sbml":       "application/sbml+xml",
   "sc":         "application/vnd.ibm.secure-container",
   "scd":        "application/x-msschedule",
   "scm":        "application/vnd.lotus-screencam",
   "scq":        "application/scvp-cv-request",
   "scs":        "application/scvp-cv-response",
   "sdkd":       "application/vnd.solent.sdkm+xml",
   "sdkm":       "application/vnd.solent.sdkm+xml",
   "sdp":        "application/sdp",
   "see":        "application/vnd.seemail",
   "sema":       "application/vnd.sema",
   "semd":       "application/vnd.semd",
   "semf":       "application/vnd.semf",
   "setpay":     "application/set-payment-initiation",
   "setreg":     "application/set-registration-initiation",
   "sfs":        "application/vnd.spotfire.sfs",
   "sgm":        "text/sgml",
   "sgml":       "text/sgml",
   "sh":         "application/x-sh",
   "shar":       "application/x-shar",
   "shf":        "application/shf+xml",
   "sig":        "application/pgp-signature",
   "silo":       "model/mesh",
   "sit":        "application/x-stuffit",
   "sitx":       "application/x-stuffitx",
   "skd":        "application/vnd.koan",
   "skm":        "application/vnd.koan",
   "skp":        "application/vnd.koan",
   "skt":        "application/vnd.koan",
   "slt":        "application/vnd.epson.salt",
   "smi":        "application/smil+xml",
   "smil":       "application/smil+xml",
   "snd":        "audio/basic",
   "so":         "application/octet-stream",
   "spc":        "application/x-pkcs7-certificates",
   "spf":        "application/vnd.yamaha.smaf-phrase",
   "spl":        "application/x-futuresplash",
   "spot":       "text/vnd.in3d.spot",
   "spp":        "application/scvp-vp-response",
   "spq":        "application/scvp-vp-request",
   "src":        "application/x-wais-source",
   "srx":        "application/sparql-results+xml",
   "ssf":        "application/vnd.epson.ssf",
   "ssml":       "application/ssml+xml",
   "stf":        "application/vnd.wt.stf",
   "stk":        "application/hyperstudio",
   "str":        "application/vnd.pg.format",
   "sus":        "application/vnd.sus-calendar",
   "susp":       "application/vnd.sus-calendar",
   "sv4cpio":    "application/x-sv4cpio",
   "sv4crc":     "application/x-sv4crc",
   "svd":        "application/vnd.svd",
   "svg":        "image/svg+xml",
   "svgz":       "image/svg+xml",
   "swf":        "application/x-shockwave-flash",
   "t":          "text/troff",
   "tao":        "application/vnd.tao.intent-module-archive",
   "tar":        "application/x-tar",
   "tcap":       "application/vnd.3gpp2.tcap",
   "tcl":        "application/x-tcl",
   "tex":        "application/x-tex",
   "texi":       "application/x-texinfo",
   "texinfo":    "application/x-texinfo",
   "text":       "text/plain",
   "tif":        "image/tiff",
   "tiff":       "image/tiff",
   "tmo":        "application/vnd.tmobile-livetv",
   "torrent":    "application/x-bittorrent",
   "tpl":        "application/vnd.groove-tool-template",
   "tpt":        "application/vnd.trid.tpt",
   "tr":         "text/troff",
   "tra":        "application/vnd.trueapp",
   "trm":        "application/x-msterminal",
   "tsv":        "text/tab-separated-values",
   "twd":        "application/vnd.simtech-mindmapper",
   "twds":       "application/vnd.simtech-mindmapper",
   "txd":        "application/vnd.genomatix.tuxedo",
   "txf":        "application/vnd.mobius.txf",
   "txt":        "text/plain",
   "ufd":        "application/vnd.ufdl",
   "ufdl":       "application/vnd.ufdl",
   "umj":        "application/vnd.umajin",
   "unityweb":   "application/vnd.unity",
   "uoml":       "application/vnd.uoml+xml",
   "uri":        "text/uri-list",
   "uris":       "text/uri-list",
   "urls":       "text/uri-list",
   "ustar":      "application/x-ustar",
   "utz":        "application/vnd.uiq.theme",
   "uu":         "text/x-uuencode",
   "vcd":        "application/x-cdlink",
   "vcf":        "text/x-vcard",
   "vcg":        "application/vnd.groove-vcard",
   "vcs":        "text/x-vcalendar",
   "vcx":        "application/vnd.vcx",
   "vis":        "application/vnd.visionary",
   "viv":        "video/vnd.vivo",
   "vob":        "video/dvd",
   "vrml":       "model/vrml",
   "vsd":        "application/vnd.visio",
   "vsf":        "application/vnd.vsf",
   "vss":        "application/vnd.visio",
   "vst":        "application/vnd.visio",
   "vsw":        "application/vnd.visio",
   "vtu":        "model/vnd.vtu",
   "vxml":       "application/voicexml+xml",
   "wav":        "audio/wav",
   "wax":        "audio/x-ms-wax",
   "wbmp":       "image/vnd.wap.wbmp",
   "wbs":        "application/vnd.criticaltools.wbs+xml",
   "wbxml":      "application/vnd.wap.wbxml",
   "wcm":        "application/vnd.ms-works",
   "wdb":        "application/vnd.ms-works",
   "wks":        "application/vnd.ms-works",
   "wm":         "video/x-ms-wm",
   "wma":        "audio/x-ms-wma",
   "wmd":        "application/x-ms-wmd",
   "wmf":        "application/x-msmetafile",
   "wml":        "text/vnd.wap.wml",
   "wmlc":       "application/vnd.wap.wmlc",
   "wmls":       "text/vnd.wap.wmlscript",
   "wmlsc":      "application/vnd.wap.wmlscriptc",
   "wmv":        "video/x-ms-wmv",
   "wmx":        "video/x-ms-wmx",
   "wmz":        "application/x-ms-wmz",
   "wpd":        "application/vnd.wordperfect",
   "wpl":        "application/vnd.ms-wpl",
   "wps":        "application/vnd.ms-works",
   "wqd":        "application/vnd.wqd",
   "wri":        "application/x-mswrite",
   "wrl":        "model/vrml",
   "wsdl":       "application/wsdl+xml",
   "wspolicy":   "application/wspolicy+xml",
   "wtb":        "application/vnd.webturbo",
   "wvx":        "video/x-ms-wvx",
   "x3d":        "application/vnd.hzn-3d-crossword",
   "xar":        "application/vnd.xara",
   "xbd":        "application/vnd.fujixerox.docuworks.binder",
   "xbm":        "image/x-xbitmap",
   "xdm":        "application/vnd.syncml.dm+xml",
   "xdp":        "application/vnd.adobe.xdp+xml",
   "xdw":        "application/vnd.fujixerox.docuworks",
   "xenc":       "application/xenc+xml",
   "xfdf":       "application/vnd.adobe.xfdf",
   "xfdl":       "application/vnd.xfdl",
   "xht":        "application/xhtml+xml",
   "xhtml":      "application/xhtml+xml",
   "xhvml":      "application/xv+xml",
   "xif":        "image/vnd.xiff",
   "xla":        "application/vnd.ms-excel",
   "xlc":        "application/vnd.ms-excel",
   "xlm":        "application/vnd.ms-excel",
   "xls":        "application/vnd.ms-excel",
   "xlt":        "application/vnd.ms-excel",
   "xlw":        "application/vnd.ms-excel",
   "xml":        "application/xml",
   "xo":         "application/vnd.olpc-sugar",
   "xop":        "application/xop+xml",
   "xpm":        "image/x-xpixmap",
   "xpr":        "application/vnd.is-xpr",
   "xps":        "application/vnd.ms-xpsdocument",
   "xpw":        "application/vnd.intercon.formnet",
   "xpx":        "application/vnd.intercon.formnet",
   "xsl":        "application/xml",
   "xslt":       "application/xslt+xml",
   "xsm":        "application/vnd.syncml+xml",
   "xspf":       "application/xspf+xml",
   "xul":        "application/vnd.mozilla.xul+xml",
   "xvm":        "application/xv+xml",
   "xvml":       "application/xv+xml",
   "xwd":        "image/x-xwindowdump",
   "xyz":        "chemical/x-xyz",
   "zaz":        "application/vnd.zzazz.deck+xml",
   "zip":        "application/zip",
   "zmm":        "application/vnd.handheld-entertainment+xml"
}

/* Unknown mime-type constant */
var MIME_TYPE_UNKNOWN = "application/unknown";

/*
   Trim blanks from a string.
*/
function trim(text) {
   return text.replace(/^\s+|\s+$/, "");
}


/*
   Trim left blanks from a string.
*/
function ltrim(text) {
   return text.replace(/^\s+/, "");
}


/*
   Trim right blanks from a string.
*/
function rtrim(text) {
   return text.replace(/\s+$/, "");
}


/*
   Trim blanks from a string, including
   possible &nbsp; (ISO-8859-1 notation).
*/
function trimHTML(text) {
   return text.replace(/[\x20,\xa0]+$/, "");
}


/*
   Return the first string if not null (and not empty),
   otherwise the second one (even if null or empty).
*/
function coalesce(firstString,
                  secondString) {
   if (firstString == null || firstString == undefined || firstString == "")
      return secondString;

   return firstString;
}


/*
   Append the given character to the right of a string
   til the desired lentgth is reached
*/
function padStringRight(toPad,
                        pad,
                        length) {
   /*
      If the length of the string >= desired length
      return the original string
   */
   if (toPad != null && toPad.length >= length)
      return toPad;

   var sBuf = (toPad == null ? "" : toPad);

   for (var i = sBuf.length + 1; i++ <= length; sBuf += pad);

   return sBuf;
}


/*
   Append the given character to the left of a string
   til the desired lentgth is reached
*/
function padStringLeft(toPad,
                       pad,
                       length) {
   /*
      If the length of the string >= desired length
      return the original string
   */
   if (toPad != null && toPad.length >= length)
      return toPad;

   var sBuf = (toPad == null ? "" : toPad);

   for (var i = sBuf.length + 1; i++ <= length; sBuf = pad + sBuf);

   return sBuf;
}


/*
   Set the string uppercase
   (also trim possible blanks).
*/
function toUpper(text) {
   return trim(text.toUpperCase());
}


/*
   Set the string lowercase
   (also trim possible blanks).
*/
function toLower(text) {
   return trim(text.toLowerCase());
}


/*
   Capitalize the string
   (also trim possible blanks).
*/
function toCapitalize(text) {
   if (text.length <= 1)
      return trim(text.toUpperCase());
   else
      return trim(text.substr(0, 1).toUpperCase() + text.substr(1).toLowerCase());
}


/*
   Converts to boolean a string representation.
*/
function toBoolean(booleanAsString) {
  if (booleanAsString == null || booleanAsString == undefined || booleanAsString == "")
    return false;

  if (booleanAsString.toLowerCase() == "true")
    return true;

  return false;
}


/*
   Return the sortened string (...) or the original string when
   its number of characters does not exceed the given length.
*/
function shortenString(text, maxLength) {
   if (text == null || maxLength == null)
      return text;

   if (text.length > maxLength)
      return text.substr(0, maxLength) + '\u2026';

   return text;
}


/*
   Convert carriage return (\r, \n, \r\n) into HTML tag (<br>).
*/
function decodeBR(textToDecode) {
  textToDecode = textToDecode.replace(/(\x0D\x0A)/g, "<br>");
  textToDecode = textToDecode.replace(/[\x0D\x0A]/g, "<br>");
  textToDecode = textToDecode.replace(/(\u2029\u2028)/g, "<br>");
  textToDecode = textToDecode.replace(/[\u2029\u2028]/g, "<br>");

  return textToDecode;
}


/*
  Convert  HTML tag <br> into carriage return (\n).
*/
function encodeBR(textToEncode) {
  textToEncode = textToEncode.replace(/(<br>)/g, "\n");
  textToEncode = textToEncode.replace(/(<br\/>)/g, "\n");

  return textToEncode;
}


/*
  Return a string where characters with notation &xxxx; are
  replaced with their corresponding ASCII values.
*/
function decodeString(stringToDecode) {
   stringToDecode = stringToDecode.replace(/&Agrave;/g, "\u00C0");
   stringToDecode = stringToDecode.replace(/&Aacute;/g, "\u00C1");
   stringToDecode = stringToDecode.replace(/&Acirc;/g,  "\u00C2");
   stringToDecode = stringToDecode.replace(/&Atilde;/g, "\u00C3");
   stringToDecode = stringToDecode.replace(/&Auml;/g,   "\u00C4");
   stringToDecode = stringToDecode.replace(/&Aring;/g,  "\u00C5");
   stringToDecode = stringToDecode.replace(/&AElig;/g,  "\u00C6");
   stringToDecode = stringToDecode.replace(/&Ccedil;/g, "\u00C7");
   stringToDecode = stringToDecode.replace(/&Egrave;/g, "\u00C8");
   stringToDecode = stringToDecode.replace(/&Eacute;/g, "\u00C9");
   stringToDecode = stringToDecode.replace(/&Ecirc;/g,  "\u00CA");
   stringToDecode = stringToDecode.replace(/&Euml;/g,   "\u00CB");
   stringToDecode = stringToDecode.replace(/&Igrave;/g, "\u00CC");
   stringToDecode = stringToDecode.replace(/&Iacute;/g, "\u00CD");
   stringToDecode = stringToDecode.replace(/&Icirc;/g,  "\u00CE");
   stringToDecode = stringToDecode.replace(/&Iuml;/g,   "\u00CF");
   stringToDecode = stringToDecode.replace(/&Ntilde;/g, "\u00D1");
   stringToDecode = stringToDecode.replace(/&Ograve;/g, "\u00D2");
   stringToDecode = stringToDecode.replace(/&Oacute;/g, "\u00D3");
   stringToDecode = stringToDecode.replace(/&Ocirc;/g,  "\u00D4");
   stringToDecode = stringToDecode.replace(/&Otilde;/g, "\u00D5");
   stringToDecode = stringToDecode.replace(/&Ouml;/g,   "\u00D6");
   stringToDecode = stringToDecode.replace(/&Oslash;/g, "\u00D8");
   stringToDecode = stringToDecode.replace(/&Ugrave;/g, "\u00D9");
   stringToDecode = stringToDecode.replace(/&Uacute;/g, "\u00DA");
   stringToDecode = stringToDecode.replace(/&Ucirc;/g,  "\u00DB");
   stringToDecode = stringToDecode.replace(/&Uuml;/g,   "\u00DC");
   stringToDecode = stringToDecode.replace(/&szlig;/g,  "\u00DF");
   stringToDecode = stringToDecode.replace(/&agrave;/g, "\u00E0");
   stringToDecode = stringToDecode.replace(/&aacute;/g, "\u00E1");
   stringToDecode = stringToDecode.replace(/&acirc;/g,  "\u00E2");
   stringToDecode = stringToDecode.replace(/&atilde;/g, "\u00E3");
   stringToDecode = stringToDecode.replace(/&auml;/g,   "\u00E4");
   stringToDecode = stringToDecode.replace(/&aring;/g,  "\u00E5");
   stringToDecode = stringToDecode.replace(/&aelig;/g,  "\u00E6");
   stringToDecode = stringToDecode.replace(/&ccedil;/g, "\u00E7");
   stringToDecode = stringToDecode.replace(/&egrave;/g, "\u00E8");
   stringToDecode = stringToDecode.replace(/&eacute;/g, "\u00E9");
   stringToDecode = stringToDecode.replace(/&ecirc;/g,  "\u00EA");
   stringToDecode = stringToDecode.replace(/&euml;/g,   "\u00EB");
   stringToDecode = stringToDecode.replace(/&hellip;/g, "\u2026");
   stringToDecode = stringToDecode.replace(/&igrave;/g, "\u00EC");
   stringToDecode = stringToDecode.replace(/&iacute;/g, "\u00ED");
   stringToDecode = stringToDecode.replace(/&icirc;/g,  "\u00EE");
   stringToDecode = stringToDecode.replace(/&iuml;/g,   "\u00EF");
   stringToDecode = stringToDecode.replace(/&ntilde;/g, "\u00F1");
   stringToDecode = stringToDecode.replace(/&ograve;/g, "\u00F2");
   stringToDecode = stringToDecode.replace(/&oacute;/g, "\u00F3");
   stringToDecode = stringToDecode.replace(/&ocirc;/g,  "\u00F4");
   stringToDecode = stringToDecode.replace(/&otilde;/g, "\u00F5");
   stringToDecode = stringToDecode.replace(/&ouml;/g,   "\u00F6");
   stringToDecode = stringToDecode.replace(/&oslash;/g, "\u00F8");
   stringToDecode = stringToDecode.replace(/&ugrave;/g, "\u00F9");
   stringToDecode = stringToDecode.replace(/&uacute;/g, "\u00FA");
   stringToDecode = stringToDecode.replace(/&ucirc;/g,  "\u00FB");
   stringToDecode = stringToDecode.replace(/&uuml;/g,   "\u00FC");
   stringToDecode = stringToDecode.replace(/&yuml;/g,   "\u00FF");
   stringToDecode = stringToDecode.replace(/&iquest;/g, "\u00BF");

   return stringToDecode;
}


/*
   Return a string where extended ASCII characters are replaced
   with their corresponding &xxxx; notation.
*/
function encodeString(stringToEncode) {
   stringToEncode = stringToEncode.replace(/\u00C0/g, "&Agrave;");
   stringToEncode = stringToEncode.replace(/\u00C1/g, "&Aacute;");
   stringToEncode = stringToEncode.replace(/\u00C2/g, "&Acirc;");
   stringToEncode = stringToEncode.replace(/\u00C3/g, "&Atilde;");
   stringToEncode = stringToEncode.replace(/\u00C4/g, "&Auml;");
   stringToEncode = stringToEncode.replace(/\u00C5/g, "&Aring;");
   stringToEncode = stringToEncode.replace(/\u00C6/g, "&AElig;");
   stringToEncode = stringToEncode.replace(/\u00C7/g, "&Ccedil;");
   stringToEncode = stringToEncode.replace(/\u00C8/g, "&Egrave;");
   stringToEncode = stringToEncode.replace(/\u00C9/g, "&Eacute;");
   stringToEncode = stringToEncode.replace(/\u00CA/g, "&Ecirc;");
   stringToEncode = stringToEncode.replace(/\u00CB/g, "&Euml;");
   stringToEncode = stringToEncode.replace(/\u00CC/g, "&Igrave;");
   stringToEncode = stringToEncode.replace(/\u00CD/g, "&Iacute;");
   stringToEncode = stringToEncode.replace(/\u00CE/g, "&Icirc;");
   stringToEncode = stringToEncode.replace(/\u00CF/g, "&Iuml;");
   stringToEncode = stringToEncode.replace(/\u00D1/g, "&Ntilde;");
   stringToEncode = stringToEncode.replace(/\u00D2/g, "&Ograve;");
   stringToEncode = stringToEncode.replace(/\u00D3/g, "&Oacute;");
   stringToEncode = stringToEncode.replace(/\u00D4/g, "&Ocirc;");
   stringToEncode = stringToEncode.replace(/\u00D5/g, "&Otilde;");
   stringToEncode = stringToEncode.replace(/\u00D6/g, "&Ouml;");
   stringToEncode = stringToEncode.replace(/\u00D8/g, "&Oslash;");
   stringToEncode = stringToEncode.replace(/\u00D9/g, "&Ugrave;");
   stringToEncode = stringToEncode.replace(/\u00DA/g, "&Uacute;");
   stringToEncode = stringToEncode.replace(/\u00DB/g, "&Ucirc;");
   stringToEncode = stringToEncode.replace(/\u00DC/g, "&Uuml;");
   stringToEncode = stringToEncode.replace(/\u00DF/g, "&szlig;");
   stringToEncode = stringToEncode.replace(/\u00E0/g, "&agrave;");
   stringToEncode = stringToEncode.replace(/\u00E1/g, "&aacute;");
   stringToEncode = stringToEncode.replace(/\u00E2/g, "&acirc;");
   stringToEncode = stringToEncode.replace(/\u00E3/g, "&atilde;");
   stringToEncode = stringToEncode.replace(/\u00E4/g, "&auml;");
   stringToEncode = stringToEncode.replace(/\u00E5/g, "&aring;");
   stringToEncode = stringToEncode.replace(/\u00E6/g, "&aelig;");
   stringToEncode = stringToEncode.replace(/\u00E7/g, "&ccedil;");
   stringToEncode = stringToEncode.replace(/\u00E8/g, "&egrave;");
   stringToEncode = stringToEncode.replace(/\u00E9/g, "&eacute;");
   stringToEncode = stringToEncode.replace(/\u00EA/g, "&ecirc;");
   stringToEncode = stringToEncode.replace(/\u00EB/g, "&euml;");
   stringToEncode = stringToEncode.replace(/\u2026/g, "&hellip;");
   stringToEncode = stringToEncode.replace(/\u00EC/g, "&igrave;");
   stringToEncode = stringToEncode.replace(/\u00ED/g, "&iacute;");
   stringToEncode = stringToEncode.replace(/\u00EE/g, "&icirc;");
   stringToEncode = stringToEncode.replace(/\u00EF/g, "&iuml;");
   stringToEncode = stringToEncode.replace(/\u00F1/g, "&ntilde;");
   stringToEncode = stringToEncode.replace(/\u00F2/g, "&ograve;");
   stringToEncode = stringToEncode.replace(/\u00F3/g, "&oacute;");
   stringToEncode = stringToEncode.replace(/\u00F4/g, "&ocirc;");
   stringToEncode = stringToEncode.replace(/\u00F5/g, "&otilde;");
   stringToEncode = stringToEncode.replace(/\u00F6/g, "&ouml;");
   stringToEncode = stringToEncode.replace(/\u00F8/g, "&oslash;");
   stringToEncode = stringToEncode.replace(/\u00F9/g, "&ugrave;");
   stringToEncode = stringToEncode.replace(/\u00FA/g, "&uacute;");
   stringToEncode = stringToEncode.replace(/\u00FB/g, "&ucirc;");
   stringToEncode = stringToEncode.replace(/\u00FC/g, "&uuml;");
   stringToEncode = stringToEncode.replace(/\u00FF/g, "&yuml;");
   stringToEncode = stringToEncode.replace(/\u00BF/g, "&iquest;");

   return stringToEncode;
}


/*
   Display an alert dialog where characters with notation &xxxx; are
   replaced with their corresponding ASCII values.
*/
function alertDecoded(message) {
   alert(decodeString(message));
}


/*
   Confirm di una stringa dove ai caratteri con notazione &xxxx; sono
   sostituiti i corrispondenti caratteri ASCII.
*/
function confirmDecoded(message) {
   return confirm(decodeString(message));
}


/*
   Return the mime-type of the resource by examinaning its extension.
   Return MIME_TYPE_UNKNOWN if the extension is unknown.
   Null extensions are not supported.
*/
function mimetypeFromExtension(extension) {
   if (extension == undefined)
      return MIME_TYPE_UNKNOWN;

   var mimeType = mimeMapping[extension.toLowerCase()];

   if (mimeType == undefined)
      mimeType = MIME_TYPE_UNKNOWN;

   return mimeType;
}


/*
   Return the mime-type of the resource by examinaning its name.
   Return MIME_TYPE_UNKNOWN if the extension is unknown.
*/
function mimetypeFromFile(file) {
   var dot = file.lastIndexOf(".");

   if (dot < 0)
      return MIME_TYPE_UNKNOWN;

   return mimetypeFromExtension(file.substr(dot + 1));
}


/*
   Return the extension of the given file by examinaning its name.
   Return an empty string if the extension is either null or unknown.
*/
function extensionFromFile(file) {
   var dot = file.lastIndexOf(".");

   if (dot < 0)
      return "";

   return file.substr(dot + 1);
}


/*
   Check whether the given extension is supported.
*/
function isFileSupported(fileExt,
                         supportedFormats) {
   if (trim(fileExt) == "" || supportedFormats == null || supportedFormats == undefined)
      return false;

   var supported = false;
   for (var i = 0; i < supportedFormats.length; i++) {
      if (fileExt.toLowerCase() == supportedFormats[i]) {
         supported = true;
         break;
      }
   }

   return supported;
}


/* Open link in a new window */
function openLink(url) {
   var pattern = "^(http://)(.)*$";
   var re = new RegExp(pattern);

   window.open(re.test(url) ? url : ("http://" + url));
}


/* Copy selected text into the clipboard */
function copyToClipboard(textToCopy) {
   var flashcopier = 'flashcopier';
   if (!document.getElementById(flashcopier)) {
      var divholder = document.createElement('div');
      divholder.id = flashcopier;
      document.body.appendChild(divholder);
   }
   document.getElementById(flashcopier).innerHTML = '';
   var divinfo = '<embed src="scripts/_clipboard.swf" FlashVars="clipboard=' + encodeURIComponent(textToCopy) + '" width="0" height="0" type="application/x-shockwave-flash"></embed>';
   document.getElementById(flashcopier).innerHTML = divinfo;
}


/*
  Return a random password of desired length
  (and with the given numbers of digits, if specified)
*/
function generateRandomPassword(length, numerics) {
   var alphabet = "abcdefghijklmnopqrstuvwxyz";
   var alphabetLength = alphabet.length;
   var password = new Array(length);

   /* Check (and fix inconsistency among) parameters */
   if (numerics == null || numerics == undefined)
      numerics = 0;
   if (numerics > length)
      numerics = length;

   var numericPosition = new Array();
   while (numericPosition.length < numerics) {
      var newPos = Math.floor(Math.random() * length);
      var skip = false;
      for (var i = 0; i < numericPosition.length; i++)
         if (numericPosition[i] == newPos) {
            skip = true;
            break; // already present
         }
      if (!skip)
         numericPosition.push(newPos);
   }

   /* Insert numeric characters */
   if (numerics > 0)
      for (var i = 0; i < numericPosition.length; i++)
         password[numericPosition[i]] = Math.floor(Math.random() * 10);

   /* Insert alphanumeric characters */
   for (var i = 0; i < length; i++)
      if (password[i] == null || password[i] == undefined || password[i] == "")
         password[i] = alphabet.charAt(Math.floor(Math.random() * alphabetLength));

   return password.join("");
}