A bunch of new updates from icehrm pro
This commit is contained in:
File diff suppressed because it is too large
Load Diff
@@ -1,503 +0,0 @@
|
||||
/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
|
||||
/* AES implementation in JavaScript (c) Chris Veness 2005-2014 / MIT Licence */
|
||||
/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
|
||||
|
||||
/* jshint node:true *//* global define */
|
||||
'use strict';
|
||||
|
||||
|
||||
/**
|
||||
* AES (Rijndael cipher) encryption routines,
|
||||
*
|
||||
* Reference implementation of FIPS-197 http://csrc.nist.gov/publications/fips/fips197/fips-197.pdf.
|
||||
*
|
||||
* @namespace
|
||||
*/
|
||||
var Aes = {};
|
||||
|
||||
|
||||
/**
|
||||
* AES Cipher function: encrypt 'input' state with Rijndael algorithm [§5.1];
|
||||
* applies Nr rounds (10/12/14) using key schedule w for 'add round key' stage.
|
||||
*
|
||||
* @param {number[]} input - 16-byte (128-bit) input state array.
|
||||
* @param {number[][]} w - Key schedule as 2D byte-array (Nr+1 x Nb bytes).
|
||||
* @returns {number[]} Encrypted output state array.
|
||||
*/
|
||||
Aes.cipher = function(input, w) {
|
||||
var Nb = 4; // block size (in words): no of columns in state (fixed at 4 for AES)
|
||||
var Nr = w.length/Nb - 1; // no of rounds: 10/12/14 for 128/192/256-bit keys
|
||||
|
||||
var state = [[],[],[],[]]; // initialise 4xNb byte-array 'state' with input [§3.4]
|
||||
for (var i=0; i<4*Nb; i++) state[i%4][Math.floor(i/4)] = input[i];
|
||||
|
||||
state = Aes.addRoundKey(state, w, 0, Nb);
|
||||
|
||||
for (var round=1; round<Nr; round++) {
|
||||
state = Aes.subBytes(state, Nb);
|
||||
state = Aes.shiftRows(state, Nb);
|
||||
state = Aes.mixColumns(state, Nb);
|
||||
state = Aes.addRoundKey(state, w, round, Nb);
|
||||
}
|
||||
|
||||
state = Aes.subBytes(state, Nb);
|
||||
state = Aes.shiftRows(state, Nb);
|
||||
state = Aes.addRoundKey(state, w, Nr, Nb);
|
||||
|
||||
var output = new Array(4*Nb); // convert state to 1-d array before returning [§3.4]
|
||||
for (var i=0; i<4*Nb; i++) output[i] = state[i%4][Math.floor(i/4)];
|
||||
|
||||
return output;
|
||||
};
|
||||
|
||||
|
||||
/**
|
||||
* Perform key expansion to generate a key schedule from a cipher key [§5.2].
|
||||
*
|
||||
* @param {number[]} key - Cipher key as 16/24/32-byte array.
|
||||
* @returns {number[][]} Expanded key schedule as 2D byte-array (Nr+1 x Nb bytes).
|
||||
*/
|
||||
Aes.keyExpansion = function(key) {
|
||||
var Nb = 4; // block size (in words): no of columns in state (fixed at 4 for AES)
|
||||
var Nk = key.length/4; // key length (in words): 4/6/8 for 128/192/256-bit keys
|
||||
var Nr = Nk + 6; // no of rounds: 10/12/14 for 128/192/256-bit keys
|
||||
|
||||
var w = new Array(Nb*(Nr+1));
|
||||
var temp = new Array(4);
|
||||
|
||||
// initialise first Nk words of expanded key with cipher key
|
||||
for (var i=0; i<Nk; i++) {
|
||||
var r = [key[4*i], key[4*i+1], key[4*i+2], key[4*i+3]];
|
||||
w[i] = r;
|
||||
}
|
||||
|
||||
// expand the key into the remainder of the schedule
|
||||
for (var i=Nk; i<(Nb*(Nr+1)); i++) {
|
||||
w[i] = new Array(4);
|
||||
for (var t=0; t<4; t++) temp[t] = w[i-1][t];
|
||||
// each Nk'th word has extra transformation
|
||||
if (i % Nk == 0) {
|
||||
temp = Aes.subWord(Aes.rotWord(temp));
|
||||
for (var t=0; t<4; t++) temp[t] ^= Aes.rCon[i/Nk][t];
|
||||
}
|
||||
// 256-bit key has subWord applied every 4th word
|
||||
else if (Nk > 6 && i%Nk == 4) {
|
||||
temp = Aes.subWord(temp);
|
||||
}
|
||||
// xor w[i] with w[i-1] and w[i-Nk]
|
||||
for (var t=0; t<4; t++) w[i][t] = w[i-Nk][t] ^ temp[t];
|
||||
}
|
||||
|
||||
return w;
|
||||
};
|
||||
|
||||
|
||||
/**
|
||||
* Apply SBox to state S [§5.1.1]
|
||||
* @private
|
||||
*/
|
||||
Aes.subBytes = function(s, Nb) {
|
||||
for (var r=0; r<4; r++) {
|
||||
for (var c=0; c<Nb; c++) s[r][c] = Aes.sBox[s[r][c]];
|
||||
}
|
||||
return s;
|
||||
};
|
||||
|
||||
|
||||
/**
|
||||
* Shift row r of state S left by r bytes [§5.1.2]
|
||||
* @private
|
||||
*/
|
||||
Aes.shiftRows = function(s, Nb) {
|
||||
var t = new Array(4);
|
||||
for (var r=1; r<4; r++) {
|
||||
for (var c=0; c<4; c++) t[c] = s[r][(c+r)%Nb]; // shift into temp copy
|
||||
for (var c=0; c<4; c++) s[r][c] = t[c]; // and copy back
|
||||
} // note that this will work for Nb=4,5,6, but not 7,8 (always 4 for AES):
|
||||
return s; // see asmaes.sourceforge.net/rijndael/rijndaelImplementation.pdf
|
||||
};
|
||||
|
||||
|
||||
/**
|
||||
* Combine bytes of each col of state S [§5.1.3]
|
||||
* @private
|
||||
*/
|
||||
Aes.mixColumns = function(s, Nb) {
|
||||
for (var c=0; c<4; c++) {
|
||||
var a = new Array(4); // 'a' is a copy of the current column from 's'
|
||||
var b = new Array(4); // 'b' is a•{02} in GF(2^8)
|
||||
for (var i=0; i<4; i++) {
|
||||
a[i] = s[i][c];
|
||||
b[i] = s[i][c]&0x80 ? s[i][c]<<1 ^ 0x011b : s[i][c]<<1;
|
||||
}
|
||||
// a[n] ^ b[n] is a•{03} in GF(2^8)
|
||||
s[0][c] = b[0] ^ a[1] ^ b[1] ^ a[2] ^ a[3]; // {02}•a0 + {03}•a1 + a2 + a3
|
||||
s[1][c] = a[0] ^ b[1] ^ a[2] ^ b[2] ^ a[3]; // a0 • {02}•a1 + {03}•a2 + a3
|
||||
s[2][c] = a[0] ^ a[1] ^ b[2] ^ a[3] ^ b[3]; // a0 + a1 + {02}•a2 + {03}•a3
|
||||
s[3][c] = a[0] ^ b[0] ^ a[1] ^ a[2] ^ b[3]; // {03}•a0 + a1 + a2 + {02}•a3
|
||||
}
|
||||
return s;
|
||||
};
|
||||
|
||||
|
||||
/**
|
||||
* Xor Round Key into state S [§5.1.4]
|
||||
* @private
|
||||
*/
|
||||
Aes.addRoundKey = function(state, w, rnd, Nb) {
|
||||
for (var r=0; r<4; r++) {
|
||||
for (var c=0; c<Nb; c++) state[r][c] ^= w[rnd*4+c][r];
|
||||
}
|
||||
return state;
|
||||
};
|
||||
|
||||
|
||||
/**
|
||||
* Apply SBox to 4-byte word w
|
||||
* @private
|
||||
*/
|
||||
Aes.subWord = function(w) {
|
||||
for (var i=0; i<4; i++) w[i] = Aes.sBox[w[i]];
|
||||
return w;
|
||||
};
|
||||
|
||||
|
||||
/**
|
||||
* Rotate 4-byte word w left by one byte
|
||||
* @private
|
||||
*/
|
||||
Aes.rotWord = function(w) {
|
||||
var tmp = w[0];
|
||||
for (var i=0; i<3; i++) w[i] = w[i+1];
|
||||
w[3] = tmp;
|
||||
return w;
|
||||
};
|
||||
|
||||
|
||||
// sBox is pre-computed multiplicative inverse in GF(2^8) used in subBytes and keyExpansion [§5.1.1]
|
||||
Aes.sBox = [0x63,0x7c,0x77,0x7b,0xf2,0x6b,0x6f,0xc5,0x30,0x01,0x67,0x2b,0xfe,0xd7,0xab,0x76,
|
||||
0xca,0x82,0xc9,0x7d,0xfa,0x59,0x47,0xf0,0xad,0xd4,0xa2,0xaf,0x9c,0xa4,0x72,0xc0,
|
||||
0xb7,0xfd,0x93,0x26,0x36,0x3f,0xf7,0xcc,0x34,0xa5,0xe5,0xf1,0x71,0xd8,0x31,0x15,
|
||||
0x04,0xc7,0x23,0xc3,0x18,0x96,0x05,0x9a,0x07,0x12,0x80,0xe2,0xeb,0x27,0xb2,0x75,
|
||||
0x09,0x83,0x2c,0x1a,0x1b,0x6e,0x5a,0xa0,0x52,0x3b,0xd6,0xb3,0x29,0xe3,0x2f,0x84,
|
||||
0x53,0xd1,0x00,0xed,0x20,0xfc,0xb1,0x5b,0x6a,0xcb,0xbe,0x39,0x4a,0x4c,0x58,0xcf,
|
||||
0xd0,0xef,0xaa,0xfb,0x43,0x4d,0x33,0x85,0x45,0xf9,0x02,0x7f,0x50,0x3c,0x9f,0xa8,
|
||||
0x51,0xa3,0x40,0x8f,0x92,0x9d,0x38,0xf5,0xbc,0xb6,0xda,0x21,0x10,0xff,0xf3,0xd2,
|
||||
0xcd,0x0c,0x13,0xec,0x5f,0x97,0x44,0x17,0xc4,0xa7,0x7e,0x3d,0x64,0x5d,0x19,0x73,
|
||||
0x60,0x81,0x4f,0xdc,0x22,0x2a,0x90,0x88,0x46,0xee,0xb8,0x14,0xde,0x5e,0x0b,0xdb,
|
||||
0xe0,0x32,0x3a,0x0a,0x49,0x06,0x24,0x5c,0xc2,0xd3,0xac,0x62,0x91,0x95,0xe4,0x79,
|
||||
0xe7,0xc8,0x37,0x6d,0x8d,0xd5,0x4e,0xa9,0x6c,0x56,0xf4,0xea,0x65,0x7a,0xae,0x08,
|
||||
0xba,0x78,0x25,0x2e,0x1c,0xa6,0xb4,0xc6,0xe8,0xdd,0x74,0x1f,0x4b,0xbd,0x8b,0x8a,
|
||||
0x70,0x3e,0xb5,0x66,0x48,0x03,0xf6,0x0e,0x61,0x35,0x57,0xb9,0x86,0xc1,0x1d,0x9e,
|
||||
0xe1,0xf8,0x98,0x11,0x69,0xd9,0x8e,0x94,0x9b,0x1e,0x87,0xe9,0xce,0x55,0x28,0xdf,
|
||||
0x8c,0xa1,0x89,0x0d,0xbf,0xe6,0x42,0x68,0x41,0x99,0x2d,0x0f,0xb0,0x54,0xbb,0x16];
|
||||
|
||||
|
||||
// rCon is Round Constant used for the Key Expansion [1st col is 2^(r-1) in GF(2^8)] [§5.2]
|
||||
Aes.rCon = [ [0x00, 0x00, 0x00, 0x00],
|
||||
[0x01, 0x00, 0x00, 0x00],
|
||||
[0x02, 0x00, 0x00, 0x00],
|
||||
[0x04, 0x00, 0x00, 0x00],
|
||||
[0x08, 0x00, 0x00, 0x00],
|
||||
[0x10, 0x00, 0x00, 0x00],
|
||||
[0x20, 0x00, 0x00, 0x00],
|
||||
[0x40, 0x00, 0x00, 0x00],
|
||||
[0x80, 0x00, 0x00, 0x00],
|
||||
[0x1b, 0x00, 0x00, 0x00],
|
||||
[0x36, 0x00, 0x00, 0x00] ];
|
||||
|
||||
|
||||
/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
|
||||
if (typeof module != 'undefined' && module.exports) module.exports = Aes; // CommonJs export
|
||||
if (typeof define == 'function' && define.amd) define([], function() { return Aes; }); // AMD
|
||||
|
||||
|
||||
|
||||
|
||||
/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
|
||||
/* AES Counter-mode implementation in JavaScript (c) Chris Veness 2005-2014 / MIT Licence */
|
||||
/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
|
||||
|
||||
/* jshint node:true *//* global define, escape, unescape, btoa, atob */
|
||||
'use strict';
|
||||
if (typeof module!='undefined' && module.exports) var Aes = require('./aes'); // CommonJS (Node.js)
|
||||
|
||||
|
||||
/**
|
||||
* Aes.Ctr: Counter-mode (CTR) wrapper for AES.
|
||||
*
|
||||
* This encrypts a Unicode string to produces a base64 ciphertext using 128/192/256-bit AES,
|
||||
* and the converse to decrypt an encrypted ciphertext.
|
||||
*
|
||||
* See http://csrc.nist.gov/publications/nistpubs/800-38a/sp800-38a.pdf
|
||||
*
|
||||
* @augments Aes
|
||||
*/
|
||||
Aes.Ctr = {};
|
||||
|
||||
|
||||
/**
|
||||
* Encrypt a text using AES encryption in Counter mode of operation.
|
||||
*
|
||||
* Unicode multi-byte character safe
|
||||
*
|
||||
* @param {string} plaintext - Source text to be encrypted.
|
||||
* @param {string} password - The password to use to generate a key.
|
||||
* @param {number} nBits - Number of bits to be used in the key; 128 / 192 / 256.
|
||||
* @returns {string} Encrypted text.
|
||||
*
|
||||
* @example
|
||||
* var encr = Aes.Ctr.encrypt('big secret', 'pāşšŵōřđ', 256); // encr: 'lwGl66VVwVObKIr6of8HVqJr'
|
||||
*/
|
||||
Aes.Ctr.encrypt = function(plaintext, password, nBits) {
|
||||
var blockSize = 16; // block size fixed at 16 bytes / 128 bits (Nb=4) for AES
|
||||
if (!(nBits==128 || nBits==192 || nBits==256)) return ''; // standard allows 128/192/256 bit keys
|
||||
plaintext = String(plaintext).utf8Encode();
|
||||
password = String(password).utf8Encode();
|
||||
|
||||
// use AES itself to encrypt password to get cipher key (using plain password as source for key
|
||||
// expansion) - gives us well encrypted key (though hashed key might be preferred for prod'n use)
|
||||
var nBytes = nBits/8; // no bytes in key (16/24/32)
|
||||
var pwBytes = new Array(nBytes);
|
||||
for (var i=0; i<nBytes; i++) { // use 1st 16/24/32 chars of password for key
|
||||
pwBytes[i] = isNaN(password.charCodeAt(i)) ? 0 : password.charCodeAt(i);
|
||||
}
|
||||
var key = Aes.cipher(pwBytes, Aes.keyExpansion(pwBytes)); // gives us 16-byte key
|
||||
key = key.concat(key.slice(0, nBytes-16)); // expand key to 16/24/32 bytes long
|
||||
|
||||
// initialise 1st 8 bytes of counter block with nonce (NIST SP800-38A §B.2): [0-1] = millisec,
|
||||
// [2-3] = random, [4-7] = seconds, together giving full sub-millisec uniqueness up to Feb 2106
|
||||
var counterBlock = new Array(blockSize);
|
||||
|
||||
var nonce = (new Date()).getTime(); // timestamp: milliseconds since 1-Jan-1970
|
||||
var nonceMs = nonce%1000;
|
||||
var nonceSec = Math.floor(nonce/1000);
|
||||
var nonceRnd = Math.floor(Math.random()*0xffff);
|
||||
// for debugging: nonce = nonceMs = nonceSec = nonceRnd = 0;
|
||||
|
||||
for (var i=0; i<2; i++) counterBlock[i] = (nonceMs >>> i*8) & 0xff;
|
||||
for (var i=0; i<2; i++) counterBlock[i+2] = (nonceRnd >>> i*8) & 0xff;
|
||||
for (var i=0; i<4; i++) counterBlock[i+4] = (nonceSec >>> i*8) & 0xff;
|
||||
|
||||
// and convert it to a string to go on the front of the ciphertext
|
||||
var ctrTxt = '';
|
||||
for (var i=0; i<8; i++) ctrTxt += String.fromCharCode(counterBlock[i]);
|
||||
|
||||
// generate key schedule - an expansion of the key into distinct Key Rounds for each round
|
||||
var keySchedule = Aes.keyExpansion(key);
|
||||
|
||||
var blockCount = Math.ceil(plaintext.length/blockSize);
|
||||
var ciphertxt = new Array(blockCount); // ciphertext as array of strings
|
||||
|
||||
for (var b=0; b<blockCount; b++) {
|
||||
// set counter (block #) in last 8 bytes of counter block (leaving nonce in 1st 8 bytes)
|
||||
// done in two stages for 32-bit ops: using two words allows us to go past 2^32 blocks (68GB)
|
||||
for (var c=0; c<4; c++) counterBlock[15-c] = (b >>> c*8) & 0xff;
|
||||
for (var c=0; c<4; c++) counterBlock[15-c-4] = (b/0x100000000 >>> c*8);
|
||||
|
||||
var cipherCntr = Aes.cipher(counterBlock, keySchedule); // -- encrypt counter block --
|
||||
|
||||
// block size is reduced on final block
|
||||
var blockLength = b<blockCount-1 ? blockSize : (plaintext.length-1)%blockSize+1;
|
||||
var cipherChar = new Array(blockLength);
|
||||
|
||||
for (var i=0; i<blockLength; i++) { // -- xor plaintext with ciphered counter char-by-char --
|
||||
cipherChar[i] = cipherCntr[i] ^ plaintext.charCodeAt(b*blockSize+i);
|
||||
cipherChar[i] = String.fromCharCode(cipherChar[i]);
|
||||
}
|
||||
ciphertxt[b] = cipherChar.join('');
|
||||
}
|
||||
|
||||
// use Array.join() for better performance than repeated string appends
|
||||
var ciphertext = ctrTxt + ciphertxt.join('');
|
||||
ciphertext = ciphertext.base64Encode();
|
||||
|
||||
return ciphertext;
|
||||
};
|
||||
|
||||
|
||||
/**
|
||||
* Decrypt a text encrypted by AES in counter mode of operation
|
||||
*
|
||||
* @param {string} ciphertext - Source text to be encrypted.
|
||||
* @param {string} password - Password to use to generate a key.
|
||||
* @param {number} nBits - Number of bits to be used in the key; 128 / 192 / 256.
|
||||
* @returns {string} Decrypted text
|
||||
*
|
||||
* @example
|
||||
* var decr = Aes.Ctr.encrypt('lwGl66VVwVObKIr6of8HVqJr', 'pāşšŵōřđ', 256); // decr: 'big secret'
|
||||
*/
|
||||
Aes.Ctr.decrypt = function(ciphertext, password, nBits) {
|
||||
var blockSize = 16; // block size fixed at 16 bytes / 128 bits (Nb=4) for AES
|
||||
if (!(nBits==128 || nBits==192 || nBits==256)) return ''; // standard allows 128/192/256 bit keys
|
||||
ciphertext = String(ciphertext).base64Decode();
|
||||
password = String(password).utf8Encode();
|
||||
|
||||
// use AES to encrypt password (mirroring encrypt routine)
|
||||
var nBytes = nBits/8; // no bytes in key
|
||||
var pwBytes = new Array(nBytes);
|
||||
for (var i=0; i<nBytes; i++) {
|
||||
pwBytes[i] = isNaN(password.charCodeAt(i)) ? 0 : password.charCodeAt(i);
|
||||
}
|
||||
var key = Aes.cipher(pwBytes, Aes.keyExpansion(pwBytes));
|
||||
key = key.concat(key.slice(0, nBytes-16)); // expand key to 16/24/32 bytes long
|
||||
|
||||
// recover nonce from 1st 8 bytes of ciphertext
|
||||
var counterBlock = new Array(8);
|
||||
var ctrTxt = ciphertext.slice(0, 8);
|
||||
for (var i=0; i<8; i++) counterBlock[i] = ctrTxt.charCodeAt(i);
|
||||
|
||||
// generate key schedule
|
||||
var keySchedule = Aes.keyExpansion(key);
|
||||
|
||||
// separate ciphertext into blocks (skipping past initial 8 bytes)
|
||||
var nBlocks = Math.ceil((ciphertext.length-8) / blockSize);
|
||||
var ct = new Array(nBlocks);
|
||||
for (var b=0; b<nBlocks; b++) ct[b] = ciphertext.slice(8+b*blockSize, 8+b*blockSize+blockSize);
|
||||
ciphertext = ct; // ciphertext is now array of block-length strings
|
||||
|
||||
// plaintext will get generated block-by-block into array of block-length strings
|
||||
var plaintxt = new Array(ciphertext.length);
|
||||
|
||||
for (var b=0; b<nBlocks; b++) {
|
||||
// set counter (block #) in last 8 bytes of counter block (leaving nonce in 1st 8 bytes)
|
||||
for (var c=0; c<4; c++) counterBlock[15-c] = ((b) >>> c*8) & 0xff;
|
||||
for (var c=0; c<4; c++) counterBlock[15-c-4] = (((b+1)/0x100000000-1) >>> c*8) & 0xff;
|
||||
|
||||
var cipherCntr = Aes.cipher(counterBlock, keySchedule); // encrypt counter block
|
||||
|
||||
var plaintxtByte = new Array(ciphertext[b].length);
|
||||
for (var i=0; i<ciphertext[b].length; i++) {
|
||||
// -- xor plaintxt with ciphered counter byte-by-byte --
|
||||
plaintxtByte[i] = cipherCntr[i] ^ ciphertext[b].charCodeAt(i);
|
||||
plaintxtByte[i] = String.fromCharCode(plaintxtByte[i]);
|
||||
}
|
||||
plaintxt[b] = plaintxtByte.join('');
|
||||
}
|
||||
|
||||
// join array of blocks into single plaintext string
|
||||
var plaintext = plaintxt.join('');
|
||||
plaintext = plaintext.utf8Decode(); // decode from UTF8 back to Unicode multi-byte chars
|
||||
|
||||
return plaintext;
|
||||
};
|
||||
|
||||
|
||||
/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
|
||||
|
||||
|
||||
/** Extend String object with method to encode multi-byte string to utf8
|
||||
* - monsur.hossa.in/2012/07/20/utf-8-in-javascript.html */
|
||||
if (typeof String.prototype.utf8Encode == 'undefined') {
|
||||
String.prototype.utf8Encode = function() {
|
||||
return unescape( encodeURIComponent( this ) );
|
||||
};
|
||||
}
|
||||
|
||||
/** Extend String object with method to decode utf8 string to multi-byte */
|
||||
if (typeof String.prototype.utf8Decode == 'undefined') {
|
||||
String.prototype.utf8Decode = function() {
|
||||
try {
|
||||
return decodeURIComponent( escape( this ) );
|
||||
} catch (e) {
|
||||
return this; // invalid UTF-8? return as-is
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
/** Extend String object with method to encode base64
|
||||
* - developer.mozilla.org/en-US/docs/Web/API/window.btoa, nodejs.org/api/buffer.html
|
||||
* note: if btoa()/atob() are not available (eg IE9-), try github.com/davidchambers/Base64.js */
|
||||
if (typeof String.prototype.base64Encode == 'undefined') {
|
||||
String.prototype.base64Encode = function() {
|
||||
if (typeof btoa != 'undefined') return btoa(this); // browser
|
||||
if (typeof Buffer != 'undefined') return new Buffer(this, 'utf8').toString('base64'); // Node.js
|
||||
throw new Error('No Base64 Encode');
|
||||
};
|
||||
}
|
||||
|
||||
/** Extend String object with method to decode base64 */
|
||||
if (typeof String.prototype.base64Decode == 'undefined') {
|
||||
String.prototype.base64Decode = function() {
|
||||
if (typeof atob != 'undefined') return atob(this); // browser
|
||||
if (typeof Buffer != 'undefined') return new Buffer(this, 'base64').toString('utf8'); // Node.js
|
||||
throw new Error('No Base64 Decode');
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
|
||||
if (typeof module != 'undefined' && module.exports) module.exports = Aes.Ctr; // CommonJs export
|
||||
if (typeof define == 'function' && define.amd) define(['Aes'], function() { return Aes.Ctr; }); // AMD
|
||||
|
||||
|
||||
/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
|
||||
/* Encrypt/decrypt files */
|
||||
/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
|
||||
|
||||
function encryptFile(file) {
|
||||
// use FileReader.readAsArrayBuffer to handle binary files
|
||||
var reader = new FileReader();
|
||||
reader.readAsArrayBuffer(file);
|
||||
reader.onload = function(evt) {
|
||||
$('body').css({'cursor':'wait'});
|
||||
|
||||
// Aes.Ctr.encrypt expects a string, but converting binary file directly to string could
|
||||
// give invalid Unicode sequences, so convert bytestream ArrayBuffer to single-byte chars
|
||||
var contentBytes = new Uint8Array(reader.result); // ≡ evt.target.result
|
||||
var contentStr = '';
|
||||
for (var i=0; i<contentBytes.length; i++) {
|
||||
contentStr += String.fromCharCode(contentBytes[i]);
|
||||
}
|
||||
|
||||
var password = $('#password-file').val();
|
||||
|
||||
var t1 = new Date();
|
||||
var ciphertext = Aes.Ctr.encrypt(contentStr, password, 256);
|
||||
var t2 = new Date();
|
||||
|
||||
// use Blob to save encrypted file
|
||||
var blob = new Blob([ciphertext], { type: 'text/plain' });
|
||||
var filename = file.name+'.encrypted';
|
||||
saveAs(blob, filename);
|
||||
|
||||
$('#encrypt-file-time').html(((t2 - t1)/1000)+'s'); // display time taken
|
||||
$('body').css({'cursor':'default'});
|
||||
}
|
||||
}
|
||||
|
||||
function decryptFile(file) {
|
||||
// use FileReader.ReadAsText to read (base64-encoded) ciphertext file
|
||||
var reader = new FileReader();
|
||||
reader.readAsText(file);
|
||||
reader.onload = function(evt) {
|
||||
$('body').css({'cursor':'wait'});
|
||||
|
||||
var content = reader.result; // ≡ evt.target.result
|
||||
var password = $('#password-file').val();
|
||||
|
||||
var t1 = new Date();
|
||||
var plaintext = Aes.Ctr.decrypt(content, password, 256);
|
||||
var t2 = new Date();
|
||||
|
||||
// convert single-byte character stream to ArrayBuffer bytestream
|
||||
var contentBytes = new Uint8Array(plaintext.length);
|
||||
for (var i=0; i<plaintext.length; i++) {
|
||||
contentBytes[i] = plaintext.charCodeAt(i);
|
||||
}
|
||||
|
||||
// use Blob to save decrypted file
|
||||
var blob = new Blob([contentBytes], { type: 'application/octet-stream' });
|
||||
var filename = file.name.replace(/\.encrypted$/,'')+'.decrypted';
|
||||
saveAs(blob, filename);
|
||||
|
||||
$('#decrypt-file-time').html(((t2 - t1)/1000)+'s'); // display time taken
|
||||
$('body').css({'cursor':'default'});
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
2639
web/api/Base.js
2639
web/api/Base.js
File diff suppressed because it is too large
Load Diff
@@ -1,5 +1,13 @@
|
||||
function ConversationsAdapter(endPoint,tab,filter,orderBy) {
|
||||
this.initAdapter(endPoint,tab,filter,orderBy);
|
||||
/*
|
||||
Copyright (c) 2018 [Glacies UG, Berlin, Germany] (http://glacies.de)
|
||||
Developer: Thilina Hasantha (http://lk.linkedin.com/in/thilinah | https://github.com/thilinah)
|
||||
*/
|
||||
/* global showUploadDialog */
|
||||
import AdapterBase from './AdapterBase';
|
||||
|
||||
class ConversationsAdapter extends AdapterBase {
|
||||
constructor(endPoint, tab, filter, orderBy) {
|
||||
super(endPoint, tab, filter, orderBy);
|
||||
this.topLimit = 0;
|
||||
this.bottomLimit = 0;
|
||||
this.conversations = [];
|
||||
@@ -10,339 +18,335 @@ function ConversationsAdapter(endPoint,tab,filter,orderBy) {
|
||||
this.pageSize = 6;
|
||||
this.currentPage = 1;
|
||||
this.hasMoreData = true;
|
||||
this.searchTerm = "";
|
||||
this.searchTerm = '';
|
||||
this.searchInput = null;
|
||||
this.timer = null;
|
||||
this.timeoutDelay = 0;
|
||||
this.topLimitUpdated = false;
|
||||
}
|
||||
}
|
||||
|
||||
ConversationsAdapter.inherits(AdapterBase);
|
||||
|
||||
ConversationsAdapter.method('getDataMapping', function() {
|
||||
getDataMapping() {
|
||||
return [];
|
||||
});
|
||||
}
|
||||
|
||||
ConversationsAdapter.method('getHeaders', function() {
|
||||
getHeaders() {
|
||||
return [];
|
||||
});
|
||||
}
|
||||
|
||||
ConversationsAdapter.method('getFormFields', function() {
|
||||
getFormFields() {
|
||||
return [];
|
||||
});
|
||||
}
|
||||
|
||||
ConversationsAdapter.method('addConversation', function() {
|
||||
var object = this.validateCreateConversation();
|
||||
addConversation() {
|
||||
const object = this.validateCreateConversation();
|
||||
|
||||
if (!object) {
|
||||
return false;
|
||||
return false;
|
||||
}
|
||||
object.type = this.type;
|
||||
object.clienttime = (new Date()).getTimezoneOffset();
|
||||
var reqJson = JSON.stringify(object);
|
||||
var callBackData = [];
|
||||
callBackData['callBackData'] = [];
|
||||
callBackData['callBackSuccess'] = 'addConversationSuccessCallBack';
|
||||
callBackData['callBackFail'] = 'addConversationFailCallBack';
|
||||
const reqJson = JSON.stringify(object);
|
||||
const callBackData = [];
|
||||
callBackData.callBackData = [];
|
||||
callBackData.callBackSuccess = 'addConversationSuccessCallBack';
|
||||
callBackData.callBackFail = 'addConversationFailCallBack';
|
||||
|
||||
this.customAction('addConversation','modules=conversations',reqJson,callBackData);
|
||||
});
|
||||
this.customAction('addConversation', 'modules=conversations', reqJson, callBackData);
|
||||
return true;
|
||||
}
|
||||
|
||||
ConversationsAdapter.method('clearInputs', function() {
|
||||
clearInputs() {
|
||||
$('#contentMessage').data('simplemde').value('');
|
||||
$('#attachment').html(this.gt('Attach File'));
|
||||
$('#attachment_remove').hide();
|
||||
$('#attachment_download').hide();
|
||||
});
|
||||
}
|
||||
|
||||
ConversationsAdapter.method('uploadPostAttachment', function() {
|
||||
var rand = this.generateRandom(14);
|
||||
showUploadDialog('attachment_'+rand,'Upload Attachment','Conversation',1,'attachment','html','name','all');
|
||||
});
|
||||
uploadPostAttachment() {
|
||||
const rand = this.generateRandom(14);
|
||||
showUploadDialog(`attachment_${rand}`, 'Upload Attachment', 'Conversation', 1, 'attachment', 'html', 'name', 'all');
|
||||
}
|
||||
|
||||
ConversationsAdapter.method('setConversationType', function(type) {
|
||||
setConversationType(type) {
|
||||
this.type = type;
|
||||
});
|
||||
}
|
||||
|
||||
ConversationsAdapter.method('addConversationSuccessCallBack', function(callBackData) {
|
||||
addConversationSuccessCallBack() {
|
||||
this.clearInputs();
|
||||
this.getConversations(this.topLimit, this.pageSize, true);
|
||||
});
|
||||
}
|
||||
|
||||
ConversationsAdapter.method('addConversationFailCallBack', function(callBackData) {
|
||||
addConversationFailCallBack() {
|
||||
|
||||
});
|
||||
}
|
||||
|
||||
ConversationsAdapter.method('deleteConversation', function(id) {
|
||||
var object = {id: id};
|
||||
var reqJson = JSON.stringify(object);
|
||||
var callBackData = [];
|
||||
callBackData['callBackData'] = [];
|
||||
callBackData['callBackSuccess'] = 'deleteConversationSuccessCallBack';
|
||||
callBackData['callBackFail'] = 'deleteConversationFailCallBack';
|
||||
deleteConversation(id) {
|
||||
const object = { id };
|
||||
const reqJson = JSON.stringify(object);
|
||||
const callBackData = [];
|
||||
callBackData.callBackData = [];
|
||||
callBackData.callBackSuccess = 'deleteConversationSuccessCallBack';
|
||||
callBackData.callBackFail = 'deleteConversationFailCallBack';
|
||||
|
||||
this.customAction('deleteConversation','modules=conversations',reqJson,callBackData);
|
||||
});
|
||||
this.customAction('deleteConversation', 'modules=conversations', reqJson, callBackData);
|
||||
}
|
||||
|
||||
|
||||
deleteConversationSuccessCallBack(callBackData) {
|
||||
$(`#obj_${callBackData}`).fadeOut();
|
||||
}
|
||||
|
||||
ConversationsAdapter.method('deleteConversationSuccessCallBack', function(callBackData) {
|
||||
$('#obj_'+callBackData).fadeOut();
|
||||
});
|
||||
deleteConversationFailCallBack() {
|
||||
|
||||
ConversationsAdapter.method('deleteConversationFailCallBack', function(callBackData) {
|
||||
}
|
||||
|
||||
});
|
||||
|
||||
ConversationsAdapter.method('toggleConversationSize', function(id) {
|
||||
$('#obj_'+id).find('.conversation-body').toggleClass('conversation-small');
|
||||
if ($('#obj_'+id).find('.conversation-body').hasClass('conversation-small')) {
|
||||
$('#obj_'+id).find('.conversation-expand-label').html(this.gt('Show More'));
|
||||
toggleConversationSize(id) {
|
||||
$(`#obj_${id}`).find('.conversation-body').toggleClass('conversation-small');
|
||||
if ($(`#obj_${id}`).find('.conversation-body').hasClass('conversation-small')) {
|
||||
$(`#obj_${id}`).find('.conversation-expand-label').html(this.gt('Show More'));
|
||||
} else {
|
||||
$('#obj_'+id).find('.conversation-expand-label').html(this.gt('Show Less'));
|
||||
$(`#obj_${id}`).find('.conversation-expand-label').html(this.gt('Show Less'));
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
ConversationsAdapter.method('getConversations', function(start, limit, addToTop) {
|
||||
var reqJson = JSON.stringify({
|
||||
start: start,
|
||||
limit: limit,
|
||||
top: addToTop,
|
||||
type: this.type
|
||||
getConversations(start, limit, addToTop) {
|
||||
const reqJson = JSON.stringify({
|
||||
start,
|
||||
limit,
|
||||
top: addToTop,
|
||||
type: this.type,
|
||||
});
|
||||
var callBackData = [addToTop];
|
||||
callBackData['callBackData'] = callBackData;
|
||||
callBackData['callBackSuccess'] = 'getConversationsSuccessCallBack';
|
||||
callBackData['callBackFail'] = 'getConversationsFailCallBack';
|
||||
const callBackData = [addToTop];
|
||||
callBackData.callBackData = callBackData;
|
||||
callBackData.callBackSuccess = 'getConversationsSuccessCallBack';
|
||||
callBackData.callBackFail = 'getConversationsFailCallBack';
|
||||
this.showConversationLoader();
|
||||
this.customAction('getConversations','modules=conversations',reqJson,callBackData);
|
||||
});
|
||||
this.customAction('getConversations', 'modules=conversations', reqJson, callBackData);
|
||||
}
|
||||
|
||||
|
||||
|
||||
ConversationsAdapter.method('getConversationsSuccessCallBack', function(addToTop, serverData) {
|
||||
getConversationsSuccessCallBack(addToTop, serverData) {
|
||||
this.hideLoader();
|
||||
var data = [];
|
||||
if(!addToTop && serverData.length > this.pageSize){
|
||||
this.hasMoreData = true;
|
||||
serverData.pop();
|
||||
this.loadMoreButton.removeAttr('disabled');
|
||||
this.loadMoreButton.show();
|
||||
const data = [];
|
||||
if (!addToTop && serverData.length > this.pageSize) {
|
||||
this.hasMoreData = true;
|
||||
serverData.pop();
|
||||
this.loadMoreButton.removeAttr('disabled');
|
||||
this.loadMoreButton.show();
|
||||
} else if (!addToTop) {
|
||||
this.hasMoreData = false;
|
||||
this.loadMoreButton.hide();
|
||||
this.hasMoreData = false;
|
||||
this.loadMoreButton.hide();
|
||||
}
|
||||
|
||||
if (!addToTop) {
|
||||
this.scrollToElementBottom(this.container);
|
||||
this.scrollToElementBottom(this.container);
|
||||
}
|
||||
|
||||
for(var i=0;i<serverData.length;i++){
|
||||
data.push(this.preProcessTableData(serverData[i]));
|
||||
for (let i = 0; i < serverData.length; i++) {
|
||||
data.push(this.preProcessTableData(serverData[i]));
|
||||
}
|
||||
this.sourceData = serverData;
|
||||
this.topLimitUpdated = false;
|
||||
for(var i=0;i<data.length;i++){
|
||||
this.renderObject(data[i], addToTop);
|
||||
if (data[i].timeint < this.bottomLimit || this.bottomLimit === 0) {
|
||||
this.bottomLimit = data[i].timeint;
|
||||
}
|
||||
for (let i = 0; i < data.length; i++) {
|
||||
this.renderObject(data[i], addToTop);
|
||||
if (data[i].timeint < this.bottomLimit || this.bottomLimit === 0) {
|
||||
this.bottomLimit = data[i].timeint;
|
||||
}
|
||||
|
||||
if (data[i].timeint > this.topLimit || this.topLimit === 0) {
|
||||
this.topLimit = data[i].timeint;
|
||||
this.topLimitUpdated = true;
|
||||
}
|
||||
if (data[i].timeint > this.topLimit || this.topLimit === 0) {
|
||||
this.topLimit = data[i].timeint;
|
||||
this.topLimitUpdated = true;
|
||||
}
|
||||
}
|
||||
this.hideConversationLoader();
|
||||
});
|
||||
}
|
||||
|
||||
ConversationsAdapter.method('getConversationsFailCallBack', function(callBackData) {
|
||||
getConversationsFailCallBack() {
|
||||
this.hideLoader();
|
||||
this.hideConversationLoader();
|
||||
if (this.timer !== null) {
|
||||
clearTimeout(this.timer);
|
||||
this.timer = null;
|
||||
clearTimeout(this.timer);
|
||||
this.timer = null;
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
ConversationsAdapter.method('getObjectHTML', function(object) {
|
||||
var t = this.getCustomTemplate(this.getTemplateName());
|
||||
getObjectHTML(object) {
|
||||
let t = this.getCustomTemplate(this.getTemplateName());
|
||||
t = t.replace(new RegExp('#_id_#', 'g'), object.id);
|
||||
t = t.replace(new RegExp('#_message_#', 'g'), object.message);
|
||||
t = t.replace(new RegExp('#_employeeName_#', 'g'), object.employeeName);
|
||||
t = t.replace(new RegExp('#_employeeImage_#', 'g'), object.employeeImage);
|
||||
t = t.replace(new RegExp('#_date_#', 'g'), object.date);
|
||||
|
||||
if (object.attachment !== '' && object.attachment !== null && object.attachment !== undefined) {
|
||||
var at = this.getCustomTemplate('attachment.html');
|
||||
at = at.replace(new RegExp('#_attachment_#', 'g'), object.attachment);
|
||||
at = at.replace(new RegExp('#_icon_#', 'g'), this.getIconByFileType(object.file.type));
|
||||
at = at.replace(new RegExp('#_color_#', 'g'), this.getColorByFileType(object.file.type));
|
||||
at = at.replace(new RegExp('#_name_#', 'g'), object.file.name);
|
||||
at = at.replace(new RegExp('#_size_#', 'g'), object.file.size_text);
|
||||
t = t.replace(new RegExp('#_attachment_#', 'g'), at);
|
||||
if (object.attachment !== '' && object.attachment !== null && object.attachment !== undefined) {
|
||||
let at = this.getCustomTemplate('attachment.html');
|
||||
at = at.replace(new RegExp('#_attachment_#', 'g'), object.attachment);
|
||||
at = at.replace(new RegExp('#_icon_#', 'g'), this.getIconByFileType(object.file.type));
|
||||
at = at.replace(new RegExp('#_color_#', 'g'), this.getColorByFileType(object.file.type));
|
||||
at = at.replace(new RegExp('#_name_#', 'g'), object.file.name);
|
||||
at = at.replace(new RegExp('#_size_#', 'g'), object.file.size_text);
|
||||
t = t.replace(new RegExp('#_attachment_#', 'g'), at);
|
||||
} else {
|
||||
t = t.replace(new RegExp('#_attachment_#', 'g'), '');
|
||||
t = t.replace(new RegExp('#_attachment_#', 'g'), '');
|
||||
}
|
||||
|
||||
return t;
|
||||
}
|
||||
|
||||
});
|
||||
|
||||
ConversationsAdapter.method('setPageSize', function(pageSize) {
|
||||
setPageSize(pageSize) {
|
||||
this.pageSize = pageSize;
|
||||
});
|
||||
}
|
||||
|
||||
ConversationsAdapter.method('addDomEvents', function(object) {
|
||||
// eslint-disable-next-line no-unused-vars
|
||||
addDomEvents(object) {
|
||||
|
||||
});
|
||||
}
|
||||
|
||||
ConversationsAdapter.method('getTemplateName', function() {
|
||||
getTemplateName() {
|
||||
return 'conversation.html';
|
||||
});
|
||||
}
|
||||
|
||||
ConversationsAdapter.method('renderObject', function(object, addToTop) {
|
||||
renderObject(object, addToTop) {
|
||||
const objDom = this.getObjectDom(object.id);
|
||||
|
||||
var objDom = this.getObjectDom(object.id);
|
||||
|
||||
var html = this.getObjectHTML(object);
|
||||
var domObj = $(html);
|
||||
const html = this.getObjectHTML(object);
|
||||
const domObj = $(html);
|
||||
|
||||
|
||||
if (objDom !== undefined && objDom !== null) {
|
||||
objDom.replace(domObj);
|
||||
if (objDom !== undefined && objDom !== null) {
|
||||
objDom.replace(domObj);
|
||||
} else if (addToTop) {
|
||||
this.container.prepend(domObj);
|
||||
$('#obj_'+object.id).css('background-color', '#FFF8DC');
|
||||
$('#obj_'+object.id).fadeIn('slow');
|
||||
$('#obj_'+object.id).animate({backgroundColor: '#FFF'}, 'slow');
|
||||
this.container.prepend(domObj);
|
||||
$(`#obj_${object.id}`).css('background-color', '#FFF8DC');
|
||||
$(`#obj_${object.id}`).fadeIn('slow');
|
||||
$(`#obj_${object.id}`).animate({ backgroundColor: '#FFF' }, 'slow');
|
||||
} else {
|
||||
this.container.append(domObj);
|
||||
$('#obj_'+object.id).fadeIn('slow');
|
||||
this.container.append(domObj);
|
||||
$(`#obj_${object.id}`).fadeIn('slow');
|
||||
}
|
||||
|
||||
if (domObj.find('.conversation-body').prop('scrollHeight') > 290) {
|
||||
domObj.find('.conversation-expand').show();
|
||||
domObj.find('.conversation-expand').show();
|
||||
}
|
||||
|
||||
if (object.actionDelete === 1) {
|
||||
domObj.find('.delete-button').show();
|
||||
domObj.find('.delete-button').show();
|
||||
}
|
||||
|
||||
this.addDomEvents(domObj);
|
||||
});
|
||||
}
|
||||
|
||||
ConversationsAdapter.method('setContainer', function(container) {
|
||||
setContainer(container) {
|
||||
this.container = container;
|
||||
});
|
||||
}
|
||||
|
||||
ConversationsAdapter.method('setLoadMoreButton', function(loadMoreButton) {
|
||||
var that = this;
|
||||
setLoadMoreButton(loadMoreButton) {
|
||||
const that = this;
|
||||
this.loadMoreButton = loadMoreButton;
|
||||
this.loadMoreButton.off().on('click',function(){
|
||||
that.loadMoreButton.attr('disabled','disabled');
|
||||
that.loadMore([]);
|
||||
}
|
||||
);
|
||||
});
|
||||
this.loadMoreButton.off().on('click', () => {
|
||||
that.loadMoreButton.attr('disabled', 'disabled');
|
||||
that.loadMore([]);
|
||||
});
|
||||
}
|
||||
|
||||
ConversationsAdapter.method('showLoadError', function(msg) {
|
||||
$("#"+this.getTableName()+"_error").html(msg);
|
||||
$("#"+this.getTableName()+"_error").show();
|
||||
});
|
||||
showLoadError(msg) {
|
||||
$(`#${this.getTableName()}_error`).html(msg);
|
||||
$(`#${this.getTableName()}_error`).show();
|
||||
}
|
||||
|
||||
ConversationsAdapter.method('hideLoadError', function() {
|
||||
$("#"+this.getTableName()+"_error").hide();
|
||||
});
|
||||
hideLoadError() {
|
||||
$(`#${this.getTableName()}_error`).hide();
|
||||
}
|
||||
|
||||
ConversationsAdapter.method('setSearchBox', function(searchInput) {
|
||||
var that = this;
|
||||
setSearchBox(searchInput) {
|
||||
const that = this;
|
||||
this.searchInput = searchInput;
|
||||
this.searchInput.off();
|
||||
this.searchInput.keydown(function(event){
|
||||
var val = $(this).val();
|
||||
if ( event.which == 13 ) {
|
||||
event.preventDefault();
|
||||
that.search([]);
|
||||
}else if(( event.which == 8 || event.which == 46) && val.length == 1 && that.searchTerm != ''){
|
||||
that.search([]);
|
||||
}
|
||||
this.searchInput.keydown(function (event) {
|
||||
const val = $(this).val();
|
||||
if (event.which === 13) {
|
||||
event.preventDefault();
|
||||
that.search([]);
|
||||
} else if ((event.which === 8 || event.which === 46) && val.length === 1 && that.searchTerm !== '') {
|
||||
that.search([]);
|
||||
}
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
ConversationsAdapter.method('getObjectDom', function(id) {
|
||||
obj = this.container.find("#obj_"+id);
|
||||
if(obj.length){
|
||||
return obj;
|
||||
getObjectDom(id) {
|
||||
const obj = this.container.find(`#obj_${id}`);
|
||||
if (obj.length) {
|
||||
return obj;
|
||||
}
|
||||
return null;
|
||||
});
|
||||
}
|
||||
|
||||
ConversationsAdapter.method('loadMore', function(callBackData) {
|
||||
if(!this.hasMoreData){
|
||||
return;
|
||||
loadMore(callBackData) {
|
||||
if (!this.hasMoreData) {
|
||||
return;
|
||||
}
|
||||
this.currentPage++;
|
||||
this.get(callBackData, true);
|
||||
});
|
||||
}
|
||||
|
||||
ConversationsAdapter.method('get', function(callBackData, loadMore) {
|
||||
var that = this;
|
||||
get(callBackData, loadMore) {
|
||||
const that = this;
|
||||
|
||||
this.hideLoadError();
|
||||
|
||||
if(!loadMore){
|
||||
this.currentPage = 1;
|
||||
if(this.container != null){
|
||||
this.container.html('');
|
||||
}
|
||||
this.hasMoreData = true;
|
||||
this.tableData = [];
|
||||
if (!loadMore) {
|
||||
this.currentPage = 1;
|
||||
if (this.container != null) {
|
||||
this.container.html('');
|
||||
}
|
||||
this.hasMoreData = true;
|
||||
this.tableData = [];
|
||||
}
|
||||
|
||||
this.start = (this.currentPage === 1) ? 0 : this.bottomLimit;
|
||||
|
||||
this.container = $("#"+this.getTableName()).find('.objectList');
|
||||
this.container = $(`#${this.getTableName()}`).find('.objectList');
|
||||
|
||||
that.showLoader();
|
||||
|
||||
this.getConversations(this.start, this.pageSize, false);
|
||||
|
||||
if (this.timer === null && that.getTimeout() > 0) {
|
||||
this.timeoutDelay = 0;
|
||||
this.timer = setTimeout(function tick() {
|
||||
that.getConversations(that.topLimit, that.pageSize, true);
|
||||
that.timeoutDelay += that.getTimeout();
|
||||
if (that.topLimitUpdated) {
|
||||
that.timeoutDelay = 0;
|
||||
}
|
||||
that.timer = setTimeout(tick, that.getTimeout() + that.timeoutDelay);
|
||||
}, that.getTimeout() + that.timeoutDelay);
|
||||
this.timeoutDelay = 0;
|
||||
this.timer = setTimeout(function tick() {
|
||||
that.getConversations(that.topLimit, that.pageSize, true);
|
||||
that.timeoutDelay += that.getTimeout();
|
||||
if (that.topLimitUpdated) {
|
||||
that.timeoutDelay = 0;
|
||||
}
|
||||
that.timer = setTimeout(tick, that.getTimeout() + that.timeoutDelay);
|
||||
}, that.getTimeout() + that.timeoutDelay);
|
||||
}
|
||||
}
|
||||
|
||||
});
|
||||
|
||||
ConversationsAdapter.method('getTimeout', function() {
|
||||
getTimeout() {
|
||||
return 0;
|
||||
});
|
||||
}
|
||||
|
||||
ConversationsAdapter.method('getTimeoutUpper', function() {
|
||||
getTimeoutUpper() {
|
||||
return 0;
|
||||
});
|
||||
}
|
||||
|
||||
ConversationsAdapter.method('showConversationLoader', function() {
|
||||
//Do nothing
|
||||
});
|
||||
showConversationLoader() {
|
||||
// Do nothing
|
||||
}
|
||||
|
||||
ConversationsAdapter.method('hideConversationLoader', function() {
|
||||
//Do nothing
|
||||
});
|
||||
hideConversationLoader() {
|
||||
// Do nothing
|
||||
}
|
||||
|
||||
ConversationsAdapter.method('search', function(callBackData) {
|
||||
this.searchTerm = $("#"+this.getTableName()+"_search").val();
|
||||
search(callBackData) {
|
||||
this.searchTerm = $(`#${this.getTableName()}_search`).val();
|
||||
|
||||
this.get(callBackData);
|
||||
}
|
||||
}
|
||||
|
||||
});
|
||||
export default ConversationsAdapter;
|
||||
|
||||
@@ -1,280 +1,246 @@
|
||||
/*
|
||||
This file is part of Ice Framework.
|
||||
|
||||
Ice Framework is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
Ice Framework is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with Ice Framework. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
------------------------------------------------------------------
|
||||
|
||||
Original work Copyright (c) 2012 [Gamonoid Media Pvt. Ltd]
|
||||
Developer: Thilina Hasantha (thilina.hasantha[at]gmail.com / facebook.com/thilinah)
|
||||
Copyright (c) 2018 [Glacies UG, Berlin, Germany] (http://glacies.de)
|
||||
Developer: Thilina Hasantha (http://lk.linkedin.com/in/thilinah | https://github.com/thilinah)
|
||||
*/
|
||||
/* global tinyMCE */
|
||||
const ValidationRules = {
|
||||
|
||||
ValidationRules = {
|
||||
|
||||
float: function (str) {
|
||||
var floatstr = /^[-+]?[0-9]+(\.[0-9]+)?$/;
|
||||
if (str != null && str.match(floatstr)) {
|
||||
return true;
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
},
|
||||
|
||||
number: function (str) {
|
||||
var numstr = /^[0-9]+$/;
|
||||
if (str != null && str.match(numstr)) {
|
||||
return true;
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
},
|
||||
|
||||
numberOrEmpty: function (str) {
|
||||
if(str == ""){
|
||||
return true;
|
||||
}
|
||||
var numstr = /^[0-9]+$/;
|
||||
if (str != null && str.match(numstr)) {
|
||||
return true;
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
},
|
||||
|
||||
email: function (str) {
|
||||
var emailPattern = /^\s*[\w\-\+_]+(\.[\w\-\+_]+)*\@[\w\-\+_]+\.[\w\-\+_]+(\.[\w\-\+_]+)*\s*$/;
|
||||
return str != null && emailPattern.test(str);
|
||||
},
|
||||
|
||||
emailOrEmpty: function (str) {
|
||||
if(str == ""){
|
||||
return true;
|
||||
}
|
||||
var emailPattern = /^\s*[\w\-\+_]+(\.[\w\-\+_]+)*\@[\w\-\+_]+\.[\w\-\+_]+(\.[\w\-\+_]+)*\s*$/;
|
||||
return str != null && emailPattern.test(str);
|
||||
},
|
||||
|
||||
username: function (str) {
|
||||
var username = /^[a-zA-Z0-9\.-]+$/;
|
||||
return str != null && username.test(str);
|
||||
},
|
||||
|
||||
input: function (str) {
|
||||
if (str != null && str.length > 0) {
|
||||
return true;
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
float(str) {
|
||||
const floatstr = /^[-+]?[0-9]+(\.[0-9]+)?$/;
|
||||
if (str != null && str.match(floatstr)) {
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
},
|
||||
|
||||
number(str) {
|
||||
const numstr = /^[0-9]+$/;
|
||||
if (str != null && str.match(numstr)) {
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
},
|
||||
|
||||
numberOrEmpty(str) {
|
||||
if (str === '') {
|
||||
return true;
|
||||
}
|
||||
const numstr = /^[0-9]+$/;
|
||||
if (str != null && str.match(numstr)) {
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
},
|
||||
|
||||
email(str) {
|
||||
const emailPattern = /^\s*[\w\-+_]+(\.[\w\-+_]+)*@[\w\-+_]+\.[\w\-+_]+(\.[\w\-+_]+)*\s*$/;
|
||||
return str != null && emailPattern.test(str);
|
||||
},
|
||||
|
||||
emailOrEmpty(str) {
|
||||
if (str === '') {
|
||||
return true;
|
||||
}
|
||||
const emailPattern = /^\s*[\w\-+_]+(\.[\w\-+_]+)*@[\w\-+_]+\.[\w\-+_]+(\.[\w\-+_]+)*\s*$/;
|
||||
return str != null && emailPattern.test(str);
|
||||
},
|
||||
|
||||
username(str) {
|
||||
const username = /^[a-zA-Z0-9.-]+$/;
|
||||
return str != null && username.test(str);
|
||||
},
|
||||
|
||||
input(str) {
|
||||
if (str != null && str.length > 0) {
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
},
|
||||
|
||||
|
||||
};
|
||||
|
||||
function FormValidation(formId,validateAll,options) {
|
||||
class FormValidation {
|
||||
constructor(formId, validateAll, options) {
|
||||
this.tempOptions = {};
|
||||
this.formId = formId;
|
||||
this.formError = false;
|
||||
this.formId = formId;
|
||||
this.formError = false;
|
||||
this.formObject = null;
|
||||
this.errorMessages = "";
|
||||
this.errorMessages = '';
|
||||
this.popupDialog = null;
|
||||
this.validateAll = validateAll;
|
||||
this.errorMap = new Array();
|
||||
this.errorMap = [];
|
||||
|
||||
this.settings = {"thirdPartyPopup":null,"LabelErrorClass":false, "ShowPopup":true};
|
||||
this.settings = { thirdPartyPopup: null, LabelErrorClass: false, ShowPopup: true };
|
||||
|
||||
this.settings = jQuery.extend(this.settings,options);
|
||||
this.settings = jQuery.extend(this.settings, options);
|
||||
|
||||
this.inputTypes = new Array( "text", "radio", "checkbox", "file", "password", "select-one","select-multi", "textarea","fileupload" ,"signature");
|
||||
this.inputTypes = ['text', 'radio', 'checkbox', 'file', 'password', 'select-one', 'select-multi', 'textarea', 'fileupload', 'signature'];
|
||||
|
||||
this.validator = ValidationRules;
|
||||
}
|
||||
|
||||
}
|
||||
// eslint-disable-next-line no-unused-vars
|
||||
clearError(formInput, overrideMessage) {
|
||||
const id = formInput.attr('id');
|
||||
$(`#${this.formId} #field_${id}`).removeClass('error');
|
||||
$(`#${this.formId} #help_${id}`).html('');
|
||||
}
|
||||
|
||||
FormValidation.method('clearError' , function(formInput, overrideMessage) {
|
||||
var id = formInput.attr("id");
|
||||
$('#'+ this.formId +' #field_'+id).removeClass('error');
|
||||
$('#'+ this.formId +' #help_'+id).html('');
|
||||
});
|
||||
|
||||
FormValidation.method('addError' , function(formInput, overrideMessage) {
|
||||
// eslint-disable-next-line no-unused-vars
|
||||
addError(formInput, overrideMessage) {
|
||||
this.formError = true;
|
||||
if(formInput.attr("message") != null) {
|
||||
this.errorMessages += (formInput.attr("message") + "\n");
|
||||
this.errorMap[formInput.attr("name")] = formInput.attr("message");
|
||||
}else{
|
||||
this.errorMap[formInput.attr("name")] = "";
|
||||
if (formInput.attr('message') != null) {
|
||||
this.errorMessages += (`${formInput.attr('message')}\n`);
|
||||
this.errorMap[formInput.attr('name')] = formInput.attr('message');
|
||||
} else {
|
||||
this.errorMap[formInput.attr('name')] = '';
|
||||
}
|
||||
|
||||
var id = formInput.attr("id");
|
||||
var validation = formInput.attr("validation");
|
||||
var message = formInput.attr("validation");
|
||||
$('#'+ this.formId +' #field_'+id).addClass('error');
|
||||
if(message == undefined || message == null || message == ""){
|
||||
$('#'+ this.formId +' #help_err_'+id).html(message);
|
||||
}else{
|
||||
if(validation == undefined || validation == null || validation == ""){
|
||||
$('#'+ this.formId +' #help_err_'+id).html("Required");
|
||||
}else{
|
||||
if(validation == "float" || validation == "number"){
|
||||
$('#'+ this.formId +' #help_err_'+id).html("Number required");
|
||||
}else if(validation == "email"){
|
||||
$('#'+ this.formId +' #help_err_'+id).html("Email required");
|
||||
}else{
|
||||
$('#'+ this.formId +' #help_err_'+id).html("Required");
|
||||
}
|
||||
const id = formInput.attr('id');
|
||||
const validation = formInput.attr('validation');
|
||||
const message = formInput.attr('validation');
|
||||
$(`#${this.formId} #field_${id}`).addClass('error');
|
||||
if (message === undefined || message == null || message === '') {
|
||||
$(`#${this.formId} #help_err_${id}`).html(message);
|
||||
} else if (validation === undefined || validation == null || validation === '') {
|
||||
$(`#${this.formId} #help_err_${id}`).html('Required');
|
||||
} else if (validation === 'float' || validation === 'number') {
|
||||
$(`#${this.formId} #help_err_${id}`).html('Number required');
|
||||
} else if (validation === 'email') {
|
||||
$(`#${this.formId} #help_err_${id}`).html('Email required');
|
||||
} else {
|
||||
$(`#${this.formId} #help_err_${id}`).html('Required');
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
showErrors() {
|
||||
if (this.formError) {
|
||||
if (this.settings.thirdPartyPopup !== undefined && this.settings.thirdPartyPopup != null) {
|
||||
this.settings.thirdPartyPopup.alert();
|
||||
} else if (this.settings.ShowPopup === true) {
|
||||
if (this.tempOptions.popupTop !== undefined && this.tempOptions.popupTop != null) {
|
||||
this.alert('Errors Found', this.errorMessages, this.tempOptions.popupTop);
|
||||
} else {
|
||||
this.alert('Errors Found', this.errorMessages, -1);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
});
|
||||
|
||||
|
||||
FormValidation.method('showErrors' , function() {
|
||||
if(this.formError) {
|
||||
if(this.settings['thirdPartyPopup'] != undefined && this.settings['thirdPartyPopup'] != null){
|
||||
this.settings['thirdPartyPopup'].alert();
|
||||
}else{
|
||||
if(this.settings['ShowPopup'] == true){
|
||||
if(this.tempOptions['popupTop'] != undefined && this.tempOptions['popupTop'] != null){
|
||||
this.alert("Errors Found",this.errorMessages,this.tempOptions['popupTop']);
|
||||
}else{
|
||||
this.alert("Errors Found",this.errorMessages,-1);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
FormValidation.method('checkValues' , function(options) {
|
||||
checkValues(options) {
|
||||
this.tempOptions = options;
|
||||
var that = this;
|
||||
const that = this;
|
||||
this.formError = false;
|
||||
this.errorMessages = "";
|
||||
this.formObject = new Object();
|
||||
var validate = function (inputObject) {
|
||||
if(that.settings['LabelErrorClass'] != false){
|
||||
$("label[for='" + name + "']").removeClass(that.settings['LabelErrorClass']);
|
||||
}
|
||||
var id = inputObject.attr("id");
|
||||
var name = inputObject.attr("name");
|
||||
var type = inputObject.attr("type");
|
||||
this.errorMessages = '';
|
||||
this.formObject = {};
|
||||
// eslint-disable-next-line consistent-return
|
||||
const validate = function (inputObject) {
|
||||
let inputValue = null;
|
||||
const name = inputObject.attr('name');
|
||||
if (that.settings.LabelErrorClass !== false) {
|
||||
$(`label[for='${name}']`).removeClass(that.settings.LabelErrorClass);
|
||||
}
|
||||
const id = inputObject.attr('id');
|
||||
const type = inputObject.attr('type');
|
||||
|
||||
if(inputObject.hasClass('select2-focusser') || inputObject.hasClass('select2-input')){
|
||||
return true;
|
||||
if (inputObject.hasClass('select2-focusser') || inputObject.hasClass('select2-input')) {
|
||||
return true;
|
||||
}
|
||||
|
||||
if (jQuery.inArray(type, that.inputTypes) >= 0) {
|
||||
if (inputObject.hasClass('uploadInput')) {
|
||||
inputValue = inputObject.attr('val');
|
||||
} else if (type === 'radio' || type === 'checkbox') {
|
||||
inputValue = $(`input[name='${name}']:checked`).val();
|
||||
} else if (inputObject.hasClass('select2Field')) {
|
||||
if ($(`#${that.formId} #${id}`).select2('data') != null && $(`#${that.formId} #${id}`).select2('data') !== undefined) {
|
||||
inputValue = $(`#${that.formId} #${id}`).select2('data').id;
|
||||
} else {
|
||||
inputValue = '';
|
||||
}
|
||||
} else if (inputObject.hasClass('select2Multi')) {
|
||||
if ($(`#${that.formId} #${id}`).select2('data') != null && $(`#${that.formId} #${id}`).select2('data') !== undefined) {
|
||||
const inputValueObjects = $(`#${that.formId} #${id}`).select2('data');
|
||||
inputValue = [];
|
||||
for (let i = 0; i < inputValueObjects.length; i++) {
|
||||
inputValue.push(inputValueObjects[i].id);
|
||||
}
|
||||
inputValue = JSON.stringify(inputValue);
|
||||
} else {
|
||||
inputValue = '';
|
||||
}
|
||||
} else if (inputObject.hasClass('signatureField')) {
|
||||
if ($(`#${that.formId} #${id}`).data('signaturePad').isEmpty()) {
|
||||
inputValue = '';
|
||||
} else {
|
||||
inputValue = $(`#${id}`).data('signaturePad').toDataURL();
|
||||
}
|
||||
} else if (inputObject.hasClass('simplemde')) {
|
||||
inputValue = $(`#${that.formId} #${id}`).data('simplemde').value();
|
||||
} else if (inputObject.hasClass('tinymce')) {
|
||||
inputValue = tinyMCE.get(id).getContent({ format: 'raw' });
|
||||
} else {
|
||||
inputValue = inputObject.val();
|
||||
}
|
||||
|
||||
if(jQuery.inArray(type, that.inputTypes ) >= 0) {
|
||||
if(inputObject.hasClass('uploadInput')){
|
||||
inputValue = inputObject.attr("val");
|
||||
//}else if(inputObject.hasClass('datetimeInput')){
|
||||
//inputValue = inputObject.getDate()+":00";
|
||||
}else{
|
||||
//inputValue = (type == "radio" || type == "checkbox")?$("input[name='" + name + "']:checked").val():inputObject.val();
|
||||
const validation = inputObject.attr('validation');
|
||||
let valid = false;
|
||||
|
||||
inputValue = null;
|
||||
if(type == "radio" || type == "checkbox"){
|
||||
inputValue = $("input[name='" + name + "']:checked").val();
|
||||
}else if(inputObject.hasClass('select2Field')){
|
||||
if($('#'+id).select2('data') != null && $('#'+id).select2('data') != undefined){
|
||||
inputValue = $('#'+id).select2('data').id;
|
||||
}else{
|
||||
inputValue = "";
|
||||
}
|
||||
|
||||
}else if(inputObject.hasClass('select2Multi')){
|
||||
if($('#'+id).select2('data') != null && $('#'+id).select2('data') != undefined){
|
||||
inputValueObjects = $('#'+id).select2('data');
|
||||
inputValue = [];
|
||||
for(var i=0;i<inputValueObjects.length;i++){
|
||||
inputValue.push(inputValueObjects[i].id);
|
||||
}
|
||||
inputValue = JSON.stringify(inputValue);
|
||||
}else{
|
||||
inputValue = "";
|
||||
}
|
||||
}else if(inputObject.hasClass('signatureField')){
|
||||
if($('#'+id).data('signaturePad').isEmpty()){
|
||||
inputValue = '';
|
||||
}else{
|
||||
inputValue = $('#'+id).data('signaturePad').toDataURL();
|
||||
}
|
||||
}else if(inputObject.hasClass('simplemde')){
|
||||
inputValue = $('#'+id).data('simplemde').value();
|
||||
|
||||
}else if(inputObject.hasClass('tinymce')){
|
||||
inputValue = tinyMCE.get(id).getContent({format : 'raw'});
|
||||
|
||||
}else{
|
||||
inputValue = inputObject.val();
|
||||
}
|
||||
}
|
||||
|
||||
var validation = inputObject.attr('validation');
|
||||
var valid = false;
|
||||
|
||||
if(validation != undefined && validation != null && that.validator[validation] != undefined && that.validator[validation] != null){
|
||||
valid = that.validator[validation](inputValue);
|
||||
|
||||
}else{
|
||||
|
||||
if(that.validateAll){
|
||||
if(validation != undefined && validation != null && validation == "none"){
|
||||
valid = true;
|
||||
}else{
|
||||
valid = that.validator['input'](inputValue);
|
||||
}
|
||||
|
||||
}else{
|
||||
valid = true;
|
||||
}
|
||||
$(that.formObject).attr(id,inputValue);
|
||||
}
|
||||
|
||||
if(!valid) {
|
||||
that.addError(inputObject, null);
|
||||
}else{
|
||||
that.clearError(inputObject, null);
|
||||
$(that.formObject).attr(id,inputValue);
|
||||
if (validation !== undefined && validation != null && that.validator[validation] !== undefined && that.validator[validation] != null) {
|
||||
valid = that.validator[validation](inputValue);
|
||||
} else {
|
||||
if (that.validateAll) {
|
||||
if (validation !== undefined && validation != null && validation === 'none') {
|
||||
valid = true;
|
||||
} else {
|
||||
valid = that.validator.input(inputValue);
|
||||
}
|
||||
} else {
|
||||
valid = true;
|
||||
}
|
||||
that.formObject[id] = inputValue;
|
||||
}
|
||||
|
||||
if (!valid) {
|
||||
that.addError(inputObject, null);
|
||||
} else {
|
||||
that.clearError(inputObject, null);
|
||||
that.formObject[id] = inputValue;
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
var inputs = $('#'+ this.formId + " :input");
|
||||
inputs.each(function() {
|
||||
var that = $(this);
|
||||
validate(that);
|
||||
let inputs = $(`#${this.formId} :input`);
|
||||
inputs.each(function () {
|
||||
validate($(this));
|
||||
});
|
||||
|
||||
inputs = $('#'+ this.formId + " .uploadInput");
|
||||
inputs.each(function() {
|
||||
var that = $(this);
|
||||
validate(that);
|
||||
inputs = $(`#${this.formId} .uploadInput`);
|
||||
inputs.each(function () {
|
||||
validate($(this));
|
||||
});
|
||||
|
||||
this.showErrors();
|
||||
this.tempOptions = {};
|
||||
return !this.formError;
|
||||
});
|
||||
}
|
||||
|
||||
FormValidation.method('getFormParameters' , function() {
|
||||
getFormParameters() {
|
||||
return this.formObject;
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
FormValidation.method('alert', function (title,text,top) {
|
||||
alert(title, text) {
|
||||
alert(text);
|
||||
});
|
||||
}
|
||||
|
||||
static getValidationRules() {
|
||||
return ValidationRules;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
export default FormValidation;
|
||||
|
||||
@@ -1,138 +0,0 @@
|
||||
/*
|
||||
This file is part of Ice Framework.
|
||||
|
||||
Ice Framework is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
Ice Framework is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with Ice Framework. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
------------------------------------------------------------------
|
||||
|
||||
Original work Copyright (c) 2012 [Gamonoid Media Pvt. Ltd]
|
||||
Developer: Thilina Hasantha (thilina.hasantha[at]gmail.com / facebook.com/thilinah)
|
||||
*/
|
||||
|
||||
function NotificationManager() {
|
||||
this.baseUrl = "";
|
||||
this.templates = {};
|
||||
}
|
||||
|
||||
NotificationManager.method('setBaseUrl' , function(url) {
|
||||
this.baseUrl = url;
|
||||
});
|
||||
|
||||
NotificationManager.method('setTemplates' , function(data) {
|
||||
this.templates = data;
|
||||
});
|
||||
|
||||
NotificationManager.method('setTimeUtils' , function(timeUtils) {
|
||||
this.timeUtils = timeUtils;
|
||||
});
|
||||
|
||||
NotificationManager.method('getNotifications' , function(name, data) {
|
||||
var that = this;
|
||||
$.getJSON(this.baseUrl, {'a':'getNotifications'}, function(data) {
|
||||
if(data.status == "SUCCESS"){
|
||||
that.renderNotifications(data.data[1],data.data[0]);
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
NotificationManager.method('clearPendingNotifications' , function(name, data) {
|
||||
var that = this;
|
||||
$.getJSON(this.baseUrl, {'a':'clearNotifications'}, function(data) {
|
||||
|
||||
});
|
||||
});
|
||||
|
||||
NotificationManager.method('renderNotifications' , function(notifications, unreadCount) {
|
||||
|
||||
if(notifications.length == 0){
|
||||
return;
|
||||
}
|
||||
|
||||
var t = this.templates['notifications'];
|
||||
if(unreadCount > 0){
|
||||
t = t.replace('#_count_#',unreadCount);
|
||||
if(unreadCount > 1){
|
||||
t = t.replace('#_header_#',"You have "+unreadCount+" new notifications");
|
||||
}else{
|
||||
t = t.replace('#_header_#',"You have "+unreadCount+" new notification");
|
||||
}
|
||||
|
||||
}else{
|
||||
t = t.replace('#_count_#',"");
|
||||
t = t.replace('#_header_#',"You have no new notifications");
|
||||
}
|
||||
|
||||
var notificationStr = "";
|
||||
|
||||
for (index in notifications){
|
||||
notificationStr += this.renderNotification(notifications[index]);
|
||||
}
|
||||
|
||||
t = t.replace('#_notifications_#',notificationStr);
|
||||
|
||||
$obj = $(t);
|
||||
|
||||
if(unreadCount == 0){
|
||||
$obj.find('.label-danger').remove();
|
||||
}
|
||||
|
||||
$obj.attr("id","notifications");
|
||||
var k = $("#notifications");
|
||||
k.replaceWith($obj);
|
||||
|
||||
$(".navbar .menu").slimscroll({
|
||||
height: "320px",
|
||||
alwaysVisible: false,
|
||||
size: "3px"
|
||||
}).css("width", "100%");
|
||||
|
||||
this.timeUtils.convertToRelativeTime($(".notificationTime"));
|
||||
});
|
||||
|
||||
|
||||
NotificationManager.method('renderNotification' , function(notification) {
|
||||
var t = this.templates['notification'];
|
||||
t = t.replace('#_image_#',notification.image);
|
||||
|
||||
try{
|
||||
var json = JSON.parse(notification.action);
|
||||
t = t.replace('#_url_#',this.baseUrl.replace('service.php','?')+json['url']);
|
||||
}catch(e){
|
||||
t = t.replace('#_url_#',"");
|
||||
}
|
||||
|
||||
t = t.replace('#_time_#',notification.time);
|
||||
t = t.replace('#_fromName_#',notification.type);
|
||||
t = t.replace('#_message_#',this.getLineBreakString(notification.message,27));
|
||||
return t;
|
||||
});
|
||||
|
||||
|
||||
NotificationManager.method('getLineBreakString' , function(str, len) {
|
||||
var t = "";
|
||||
try{
|
||||
var arr = str.split(" ");
|
||||
var count = 0;
|
||||
for(var i=0;i<arr.length;i++){
|
||||
count += arr[i].length + 1;
|
||||
if(count > len){
|
||||
t += arr[i] + "<br/>";
|
||||
count = 0;
|
||||
}else{
|
||||
t += arr[i] + " ";
|
||||
}
|
||||
}
|
||||
}catch(e){}
|
||||
return t;
|
||||
});
|
||||
@@ -1,47 +1,49 @@
|
||||
function SocialShare(){
|
||||
};
|
||||
/* eslint-disable no-restricted-globals */
|
||||
/*
|
||||
Copyright (c) 2018 [Glacies UG, Berlin, Germany] (http://glacies.de)
|
||||
Developer: Thilina Hasantha (http://lk.linkedin.com/in/thilinah | https://github.com/thilinah)
|
||||
*/
|
||||
const SocialShare = {
|
||||
facebook: (url) => {
|
||||
const w = 700;
|
||||
const h = 500;
|
||||
const left = (screen.width / 2) - (w / 2);
|
||||
const top = (screen.height / 2) - (h / 2);
|
||||
|
||||
SocialShare.facebook = function(url) {
|
||||
var w = 700;
|
||||
var h = 500;
|
||||
var left = (screen.width/2)-(w/2);
|
||||
var top = (screen.height/2)-(h/2);
|
||||
|
||||
var url = "https://www.facebook.com/sharer/sharer.php?u="+encodeURIComponent(url);
|
||||
url = `https://www.facebook.com/sharer/sharer.php?u=${encodeURIComponent(url)}`;
|
||||
|
||||
window.open(url, "Share on Facebook", "width="+w+",height="+h+",left="+left+",top="+top);
|
||||
window.open(url, 'Share on Facebook', `width=${w},height=${h},left=${left},top=${top}`);
|
||||
return false;
|
||||
|
||||
};
|
||||
},
|
||||
|
||||
SocialShare.google = function(url) {
|
||||
var w = 500;
|
||||
var h = 500;
|
||||
var left = (screen.width/2)-(w/2);
|
||||
var top = (screen.height/2)-(h/2);
|
||||
|
||||
var url = "https://plus.google.com/share?url="+encodeURIComponent(url);
|
||||
google: (url) => {
|
||||
const w = 500;
|
||||
const h = 500;
|
||||
const left = (screen.width / 2) - (w / 2);
|
||||
const top = (screen.height / 2) - (h / 2);
|
||||
|
||||
window.open(url, "Share on Google", "width="+w+",height="+h+",left="+left+",top="+top);
|
||||
url = `https://plus.google.com/share?url=${encodeURIComponent(url)}`;
|
||||
|
||||
window.open(url, 'Share on Google', `width=${w},height=${h},left=${left},top=${top}`);
|
||||
return false;
|
||||
|
||||
};
|
||||
},
|
||||
|
||||
SocialShare.linkedin = function(url) {
|
||||
var w = 500;
|
||||
var h = 500;
|
||||
var left = (screen.width/2)-(w/2);
|
||||
var top = (screen.height/2)-(h/2);
|
||||
|
||||
var url = "https://www.linkedin.com/cws/share?url="+encodeURIComponent(url);
|
||||
linkedin: (url) => {
|
||||
const w = 500;
|
||||
const h = 500;
|
||||
const left = (screen.width / 2) - (w / 2);
|
||||
const top = (screen.height / 2) - (h / 2);
|
||||
|
||||
window.open(url, "Share on Linked in", "width="+w+",height="+h+",left="+left+",top="+top);
|
||||
url = `https://www.linkedin.com/cws/share?url=${encodeURIComponent(url)}`;
|
||||
|
||||
window.open(url, 'Share on Linked in', `width=${w},height=${h},left=${left},top=${top}`);
|
||||
return false;
|
||||
|
||||
},
|
||||
|
||||
twitter(url, msg) {
|
||||
window.open(`http://twitter.com/share?text=${escape(msg)}&url=${escape(url)}`, 'popup', 'width=550,height=260,scrollbars=yes,resizable=yes,toolbar=no,directories=no,location=no,menubar=no,status=no,left=200,top=200');
|
||||
return false;
|
||||
},
|
||||
};
|
||||
|
||||
SocialShare.twitter = function(url, msg) {
|
||||
window.open('http://twitter.com/share?text='+escape(msg) + '&url=' + escape(url),'popup','width=550,height=260,scrollbars=yes,resizable=yes,toolbar=no,directories=no,location=no,menubar=no,status=no,left=200,top=200');
|
||||
return false;
|
||||
|
||||
};
|
||||
export default SocialShare;
|
||||
|
||||
@@ -1,163 +0,0 @@
|
||||
/*
|
||||
This file is part of Ice Framework.
|
||||
|
||||
Ice Framework is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
Ice Framework is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with Ice Framework. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
------------------------------------------------------------------
|
||||
|
||||
Original work Copyright (c) 2012 [Gamonoid Media Pvt. Ltd]
|
||||
Developer: Thilina Hasantha (thilina.hasantha[at]gmail.com / facebook.com/thilinah)
|
||||
*/
|
||||
|
||||
function TimeUtils() {
|
||||
|
||||
}
|
||||
|
||||
TimeUtils.method('setServerGMToffset' , function(serverGMToffset) {
|
||||
this.serverGMToffset = serverGMToffset;
|
||||
});
|
||||
|
||||
TimeUtils.method('getMySQLFormatDate' , function(date) {
|
||||
|
||||
var format = function(val){
|
||||
if(val < 10){return "0"+val;}
|
||||
return val;
|
||||
|
||||
}
|
||||
|
||||
return date.getUTCFullYear()+"-"+format(date.getUTCMonth()+1)+"-"+format(date.getUTCDate());
|
||||
});
|
||||
|
||||
TimeUtils.method('convertToRelativeTime',function(selector) {
|
||||
|
||||
var that = this;
|
||||
|
||||
var getAmPmTime = function(curHour, curMin) {
|
||||
var amPm = "am";
|
||||
var amPmHour = curHour;
|
||||
if (amPmHour >= 12) {
|
||||
amPm = "pm";
|
||||
if (amPmHour > 12) {
|
||||
amPmHour = amPmHour - 12;
|
||||
}
|
||||
}
|
||||
var prefixCurMin = "";
|
||||
if (curMin < 10) {
|
||||
prefixCurMin = "0";
|
||||
}
|
||||
|
||||
var prefixCurHour = "";
|
||||
if (curHour == 0) {
|
||||
prefixCurHour = "0";
|
||||
}
|
||||
return " at " + prefixCurHour + amPmHour + ":" + prefixCurMin + curMin + amPm;
|
||||
};
|
||||
|
||||
var getBrowserTimeZone = function() {
|
||||
var current_date = new Date();
|
||||
var gmt_offset = current_date.getTimezoneOffset() / 60;
|
||||
return -gmt_offset;
|
||||
};
|
||||
|
||||
var curDate = new Date();
|
||||
var months = ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'];
|
||||
var days = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'];
|
||||
|
||||
|
||||
var timezoneDiff = this.serverGMToffset - getBrowserTimeZone();
|
||||
var timezoneTimeDiff = timezoneDiff*60*60*1000;
|
||||
|
||||
|
||||
selector.each(function () {
|
||||
try{
|
||||
var thisValue = $(this).html();
|
||||
// Split value into date and time
|
||||
var thisValueArray = thisValue.split(" ");
|
||||
var thisValueDate = thisValueArray[0];
|
||||
var thisValueTime = thisValueArray[1];
|
||||
|
||||
// Split date into components
|
||||
var thisValueDateArray = thisValueDate.split("-");
|
||||
var curYear = thisValueDateArray[0];
|
||||
var curMonth = thisValueDateArray[1]-1;
|
||||
var curDay = thisValueDateArray[2];
|
||||
|
||||
// Split time into components
|
||||
var thisValueTimeArray = thisValueTime.split(":");
|
||||
var curHour = thisValueTimeArray[0];
|
||||
var curMin = thisValueTimeArray[1];
|
||||
var curSec = thisValueTimeArray[2];
|
||||
|
||||
// Create this date
|
||||
var thisDate = new Date(curYear, curMonth, curDay, curHour, curMin, curSec);
|
||||
var thisTime = thisDate.getTime();
|
||||
var tzDate = new Date(thisTime - timezoneTimeDiff);
|
||||
//var tzDay = tzDate.getDay();//getDay will return the day of the week not the month
|
||||
//var tzDay = tzDate.getUTCDate(); //getUTCDate will return the day of the month
|
||||
var tzDay = tzDate.toString('d'); //
|
||||
var tzYear = tzDate.getFullYear();
|
||||
var tzHour = tzDate.getHours();
|
||||
var tzMin = tzDate.getMinutes();
|
||||
|
||||
// Create the full date
|
||||
//var fullDate = days[tzDate.getDay()] + ", " + months[tzDate.getMonth()] + " " + tzDay + ", " + tzYear + getAmPmTime(tzHour, tzMin);
|
||||
var fullDate = days[tzDate.getDay()] + ", " + months[tzDate.getMonth()] + " " + tzDay + ", " + tzYear + getAmPmTime(tzHour, tzMin);
|
||||
|
||||
// Get the time different
|
||||
var timeDiff = (curDate.getTime() - tzDate.getTime())/1000;
|
||||
var minDiff = Math.abs(timeDiff/60);
|
||||
var hourDiff = Math.abs(timeDiff/(60*60));
|
||||
var dayDiff = Math.abs(timeDiff/(60*60*24));
|
||||
var yearDiff = Math.abs(timeDiff/(60*60*24*365));
|
||||
|
||||
// If more than a day old, display the month, day and time (and year, if applicable)
|
||||
var fbDate = '';
|
||||
if (dayDiff > 1) {
|
||||
//fbDate = curDay + " " + months[tzDate.getMonth()].substring(0,3);
|
||||
fbDate = tzDay + " " + months[tzDate.getMonth()].substring(0,3);
|
||||
// Add the year, if applicable
|
||||
if (yearDiff > 1) {
|
||||
fbDate = fbDate + " "+ curYear;
|
||||
}
|
||||
|
||||
// Add the time
|
||||
fbDate = fbDate + getAmPmTime(tzHour, tzMin);
|
||||
}
|
||||
// Less than a day old, and more than an hour old
|
||||
else if (hourDiff >= 1) {
|
||||
var roundedHour = Math.round(hourDiff);
|
||||
if (roundedHour == 1)
|
||||
fbDate = "about an hour ago";
|
||||
else
|
||||
fbDate = roundedHour + " hours ago";
|
||||
}
|
||||
// Less than an hour, and more than a minute
|
||||
else if (minDiff >= 1) {
|
||||
var roundedMin = Math.round(minDiff);
|
||||
if (roundedMin == 1)
|
||||
fbDate = "about a minute ago";
|
||||
else
|
||||
fbDate = roundedMin + " minutes ago";
|
||||
}
|
||||
// Less than a minute
|
||||
else if (minDiff < 1) {
|
||||
fbDate = "less than a minute ago";
|
||||
}
|
||||
|
||||
// Update this element
|
||||
$(this).html(fbDate);
|
||||
$(this).attr('title', fullDate);
|
||||
}catch(e){}
|
||||
});
|
||||
});
|
||||
Reference in New Issue
Block a user