snow10/main.js

186 lines
3.8 KiB
JavaScript
Raw Normal View History

/*
Copyright (c) 2017 Kevin Froman MIT (expat) license
*/
2016-05-28 04:34:52 +00:00
var clipboard = new Clipboard('.btn');
2017-03-28 04:36:51 +00:00
var zero = '';
var one = '';
var z_zero = '';
var z_one = '';
var w_zero = ' ';
var w_one = '\t';
2017-03-31 01:17:52 +00:00
function showError(msg){
$.bootstrapGrowl(msg, {type: 'danger'})
}
2017-03-28 04:36:51 +00:00
function escapeRegExp(str) {
return str.replace(/([.*+?^=!:${}()|\[\]\/\\])/g, "\\$1");
}
function replaceAll(str, find, replace) {
return str.replace(new RegExp(escapeRegExp(find), 'g'), replace);
}
2016-05-28 04:34:52 +00:00
clipboard.on('success', function(e) {
$('#copyFeedback').css('display', 'inherit');
$('#copyFeedback').css('color', 'green');
$('#copyFeedback').html('Copied!');
e.clearSelection();
});
clipboard.on('error', function(e) {
$('#copyFeedback').css('display', 'inherit');
$('#copyFeedback').css('color', 'red');
$('#copyFeedback').html('Your browser doesn\'t seem to support automatic copying. Get a better one.');
2016-05-28 04:34:52 +00:00
e.clearSelection();
});
if ($('#useEncrypt').is(':checked') == false)
{
$('#encryptArea').css('display', 'none');
}
2016-05-28 04:34:52 +00:00
$('#modalClose').click(function(){
$('#copyFeedback').css('display', 'none');
});
$("#output").on("click", function () {
$(this).select();
});
2016-05-28 04:34:52 +00:00
2017-03-28 04:36:51 +00:00
$('#useZeroWidthCharacters').click(function(){
if (zero == w_zero)
{
zero = z_zero;
one = z_one;
}
else
{
zero = w_zero;
one = z_one;
}
});
/* based on stackoverflow.com/questions/14430633/how-to-convert-text-to-binary-code-in-javascript */
function binToText(str) {
2017-03-28 04:36:51 +00:00
var str = replaceAll(replaceAll(str, one, "1"), zero, "0");
if(str.match(/[10]{8}/g)){
var wordFromBinary = str.match(/([10]{8}|\s+)/g).map(function(fromBinary){
return String.fromCharCode(parseInt(fromBinary, 2) );
}).join('');
return wordFromBinary;
}
}
/* based on stackoverflow.com/questions/21354235/converting-binary-to-text-using-javascript */
function textToBin(text) {
var output = '';
var length = text.length,
output = [];
for (var i = 0;i < length; i++) {
var bin = text[i].charCodeAt().toString(2);
output.push(Array(8-bin.length+1).join("0") + bin);
}
return output.join('');
}
$('#useEncrypt').click(function(){
if (! this.checked)
2016-05-28 04:34:52 +00:00
{
$('#encryptArea').css('display', 'none');
2016-05-28 04:34:52 +00:00
}
else
2016-05-28 04:34:52 +00:00
{
$('#encryptArea').css('display', 'inherit');
}
})
2016-05-28 04:34:52 +00:00
function verifyPass(mode)
{
if ($('#password').val() == '')
{
2017-03-31 01:17:52 +00:00
showError('You must provide a password.');
return false;
}
2016-05-28 04:34:52 +00:00
if (mode == 'encrypt')
{
if ($('#password').val() != $('#confirmPass').val())
2016-05-28 04:34:52 +00:00
{
2017-03-31 01:17:52 +00:00
showError('Passwords must match.');
return false;
2016-05-28 04:34:52 +00:00
}
}
return true;
}
$('#encode').click(function(){
go('encode');
});
$('#decode').click(function(){
go('decode');
});
function go(mode) {
var output = '';
var input = $('#text').val();
if (input == '') { return false; }
2016-05-28 04:34:52 +00:00
// If we're encoding:
if (mode == 'encode')
{
// If we should use encryption, encrypt first:
if ($('#useEncrypt').is(':checked'))
{
// verify password first
if (verifyPass('encrypt'))
{
input = CryptoJS.AES.encrypt(input, $('#password').val()).toString();
}
else
{
return false;
}
2016-05-28 04:34:52 +00:00
}
// convert result to binary
2017-03-28 05:14:08 +00:00
output = textToBin(encodeURIComponent(input));
2017-03-31 03:42:02 +00:00
$('#output').text(replaceAll(replaceAll(output.toString(), "1", one), "0", zero));
2016-05-28 04:34:52 +00:00
}
else
{
var sanitized = "";
var split = input.split("");
for (var i = 0; i < split.length; i++)
if(split[i] == one || split[i] == zero)
sanitized = sanitized + split[i]
var output = decodeURIComponent(binToText(sanitized));
if ($('#useEncrypt').is(':checked'))
{
if (verifyPass('decrypt'))
2016-05-28 04:34:52 +00:00
{
output = CryptoJS.AES.decrypt(output, $('#password').val()).toString(CryptoJS.enc.Utf8);
2016-05-28 04:34:52 +00:00
}
else
{
return false;
2016-05-28 04:34:52 +00:00
}
}
2017-03-31 03:42:02 +00:00
$('#output').text(output.toString());
2016-05-28 04:34:52 +00:00
}
$('#outputModal').modal();
}
$('#clearInputButton').click(function(){
$('#text').val('');
});