Created
January 22, 2022 07:35
-
-
Save hendrasyp/5f7a8276ec72e52e60f47e52501c4972 to your computer and use it in GitHub Desktop.
JSCore By KiNET - Suhendra Yohana Putra
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| // Please see documentation at https://docs.microsoft.com/aspnet/core/client-side/bundling-and-minification | |
| // for details on configuring this project to bundle and minify static web assets. | |
| // Write your JavaScript code. | |
| /* CONSTANTS, GLOBAL VARIABLES */ | |
| let isSuperAdmin; | |
| let max_char_in_byte = 3915; | |
| let notyErr = 'error'; | |
| let notyOK = 'success'; | |
| let notyWarn = 'warning'; | |
| let notyInfo = 'info'; | |
| let blankString = ''; | |
| let NOTIFICATION_TIMEOUT = 3000; | |
| let DEFAULT_NOTIFICATION_TIMEOUT = 5000; | |
| let SUCCESS_NOTIFICATION_TIMEOUT = 5000; | |
| let ERROR_NOTIFICATION_TIMEOUT = 3000; | |
| var tbl; | |
| let tblData; | |
| var tblSelectedRow; | |
| var tblRowData; | |
| var tblRowIndex; | |
| var dtTableExportButtons = []; | |
| const contentWrapper = '#content-wrapper'; | |
| const RELOAD_NO_REPOST = 'reloadNoRefresh'; | |
| const RELOAD_REPOST = 'reload'; | |
| const BLANK_STRING = ''; | |
| const BREAK_LINE = '<br/>'; | |
| const EMPTY_STRING = ''; | |
| const FREE_OBJECT = {}; | |
| const NULL_OBJECT = {}; | |
| const MSG_SUCCESS = 'success'; | |
| const MSG_ERROR = 'error'; | |
| const MSG_ERROR_MAX = 'error_max'; | |
| const MSG_WARNING = 'warning'; | |
| const MSG_INFO = 'info'; | |
| const BUTTON_YES = 'Yes'; | |
| const BUTTON_NO = 'No'; | |
| const BUTTON_CANCEL = 'Cancel'; | |
| const MODAL_WIDTH_FULL = -1; // 100% | |
| const MODAL_WIDTH_1366 = 1366; | |
| const MODAL_WIDTH_1024 = 1024; | |
| const MODAL_WIDTH_800 = 800; | |
| const MODAL_WIDTH_600 = 600; | |
| const MODAL_WIDTH_400 = 400; | |
| const EVENT_CLICK = 'click'; | |
| const EVENT_SUBMIT = 'submit'; | |
| const EVENT_CHANGE = 'change'; | |
| const LINK_SEPARATOR = ' | '; | |
| const DTPICKER_DEFAULT_OPT = { | |
| autoclose: true, | |
| format: 'dd/mm/yyyy', | |
| todayBtn: "linked", | |
| clearBtn: false, | |
| todayHighlight: true | |
| }; | |
| let dynamicModalContainer = '#kiModalContainer'; | |
| var vmNet = { | |
| txtPreviewImage: function (input, element) { | |
| if (input.files && input.files[0]) { | |
| var reader = new FileReader(); | |
| reader.onload = function (e) { | |
| $(element).attr('value', e.target.result); | |
| } | |
| reader.readAsDataURL(input.files[0]); // convert to base64 string | |
| } | |
| }, | |
| previewImage: function (input, element) { | |
| if (input.files && input.files[0]) { | |
| var reader = new FileReader(); | |
| reader.onload = function (e) { | |
| $(element).attr('src', e.target.result); | |
| } | |
| reader.readAsDataURL(input.files[0]); // convert to base64 string | |
| } | |
| }, | |
| message: { | |
| type: { | |
| success: 'success', | |
| error: 'error', | |
| warn: 'warning' | |
| }, | |
| }, | |
| validation: { | |
| isRequired: 'required', | |
| defaultRequired: 'This field is required', | |
| errorValidation: 'Please fill in the blank field(s)' | |
| }, | |
| dialog: { | |
| message: '', | |
| confirmation: function (acceptButton, rejectButton, callback, param) { | |
| let dialogBox = new Noty({ | |
| text: vmNet.dialog.message, | |
| dismissQueue: true, | |
| layout: 'center', | |
| closeWith: ['button'], | |
| modal: true, | |
| theme: 'metroui', | |
| callback: { | |
| onCloseClick: function () { | |
| dialogBox.close(); | |
| }, | |
| }, | |
| buttons: [ | |
| Noty.button(acceptButton, 'btn btn-success', function () { | |
| callback(param); | |
| dialogBox.close(); | |
| }, { | |
| id: 'btnDialogOk', | |
| 'data-status': 'ok', | |
| 'style': 'margin-right: 5px;' | |
| }), | |
| Noty.button(rejectButton, 'btn btn-danger', function () { | |
| dialogBox.close(); | |
| }, { | |
| id: 'btnDialogCancel', | |
| 'data-status': 'cancel' | |
| }) | |
| ] | |
| }); | |
| dialogBox.show(); | |
| }, | |
| // confirm: function (args) { | |
| // let dialogBox = new Noty({ | |
| // text: args.message, | |
| // dismissQueue: true, | |
| // layout: 'center', | |
| // closeWith: ['button'], | |
| // modal: true, | |
| // theme: 'metroui', | |
| // callback: { | |
| // onCloseClick: function () { | |
| // dialogBox.close(); | |
| // }, | |
| // }, | |
| // buttons: [ | |
| // Noty.button(args.firstButton, 'btn ' + args.firstButtonStyle, function () { | |
| // args.onFirstButtonClick(args.firstParam); | |
| // dialogBox.close(); | |
| // }, { | |
| // id: 'btnDialogOk', | |
| // 'data-status': 'ok', | |
| // 'style': 'margin-right: 5px;' | |
| // }), | |
| // Noty.button(args.lastButton, 'btn ' + args.lastButtonStyle, function () { | |
| // args.onLastButtonClick(args.lastParam); | |
| // dialogBox.close(); | |
| // }, { | |
| // id: 'btnDialogCancel', | |
| // 'data-status': 'cancel' | |
| // }) | |
| // ] | |
| // }); | |
| // dialogBox.show(); | |
| // }, | |
| // dialogOKCancelWithAction: function (msg, callback, callbackCancel, param) { | |
| // let dialogBox = new Noty({ | |
| // text: msg, | |
| // dismissQueue: true, | |
| // layout: 'center', | |
| // closeWith: ['button'], | |
| // modal: true, | |
| // theme: 'metroui', | |
| // callback: { | |
| // onCloseClick: function () { | |
| // callbackCancel(param); | |
| // }, | |
| // }, | |
| // buttons: [ | |
| // Noty.button('YES', 'btn btn-success', function () { | |
| // callback(param); | |
| // dialogBox.close(); | |
| // }, { | |
| // id: 'btnDialogOk', | |
| // 'data-status': 'ok', | |
| // 'style': 'margin-right: 5px;' | |
| // }), | |
| // Noty.button('NO', 'btn btn-danger', function () { | |
| // callbackCancel(param); | |
| // dialogBox.close(); | |
| // }, { | |
| // id: 'btnDialogCancel', | |
| // 'data-status': 'cancel' | |
| // }) | |
| // ] | |
| // }); | |
| // dialogBox.show(); | |
| // }, | |
| // dialog: function (msg, callback, param) { | |
| // let dialogBox = new Noty({ | |
| // text: msg, | |
| // layout: 'center', | |
| // closeWith: ['click'], | |
| // modal: true, | |
| // theme: 'metroui', | |
| // buttons: [ | |
| // Noty.button('YES', 'btn btn-success', function () { | |
| // callback(param); | |
| // dialogBox.close(); | |
| // }, { | |
| // id: 'btnDialogOk', | |
| // 'data-status': 'ok', | |
| // 'style': 'margin-right: 5px;' | |
| // }), | |
| // Noty.button('NO', 'btn btn-danger', function () { | |
| // dialogBox.close(); | |
| // }, { | |
| // id: 'btnDialogCancel', | |
| // 'data-status': 'cancel' | |
| // }) | |
| // ] | |
| // }); | |
| // dialogBox.show(); | |
| // }, | |
| // dialogOK: function (msg, callback, param) { | |
| // let dialogBox = new Noty({ | |
| // text: msg, | |
| // layout: 'center', | |
| // timeout: 10000, | |
| // closeWith: ['click', 'timeout'], | |
| // modal: true, | |
| // theme: 'metroui', | |
| // buttons: [ | |
| // Noty.button('OK', 'btn btn-success', function () { | |
| // callback(param); | |
| // dialogBox.close(); | |
| // }, { | |
| // id: 'btnDialogOk', | |
| // 'data-status': 'ok', | |
| // 'style': 'margin-right: 5px;' | |
| // }), | |
| // ] | |
| // }); | |
| // dialogBox.show(); | |
| // }, | |
| // dialogNoAction: function (msg) { | |
| // let dialogBox = new Noty({ | |
| // text: msg, | |
| // layout: 'center', | |
| // closeWith: ['click', 'timeout'], | |
| // timeout: 3000, | |
| // modal: true, | |
| // theme: 'metroui', | |
| // buttons: [ | |
| // Noty.button('OK', 'btn btn-success', function () { | |
| // dialogBox.close(); | |
| // }, { | |
| // id: 'btnDialogOk', | |
| // 'data-status': 'ok', | |
| // 'style': 'margin-right: 5px;' | |
| // }), | |
| // ] | |
| // }); | |
| // dialogBox.show(); | |
| // }, | |
| // dialogOkOnly: function (msg) { | |
| // let dialogBox = new Noty({ | |
| // text: msg, | |
| // layout: 'center', | |
| // closeWith: ['click'], | |
| // modal: true, | |
| // theme: 'metroui', | |
| // buttons: [ | |
| // Noty.button('OK', 'btn btn-success', function () { | |
| // dialogBox.close(); | |
| // }, { | |
| // id: 'btnDialogOk', | |
| // 'data-status': 'ok', | |
| // 'style': 'margin-right: 5px;' | |
| // }), | |
| // ] | |
| // }); | |
| // dialogBox.show(); | |
| // }, | |
| // | |
| // validationMsg: function () { | |
| // let optionsDefault = { | |
| // type: 'error', | |
| // text: 'Please enter Required value', | |
| // layout: 'topRight', | |
| // timeout: 500, | |
| // closeWith: ['click', 'timeout'], | |
| // progressBar: true, | |
| // modal: true, | |
| // theme: 'metroui' | |
| // }; | |
| // new Noty(optionsDefault).show(); | |
| // }, | |
| }, | |
| notification: { | |
| show: function (msg, type, redirect, timeout) { | |
| timeout = timeout || DEFAULT_NOTIFICATION_TIMEOUT; | |
| const optionsDefault = { | |
| type: type, | |
| text: msg, | |
| layout: 'topRight', | |
| timeout: timeout, | |
| closeWith: ['click', 'timeout'], | |
| progressBar: true, | |
| modal: true, | |
| theme: 'metroui' | |
| }; | |
| new Noty(optionsDefault).on('onClose', function () { | |
| if (redirect != '') { | |
| if (redirect === 'reloadNoRefresh') { | |
| window.top.location = window.top.location; | |
| } else if (redirect === 'reload') { | |
| //window.top.location = window.top.location; | |
| location.reload(); | |
| } else { | |
| window.location.href = redirect; | |
| // setTimeout(function () { | |
| // | |
| // }, timeout); | |
| } | |
| } | |
| }).show(); | |
| } | |
| }, | |
| modal: { | |
| makeDraggable: false, | |
| close: function () { | |
| $(dynamicModalContainer).modal('hide'); | |
| vmNet.modal.makeDraggable = false; | |
| }, | |
| show: function (url, title, postData) { | |
| let element = '.content-wrapper' | |
| if (postData) { | |
| $.ajax({ | |
| url: url, | |
| type: "POST", | |
| dataType: "html", | |
| contentType: "application/json; charset=utf-8", | |
| data: JSON.stringify(postData), | |
| beforeSend: function () { | |
| $(element).LoadingOverlay("show", { | |
| image: '', | |
| background: "rgba(255, 255, 255, 0.2)", | |
| size: "60", | |
| maxSize: "60", | |
| minSize: "50", | |
| fontawesome: 'fa fa-refresh fa-spin' | |
| }); | |
| }, | |
| complete: function (e) { | |
| $(element).LoadingOverlay("hide", true); | |
| }, | |
| error: function (xhr, ajaxOptions, thrownError) { | |
| switch (xhr.status) { | |
| case 404: | |
| vmNet.notification.show("The page you requested not found.", MSG_ERROR, BLANK_STRING); | |
| break; | |
| case 400: | |
| vmNet.notification.show("Bad Request. Check your parameter request.", MSG_ERROR, BLANK_STRING); | |
| break; | |
| case 403: | |
| vmNet.notification.show("You don't have authorization to access requested page.", MSG_ERROR, BLANK_STRING); | |
| break; | |
| case 500: | |
| dipNotification.show("Internal server error. Please check the requested page.", MSG_ERROR, BLANK_STRING); | |
| break; | |
| } | |
| return false; | |
| }, | |
| success: function (html) { | |
| $(dynamicModalContainer + ' .modal-title').text(title); | |
| $(dynamicModalContainer + ' .modal-body').html(html); | |
| $(dynamicModalContainer).modal('show', { | |
| backdrop: 'static', | |
| keyboard: false | |
| }); | |
| if (vmNet.modal.makeDraggable === true) { | |
| $(dynamicModalContainer).draggable({ | |
| handle: ".modal-header" | |
| }); | |
| $(".modal").css('background', 'none'); | |
| } | |
| } | |
| }); | |
| } else { | |
| $.ajax({ | |
| url: url, | |
| success: function (html) { | |
| $(dynamicModalContainer + ' .modal-title').text(title); | |
| $(dynamicModalContainer + ' .modal-body').html(html); | |
| $(dynamicModalContainer).modal('show', { | |
| backdrop: 'static', | |
| keyboard: false | |
| }); | |
| } | |
| }); | |
| } | |
| }, | |
| width: function (w) { | |
| $(dynamicModalContainer).on('shown.bs.modal', function () { | |
| if (w == -1) { | |
| $(this).find('.modal-dialog').css({ | |
| width: '100%', //probably not needed | |
| height: 'auto', //probably not needed | |
| 'max-height': '100%' | |
| }); | |
| } else { | |
| $(this).find('.modal-dialog').css({ | |
| width: w + 'px', //probably not needed | |
| height: 'auto', //probably not needed | |
| 'max-height': '100%' | |
| }); | |
| } | |
| }); | |
| }, | |
| }, | |
| grid: { | |
| extractDataAttr: function (attr) { | |
| let dataAttr = ""; | |
| Object.keys(attr).forEach(function (key) { | |
| dataAttr = dataAttr + 'data-' + key + '="' + attr[key] + '" '; | |
| }); | |
| return dataAttr; | |
| }, | |
| generateActionLink: function (args, data, separator) { | |
| let noUrl = 'javascript:void(0)'; | |
| let uri = ''; | |
| let icon = 'fa-heart'; | |
| let dummy = [ | |
| { | |
| "class": "edit", | |
| "label": "label edit", | |
| "url": null, | |
| "withPermission": false, | |
| "permissions": { | |
| "admin": true, | |
| "itsupport": true | |
| } | |
| }, | |
| { | |
| "class": "delete", | |
| "label": "Delete", | |
| "url": null, | |
| "withPermission": false, | |
| "permissions": { | |
| "admin": true, | |
| "itsupport": true | |
| } | |
| } | |
| ]; | |
| let btnLinks = []; | |
| for (let idx = 0; idx < args.length; idx++) { | |
| if (args[idx].url === null) { | |
| uri = noUrl; | |
| } | |
| if (args[idx].icon === null) { | |
| args[idx].icon = icon; | |
| } | |
| if (args[idx].label === null) { | |
| btnLinks[idx] = '<a href="' + uri + '" title="' + args[idx].label + '" class="btn btn-' + args[idx].color + ' btn-flat ' + args[idx].class + '" ' + vmNet.grid.extractDataAttr(data) + ' ><i class="fas fa-' + args[idx].icon + '"></i></a>'; | |
| } else { | |
| btnLinks[idx] = '<a href="' + uri + '" title="' + args[idx].label + '" class="btn btn-' + args[idx].color + ' btn-flat ' + args[idx].class + '" ' + vmNet.grid.extractDataAttr(data) + ' ><i class="fas fa-' + args[idx].icon + '"></i>' + args[idx].label + '</a>'; | |
| } | |
| } | |
| // console.log(btnLinks.join(' | ')); | |
| return '<div class="btn-group">' + btnLinks.join(separator) + '</div>'; | |
| }, | |
| checkBoxSelector: 'input[type="checkbox"]', | |
| selectAllId: '#select_all', | |
| summarized: { | |
| render: function (api, colsToSum, intVal) { | |
| let me = vmNet.grid.summarized; | |
| let total = 0; // Total over all pages | |
| let totalPerPage = 0; // Total over this page | |
| let idx = 0; | |
| if (Array.isArray(colsToSum)) { | |
| for (idx = 0; idx < colsToSum.length; idx++) { | |
| total = me.getTotal(api, colsToSum[idx], intVal); | |
| totalPerPage = me.getPageTotal(api, colsToSum[idx], intVal); | |
| me.renderFooter(api, colsToSum[idx], totalPerPage, total); | |
| } | |
| } else { | |
| total = me.getTotal(api, colsToSum, intVal); | |
| totalPerPage = me.getPageTotal(api, colsToSum, intVal); | |
| me.renderFooter(api, colsToSum, totalPerPage, total); | |
| } | |
| }, | |
| getTotal: function (api, colIndex, intVal) { | |
| return api | |
| .column(colIndex) | |
| .data() | |
| .reduce(function (a, b) { | |
| return intVal(a) + intVal(b); | |
| }, 0); | |
| }, | |
| getPageTotal: function (api, colIndex, intVal) { | |
| return api | |
| .column(colIndex, { page: 'current' }) | |
| .data() | |
| .reduce(function (a, b) { | |
| return intVal(a) + intVal(b); | |
| }, 0); | |
| }, | |
| renderFooter: function (api, colIndex, pageTotal, total) { | |
| $(api.column(colIndex).footer()).html( | |
| //'$' + pageTotal + ' ( $' + total + ' total)' | |
| // dtTableNumericVar(pageTotal) + ' of ' + dtTableNumericVar(total) + ' total.' | |
| dtTableNumericVar(pageTotal) | |
| // pageTotal + 'of ( $' + total + ' total)' | |
| ); | |
| } | |
| }, | |
| formatter: { | |
| number: function (thousands, decimal, precision, prefix, postfix) { | |
| return $.fn.dataTable.render.number(thousands, decimal, precision, prefix, postfix); | |
| } | |
| }, | |
| generateTopButton: { | |
| onRight: function () { | |
| $(".dataTables_wrapper div.dt-buttons").addClass("float-right").css({ "position": "initial" }); | |
| }, | |
| onLeft: function () { | |
| $(".dataTables_wrapper div.dt-buttons").css({ "position": "initial" }); | |
| } | |
| }, | |
| getData: function (el) { | |
| let tbl = $(el).DataTable(); | |
| return tbl.rows().data(); | |
| }, | |
| getDataLength: function (el) { | |
| let tbl = $(el).DataTable(); | |
| return tbl.rows().data().length; | |
| }, | |
| getRowData: function (el, obj) { | |
| let tbl = $(el).DataTable(); | |
| return tbl.row(obj.parents('tr')).data(); | |
| }, | |
| getRowSelectedData: function (el) { | |
| let tbl = $(el).DataTable(); | |
| return tbl.row({ selected: true }).data(); | |
| }, | |
| getRowIndex: function (el, obj) { | |
| let tbl = $(el).DataTable(); | |
| return tbl.row(obj.parents('tr')).index(); | |
| }, | |
| onWindowResize: function (el) { | |
| let table = el.DataTable(); | |
| table.columns.adjust().draw(); | |
| } | |
| }, | |
| dateHelper: { | |
| dtPicker: { | |
| alwaysOnTop: function (el) { | |
| el.on('show', function () { | |
| $(".datepicker").css('z-index', 9999); | |
| }).datepicker(); | |
| } | |
| }, | |
| isoToDate: function (isoDate) { | |
| let date = new Date(isoDate); | |
| let year = date.getFullYear(); | |
| let month = date.getMonth() + 1; | |
| let dt = date.getDate(); | |
| if (dt < 10) { | |
| dt = '0' + dt; | |
| } | |
| if (month < 10) { | |
| month = '0' + month; | |
| } | |
| return dt + '/' + month + '/' + year; | |
| }, | |
| getCurrentDate: function (inFormat) { | |
| let today = new Date(); | |
| let dd = today.getDate(); | |
| let mm = today.getMonth() + 1; | |
| const yyyy = today.getFullYear(); | |
| if (dd < 10) { | |
| dd = `0${dd}`; | |
| } | |
| if (mm < 10) { | |
| mm = `0${mm}`; | |
| } | |
| // today = `${mm}-${dd}-${yyyy}`; | |
| return inFormat.toString().replace('dd', dd.toString()) | |
| .replace('mm', mm.toString()) | |
| .replace('yyyy', yyyy.toString()); | |
| }, | |
| getFullYear: { | |
| fromDtPicker: function (objDate) { | |
| if (objDate.length > 0) { | |
| let strDate = objDate.split('/'); | |
| let space = ' '; | |
| let delimiter = '-'; | |
| let year = strDate[2]; | |
| let month = strDate[1]; | |
| let date = strDate[0]; | |
| let newDate = year + delimiter + month + delimiter + date; | |
| return moment(newDate, 'YYYY-MM-DD').format('YYYY'); | |
| } else { | |
| return ''; | |
| } | |
| } | |
| }, | |
| getMonth: { | |
| fromDtPicker: function (objDate) { | |
| if (objDate.length > 0) { | |
| let strDate = objDate.split('/'); | |
| let space = ' '; | |
| let delimiter = '-'; | |
| let year = strDate[2]; | |
| let month = strDate[1]; | |
| let date = strDate[0]; | |
| let newDate = year + delimiter + month + delimiter + date; | |
| return moment(newDate, 'YYYY-MM-DD').format('MMMM'); | |
| } else { | |
| return ''; | |
| } | |
| } | |
| }, | |
| // dd/MM/yyyy to yyyy-MM-dd hh:mm:ss | |
| toTimeStamp: function (objDate) { | |
| let strDate = objDate.split('/'); | |
| let space = ' '; | |
| let delimiter = '-'; | |
| let time = '00:00:00'; | |
| let year = strDate[2]; | |
| let month = strDate[1]; | |
| let date = strDate[0]; | |
| return year + delimiter + month + delimiter + date + space + time; | |
| }, | |
| timeStampToDate: function (objTimeStamp) { | |
| let strDate = objTimeStamp.split(' '); | |
| strDate = strDate[0].split('-'); | |
| let space = ' '; | |
| let delimiter = '/'; | |
| let year = strDate[0]; | |
| let month = strDate[1]; | |
| let date = strDate[2]; | |
| return date + delimiter + month + delimiter + year; | |
| }, | |
| // dd/MM/yyyy to yyyy-MM-dd | |
| toSqlDate: function (objDate) { | |
| if (objDate.length > 0) { | |
| let strDate = objDate.split('/'); | |
| let space = ' '; | |
| let delimiter = '-'; | |
| let year = strDate[2]; | |
| let month = strDate[1]; | |
| let date = strDate[0]; | |
| return year + delimiter + month + delimiter + date; | |
| } else { | |
| return ''; | |
| } | |
| }, | |
| // return MM-DD-YYYY | |
| toMomentValidFormat(objDate, format) { | |
| if (objDate.length > 0) { | |
| const dateValue = objDate; | |
| const newDate = new Date(dateValue); | |
| if (format !== '') { | |
| return moment(newDate).format(format); | |
| } else { | |
| return moment(newDate).format('DD/MM/YYYY'); | |
| } | |
| } else { | |
| return ''; | |
| } | |
| }, | |
| }, | |
| general: { | |
| browserClientInfo: function () { | |
| "undefined" != typeof jQuery ? console.log("jQuery Version", jQuery.fn.jquery) : console.log("jQuery library is not found!"); | |
| navigator.appVersion; | |
| var n, e, r, o = navigator.userAgent, a = navigator.appName, i = "" + parseFloat(navigator.appVersion), | |
| s = parseInt(navigator.appVersion, 10); | |
| -1 != (e = o.indexOf("OPR/")) ? (a = "Opera", i = o.substring(e + 4)) : -1 != (e = o.indexOf("Opera")) ? (a = "Opera", i = o.substring(e + 6), -1 != (e = o.indexOf("Version")) && (i = o.substring(e + 8))) : -1 != (e = o.indexOf("MSIE")) ? (a = "Microsoft Internet Explorer", i = o.substring(e + 5)) : -1 != (e = o.indexOf("Chrome")) ? (a = "Chrome", i = o.substring(e + 7)) : -1 != (e = o.indexOf("Safari")) ? (a = "Safari", i = o.substring(e + 7), -1 != (e = o.indexOf("Version")) && (i = o.substring(e + 8))) : -1 != (e = o.indexOf("Firefox")) ? (a = "Firefox", i = o.substring(e + 8)) : (n = o.lastIndexOf(" ") + 1) < (e = o.lastIndexOf("/")) && (a = o.substring(n, e), i = o.substring(e + 1), a.toLowerCase() == a.toUpperCase() && (a = navigator.appName)), -1 != (r = i.indexOf(";")) && (i = i.substring(0, r)), -1 != (r = i.indexOf(" ")) && (i = i.substring(0, r)), s = parseInt("" + i, 10), isNaN(s) && (i = "" + parseFloat(navigator.appVersion), s = parseInt(navigator.appVersion, 10)), console.log("Cookie Enabled", navigator.cookieEnabled), console.log("Browser: ", a + "(" + i + ")"), console.log("Navigator: ", navigator.appName), console.log("User Agent: ", navigator.userAgent); | |
| var t = "Unknown OS"; | |
| -1 != navigator.appVersion.indexOf("Win") && (t = "Windows"), -1 != navigator.appVersion.indexOf("Mac") && (t = "MacOS"), -1 != navigator.appVersion.indexOf("X11") && (t = "UNIX"), -1 != navigator.appVersion.indexOf("Linux") && (t = "Linux"), console.log("OS: ", t) | |
| }, | |
| checkBrowser: function () { | |
| var browser; | |
| c = navigator.userAgent.search("Chrome"); | |
| f = navigator.userAgent.search("Firefox"); | |
| m8 = navigator.userAgent.search("MSIE 8.0"); | |
| m9 = navigator.userAgent.search("MSIE 9.0"); | |
| if (c > -1) { | |
| browser = "Chrome"; | |
| } else if (f > -1) { | |
| browser = "Firefox"; | |
| } else if (m9 > -1) { | |
| browser = "MSIE 9.0"; | |
| } else if (m8 > -1) { | |
| browser = "MSIE 8.0"; | |
| } | |
| return browser; | |
| }, | |
| browserMust: function (force) { | |
| if (vmNet.general.checkBrowser() !== force) { | |
| //window.location.href = "/dashboard"; | |
| } | |
| } | |
| }, | |
| ajax: { | |
| statusCode: { | |
| 400: function () { | |
| console.log("Error 400", "BadRequest."); | |
| }, 404: function () { | |
| console.log("Error 404", "Page Not Found."); | |
| }, 500: function () { | |
| console.log("Error 500", "Internal Server Error."); | |
| } | |
| }, | |
| post: function (destination, data, element) { | |
| if (element == blankString || typeof element === 'undefined' || !element || element === null) { | |
| element = "#content-wrapper"; | |
| } | |
| return $.ajax({ | |
| url: destination, | |
| type: "POST", | |
| dataType: "JSON", | |
| contentType: "application/json", | |
| data: JSON.stringify(data), | |
| statusCode: this.statusCode, | |
| beforeSend: function () { | |
| $(element).LoadingOverlay("show", { | |
| image: '', | |
| background: "rgba(165, 168, 172, 0)", | |
| size: "60", | |
| maxSize: "60", | |
| minSize: "50", | |
| fontawesome: 'fa fa-refresh fa-spin' | |
| }); | |
| }, | |
| complete: function (e) { | |
| $(element).LoadingOverlay("hide", true); | |
| }, | |
| error: function (xhr, ajaxOptions, thrownError) { | |
| switch (xhr.status) { | |
| case 404: | |
| dipNotification.show("The page you requested not found.", "error", ""); | |
| break; | |
| case 400: | |
| dipNotification.show("Bad Request. Check your parameter request.", "error", ""); | |
| break; | |
| case 403: | |
| dipNotification.show("You don't have authorization to access requested page.", "error", ""); | |
| break; | |
| case 500: | |
| dipNotification.show("Internal server error. Please check the requested page. <br/> Error details: " + xhr.responseText, "error", ""); | |
| break; | |
| } | |
| return false; | |
| } | |
| }); | |
| }, | |
| }, | |
| // Event | |
| goToURL: function (page) { | |
| window.location.href = page; | |
| }, | |
| validator: { | |
| validateFileInput: function (el) { | |
| if (el.hasClass("error-ext").toString() === 'true') { | |
| return false; | |
| } else { | |
| return true; | |
| } | |
| }, | |
| isGreaterThanEquals: function (a, b) { | |
| // const x = new Date('07/09/2020'); | |
| // const y = new Date('04/09/1986'); | |
| const x = new Date(a); | |
| const y = new Date(b); | |
| return (x >= y); | |
| }, | |
| isEmailAddress: function (val) { | |
| var pattern = /^\w+([\.-]?\w+)*@\w+([\.-]?\w+)*(\.\w{2,3})+$/; | |
| return pattern.test(val); // returns a boolean | |
| }, | |
| isNotEmpty: function (val) { | |
| var pattern = /\S+/; | |
| return pattern.test(val); // returns a boolean | |
| }, | |
| isNumber: function (val) { | |
| var pattern = /^\d+$/; | |
| return pattern.test(val); // returns a boolean | |
| }, | |
| is123: function (val) { | |
| var pattern = /^[0-2]+$/; | |
| return pattern.test(val); // returns a boolean | |
| }, | |
| isSame: function (val1, val2) { | |
| return val1 === val2; | |
| }, | |
| }, | |
| generateLink: function (url, title, target) { | |
| if (target != '') { | |
| return '<a class="goto" href="javascript:void(0)" data-url="' + url + '" title="">' + title + '</a>'; | |
| } else { | |
| return '<a class="goto" target="' + target + '" href="javascript:void(0)" data-url="' + url + '" title="">' + title + '</a>'; | |
| } | |
| }, | |
| checkExtension: function (input, forceExt) { | |
| if (!input.files || !input.files[0]) { | |
| return; | |
| } | |
| const name = input.files[0].name; | |
| const lastDot = name.lastIndexOf('.'); | |
| const fileName = name.substring(0, lastDot); | |
| const ext = name.substring(lastDot + 1); | |
| // console.log(ext); | |
| // console.log(forceExt.toLowerCase()); | |
| if (ext.toLowerCase() !== forceExt.toLowerCase()) { | |
| $(input).addClass("error-ext"); | |
| $(input).after("<span class='error-ext_span' style=\"color:#ff0000;font-style:italic;font-size:12px;\">Please use *." + forceExt + " file.</span>"); | |
| } else { | |
| $(input).removeClass("error-ext"); | |
| $(".error-ext_span").remove(); | |
| } | |
| } | |
| } | |
| if (window.addEventListener) { | |
| window.addEventListener('load', vmNet.general.browserMust("Firefox"), false); | |
| } else if (window.attachEvent) { | |
| // window.attachEvent('onload', dip.speedTest.InitiateSpeedDetection); | |
| } | |
| // KEYBOARD/DOM/MOUSE EVENT | |
| $(document).off("keydown", "form"); | |
| $(document).on("keydown", "form", function (e) { | |
| if (e.which === 13) { | |
| var className = e.target.parentNode.className; | |
| if (!$(e.target).is('textarea') && className !== 'bootstrap-tagsinput') { | |
| e.preventDefault(); | |
| console.error("ENTER-KEY PREVENTED ON NON-TEXTAREA ELEMENTS"); | |
| } | |
| } | |
| }); | |
| $(document).off(EVENT_CLICK, '#select_all'); | |
| $(document).on(EVENT_CLICK, '#select_all', function (e) { | |
| var table = $(e.target).closest('table'); | |
| $('td input:checkbox', table).prop('checked', this.checked); | |
| }); | |
| $(document).off(EVENT_CLICK, '#btnBackToPage'); | |
| $(document).on(EVENT_CLICK, '#btnBackToPage', function (e) { | |
| vmNet.goToURL($(this).data('backpage')); | |
| }); | |
| $(document).off(EVENT_CLICK, 'a.goto'); | |
| $(document).on(EVENT_CLICK, 'a.goto', function (e) { | |
| vmNet.goToURL($(this).data('url')); | |
| }); | |
| $(document).off(EVENT_SUBMIT, '.preventSubmit'); | |
| $(document).on(EVENT_SUBMIT, '.preventSubmit', function (e) { | |
| e.preventDefault(); | |
| }); | |
| $(document).off(EVENT_SUBMIT, '.prevent-submit'); | |
| $(document).on(EVENT_SUBMIT, '.prevent-submit', function (e) { | |
| e.preventDefault(); | |
| }); | |
| $(document).off(EVENT_CHANGE, '.forcePDF'); | |
| $(document).on(EVENT_CHANGE, '.forcePDF', function () { | |
| vmNet.checkExtension(this, 'pdf'); | |
| }); | |
| $(document).off(EVENT_CHANGE, '.forceXlsx'); | |
| $(document).on(EVENT_CHANGE, '.forceXlsx', function () { | |
| vmNet.checkExtension(this, 'xlsx'); | |
| }); | |
| $(document).off('keydown', 'input[pattern]'); | |
| $(document).on('keydown', 'input[pattern]', function (e) { | |
| var input = $(this); | |
| var oldVal = input.val(); | |
| var regex = new RegExp(input.attr('pattern'), 'g'); | |
| setTimeout(function () { | |
| var newVal = input.val(); | |
| if (!regex.test(newVal)) { | |
| input.val(oldVal); | |
| } | |
| }, 0); | |
| }); | |
| $(document).off(EVENT_CLICK, ".btn-modal-cancel"); | |
| $(document).on(EVENT_CLICK, ".btn-modal-cancel", function (e) { | |
| e.preventDefault(); | |
| vmNet.modal.close(); | |
| }); | |
| $(document).off('shown.bs.modal'); | |
| $(document).on('shown.bs.modal', function (e) { | |
| $.fn.dataTable.tables({ visible: true, api: true }).columns.adjust(); | |
| }); | |
| (function ($) { | |
| $.fn.inputFilter = function (inputFilter) { | |
| return this.on("input keydown keyup mousedown mouseup select contextmenu drop", function () { | |
| if (inputFilter(this.value)) { | |
| this.oldValue = this.value; | |
| this.oldSelectionStart = this.selectionStart; | |
| this.oldSelectionEnd = this.selectionEnd; | |
| } else if (this.hasOwnProperty("oldValue")) { | |
| this.value = this.oldValue; | |
| this.setSelectionRange(this.oldSelectionStart, this.oldSelectionEnd); | |
| } else { | |
| this.value = ""; | |
| } | |
| }); | |
| }; | |
| }(jQuery)); | |
| // Restricts input for the set of matched elements to the given inputFilter function. | |
| $(document).ready(function () { | |
| //let loggedUserRoleList = $("#hidUserRoleList").val(); | |
| //isSuperAdmin = loggedUserRoleList.includes("administrator"); | |
| //_setVal('hidIsSuperAdmin', isSuperAdmin); | |
| $('.tooltip').tooltip(); | |
| // https://jsfiddle.net/emkey08/tvx5e7q3 | |
| $(".integer").inputFilter(function (value) { | |
| return /^-?\d*$/.test(value); | |
| }); | |
| $(".uint").inputFilter(function (value) { | |
| return /^\d*$/.test(value); | |
| }); | |
| $(".float").inputFilter(function (value) { | |
| return /^-?\d*[.,]?\d*$/.test(value); | |
| }); | |
| $(".currency").inputFilter(function (value) { | |
| return /^-?\d*[.,]?\d{0,2}$/.test(value); | |
| }); | |
| $(".latin").inputFilter(function (value) { | |
| return /^[a-z]*$/i.test(value); | |
| }); | |
| $(".hex").inputFilter(function (value) { | |
| return /^[0-9a-f]*$/i.test(value); | |
| }); | |
| $('.datepicker').datepicker(DTPICKER_DEFAULT_OPT); | |
| //Timepicker | |
| //$('.timepicker').timepicker({ | |
| // showInputs: false | |
| //}); | |
| $('input').attr('autocomplete', 'off'); | |
| $('form').attr('autocomplete', 'off'); | |
| $(':input').on('focus', function () { | |
| $(this).attr('autocomplete', 'off') | |
| }); | |
| $('.has-tooltip').tooltip(); | |
| //Initialize Select2 Elements | |
| $('.select2bs4').select2({ | |
| theme: 'bootstrap4' | |
| }); | |
| }); | |
| /* TRIGGER EVENT UNTUK ELEMENT YANG BELUM ADA SEBELUMNYA :: LIVE EVENT */ | |
| /* EXTERNAL FUNCTION */ | |
| function textAreaCounter(val, maxchar) { | |
| var len = val.value.length; | |
| var tmp = 0 | |
| var oldValue = val.value; | |
| tmp = maxchar - len | |
| if (len > maxchar) { | |
| $("#charNum").css("color", "red"); | |
| } else { | |
| $("#charNum").css("color", "#333"); | |
| } | |
| $('#charNum').text(tmp + ' Characters left from ' + maxchar); | |
| }; | |
| function countChar(val) { | |
| var len = val.value.length; | |
| var tmp = 0 | |
| var oldValue = val.value; | |
| tmp = max_char_in_byte - len | |
| if (len > max_char_in_byte) { | |
| $("#charNum").css("color", "red"); | |
| } else { | |
| $("#charNum").css("color", "#333"); | |
| } | |
| $('#charNum').text(tmp + ' Characters left from ' + max_char_in_byte); | |
| }; | |
| // var mynumber = 500000; | |
| // (cicilan).formatMoney(0, ',', '.') | |
| Number.prototype.formatMoney = function (c, d, t) { | |
| var n = this, | |
| c = isNaN(c = Math.abs(c)) ? 2 : c, | |
| d = d == undefined ? "." : d, | |
| t = t == undefined ? "," : t, | |
| s = n < 0 ? "-" : "", | |
| i = parseInt(n = Math.abs(+n || 0).toFixed(c)) + "", | |
| j = (j = i.length) > 3 ? j % 3 : 0; | |
| return s + (j ? i.substr(0, j) + t : "") + i.substr(j).replace(/(\d{3})(?=\d)/g, "$1" + t) + (c ? d + Math.abs(n - i).toFixed(c).slice(2) : ""); | |
| }; | |
| jQuery.extend(jQuery.fn.dataTableExt.oSort, { | |
| "numeric-comma-pre": function (a) { | |
| var x = (a == "-") ? 0 : a.replace(/,/, "."); | |
| return parseFloat(x); | |
| }, | |
| "numeric-comma-asc": function (a, b) { | |
| return ((a < b) ? -1 : ((a > b) ? 1 : 0)); | |
| }, | |
| "numeric-comma-desc": function (a, b) { | |
| return ((a < b) ? 1 : ((a > b) ? -1 : 0)); | |
| } | |
| }); | |
| function setReadOnly(obj) { | |
| $("#" + obj).attr("readonly", "readonly"); | |
| } | |
| // region DIP-MODAL | |
| // endregion | |
| //region NOTY-JS | |
| function common_showDialog(msg, callback, param) { | |
| var dialog = new Noty({ | |
| text: msg, | |
| layout: 'center', | |
| closeWith: ['click'], | |
| modal: true, | |
| theme: 'metroui', | |
| buttons: [ | |
| Noty.button('YES', 'btn btn-success', function () { | |
| callback(param); | |
| dialog.close(); | |
| }, { | |
| id: 'btnDialogOk', | |
| 'data-status': 'ok', | |
| 'style': 'margin-right: 5px;' | |
| }), | |
| Noty.button('NO', 'btn btn-danger', function () { | |
| dialog.close(); | |
| }, { | |
| id: 'btnDialogCancel', | |
| 'data-status': 'cancel' | |
| }) | |
| ] | |
| }); | |
| dialog.show(); | |
| } | |
| function common_showValidationMessage() { | |
| var optionsDefault = { | |
| type: 'error', | |
| text: 'Please enter Required value', | |
| layout: 'topRight', | |
| timeout: 500, | |
| closeWith: ['click', 'timeout'], | |
| progressBar: true, | |
| modal: true, | |
| theme: 'metroui' | |
| }; | |
| new Noty(optionsDefault).show(); | |
| } | |
| //endregion | |
| // region FUNGSI YANG SUDAH ADA DI VARIABLE DIP | |
| // dip.property | |
| function dtTableNumeric(thousands, decimal, precision, prefix, postfix) { | |
| // return $.fn.dataTable.render.number(thousands, precision, decimal, prefix, postfix); | |
| return $.fn.dataTable.render.number(thousands, decimal, precision, prefix, postfix); | |
| } | |
| function dtTableNumericDefault() { | |
| // return $.fn.dataTable.render.number(thousands, precision, decimal, prefix, postfix); | |
| return $.fn.dataTable.render.number('.', ',', '2', null, null); | |
| } | |
| //let dtTableNumericVar = $.fn.dataTable.render.number(',', '.', 2).display; | |
| let dtTableNumericVar = $.fn.dataTable.render.number('.', ',', 2).display; | |
| let dtTableNumericVar9 = $.fn.dataTable.render.number(',', '.', 9).display; | |
| function dateToTimeStamp(objDate) { | |
| var strDate = objDate.split('/'); | |
| var space = ' '; | |
| var delimiter = '-'; | |
| var time = '00:00:00'; | |
| var year = strDate[2]; | |
| var month = strDate[1]; | |
| var date = strDate[0]; | |
| return year + delimiter + month + delimiter + date + space + time; | |
| } | |
| function dateToSqlDate(objDate) { | |
| if (objDate.length > 0) { | |
| var strDate = objDate.split('/'); | |
| var space = ' '; | |
| var delimiter = '-'; | |
| var year = strDate[2]; | |
| var month = strDate[1]; | |
| var date = strDate[0]; | |
| return year + delimiter + month + delimiter + date; | |
| } else { | |
| return ''; | |
| } | |
| } | |
| function generateActionLink(args, data) { | |
| let noUrl = 'javascript:void(0)'; | |
| let uri = ''; | |
| let dummy = [ | |
| { | |
| "class": "edit", | |
| "label": "label edit", | |
| "url": null, | |
| "withPermission": false, | |
| "permissions": { | |
| "admin": true, | |
| "itsupport": true | |
| } | |
| }, | |
| { | |
| "class": "delete", | |
| "label": "label delete", | |
| "url": null, | |
| "withPermission": false, | |
| "permissions": { | |
| "admin": true, | |
| "itsupport": true | |
| } | |
| } | |
| ]; | |
| let btnLinks = []; | |
| let btnLink = ""; | |
| for (let idx = 0; idx < args.length; idx++) { | |
| if (args[idx].url === null) { | |
| uri = noUrl; | |
| } | |
| btnLinks[idx] = '<a href="' + uri + '" title="' + args[idx].label + '" class="' + args[idx].class + '" ' + buildDataAttrLink(data) + ' >' + args[idx].label + '</a>'; | |
| } | |
| return btnLink.join(' | '); | |
| } | |
| function buildDataAttrLink(attr) { | |
| var dataAttr = ""; | |
| Object.keys(attr).forEach(function (key) { | |
| dataAttr = dataAttr + 'data-' + key + '="' + attr[key] + '" '; | |
| }); | |
| //console.log("Table Data Attr", dataAttr); | |
| return dataAttr; | |
| } | |
| function buildLinkAction(linkArray) { | |
| var actionLink = linkArray.join(' | '); | |
| return actionLink; | |
| } | |
| // endregion | |
| // Create an object type UserException | |
| function UserException(message) { | |
| this.message = message; | |
| this.name = 'UserException'; | |
| } | |
| // Make the exception convert to a pretty string when used as a string | |
| // (e.g., by the error console) | |
| UserException.prototype.toString = function () { | |
| return `${this.name}: "${this.message}"`; | |
| }; | |
| // region CUSTOM VALIDATOR | |
| jQuery.validator.addMethod("validate_email", function (value, element) { | |
| if (value.length > 1) { | |
| if (/^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$/.test(value)) { | |
| return true; | |
| } else { | |
| return false; | |
| } | |
| } else { | |
| return false; | |
| } | |
| }, "Please enter a valid Email."); | |
| jQuery.validator.addMethod("numberMoreThanZero", function (value, element) { | |
| if (value > 0) { | |
| return true; | |
| } else { | |
| return false; | |
| } | |
| }, "Please enter a value more than Zero."); | |
| // endregion | |
| let randomGuid = ''; | |
| let dip = { | |
| implode: function (arr, separator) { | |
| if (arr.length > 0) { | |
| return arr.join(separator); | |
| } else { | |
| return EMPTY_STRING; | |
| } | |
| }, | |
| splitChunkArray: function (array, chunkSize) { | |
| return [].concat.apply([], | |
| array.map(function (elem, i) { | |
| return i % chunkSize ? [] : [array.slice(i, i + chunkSize)]; | |
| }) | |
| ); | |
| }, | |
| concatArrayForce: function (array, separator, len, conjunction) { | |
| var chunkedArray = dip.splitChunkArray(array, len); | |
| console.log(chunkedArray); | |
| var out = ''; | |
| var tmpOut = []; | |
| for (let idx = 0; idx < chunkedArray.length; idx++) { | |
| tmpOut[idx] = chunkedArray[idx].join(separator); | |
| // if ((idx+1) === len){ | |
| // tmpOut.length = 0; | |
| // } | |
| } | |
| var tmpOutLagi = tmpOut.join('___|___'); | |
| tmpOutLagi = tmpOutLagi.replaceAll('___|___', separator + conjunction) | |
| out = tmpOutLagi.replace('___', ' '); | |
| //out = tmpOutLagi.join(conjunction); | |
| console.log(out); | |
| return out; | |
| }, | |
| concatArray: function (arr, separator, eachLength, conjuction) { | |
| var str = blankString; | |
| if (arr.length > 0) { | |
| var counter = 0; | |
| for (var i = 0; i < arr.length; i++) { | |
| str = str + arr[i]; | |
| counter++; | |
| if (counter == eachLength) { | |
| counter = 0; | |
| if (i < arr.length) { | |
| if ((i + 1) == arr.length) { | |
| str = str; | |
| } else { | |
| str = str + conjuction; | |
| } | |
| } else { | |
| str = blankString; | |
| } | |
| } else { | |
| str = str + separator | |
| } | |
| } | |
| } | |
| var nStr = str.substring(str.length - 3).trim(); | |
| if (nStr === "|") { | |
| nStr = str.slice(0, -3); | |
| } else { | |
| nStr = str; | |
| } | |
| return nStr; | |
| }, | |
| isEquals: function (str1, str2) { | |
| var ret = false; | |
| if (str1.toLowerCase().trim() === str2.toLowerCase().trim()) { | |
| ret = true; | |
| } | |
| return ret; | |
| }, | |
| notdefined: 'undefined', | |
| isUndefined: function (obj) { | |
| if (typeof obj === 'undefined') { | |
| return true; | |
| } else { | |
| return false; | |
| } | |
| }, | |
| currentUser: { | |
| userNumber: $('#hidUserNumber').val(), | |
| userName: $('#hidUserName').val(), | |
| userPass: $('#hidUserPass').val(), | |
| roleList: $('#hidUserRoleList').val(), | |
| today: $('#hidToday').val() | |
| }, | |
| // COLLECTION | |
| formOptions: { | |
| validatorErrorPlacement: function (error, element, name, type) { | |
| var elementName = element.attr('name'); | |
| if (type === 'select2' && elementName === name) { | |
| error.appendTo(element.parent("div")); | |
| } else if (type === 'datepicker' && elementName === name) { | |
| error.appendTo(element.parent("div").parent("div")); | |
| } else if (type === 'textGroupButton' && elementName === name) { | |
| error.insertAfter(element); | |
| } else { | |
| error.insertAfter(element); | |
| } | |
| } | |
| }, | |
| fileExt: { | |
| xlsx: ".xlsx", | |
| pdf: ".pdf", | |
| }, | |
| mimeType: { | |
| "123": "application/vnd.lotus-1-2-3", | |
| "1km": "application/vnd.1000minds.decision-model+xml", | |
| "3dml": "text/vnd.in3d.3dml", | |
| "3ds": "image/x-3ds", | |
| "3g2": "video/3gpp2", | |
| "3gp": "video/3gpp", | |
| "3gpp": "video/3gpp", | |
| "3mf": "model/3mf", | |
| "7z": "application/x-7z-compressed", | |
| "aab": "application/x-authorware-bin", | |
| "aac": "audio/x-aac", | |
| "aam": "application/x-authorware-map", | |
| "aas": "application/x-authorware-seg", | |
| "abw": "application/x-abiword", | |
| "ac": "application/vnd.nokia.n-gage.ac+xml", | |
| "acc": "application/vnd.americandynamics.acc", | |
| "ace": "application/x-ace-compressed", | |
| "acu": "application/vnd.acucobol", | |
| "acutc": "application/vnd.acucorp", | |
| "adp": "audio/adpcm", | |
| "aep": "application/vnd.audiograph", | |
| "afm": "application/x-font-type1", | |
| "afp": "application/vnd.ibm.modcap", | |
| "ahead": "application/vnd.ahead.space", | |
| "ai": "application/postscript", | |
| "aif": "audio/x-aiff", | |
| "aifc": "audio/x-aiff", | |
| "aiff": "audio/x-aiff", | |
| "air": "application/vnd.adobe.air-application-installer-package+zip", | |
| "ait": "application/vnd.dvb.ait", | |
| "ami": "application/vnd.amiga.ami", | |
| "amr": "audio/amr", | |
| "apk": "application/vnd.android.package-archive", | |
| "apng": "image/apng", | |
| "appcache": "text/cache-manifest", | |
| "application": "application/x-ms-application", | |
| "apr": "application/vnd.lotus-approach", | |
| "arc": "application/x-freearc", | |
| "arj": "application/x-arj", | |
| "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", | |
| "atomdeleted": "application/atomdeleted+xml", | |
| "atomsvc": "application/atomsvc+xml", | |
| "atx": "application/vnd.antix.game-component", | |
| "au": "audio/basic", | |
| "avi": "video/x-msvideo", | |
| "avif": "image/avif", | |
| "aw": "application/applixware", | |
| "azf": "application/vnd.airzip.filesecure.azf", | |
| "azs": "application/vnd.airzip.filesecure.azs", | |
| "azv": "image/vnd.airzip.accelerator.azv", | |
| "azw": "application/vnd.amazon.ebook", | |
| "b16": "image/vnd.pco.b16", | |
| "bat": "application/x-msdownload", | |
| "bcpio": "application/x-bcpio", | |
| "bdf": "application/x-font-bdf", | |
| "bdm": "application/vnd.syncml.dm+wbxml", | |
| "bdoc": "application/x-bdoc", | |
| "bed": "application/vnd.realvnc.bed", | |
| "bh2": "application/vnd.fujitsu.oasysprs", | |
| "bin": "application/octet-stream", | |
| "blb": "application/x-blorb", | |
| "blorb": "application/x-blorb", | |
| "bmi": "application/vnd.bmi", | |
| "bmml": "application/vnd.balsamiq.bmml+xml", | |
| "bmp": "image/x-ms-bmp", | |
| "book": "application/vnd.framemaker", | |
| "box": "application/vnd.previewsystems.box", | |
| "boz": "application/x-bzip2", | |
| "bpk": "application/octet-stream", | |
| "bsp": "model/vnd.valve.source.compiled-map", | |
| "btif": "image/prs.btif", | |
| "buffer": "application/octet-stream", | |
| "bz": "application/x-bzip", | |
| "bz2": "application/x-bzip2", | |
| "c": "text/x-c", | |
| "c11amc": "application/vnd.cluetrust.cartomobile-config", | |
| "c11amz": "application/vnd.cluetrust.cartomobile-config-pkg", | |
| "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", | |
| "cab": "application/vnd.ms-cab-compressed", | |
| "caf": "audio/x-caf", | |
| "cap": "application/vnd.tcpdump.pcap", | |
| "car": "application/vnd.curl.car", | |
| "cat": "application/vnd.ms-pki.seccat", | |
| "cb7": "application/x-cbr", | |
| "cba": "application/x-cbr", | |
| "cbr": "application/x-cbr", | |
| "cbt": "application/x-cbr", | |
| "cbz": "application/x-cbr", | |
| "cc": "text/x-c", | |
| "cco": "application/x-cocoa", | |
| "cct": "application/x-director", | |
| "ccxml": "application/ccxml+xml", | |
| "cdbcmsg": "application/vnd.contact.cmsg", | |
| "cdf": "application/x-netcdf", | |
| "cdfx": "application/cdfx+xml", | |
| "cdkey": "application/vnd.mediastation.cdkey", | |
| "cdmia": "application/cdmi-capability", | |
| "cdmic": "application/cdmi-container", | |
| "cdmid": "application/cdmi-domain", | |
| "cdmio": "application/cdmi-object", | |
| "cdmiq": "application/cdmi-queue", | |
| "cdx": "chemical/x-cdx", | |
| "cdxml": "application/vnd.chemdraw+xml", | |
| "cdy": "application/vnd.cinderella", | |
| "cer": "application/pkix-cert", | |
| "cfs": "application/x-cfs-compressed", | |
| "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", | |
| "cjs": "application/node", | |
| "cla": "application/vnd.claymore", | |
| "class": "application/java-vm", | |
| "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", | |
| "cod": "application/vnd.rim.cod", | |
| "coffee": "text/coffeescript", | |
| "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", | |
| "crx": "application/x-chrome-extension", | |
| "cryptonote": "application/vnd.rig.cryptonote", | |
| "csh": "application/x-csh", | |
| "csl": "application/vnd.citationstyles.style+xml", | |
| "csml": "chemical/x-csml", | |
| "csp": "application/vnd.commonspace", | |
| "css": "text/css", | |
| "cst": "application/x-director", | |
| "csv": "text/csv", | |
| "cu": "application/cu-seeme", | |
| "curl": "text/vnd.curl", | |
| "cww": "application/prs.cww", | |
| "cxt": "application/x-director", | |
| "cxx": "text/x-c", | |
| "dae": "model/vnd.collada+xml", | |
| "daf": "application/vnd.mobius.daf", | |
| "dart": "application/vnd.dart", | |
| "dataless": "application/vnd.fdsn.seed", | |
| "davmount": "application/davmount+xml", | |
| "dbf": "application/vnd.dbf", | |
| "dbk": "application/docbook+xml", | |
| "dcr": "application/x-director", | |
| "dcurl": "text/vnd.curl.dcurl", | |
| "dd2": "application/vnd.oma.dd2+xml", | |
| "ddd": "application/vnd.fujixerox.ddd", | |
| "ddf": "application/vnd.syncml.dmddf+xml", | |
| "dds": "image/vnd.ms-dds", | |
| "deb": "application/x-debian-package", | |
| "def": "text/plain", | |
| "deploy": "application/octet-stream", | |
| "der": "application/x-x509-ca-cert", | |
| "dfac": "application/vnd.dreamfactory", | |
| "dgc": "application/x-dgc-compressed", | |
| "dic": "text/x-c", | |
| "dir": "application/x-director", | |
| "dis": "application/vnd.mobius.dis", | |
| "disposition-notification": "message/disposition-notification", | |
| "dist": "application/octet-stream", | |
| "distz": "application/octet-stream", | |
| "djv": "image/vnd.djvu", | |
| "djvu": "image/vnd.djvu", | |
| "dll": "application/x-msdownload", | |
| "dmg": "application/x-apple-diskimage", | |
| "dmp": "application/vnd.tcpdump.pcap", | |
| "dms": "application/octet-stream", | |
| "dna": "application/vnd.dna", | |
| "doc": "application/msword", | |
| "docm": "application/vnd.ms-word.document.macroenabled.12", | |
| "docx": "application/vnd.openxmlformats-officedocument.wordprocessingml.document", | |
| "dot": "application/msword", | |
| "dotm": "application/vnd.ms-word.template.macroenabled.12", | |
| "dotx": "application/vnd.openxmlformats-officedocument.wordprocessingml.template", | |
| "dp": "application/vnd.osgi.dp", | |
| "dpg": "application/vnd.dpgraph", | |
| "dra": "audio/vnd.dra", | |
| "drle": "image/dicom-rle", | |
| "dsc": "text/prs.lines.tag", | |
| "dssc": "application/dssc+der", | |
| "dtb": "application/x-dtbook+xml", | |
| "dtd": "application/xml-dtd", | |
| "dts": "audio/vnd.dts", | |
| "dtshd": "audio/vnd.dts.hd", | |
| "dump": "application/octet-stream", | |
| "dvb": "video/vnd.dvb.file", | |
| "dvi": "application/x-dvi", | |
| "dwd": "application/atsc-dwd+xml", | |
| "dwf": "model/vnd.dwf", | |
| "dwg": "image/vnd.dwg", | |
| "dxf": "image/vnd.dxf", | |
| "dxp": "application/vnd.spotfire.dxp", | |
| "dxr": "application/x-director", | |
| "ear": "application/java-archive", | |
| "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", | |
| "emf": "image/emf", | |
| "eml": "message/rfc822", | |
| "emma": "application/emma+xml", | |
| "emotionml": "application/emotionml+xml", | |
| "emz": "application/x-msmetafile", | |
| "eol": "audio/vnd.digital-winds", | |
| "eot": "application/vnd.ms-fontobject", | |
| "eps": "application/postscript", | |
| "epub": "application/epub+zip", | |
| "es": "application/ecmascript", | |
| "es3": "application/vnd.eszigno3+xml", | |
| "esa": "application/vnd.osgi.subsystem", | |
| "esf": "application/vnd.epson.esf", | |
| "et3": "application/vnd.eszigno3+xml", | |
| "etx": "text/x-setext", | |
| "eva": "application/x-eva", | |
| "evy": "application/x-envoy", | |
| "exe": "application/x-msdownload", | |
| "exi": "application/exi", | |
| "exr": "image/aces", | |
| "ext": "application/vnd.novadigm.ext", | |
| "ez": "application/andrew-inset", | |
| "ez2": "application/vnd.ezpix-album", | |
| "ez3": "application/vnd.ezpix-package", | |
| "f": "text/x-fortran", | |
| "f4v": "video/x-f4v", | |
| "f77": "text/x-fortran", | |
| "f90": "text/x-fortran", | |
| "fbs": "image/vnd.fastbidsheet", | |
| "fcdt": "application/vnd.adobe.formscentral.fcdt", | |
| "fcs": "application/vnd.isac.fcs", | |
| "fdf": "application/vnd.fdf", | |
| "fdt": "application/fdt+xml", | |
| "fe_launch": "application/vnd.denovo.fcselayout-link", | |
| "fg5": "application/vnd.fujitsu.oasysgp", | |
| "fgd": "application/x-director", | |
| "fh": "image/x-freehand", | |
| "fh4": "image/x-freehand", | |
| "fh5": "image/x-freehand", | |
| "fh7": "image/x-freehand", | |
| "fhc": "image/x-freehand", | |
| "fig": "application/x-xfig", | |
| "fits": "image/fits", | |
| "flac": "audio/x-flac", | |
| "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", | |
| "fo": "application/vnd.software602.filler.form+xml", | |
| "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", | |
| "fxp": "application/vnd.adobe.fxp", | |
| "fxpl": "application/vnd.adobe.fxp", | |
| "fzs": "application/vnd.fuzzysheet", | |
| "g2w": "application/vnd.geoplan", | |
| "g3": "image/g3fax", | |
| "g3w": "application/vnd.geospace", | |
| "gac": "application/vnd.groove-account", | |
| "gam": "application/x-tads", | |
| "gbr": "application/rpki-ghostbusters", | |
| "gca": "application/x-gca-compressed", | |
| "gdl": "model/vnd.gdl", | |
| "gdoc": "application/vnd.google-apps.document", | |
| "geo": "application/vnd.dynageo", | |
| "geojson": "application/geo+json", | |
| "gex": "application/vnd.geometry-explorer", | |
| "ggb": "application/vnd.geogebra.file", | |
| "ggt": "application/vnd.geogebra.tool", | |
| "ghf": "application/vnd.groove-help", | |
| "gif": "image/gif", | |
| "gim": "application/vnd.groove-identity-message", | |
| "glb": "model/gltf-binary", | |
| "gltf": "model/gltf+json", | |
| "gml": "application/gml+xml", | |
| "gmx": "application/vnd.gmx", | |
| "gnumeric": "application/x-gnumeric", | |
| "gph": "application/vnd.flographit", | |
| "gpx": "application/gpx+xml", | |
| "gqf": "application/vnd.grafeq", | |
| "gqs": "application/vnd.grafeq", | |
| "gram": "application/srgs", | |
| "gramps": "application/x-gramps-xml", | |
| "gre": "application/vnd.geometry-explorer", | |
| "grv": "application/vnd.groove-injector", | |
| "grxml": "application/srgs+xml", | |
| "gsf": "application/x-font-ghostscript", | |
| "gsheet": "application/vnd.google-apps.spreadsheet", | |
| "gslides": "application/vnd.google-apps.presentation", | |
| "gtar": "application/x-gtar", | |
| "gtm": "application/vnd.groove-tool-message", | |
| "gtw": "model/vnd.gtw", | |
| "gv": "text/vnd.graphviz", | |
| "gxf": "application/gxf", | |
| "gxt": "application/vnd.geonext", | |
| "gz": "application/gzip", | |
| "h": "text/x-c", | |
| "h261": "video/h261", | |
| "h263": "video/h263", | |
| "h264": "video/h264", | |
| "hal": "application/vnd.hal+xml", | |
| "hbci": "application/vnd.hbci", | |
| "hbs": "text/x-handlebars-template", | |
| "hdd": "application/x-virtualbox-hdd", | |
| "hdf": "application/x-hdf", | |
| "heic": "image/heic", | |
| "heics": "image/heic-sequence", | |
| "heif": "image/heif", | |
| "heifs": "image/heif-sequence", | |
| "hej2": "image/hej2k", | |
| "held": "application/atsc-held+xml", | |
| "hh": "text/x-c", | |
| "hjson": "application/hjson", | |
| "hlp": "application/winhlp", | |
| "hpgl": "application/vnd.hp-hpgl", | |
| "hpid": "application/vnd.hp-hpid", | |
| "hps": "application/vnd.hp-hps", | |
| "hqx": "application/mac-binhex40", | |
| "hsj2": "image/hsj2", | |
| "htc": "text/x-component", | |
| "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", | |
| "i2g": "application/vnd.intergeo", | |
| "icc": "application/vnd.iccprofile", | |
| "ice": "x-conference/x-cooltalk", | |
| "icm": "application/vnd.iccprofile", | |
| "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", | |
| "igm": "application/vnd.insors.igm", | |
| "igs": "model/iges", | |
| "igx": "application/vnd.micrografx.igx", | |
| "iif": "application/vnd.shana.informed.interchange", | |
| "img": "application/octet-stream", | |
| "imp": "application/vnd.accpac.simply.imp", | |
| "ims": "application/vnd.ms-ims", | |
| "in": "text/plain", | |
| "ini": "text/plain", | |
| "ink": "application/inkml+xml", | |
| "inkml": "application/inkml+xml", | |
| "install": "application/x-install-instructions", | |
| "iota": "application/vnd.astraea-software.iota", | |
| "ipfix": "application/ipfix", | |
| "ipk": "application/vnd.shana.informed.package", | |
| "irm": "application/vnd.ibm.rights-management", | |
| "irp": "application/vnd.irepository.package+xml", | |
| "iso": "application/x-iso9660-image", | |
| "itp": "application/vnd.shana.informed.formtemplate", | |
| "its": "application/its+xml", | |
| "ivp": "application/vnd.immervision-ivp", | |
| "ivu": "application/vnd.immervision-ivu", | |
| "jad": "text/vnd.sun.j2me.app-descriptor", | |
| "jade": "text/jade", | |
| "jam": "application/vnd.jam", | |
| "jar": "application/java-archive", | |
| "jardiff": "application/x-java-archive-diff", | |
| "java": "text/x-java-source", | |
| "jhc": "image/jphc", | |
| "jisp": "application/vnd.jisp", | |
| "jls": "image/jls", | |
| "jlt": "application/vnd.hp-jlyt", | |
| "jng": "image/x-jng", | |
| "jnlp": "application/x-java-jnlp-file", | |
| "joda": "application/vnd.joost.joda-archive", | |
| "jp2": "image/jp2", | |
| "jpe": "image/jpeg", | |
| "jpeg": "image/jpeg", | |
| "jpf": "image/jpx", | |
| "jpg": "image/jpeg", | |
| "jpg2": "image/jp2", | |
| "jpgm": "video/jpm", | |
| "jpgv": "video/jpeg", | |
| "jph": "image/jph", | |
| "jpm": "video/jpm", | |
| "jpx": "image/jpx", | |
| "js": "application/javascript", | |
| "json": "application/json", | |
| "json5": "application/json5", | |
| "jsonld": "application/ld+json", | |
| "jsonml": "application/jsonml+json", | |
| "jsx": "text/jsx", | |
| "jxr": "image/jxr", | |
| "jxra": "image/jxra", | |
| "jxrs": "image/jxrs", | |
| "jxs": "image/jxs", | |
| "jxsc": "image/jxsc", | |
| "jxsi": "image/jxsi", | |
| "jxss": "image/jxss", | |
| "kar": "audio/midi", | |
| "karbon": "application/vnd.kde.karbon", | |
| "kdbx": "application/x-keepass2", | |
| "key": "application/vnd.apple.keynote", | |
| "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", | |
| "kpxx": "application/vnd.ds-keypoint", | |
| "ksp": "application/vnd.kde.kspread", | |
| "ktr": "application/vnd.kahootz", | |
| "ktx": "image/ktx", | |
| "ktx2": "image/ktx2", | |
| "ktz": "application/vnd.kahootz", | |
| "kwd": "application/vnd.kde.kword", | |
| "kwt": "application/vnd.kde.kword", | |
| "lasxml": "application/vnd.las.las+xml", | |
| "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", | |
| "less": "text/less", | |
| "lgr": "application/lgr+xml", | |
| "lha": "application/x-lzh-compressed", | |
| "link66": "application/vnd.route66.link66+xml", | |
| "list": "text/plain", | |
| "list3820": "application/vnd.ibm.modcap", | |
| "listafp": "application/vnd.ibm.modcap", | |
| "litcoffee": "text/coffeescript", | |
| "lnk": "application/x-ms-shortcut", | |
| "log": "text/plain", | |
| "lostxml": "application/lost+xml", | |
| "lrf": "application/octet-stream", | |
| "lrm": "application/vnd.ms-lrm", | |
| "ltf": "application/vnd.frogans.ltf", | |
| "lua": "text/x-lua", | |
| "luac": "application/x-lua-bytecode", | |
| "lvp": "audio/vnd.lucent.voice", | |
| "lwp": "application/vnd.lotus-wordpro", | |
| "lzh": "application/x-lzh-compressed", | |
| "m13": "application/x-msmediaview", | |
| "m14": "application/x-msmediaview", | |
| "m1v": "video/mpeg", | |
| "m21": "application/mp21", | |
| "m2a": "audio/mpeg", | |
| "m2v": "video/mpeg", | |
| "m3a": "audio/mpeg", | |
| "m3u": "audio/x-mpegurl", | |
| "m3u8": "application/vnd.apple.mpegurl", | |
| "m4a": "audio/x-m4a", | |
| "m4p": "application/mp4", | |
| "m4s": "video/iso.segment", | |
| "m4u": "video/vnd.mpegurl", | |
| "m4v": "video/x-m4v", | |
| "ma": "application/mathematica", | |
| "mads": "application/mads+xml", | |
| "maei": "application/mmt-aei+xml", | |
| "mag": "application/vnd.ecowin.chart", | |
| "maker": "application/vnd.framemaker", | |
| "man": "text/troff", | |
| "manifest": "text/cache-manifest", | |
| "map": "application/json", | |
| "mar": "application/octet-stream", | |
| "markdown": "text/markdown", | |
| "mathml": "application/mathml+xml", | |
| "mb": "application/mathematica", | |
| "mbk": "application/vnd.mobius.mbk", | |
| "mbox": "application/mbox", | |
| "mc1": "application/vnd.medcalcdata", | |
| "mcd": "application/vnd.mcd", | |
| "mcurl": "text/vnd.curl.mcurl", | |
| "md": "text/markdown", | |
| "mdb": "application/x-msaccess", | |
| "mdi": "image/vnd.ms-modi", | |
| "mdx": "text/mdx", | |
| "me": "text/troff", | |
| "mesh": "model/mesh", | |
| "meta4": "application/metalink4+xml", | |
| "metalink": "application/metalink+xml", | |
| "mets": "application/mets+xml", | |
| "mfm": "application/vnd.mfmp", | |
| "mft": "application/rpki-manifest", | |
| "mgp": "application/vnd.osgeo.mapguide.package", | |
| "mgz": "application/vnd.proteus.magazine", | |
| "mid": "audio/midi", | |
| "midi": "audio/midi", | |
| "mie": "application/x-mie", | |
| "mif": "application/vnd.mif", | |
| "mime": "message/rfc822", | |
| "mj2": "video/mj2", | |
| "mjp2": "video/mj2", | |
| "mjs": "application/javascript", | |
| "mk3d": "video/x-matroska", | |
| "mka": "audio/x-matroska", | |
| "mkd": "text/x-markdown", | |
| "mks": "video/x-matroska", | |
| "mkv": "video/x-matroska", | |
| "mlp": "application/vnd.dolby.mlp", | |
| "mmd": "application/vnd.chipnuts.karaoke-mmd", | |
| "mmf": "application/vnd.smaf", | |
| "mml": "text/mathml", | |
| "mmr": "image/vnd.fujixerox.edmics-mmr", | |
| "mng": "video/x-mng", | |
| "mny": "application/x-msmoney", | |
| "mobi": "application/x-mobipocket-ebook", | |
| "mods": "application/mods+xml", | |
| "mov": "video/quicktime", | |
| "movie": "video/x-sgi-movie", | |
| "mp2": "audio/mpeg", | |
| "mp21": "application/mp21", | |
| "mp2a": "audio/mpeg", | |
| "mp3": "audio/mpeg", | |
| "mp4": "video/mp4", | |
| "mp4a": "audio/mp4", | |
| "mp4s": "application/mp4", | |
| "mp4v": "video/mp4", | |
| "mpc": "application/vnd.mophun.certificate", | |
| "mpd": "application/dash+xml", | |
| "mpe": "video/mpeg", | |
| "mpeg": "video/mpeg", | |
| "mpg": "video/mpeg", | |
| "mpg4": "video/mp4", | |
| "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", | |
| "mrcx": "application/marcxml+xml", | |
| "ms": "text/troff", | |
| "mscml": "application/mediaservercontrol+xml", | |
| "mseed": "application/vnd.fdsn.mseed", | |
| "mseq": "application/vnd.mseq", | |
| "msf": "application/vnd.epson.msf", | |
| "msg": "application/vnd.ms-outlook", | |
| "msh": "model/mesh", | |
| "msi": "application/x-msdownload", | |
| "msl": "application/vnd.mobius.msl", | |
| "msm": "application/octet-stream", | |
| "msp": "application/octet-stream", | |
| "msty": "application/vnd.muvee.style", | |
| "mtl": "model/mtl", | |
| "mts": "model/vnd.mts", | |
| "mus": "application/vnd.musician", | |
| "musd": "application/mmt-usd+xml", | |
| "musicxml": "application/vnd.recordare.musicxml+xml", | |
| "mvb": "application/x-msmediaview", | |
| "mwf": "application/vnd.mfer", | |
| "mxf": "application/mxf", | |
| "mxl": "application/vnd.recordare.musicxml", | |
| "mxmf": "audio/mobile-xmf", | |
| "mxml": "application/xv+xml", | |
| "mxs": "application/vnd.triscape.mxs", | |
| "mxu": "video/vnd.mpegurl", | |
| "n-gage": "application/vnd.nokia.n-gage.symbian.install", | |
| "n3": "text/n3", | |
| "nb": "application/mathematica", | |
| "nbp": "application/vnd.wolfram.player", | |
| "nc": "application/x-netcdf", | |
| "ncx": "application/x-dtbncx+xml", | |
| "nfo": "text/x-nfo", | |
| "ngdat": "application/vnd.nokia.n-gage.data", | |
| "nitf": "application/vnd.nitf", | |
| "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", | |
| "nq": "application/n-quads", | |
| "nsc": "application/x-conference", | |
| "nsf": "application/vnd.lotus-notes", | |
| "nt": "application/n-triples", | |
| "ntf": "application/vnd.nitf", | |
| "numbers": "application/vnd.apple.numbers", | |
| "nzb": "application/x-nzb", | |
| "oa2": "application/vnd.fujitsu.oasys2", | |
| "oa3": "application/vnd.fujitsu.oasys3", | |
| "oas": "application/vnd.fujitsu.oasys", | |
| "obd": "application/x-msbinder", | |
| "obgx": "application/vnd.openblox.game+xml", | |
| "obj": "model/obj", | |
| "oda": "application/oda", | |
| "odb": "application/vnd.oasis.opendocument.database", | |
| "odc": "application/vnd.oasis.opendocument.chart", | |
| "odf": "application/vnd.oasis.opendocument.formula", | |
| "odft": "application/vnd.oasis.opendocument.formula-template", | |
| "odg": "application/vnd.oasis.opendocument.graphics", | |
| "odi": "application/vnd.oasis.opendocument.image", | |
| "odm": "application/vnd.oasis.opendocument.text-master", | |
| "odp": "application/vnd.oasis.opendocument.presentation", | |
| "ods": "application/vnd.oasis.opendocument.spreadsheet", | |
| "odt": "application/vnd.oasis.opendocument.text", | |
| "oga": "audio/ogg", | |
| "ogex": "model/vnd.opengex", | |
| "ogg": "audio/ogg", | |
| "ogv": "video/ogg", | |
| "ogx": "application/ogg", | |
| "omdoc": "application/omdoc+xml", | |
| "onepkg": "application/onenote", | |
| "onetmp": "application/onenote", | |
| "onetoc": "application/onenote", | |
| "onetoc2": "application/onenote", | |
| "opf": "application/oebps-package+xml", | |
| "opml": "text/x-opml", | |
| "oprc": "application/vnd.palm", | |
| "opus": "audio/ogg", | |
| "org": "text/x-org", | |
| "osf": "application/vnd.yamaha.openscoreformat", | |
| "osfpvg": "application/vnd.yamaha.openscoreformat.osfpvg+xml", | |
| "osm": "application/vnd.openstreetmap.data+xml", | |
| "otc": "application/vnd.oasis.opendocument.chart-template", | |
| "otf": "font/otf", | |
| "otg": "application/vnd.oasis.opendocument.graphics-template", | |
| "oth": "application/vnd.oasis.opendocument.text-web", | |
| "oti": "application/vnd.oasis.opendocument.image-template", | |
| "otp": "application/vnd.oasis.opendocument.presentation-template", | |
| "ots": "application/vnd.oasis.opendocument.spreadsheet-template", | |
| "ott": "application/vnd.oasis.opendocument.text-template", | |
| "ova": "application/x-virtualbox-ova", | |
| "ovf": "application/x-virtualbox-ovf", | |
| "owl": "application/rdf+xml", | |
| "oxps": "application/oxps", | |
| "oxt": "application/vnd.openofficeorg.extension", | |
| "p": "text/x-pascal", | |
| "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", | |
| "p8": "application/pkcs8", | |
| "pac": "application/x-ns-proxy-autoconfig", | |
| "pages": "application/vnd.apple.pages", | |
| "pas": "text/x-pascal", | |
| "paw": "application/vnd.pawaafile", | |
| "pbd": "application/vnd.powerbuilder6", | |
| "pbm": "image/x-portable-bitmap", | |
| "pcap": "application/vnd.tcpdump.pcap", | |
| "pcf": "application/x-font-pcf", | |
| "pcl": "application/vnd.hp-pcl", | |
| "pclxl": "application/vnd.hp-pclxl", | |
| "pct": "image/x-pict", | |
| "pcurl": "application/vnd.curl.pcurl", | |
| "pcx": "image/x-pcx", | |
| "pdb": "application/x-pilot", | |
| "pde": "text/x-processing", | |
| "pdf": "application/pdf", | |
| "pem": "application/x-x509-ca-cert", | |
| "pfa": "application/x-font-type1", | |
| "pfb": "application/x-font-type1", | |
| "pfm": "application/x-font-type1", | |
| "pfr": "application/font-tdpfr", | |
| "pfx": "application/x-pkcs12", | |
| "pgm": "image/x-portable-graymap", | |
| "pgn": "application/x-chess-pgn", | |
| "pgp": "application/pgp-encrypted", | |
| "php": "application/x-httpd-php", | |
| "pic": "image/x-pict", | |
| "pkg": "application/octet-stream", | |
| "pki": "application/pkixcmp", | |
| "pkipath": "application/pkix-pkipath", | |
| "pkpass": "application/vnd.apple.pkpass", | |
| "pl": "application/x-perl", | |
| "plb": "application/vnd.3gpp.pic-bw-large", | |
| "plc": "application/vnd.mobius.plc", | |
| "plf": "application/vnd.pocketlearn", | |
| "pls": "application/pls+xml", | |
| "pm": "application/x-perl", | |
| "pml": "application/vnd.ctc-posml", | |
| "png": "image/png", | |
| "pnm": "image/x-portable-anymap", | |
| "portpkg": "application/vnd.macports.portpkg", | |
| "pot": "application/vnd.ms-powerpoint", | |
| "potm": "application/vnd.ms-powerpoint.template.macroenabled.12", | |
| "potx": "application/vnd.openxmlformats-officedocument.presentationml.template", | |
| "ppam": "application/vnd.ms-powerpoint.addin.macroenabled.12", | |
| "ppd": "application/vnd.cups-ppd", | |
| "ppm": "image/x-portable-pixmap", | |
| "pps": "application/vnd.ms-powerpoint", | |
| "ppsm": "application/vnd.ms-powerpoint.slideshow.macroenabled.12", | |
| "ppsx": "application/vnd.openxmlformats-officedocument.presentationml.slideshow", | |
| "ppt": "application/vnd.ms-powerpoint", | |
| "pptm": "application/vnd.ms-powerpoint.presentation.macroenabled.12", | |
| "pptx": "application/vnd.openxmlformats-officedocument.presentationml.presentation", | |
| "pqa": "application/vnd.palm", | |
| "prc": "application/x-pilot", | |
| "pre": "application/vnd.lotus-freelance", | |
| "prf": "application/pics-rules", | |
| "provx": "application/provenance+xml", | |
| "ps": "application/postscript", | |
| "psb": "application/vnd.3gpp.pic-bw-small", | |
| "psd": "image/vnd.adobe.photoshop", | |
| "psf": "application/x-font-linux-psf", | |
| "pskcxml": "application/pskc+xml", | |
| "pti": "image/prs.pti", | |
| "ptid": "application/vnd.pvi.ptid1", | |
| "pub": "application/x-mspublisher", | |
| "pvb": "application/vnd.3gpp.pic-bw-var", | |
| "pwn": "application/vnd.3m.post-it-notes", | |
| "pya": "audio/vnd.ms-playready.media.pya", | |
| "pyv": "video/vnd.ms-playready.media.pyv", | |
| "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-realaudio", | |
| "ram": "audio/x-pn-realaudio", | |
| "raml": "application/raml+yaml", | |
| "rapd": "application/route-apd+xml", | |
| "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", | |
| "relo": "application/p2p-overlay+xml", | |
| "rep": "application/vnd.businessobjects", | |
| "res": "application/x-dtbresource+xml", | |
| "rgb": "image/x-rgb", | |
| "rif": "application/reginfo+xml", | |
| "rip": "audio/vnd.rip", | |
| "ris": "application/x-research-info-systems", | |
| "rl": "application/resource-lists+xml", | |
| "rlc": "image/vnd.fujixerox.edmics-rlc", | |
| "rld": "application/resource-lists-diff+xml", | |
| "rm": "application/vnd.rn-realmedia", | |
| "rmi": "audio/midi", | |
| "rmp": "audio/x-pn-realaudio-plugin", | |
| "rms": "application/vnd.jcp.javame.midlet-rms", | |
| "rmvb": "application/vnd.rn-realmedia-vbr", | |
| "rnc": "application/relax-ng-compact-syntax", | |
| "rng": "application/xml", | |
| "roa": "application/rpki-roa", | |
| "roff": "text/troff", | |
| "rp9": "application/vnd.cloanto.rp9", | |
| "rpm": "application/x-redhat-package-manager", | |
| "rpss": "application/vnd.nokia.radio-presets", | |
| "rpst": "application/vnd.nokia.radio-preset", | |
| "rq": "application/sparql-query", | |
| "rs": "application/rls-services+xml", | |
| "rsat": "application/atsc-rsat+xml", | |
| "rsd": "application/rsd+xml", | |
| "rsheet": "application/urc-ressheet+xml", | |
| "rss": "application/rss+xml", | |
| "rtf": "text/rtf", | |
| "rtx": "text/richtext", | |
| "run": "application/x-makeself", | |
| "rusd": "application/route-usd+xml", | |
| "s": "text/x-asm", | |
| "s3m": "audio/s3m", | |
| "saf": "application/vnd.yamaha.smaf-audio", | |
| "sass": "text/x-sass", | |
| "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", | |
| "scss": "text/x-scss", | |
| "scurl": "text/vnd.curl.scurl", | |
| "sda": "application/vnd.stardivision.draw", | |
| "sdc": "application/vnd.stardivision.calc", | |
| "sdd": "application/vnd.stardivision.impress", | |
| "sdkd": "application/vnd.solent.sdkm+xml", | |
| "sdkm": "application/vnd.solent.sdkm+xml", | |
| "sdp": "application/sdp", | |
| "sdw": "application/vnd.stardivision.writer", | |
| "sea": "application/x-sea", | |
| "see": "application/vnd.seemail", | |
| "seed": "application/vnd.fdsn.seed", | |
| "sema": "application/vnd.sema", | |
| "semd": "application/vnd.semd", | |
| "semf": "application/vnd.semf", | |
| "senmlx": "application/senml+xml", | |
| "sensmlx": "application/sensml+xml", | |
| "ser": "application/java-serialized-object", | |
| "setpay": "application/set-payment-initiation", | |
| "setreg": "application/set-registration-initiation", | |
| "sfd-hdstx": "application/vnd.hydrostatix.sof-data", | |
| "sfs": "application/vnd.spotfire.sfs", | |
| "sfv": "text/x-sfv", | |
| "sgi": "image/sgi", | |
| "sgl": "application/vnd.stardivision.writer-global", | |
| "sgm": "text/sgml", | |
| "sgml": "text/sgml", | |
| "sh": "application/x-sh", | |
| "shar": "application/x-shar", | |
| "shex": "text/shex", | |
| "shf": "application/shf+xml", | |
| "shtml": "text/html", | |
| "sid": "image/x-mrsid-image", | |
| "sieve": "application/sieve", | |
| "sig": "application/pgp-signature", | |
| "sil": "audio/silk", | |
| "silo": "model/mesh", | |
| "sis": "application/vnd.symbian.install", | |
| "sisx": "application/vnd.symbian.install", | |
| "sit": "application/x-stuffit", | |
| "sitx": "application/x-stuffitx", | |
| "siv": "application/sieve", | |
| "skd": "application/vnd.koan", | |
| "skm": "application/vnd.koan", | |
| "skp": "application/vnd.koan", | |
| "skt": "application/vnd.koan", | |
| "sldm": "application/vnd.ms-powerpoint.slide.macroenabled.12", | |
| "sldx": "application/vnd.openxmlformats-officedocument.presentationml.slide", | |
| "slim": "text/slim", | |
| "slm": "text/slim", | |
| "sls": "application/route-s-tsid+xml", | |
| "slt": "application/vnd.epson.salt", | |
| "sm": "application/vnd.stepmania.stepchart", | |
| "smf": "application/vnd.stardivision.math", | |
| "smi": "application/smil+xml", | |
| "smil": "application/smil+xml", | |
| "smv": "video/x-smv", | |
| "smzip": "application/vnd.stepmania.package", | |
| "snd": "audio/basic", | |
| "snf": "application/x-font-snf", | |
| "so": "application/octet-stream", | |
| "spc": "application/x-pkcs7-certificates", | |
| "spdx": "text/spdx", | |
| "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", | |
| "spx": "audio/ogg", | |
| "sql": "application/x-sql", | |
| "src": "application/x-wais-source", | |
| "srt": "application/x-subrip", | |
| "sru": "application/sru+xml", | |
| "srx": "application/sparql-results+xml", | |
| "ssdl": "application/ssdl+xml", | |
| "sse": "application/vnd.kodak-descriptor", | |
| "ssf": "application/vnd.epson.ssf", | |
| "ssml": "application/ssml+xml", | |
| "st": "application/vnd.sailingtracker.track", | |
| "stc": "application/vnd.sun.xml.calc.template", | |
| "std": "application/vnd.sun.xml.draw.template", | |
| "stf": "application/vnd.wt.stf", | |
| "sti": "application/vnd.sun.xml.impress.template", | |
| "stk": "application/hyperstudio", | |
| "stl": "model/stl", | |
| "str": "application/vnd.pg.format", | |
| "stw": "application/vnd.sun.xml.writer.template", | |
| "styl": "text/stylus", | |
| "stylus": "text/stylus", | |
| "sub": "text/vnd.dvb.subtitle", | |
| "sus": "application/vnd.sus-calendar", | |
| "susp": "application/vnd.sus-calendar", | |
| "sv4cpio": "application/x-sv4cpio", | |
| "sv4crc": "application/x-sv4crc", | |
| "svc": "application/vnd.dvb.service", | |
| "svd": "application/vnd.svd", | |
| "svg": "image/svg+xml", | |
| "svgz": "image/svg+xml", | |
| "swa": "application/x-director", | |
| "swf": "application/x-shockwave-flash", | |
| "swi": "application/vnd.aristanetworks.swi", | |
| "swidtag": "application/swid+xml", | |
| "sxc": "application/vnd.sun.xml.calc", | |
| "sxd": "application/vnd.sun.xml.draw", | |
| "sxg": "application/vnd.sun.xml.writer.global", | |
| "sxi": "application/vnd.sun.xml.impress", | |
| "sxm": "application/vnd.sun.xml.math", | |
| "sxw": "application/vnd.sun.xml.writer", | |
| "t": "text/troff", | |
| "t3": "application/x-t3vm-image", | |
| "t38": "image/t38", | |
| "taglet": "application/vnd.mynfc", | |
| "tao": "application/vnd.tao.intent-module-archive", | |
| "tap": "image/vnd.tencent.tap", | |
| "tar": "application/x-tar", | |
| "tcap": "application/vnd.3gpp2.tcap", | |
| "tcl": "application/x-tcl", | |
| "td": "application/urc-targetdesc+xml", | |
| "teacher": "application/vnd.smart.teacher", | |
| "tei": "application/tei+xml", | |
| "teicorpus": "application/tei+xml", | |
| "tex": "application/x-tex", | |
| "texi": "application/x-texinfo", | |
| "texinfo": "application/x-texinfo", | |
| "text": "text/plain", | |
| "tfi": "application/thraud+xml", | |
| "tfm": "application/x-tex-tfm", | |
| "tfx": "image/tiff-fx", | |
| "tga": "image/x-tga", | |
| "thmx": "application/vnd.ms-officetheme", | |
| "tif": "image/tiff", | |
| "tiff": "image/tiff", | |
| "tk": "application/x-tcl", | |
| "tmo": "application/vnd.tmobile-livetv", | |
| "toml": "application/toml", | |
| "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", | |
| "ts": "video/mp2t", | |
| "tsd": "application/timestamped-data", | |
| "tsv": "text/tab-separated-values", | |
| "ttc": "font/collection", | |
| "ttf": "font/ttf", | |
| "ttl": "text/turtle", | |
| "ttml": "application/ttml+xml", | |
| "twd": "application/vnd.simtech-mindmapper", | |
| "twds": "application/vnd.simtech-mindmapper", | |
| "txd": "application/vnd.genomatix.tuxedo", | |
| "txf": "application/vnd.mobius.txf", | |
| "txt": "text/plain", | |
| "u32": "application/x-authorware-bin", | |
| "u8dsn": "message/global-delivery-status", | |
| "u8hdr": "message/global-headers", | |
| "u8mdn": "message/global-disposition-notification", | |
| "u8msg": "message/global", | |
| "ubj": "application/ubjson", | |
| "udeb": "application/x-debian-package", | |
| "ufd": "application/vnd.ufdl", | |
| "ufdl": "application/vnd.ufdl", | |
| "ulx": "application/x-glulx", | |
| "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", | |
| "usdz": "model/vnd.usdz+zip", | |
| "ustar": "application/x-ustar", | |
| "utz": "application/vnd.uiq.theme", | |
| "uu": "text/x-uuencode", | |
| "uva": "audio/vnd.dece.audio", | |
| "uvd": "application/vnd.dece.data", | |
| "uvf": "application/vnd.dece.data", | |
| "uvg": "image/vnd.dece.graphic", | |
| "uvh": "video/vnd.dece.hd", | |
| "uvi": "image/vnd.dece.graphic", | |
| "uvm": "video/vnd.dece.mobile", | |
| "uvp": "video/vnd.dece.pd", | |
| "uvs": "video/vnd.dece.sd", | |
| "uvt": "application/vnd.dece.ttml+xml", | |
| "uvu": "video/vnd.uvvu.mp4", | |
| "uvv": "video/vnd.dece.video", | |
| "uvva": "audio/vnd.dece.audio", | |
| "uvvd": "application/vnd.dece.data", | |
| "uvvf": "application/vnd.dece.data", | |
| "uvvg": "image/vnd.dece.graphic", | |
| "uvvh": "video/vnd.dece.hd", | |
| "uvvi": "image/vnd.dece.graphic", | |
| "uvvm": "video/vnd.dece.mobile", | |
| "uvvp": "video/vnd.dece.pd", | |
| "uvvs": "video/vnd.dece.sd", | |
| "uvvt": "application/vnd.dece.ttml+xml", | |
| "uvvu": "video/vnd.uvvu.mp4", | |
| "uvvv": "video/vnd.dece.video", | |
| "uvvx": "application/vnd.dece.unspecified", | |
| "uvvz": "application/vnd.dece.zip", | |
| "uvx": "application/vnd.dece.unspecified", | |
| "uvz": "application/vnd.dece.zip", | |
| "vbox": "application/x-virtualbox-vbox", | |
| "vbox-extpack": "application/x-virtualbox-vbox-extpack", | |
| "vcard": "text/vcard", | |
| "vcd": "application/x-cdlink", | |
| "vcf": "text/x-vcard", | |
| "vcg": "application/vnd.groove-vcard", | |
| "vcs": "text/x-vcalendar", | |
| "vcx": "application/vnd.vcx", | |
| "vdi": "application/x-virtualbox-vdi", | |
| "vhd": "application/x-virtualbox-vhd", | |
| "vis": "application/vnd.visionary", | |
| "viv": "video/vnd.vivo", | |
| "vmdk": "application/x-virtualbox-vmdk", | |
| "vob": "video/x-ms-vob", | |
| "vor": "application/vnd.stardivision.writer", | |
| "vox": "application/x-authorware-bin", | |
| "vrml": "model/vrml", | |
| "vsd": "application/vnd.visio", | |
| "vsf": "application/vnd.vsf", | |
| "vss": "application/vnd.visio", | |
| "vst": "application/vnd.visio", | |
| "vsw": "application/vnd.visio", | |
| "vtf": "image/vnd.valve.source.texture", | |
| "vtt": "text/vtt", | |
| "vtu": "model/vnd.vtu", | |
| "vxml": "application/voicexml+xml", | |
| "w3d": "application/x-director", | |
| "wad": "application/x-doom", | |
| "wadl": "application/vnd.sun.wadl+xml", | |
| "war": "application/java-archive", | |
| "wasm": "application/wasm", | |
| "wav": "audio/x-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", | |
| "wdp": "image/vnd.ms-photo", | |
| "weba": "audio/webm", | |
| "webapp": "application/x-web-app-manifest+json", | |
| "webm": "video/webm", | |
| "webmanifest": "application/manifest+json", | |
| "webp": "image/webp", | |
| "wg": "application/vnd.pmi.widget", | |
| "wgt": "application/widget", | |
| "wks": "application/vnd.ms-works", | |
| "wm": "video/x-ms-wm", | |
| "wma": "audio/x-ms-wma", | |
| "wmd": "application/x-ms-wmd", | |
| "wmf": "image/wmf", | |
| "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-msmetafile", | |
| "woff": "font/woff", | |
| "woff2": "font/woff2", | |
| "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", | |
| "wsc": "message/vnd.wfa.wsc", | |
| "wsdl": "application/wsdl+xml", | |
| "wspolicy": "application/wspolicy+xml", | |
| "wtb": "application/vnd.webturbo", | |
| "wvx": "video/x-ms-wvx", | |
| "x32": "application/x-authorware-bin", | |
| "x3d": "model/x3d+xml", | |
| "x3db": "model/x3d+fastinfoset", | |
| "x3dbz": "model/x3d+binary", | |
| "x3dv": "model/x3d-vrml", | |
| "x3dvz": "model/x3d+vrml", | |
| "x3dz": "model/x3d+xml", | |
| "x_b": "model/vnd.parasolid.transmit.binary", | |
| "x_t": "model/vnd.parasolid.transmit.text", | |
| "xaml": "application/xaml+xml", | |
| "xap": "application/x-silverlight-app", | |
| "xar": "application/vnd.xara", | |
| "xav": "application/xcap-att+xml", | |
| "xbap": "application/x-ms-xbap", | |
| "xbd": "application/vnd.fujixerox.docuworks.binder", | |
| "xbm": "image/x-xbitmap", | |
| "xca": "application/xcap-caps+xml", | |
| "xcs": "application/calendar+xml", | |
| "xdf": "application/xcap-diff+xml", | |
| "xdm": "application/vnd.syncml.dm+xml", | |
| "xdp": "application/vnd.adobe.xdp+xml", | |
| "xdssc": "application/dssc+xml", | |
| "xdw": "application/vnd.fujixerox.docuworks", | |
| "xel": "application/xcap-el+xml", | |
| "xenc": "application/xenc+xml", | |
| "xer": "application/patch-ops-error+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", | |
| "xlam": "application/vnd.ms-excel.addin.macroenabled.12", | |
| "xlc": "application/vnd.ms-excel", | |
| "xlf": "application/xliff+xml", | |
| "xlm": "application/vnd.ms-excel", | |
| "xls": "application/vnd.ms-excel", | |
| "xlsb": "application/vnd.ms-excel.sheet.binary.macroenabled.12", | |
| "xlsm": "application/vnd.ms-excel.sheet.macroenabled.12", | |
| "xlsx": "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", | |
| "xlt": "application/vnd.ms-excel", | |
| "xltm": "application/vnd.ms-excel.template.macroenabled.12", | |
| "xltx": "application/vnd.openxmlformats-officedocument.spreadsheetml.template", | |
| "xlw": "application/vnd.ms-excel", | |
| "xm": "audio/xm", | |
| "xml": "text/xml", | |
| "xns": "application/xcap-ns+xml", | |
| "xo": "application/vnd.olpc-sugar", | |
| "xop": "application/xop+xml", | |
| "xpi": "application/x-xpinstall", | |
| "xpl": "application/xproc+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", | |
| "xsd": "application/xml", | |
| "xsl": "application/xslt+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", | |
| "xz": "application/x-xz", | |
| "yaml": "text/yaml", | |
| "yang": "application/yang", | |
| "yin": "application/yin+xml", | |
| "yml": "text/yaml", | |
| "ymp": "text/x-suse-ymp", | |
| "z1": "application/x-zmachine", | |
| "z2": "application/x-zmachine", | |
| "z3": "application/x-zmachine", | |
| "z4": "application/x-zmachine", | |
| "z5": "application/x-zmachine", | |
| "z6": "application/x-zmachine", | |
| "z7": "application/x-zmachine", | |
| "z8": "application/x-zmachine", | |
| "zaz": "application/vnd.zzazz.deck+xml", | |
| "zip": "application/zip", | |
| "zir": "application/vnd.zul", | |
| "zirz": "application/vnd.zul", | |
| "zmm": "application/vnd.handheld-entertainment+xml" | |
| }, | |
| saveFile: function (fileName, ext, mimeType, blobData) { | |
| let newFileName = fileName + ext; | |
| // console.log(blobData); | |
| if (data !== null && navigator.msSaveBlob) | |
| return navigator.msSaveBlob(blobData, newFileName); | |
| var a = $("<a style='display: none;'/>"); | |
| var url = window.URL.createObjectURL(blobData); | |
| // console.log(url); | |
| // console.log(newFileName); | |
| a.attr("href", url); | |
| a.attr("download", newFileName); | |
| $("body").append(a); | |
| a[0].click(); | |
| window.URL.revokeObjectURL(url); | |
| a.remove(); | |
| }, | |
| base64toBlob(b64Data, contentType) { | |
| const byteCharacters = atob(b64Data); | |
| const byteArrays = []; | |
| for (let offset = 0; offset < byteCharacters.length; offset += 512) { | |
| const slice = byteCharacters.slice(offset, offset + 512); | |
| const byteNumbers = new Array(slice.length); | |
| for (let i = 0; i < slice.length; i++) { | |
| byteNumbers[i] = slice.charCodeAt(i); | |
| } | |
| const byteArray = new Uint8Array(byteNumbers); | |
| byteArrays.push(byteArray); | |
| } | |
| const blob = new Blob(byteArrays, { type: contentType }); | |
| return blob; | |
| }, | |
| jsonToDataAttribute: function (json) { | |
| var dataAttr = ""; | |
| Object.keys(json).forEach(function (key) { | |
| dataAttr = dataAttr + 'data-' + key + '="' + json[key] + '" '; | |
| }); | |
| return dataAttr; | |
| }, | |
| activeUserRole: { | |
| superAdmin: function () { | |
| if (_getVal('hidIsSuperAdmin') === 'true') { | |
| return true; | |
| } else { | |
| return false; | |
| } | |
| }, | |
| itSupport: function () { | |
| var loggedUserRoleList = $("#hidUserRoleList").val() | |
| loggedUserRoleList = loggedUserRoleList.split(' ').join(''); | |
| var loginRoleArray = loggedUserRoleList.split(","); | |
| var isIT = loginRoleArray.indexOf("it"); | |
| if (isIT > -1) { | |
| return true; | |
| } else { | |
| return false; | |
| } | |
| } | |
| }, | |
| getRandomGuid: function (loadElement, target) { | |
| $.when(vmNet.ajax.post('/api/generate-random-guid', { foo: 'bar' }, loadElement)).done(function (result) { | |
| _setVal(target, result.message_details); | |
| }); | |
| }, | |
| textAreaAdjust: function (o) { | |
| let element = $(o); | |
| // var elementHeight = o.css('height','1px'); | |
| let elementScrollHeight = element.prop('scrollHeight'); | |
| // elementHeight = o.css('height','1px'); | |
| element.css('height', '1px'); | |
| element.css('height', (25 + elementScrollHeight) + "px"); | |
| }, | |
| toInteger(obj) { | |
| return parseInt(obj); | |
| }, | |
| getExtensionFromString(_string) { | |
| var result = _string.substring(_string.lastIndexOf(".") + 1).trim(); | |
| // | |
| return result.toLowerCase(); | |
| }, | |
| getFaIconForFile(fileName) { | |
| var fileExtension = this.getExtensionFromString(fileName); | |
| var icon = ""; | |
| switch (fileExtension) { | |
| case 'xls': | |
| case 'xlsx': | |
| icon = 'fa fa-file-excel-o'; | |
| break; | |
| case 'doc': | |
| case 'docx': | |
| icon = 'fa fa-file-word-o'; | |
| break; | |
| case 'pdf': | |
| icon = 'fa fa-file-pdf-o'; | |
| break; | |
| case 'txt': | |
| icon = 'fa fa-file-text-o'; | |
| break; | |
| case 'png': | |
| case 'jpg': | |
| case 'jpeg': | |
| case 'bmp': | |
| icon = 'fa fa-file-image-o'; | |
| break; | |
| } | |
| return icon; | |
| }, | |
| imgDataType: 'image', | |
| get imgDataType() { | |
| return 'image'; | |
| }, | |
| fileRootPath: '..\\', | |
| get fileRootPath() { | |
| return '..\\'; | |
| }, | |
| boolTrue: true, | |
| get boolTrue() { | |
| return true; | |
| }, | |
| boolFalse: false, | |
| get boolFalse() { | |
| return false; | |
| }, | |
| // https://www.sitepoint.com/get-url-parameters-with-javascript/ | |
| getQueryString(param) { | |
| const queryString = window.location.search; | |
| const urlParams = new URLSearchParams(queryString); | |
| const qString = urlParams.get(param); | |
| return qString; | |
| }, | |
| implode(arrToJoin, separatedWith) { | |
| return arrToJoin.join(separatedWith); | |
| }, | |
| explode(stringToSplit, separatedWith) { | |
| return stringToSplit.split(separatedWith); | |
| }, | |
| findInJson(src, val) { | |
| return src.some(item => _.some(src, val)); | |
| }, | |
| stringify(obj) { | |
| return JSON.stringify(obj); | |
| }, | |
| contains(str1, str2) { | |
| let strFrom = str1.toLowerCase(); | |
| let strSearch = str2.toLowerCase(); | |
| if (strFrom.indexOf(strSearch) != -1) { | |
| return true; | |
| } else { | |
| return false; | |
| } | |
| }, | |
| loading(pstate, pelement) { | |
| if (pelement == "") { | |
| pelement = "#content-wrapper" | |
| } | |
| if (pstate === "show") { | |
| $(pelement).LoadingOverlay("show", { | |
| image: '', | |
| background: "rgba(255, 255, 255, 0.2)", | |
| size: "60", | |
| maxSize: "60", | |
| minSize: "50", | |
| fontawesome: 'fa fa-refresh fa-spin' | |
| }); | |
| } else { | |
| $(pelement).LoadingOverlay("hide", true); | |
| } | |
| }, | |
| goNewTab(url, target) { | |
| if (target !== '') { | |
| window.open(url, target); | |
| } else { | |
| window.open(url, '_blank'); | |
| } | |
| }, | |
| clearNonNumeric(str) { | |
| return str.replace(/\D/g, ''); | |
| }, | |
| uploadFileXhr: function () { | |
| } | |
| } | |
| function insertAtCaret(areaId, text) { | |
| CKEDITOR.instances[areaId].insertText(text); | |
| } |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment