0)
39 | {
40 | var nFrac = val - nInt;
41 | nFrac = Math.floor(nFrac * Math.pow(10,digits));
42 | sFrac = "." + SDigits(nFrac, digits);
43 | }
44 | else
45 | sFrac = "";
46 |
47 | return sInt + sFrac;
48 | },
49 |
50 | FormatDate: function(d)
51 | {
52 | return NS.ReplaceKeys("{y}-{m}-{d}", {y:d.getFullYear(), m:d.getMonth()+1, d:d.getDate()});
53 | },
54 |
55 | /* Divide the string into n-letter groups */
56 | GroupBy: function(s, n, chSep)
57 | {
58 | if (chSep == undefined)
59 | chSep = ' ';
60 | var re = new RegExp("(.{" + n + "})");
61 | var a = s.split(re);
62 | return Base.Filter(a, function (s) {return s.length > 0;}).join(chSep);
63 | },
64 |
65 | // Return an integer as a string using a fixed number of digits, c. (require a sign with fSign).
66 | SDigits: function(val, c, fSign)
67 | {
68 | var s = "";
69 | var fNeg = (val < 0);
70 |
71 | if (c == undefined)
72 | c = 0;
73 |
74 | if (fNeg)
75 | val = -val;
76 |
77 | val = Math.floor(val);
78 |
79 | for (; c > 0; c--)
80 | {
81 | s = (val%10) + s;
82 | val = Math.floor(val/10);
83 | }
84 |
85 | if (fSign || fNeg)
86 | s = (fNeg ? "-" : "+") + s;
87 |
88 | return s;
89 | },
90 |
91 | EscapeHTML: function(s)
92 | {
93 | s = s.toString();
94 | s = s.replace(/&/g, '&');
95 | s = s.replace(//g, '>');
97 | s = s.replace(/\"/g, '"');
98 | s = s.replace(/'/g, ''');
99 | return s;
100 | },
101 |
102 | // Replace keys in dictionary of for {key} in the text string.
103 | ReplaceKeys: function(st, keys)
104 | {
105 | for (var key in keys)
106 | st = st.StReplace("{" + key + "}", keys[key]);
107 | st = st.replace(/\{[^\{\}]*\}/g, "");
108 | return st;
109 | }
110 |
111 | })
112 |
113 | //--------------------------------------------------------------------------
114 | // Some extensions to built-in JavaScript objects (sorry!)
115 | //--------------------------------------------------------------------------
116 |
117 | String.prototype.Trim = function()
118 | {
119 | return (this || "").replace( /^\s+|\s+$/g, "");
120 | };
121 |
122 | String.prototype.StReplace = function(stPat, stRep)
123 | {
124 |
125 | var st = "";
126 | if (stRep == undefined)
127 | stRep = "";
128 | else
129 | stRep = stRep.toString();
130 |
131 | var ich = 0;
132 | var ichFind = this.indexOf(stPat, 0);
133 |
134 | while (ichFind >= 0)
135 | {
136 | st += this.substring(ich, ichFind) + stRep;
137 | ich = ichFind + stPat.length;
138 | ichFind = this.indexOf(stPat, ich);
139 | }
140 | st += this.substring(ich);
141 |
142 | return st;
143 | };
144 |
145 | }); // startpad.format-util
--------------------------------------------------------------------------------
/js/cipher/enigma/namespace.js:
--------------------------------------------------------------------------------
1 | /* Namespace.js
2 |
3 | Version 1.0, June 2009
4 | by Mike Koss - released into the public domain.
5 |
6 | Support for building modular namespaces in javascript.
7 |
8 | Globals:
9 |
10 | window.global_namespace (Namespace) - The top of the namespace heirarchy. Child namespaces
11 | are stored as properties in each namespace object.
12 |
13 | *** Class Namespace ***
14 |
15 | Methods:
16 |
17 | ns.Define(sPath, fnCallback(ns)) - Define a new Namespace object and call
18 | the provided function with the new namespace as a parameter.
19 |
20 | sPath - Path of the form ('unique.module.sub_module'). Pat
21 |
22 | Returns the newly defined namespace.
23 |
24 | ns.Extend(oDest, oSource) - Copy the (own) properties of the source object
25 | into the destination object. Returns oDest. Note: This method is a convenience
26 | function - it has no effect on the Namespace object itself.
27 |
28 | ns.Import(sPath) - Return the namespace object with the given (absolute) path.
29 |
30 | Usage example:
31 |
32 | global_namespace.Define('startpad.base', function(ns) {
33 | var Other = ns.Import('startpad.other');
34 |
35 | ns.Extend(ns, {
36 | var1: value1,
37 | var2: value2,
38 | MyFunc: function(args)
39 | {
40 | ....Other.AFunction(args)...
41 | }
42 | });
43 |
44 | ns.ClassName = function(args)
45 | {
46 | };
47 |
48 | ns.ClassName.prototype = {
49 | constructor: ns.ClassName,
50 | var1: value1,
51 |
52 | Method1: function(args)
53 | {
54 | }
55 | };
56 | });
57 | */
58 |
59 | // Define stubs for FireBug objects if not present
60 | // This is here because this will often be the very first javascript file loaded
61 | try
62 | {
63 | var console;
64 |
65 | if (!console)
66 | {
67 | (function ()
68 | {
69 | var names = ["log", "debug", "info", "warn", "error", "assert", "dir", "dirxml",
70 | "group", "groupEnd", "time", "timeEnd", "count", "trace", "profile", "profileEnd"];
71 |
72 | console = {};
73 | for (var i = 0; i < names.length; ++i)
74 | {
75 | console[names[i]] = function() {};
76 | }
77 | })();
78 | }
79 | }
80 | catch (e)
81 | {
82 | }
83 |
84 | var global_namespace = (function()
85 | {
86 | try
87 | {
88 | if (global_namespace != undefined)
89 | return global_namespace;
90 | }
91 | catch (e)
92 | {
93 | }
94 |
95 | /** @constructor **/
96 | function Namespace(nsParent, sName)
97 | {
98 | if (sName)
99 | sName = sName.replace(/-/g, '_');
100 |
101 | this._nsParent = nsParent;
102 |
103 | if (this._nsParent)
104 | {
105 | this._nsParent[sName] = this;
106 | this._sPath = this._nsParent._sPath;
107 | if (this._sPath != '')
108 | this._sPath += '.';
109 | this._sPath += sName;
110 | }
111 | else
112 | this._sPath = '';
113 | };
114 |
115 | Namespace.prototype['Extend'] = function(oDest, var_args)
116 | {
117 | if (oDest == undefined)
118 | oDest = {};
119 |
120 | for (var i = 1; i < arguments.length; i++)
121 | {
122 | var oSource = arguments[i];
123 | for (var prop in oSource)
124 | {
125 | if (oSource.hasOwnProperty(prop))
126 | oDest[prop] = oSource[prop];
127 | }
128 | }
129 |
130 | return oDest;
131 | };
132 |
133 | var ns = new Namespace(null);
134 |
135 | ns['Extend'](Namespace.prototype, {
136 | 'Define': function (sPath, fnCallback)
137 | {
138 | sPath = sPath.replace(/-/g, '_');
139 |
140 | var aPath = sPath.split('.');
141 | var nsCur = this;
142 | for (var i = 0; i < aPath.length; i++)
143 | {
144 | var sName = aPath[i];
145 | if (nsCur[sName] == undefined)
146 | new Namespace(nsCur, sName);
147 | nsCur = nsCur[sName];
148 | }
149 | // In case a namespace is multiply loaded - we ignore the definition function
150 | // for all but the first call.
151 | if (fnCallback)
152 | {
153 | if (!nsCur._fDefined)
154 | {
155 | nsCur._fDefined = true;
156 | fnCallback(nsCur);
157 | //console.info("Namespace '" + nsCur._sPath + "' defined.");
158 | }
159 | else
160 | console.warn("WARNING: Namespace '" + nsCur._sPath + "' redefinition.");
161 | }
162 | else if (!nsCur._fDefined){
163 | //console.warn("Namespace '" + nsCur._sPath + "' forward reference.");
164 | }
165 | return nsCur;
166 | },
167 |
168 | 'Import': function(sPath)
169 | {
170 | return ns['Define'](sPath);
171 | },
172 |
173 | 'SGlobalName': function(sInNamespace)
174 | {
175 | sInNamespace = sInNamespace.replace(/-/g, '_');
176 | return 'global_namespace.' + this._sPath + '.' + sInNamespace;
177 | }
178 | });
179 |
180 | return ns;
181 | })();
182 |
--------------------------------------------------------------------------------
/js/cipher/enigma/random.js:
--------------------------------------------------------------------------------
1 | global_namespace.Define('startpad.random', function(NS) {
2 | /* Random number functions.
3 |
4 | The builtin Math.random does not afford setting an initial seed. These
5 | functions provide an alternative random number generation system - and mirror
6 | the subset of functions builtin to Python (random.py).
7 |
8 | Usage:
9 |
10 | Random = NS.Import('startpad.random');
11 |
12 | Random.seed([]) - intialize the random generator for a string, number, array, or date (uses current
13 | Date() if none is given.
14 | Random.randint(min, max) - return a uniform random integer between min and max - inclusive
15 | Random.random() - return a random floating point number between 0 and 1 inclusive
16 |
17 | 2009-12-22 [mck] Created.
18 | */
19 | MT = NS.Import('startpad.random.mt');
20 | Base = NS.Import('startpad.base');
21 |
22 | NS.Extend(NS, {
23 | seed: function(data)
24 | {
25 | if (data == undefined)
26 | data = new Date();
27 |
28 | if (typeof data == 'object' && data.constructor == Date)
29 | data = data.getTime();
30 |
31 | if (typeof data == 'number')
32 | {
33 | MT.init_genrand(data);
34 | return
35 | }
36 |
37 | if (typeof data == 'string')
38 | data = Base.Map(data.split(''), function(ch) {return ch.charCodeAt(0);});
39 |
40 | MT.init_by_array(data);
41 | },
42 |
43 | randint: function(min, max)
44 | {
45 | var r = NS.random();
46 |
47 | return Math.floor(min + (max-min+1)*r);
48 | },
49 |
50 | random: function()
51 | {
52 | return MT.genrand_real1();
53 | },
54 |
55 | /* Return a random selection of k (unique) elements from array, a. */
56 | sample: function(a, k)
57 | {
58 | // Copy input array
59 | var pool = a.concat();
60 | var n = a.length;
61 | if (k > n)
62 | k = n;
63 | var result = [];
64 | for (var i = 0; i < k; i++)
65 | {
66 | var j = NS.randint(0,n-i-1);
67 | result.push(pool[j]);
68 | pool[j] = pool[n-i-1];
69 | }
70 | return result;
71 | },
72 |
73 | shuffle: function(a)
74 | {
75 | var n = a.length;
76 | for (var i = n-1; i > 0; i--)
77 | {
78 | var j = NS.randint(0, i);
79 | var t = a[i];
80 | a[i] = a[j];
81 | a[j] = t;
82 | }
83 | return a;
84 | }
85 | });
86 |
87 | // Intiialize the random generatr by the current date, if the user doesn't seed it
88 | NS.seed();
89 |
90 | });
--------------------------------------------------------------------------------
/js/cipher/keymaker.js:
--------------------------------------------------------------------------------
1 | // Keymaker
2 | // Can be inserted into any page to generate one or more keys.
3 |
4 | // Code was written by Tyler Akins and is placed in the public domain.
5 | // It would be nice if you left this header. http://rumkin.com
6 |
7 |
8 | // Call this function when the page finishes loading
9 | // It looks for elements with id='Keymaker0' id='Keymaker1' etc.
10 | // It adds the keymaker link to those elements.
11 | function Keymaker_Start()
12 | {
13 | var i = 0;
14 | var e = document.getElementById('Keymaker' + i);
15 | while (e)
16 | {
17 | KeymakerToggle(i);
18 | i ++;
19 | e = document.getElementById('Keymaker' + i);
20 | }
21 | }
22 |
23 |
24 | // Shows/hides the keymaker form
25 | function KeymakerToggle(id)
26 | {
27 | var o = '';
28 | var e = document.getElementById('Keymaker' + id);
29 | if (! e)
30 | {
31 | return false;
32 | }
33 |
34 | if (e.getAttribute('_showKeymaker') != 'show')
35 | {
36 | o = 'Show Keymaker';
38 | e.innerHTML = o;
39 | e.setAttribute('_showKeymaker', 'show')
40 | return false;
41 | }
42 |
43 | o = 'Hide Keymaker
' +
45 | '
';
61 |
62 | e.innerHTML = o;
63 | e.setAttribute('_showKeymaker', 'hide');
64 |
65 | window.setTimeout('KeymakerUpdate(' + id + ')', 100);
66 |
67 | return false;
68 | }
69 |
70 |
71 | // Update function that checks for changes and will update the
72 | // keymaker result
73 | function KeymakerUpdate(id)
74 | {
75 | var k = document.getElementById('KeymakerKeyword' + id);
76 | var li = document.getElementById('KeymakerLastInstance' + id);
77 | var rk = document.getElementById('KeymakerRevKey' + id);
78 | var ra = document.getElementById('KeymakerRevAlpha' + id);
79 | var kor = document.getElementById('KeymakerKeyOnRight' + id);
80 | var r = document.getElementById('KeymakerResult' + id);
81 |
82 | if (! k || ! li || ! rk || ! ra || ! kor || ! r)
83 | {
84 | return;
85 | }
86 |
87 | if (IsUnchanged(k, 0) && IsUnchanged(li, 1) && IsUnchanged(rk, 0) &&
88 | IsUnchanged(ra, 0) && IsUnchanged(kor, 0))
89 | {
90 | window.setTimeout('KeymakerUpdate(' + id + ')', 100);
91 | return;
92 | }
93 |
94 | var kw = k.value, alpha = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
95 |
96 | if (li.checked)
97 | {
98 | kw = Reverse_String(kw);
99 | kw = MakeKeyedAlphabet(kw, kw);
100 | kw = Reverse_String(kw);
101 | }
102 | if (rk.checked)
103 | {
104 | kw = Reverse_String(kw);
105 | }
106 | if (ra.checked)
107 | {
108 | alpha = Reverse_String(alpha);
109 | }
110 | if (kor.checked)
111 | {
112 | kw = MakeKeyedAlphabet(kw, kw);
113 | kw = Reverse_String(kw);
114 | alpha = Reverse_String(alpha);
115 | }
116 |
117 | var result = MakeKeyedAlphabet(kw, alpha);
118 | if (kor.checked)
119 | {
120 | result = Reverse_String(result);
121 | }
122 |
123 | r.innerHTML = result;
124 |
125 | window.setTimeout('KeymakerUpdate(' + id + ')', 100);
126 | }
127 |
128 |
129 | // The "apply" link's code
130 | function KeymakerApply(id)
131 | {
132 | var e = document.getElementById('Keymaker' + id);
133 | var r = document.getElementById('KeymakerResult' + id);
134 | var spot = e.getAttribute('target');
135 | eval(spot + ' = r.innerHTML');
136 | return false;
137 | }
138 |
139 |
--------------------------------------------------------------------------------
/js/cipher/letternumbers.js:
--------------------------------------------------------------------------------
1 |
2 | var LetterNumbers = {
3 | upd : function()
4 | {
5 | if (IsUnchangedVar.text * IsUnchangedVar.encdec * IsUnchangedVar.LETTERNUMBERS_method)
6 | {
7 | //window.setTimeout('LetterNumbers.upd()', 100);
8 | return;
9 | }
10 |
11 | //ResizeTextArea(CURRENTSCRATCHPAD);
12 |
13 | var e = document.getElementById('LETTERNUMBERS_output');
14 | if (CURRENTSCRATCHPAD.realvalue == '')
15 | {
16 | e.innerHTML = 'Type in a message to see the results!';
17 | }
18 | else if (document.encoder.encdec.value * 1 == 1)
19 | {
20 | e.innerHTML = LetterNumbers.encode(CURRENTSCRATCHPAD.realvalue, document.encoder.LETTERNUMBERS_method.value);
21 | }
22 | else
23 | {
24 | e.innerHTML = LetterNumbers.decode(CURRENTSCRATCHPAD.realvalue, document.encoder.LETTERNUMBERS_method.value);
25 | Timer.start();
26 | Teacher.analyzeField('LETTERNUMBERS_output', 'letternumbers()');
27 |
28 | var ei = document.getElementById('LETTERNUMBERS_output_reverse');
29 | ei.innerHTML = LetterNumbers.decode(Reverse_String(CURRENTSCRATCHPAD.realvalue), document.encoder.LETTERNUMBERS_method.value);
30 | Teacher.analyzeField('LETTERNUMBERS_output_reverse', 'reverse().letternumbers()');
31 | Timer.stop("Letternumbers - Two");
32 | }
33 |
34 | //window.setTimeout('LetterNumbers.upd()', 100);
35 | },
36 |
37 | decodeGetSteps : function(text)
38 | {
39 | var temp = LetterNumbers.decode(text, document.encoder.LETTERNUMBERS_method.value);
40 | if(temp)
41 | return [Teacher.analyzeValueDoNotSaveGrade(temp, 'letternumbers()')];
42 | temp = LetterNumbers.decode(T_ReverseText(text), document.encoder.LETTERNUMBERS_method.value);
43 | if(temp)
44 | return [Teacher.analyzeValueDoNotSaveGrade(T_ReverseText(text), 'reverse()'),Teacher.analyzeValueDoNotSaveGrade(temp, 'letternumbers()')];
45 | return false;
46 | },
47 |
48 | encode : function(str, meth)
49 | {
50 | var lett = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
51 | var out = "";
52 | var addHyphen = 0;
53 |
54 | var pad = meth.charAt(1) * 1;
55 | var hyph = meth.charAt(3) * 1;
56 |
57 | for (var i = 0; i < str.length; i ++)
58 | {
59 | c = str.charAt(i);
60 | j = lett.indexOf(c.toUpperCase()) + 1;
61 | if (j < 10 && pad)
62 | {
63 | j = "0" + j;
64 | }
65 | if (j * 1 > 0)
66 | {
67 | if (addHyphen && hyph)
68 | {
69 | out = out + '-';
70 | }
71 | out = out + j;
72 | addHyphen = 1;
73 | }
74 | else
75 | {
76 | if (addHyphen)
77 | {
78 | if (c.charCodeAt(0) == 10 || c.charCodeAt(0) == 13)
79 | {
80 | out += c;
81 | }
82 | else
83 | {
84 | out += ' ';
85 | }
86 | }
87 | addHyphen = 0;
88 | }
89 | }
90 |
91 | return out;
92 | },
93 |
94 | decode : function(str, meth)
95 | {
96 | var lett = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
97 | var num = '0123456789';
98 | var out = "";
99 | var was_letter = 0;
100 |
101 | var pad = meth.charAt(1) * 1;
102 | var hyph = meth.charAt(3) * 1;
103 |
104 | for (var i = 0; i < str.length; i ++)
105 | {
106 | c = str.charAt(i);
107 | j = num.indexOf(c);
108 | if (j < 0)
109 | {
110 | if (! was_letter || ! hyph || c != "-")
111 | {
112 | out += c;
113 | }
114 | was_letter = 0;
115 | }
116 | else
117 | {
118 | // Do a number lookahead
119 | was_letter = j;
120 | if (str.length > i + 1)
121 | {
122 | j = num.indexOf(str.charAt(i + 1));
123 | if (j >= 0)
124 | {
125 | i++;
126 | was_letter = (was_letter * 10) + j;
127 | }
128 | }
129 | if (was_letter >= 1 && was_letter <= 26)
130 | {
131 | out += lett.charAt(was_letter - 1);
132 | }
133 | else
134 | {
135 | out += was_letter;
136 | was_letter = 0;
137 | }
138 | }
139 | }
140 |
141 | return out;
142 | }
143 | };
144 |
--------------------------------------------------------------------------------
/js/cipher/lsb.js:
--------------------------------------------------------------------------------
1 |
2 |
3 | var LSB = {
4 |
5 | upd : function() {
6 | if (IsUnchangedVar.text || CURRENTSCRATCHPAD.realvalue == '') {
7 | return;
8 | } else {
9 | Timer.start();
10 |
11 | var hexstring, certainty;
12 | for(var i = 1; i <= 4; i++) {
13 | hexstring = LSB.decode(CURRENTSCRATCHPAD.realvalue, i);
14 | if(hexstring) {
15 | certainty = (REGEX_FILE_TYPES.test(hexstring) || REGEX_POSSIBLEFLAGCHARS.test(hexstring)) ?
16 | CertaintyEnum.GUESS :
17 | (REGEX_TEXTNUMBERSSPECIALCHARS.test(hexstring)?CertaintyEnum.WILDGUESS:CertaintyEnum.DESPERATE);
18 | document.getElementById('LSB_0x0'+i.toString(16)+'_output').innerHTML = Guesses.analyzeGuessAndGradeValue([hexstring, certainty], 'LSB_&0x0'+i.toString(16)+'()');
19 | }
20 | }
21 |
22 | Timer.stop("LSB - four");
23 | }
24 | },
25 |
26 | decode : function(ciphertext, mask)
27 | {
28 | var hexvalue = LSB.calcDecodeLSBGetSteps(ciphertext, mask);
29 | if(hexvalue && hexvalue.length && hexvalue[0]) {
30 | return hexvalue[hexvalue.length-1].value;
31 | }
32 | return false;
33 | },
34 |
35 | calcDecodeLSBGetSteps : function(ciphertext, mask)
36 | {
37 | var masklen = mask.toString(2).length;
38 | if((ciphertext.length/masklen) % 8 != 0) {
39 | return false;
40 | }
41 |
42 | var out = '';
43 | for (var i = 0, l = ciphertext.length; i < l; i++) {
44 | out += ("0000000"+(ciphertext.charCodeAt(i)&mask).toString(2)).slice(-masklen);
45 | }
46 |
47 | return calcDecodeBinaryGetSteps(out, false); //Yes, false on purpose
48 | },
49 |
50 | };
--------------------------------------------------------------------------------
/js/cipher/maze.js:
--------------------------------------------------------------------------------
1 |
2 |
3 | var Maze = {
4 |
5 | upd : function() {
6 | if (IsUnchangedVar.text || CURRENTSCRATCHPAD.realvalue == '') {
7 | return;
8 | } else {
9 | text = CURRENTSCRATCHPAD.realvalue;
10 | if(/^[0-9A-F\s]+$/gi.test(text) || ((text.match(/[^0-9A-F\s]/gi)||[]).length == 1 && /^[0-9A-F\s]+$/gi.test(text.replace(/[^0-9A-F\s]/i,' ')))) {
11 |
12 | Timer.start();
13 |
14 | Maze.calc(text);
15 | //document.getElementById('Dev_output').innerHTML = Teacher.analyzeValue(Dev.decode(CURRENTSCRATCHPAD.realvalue), 'UnderDev_decode()');
16 | //Dev.multiplyBruteF(CURRENTSCRATCHPAD.realvalue);
17 |
18 | Timer.stop("Maze - 16");
19 | }
20 | }
21 | },
22 |
23 | calc : function(text)
24 | {
25 | //if(/^[0-9A-F\s]+$/gi.test(text) || ((text.match(/[^0-9A-F\s]/gi)||[]).length == 1 && /^[0-9A-F\s]+$/gi.test(text.replace(/[^0-9A-F\s]/i,' ')))) {
26 | text = text.replace(/[^0-9A-F\s]/i,' ');
27 |
28 | var rows = text.split(/[\r\n]/);
29 | if(rows.length) {
30 | var rowlength = rows[0].length;
31 | for(var i = 1, l = rows.length; i < l; i++) {
32 | if (rows[i].length != rowlength)
33 | return false;
34 | }
35 | } else {
36 | return false;
37 | }
38 |
39 | var transposed = Maze.transpose(rows);
40 |
41 | //http://character-code.com/arrows-html-codes.php
42 |
43 | var original = transposed.slice();
44 | document.getElementById('MAZE_ltdd_output').innerHTML = Teacher.analyzeValue(ConvertBase.hexToStr(original.join('')),'maze_hex_\u2196\u21b3\u21b3()');//'Maze_hex_\u2196\u2193\u2193()'
45 | document.getElementById('MAZE_rbuu_output').innerHTML = Teacher.analyzeValue(ConvertBase.hexToStr(original.reverse().join('')),'maze_hex_\u21b0\u21b0\u2198()');//'Maze_hex_rev_\u2198\u2191\u2191()'
46 |
47 | var secondrow_inversed = transposed.slice();
48 | for(var i = 1, l = secondrow_inversed.length; i < l; i+=2){
49 | secondrow_inversed[i] = Reverse_String(secondrow_inversed[i]);
50 | }
51 | document.getElementById('MAZE_ltdu_output').innerHTML = Teacher.analyzeValue(ConvertBase.hexToStr(secondrow_inversed.join('')),'maze_hex_\u2196\u21b3\u21b1()');//'Maze_hex_\u2196\u2193\u2191()'
52 | document.getElementById('MAZE_rtdu_output').innerHTML = Teacher.analyzeValue(ConvertBase.hexToStr(secondrow_inversed.reverse().join('')),'maze_hex_\u21b0\u21b2\u2197()');//'Maze_hex_rev_\u2197\u2193\u2191()'
53 |
54 | var allrows_inversed = transposed.slice();
55 | for(var i = 0, l = allrows_inversed.length; i < l; i++) {
56 | allrows_inversed[i] = Reverse_String(allrows_inversed[i]);
57 | }
58 | document.getElementById('MAZE_lbuu_output').innerHTML = Teacher.analyzeValue(ConvertBase.hexToStr(allrows_inversed.join('')),'maze_hex_\u2199\u21b1\u21b1()');//'Maze_hex_\u2199\u2191\u2191()'
59 | document.getElementById('MAZE_rtdd_output').innerHTML = Teacher.analyzeValue(ConvertBase.hexToStr(allrows_inversed.reverse().join('')),'maze_hex_\u21b2\u21b2\u2197()');//'Maze_hex_rev_\u2197\u2193\u2193()'
60 |
61 | var firstrow_inversed = transposed.slice();
62 | for(var i = 0, l = firstrow_inversed.length; i < l; i+=2) {
63 | firstrow_inversed[i] = Reverse_String(firstrow_inversed[i]);
64 | }
65 | document.getElementById('MAZE_lbud_output').innerHTML = Teacher.analyzeValue(ConvertBase.hexToStr(firstrow_inversed.join('')),'maze_hex_\u2199\u21b1\u21b3()');//"Maze_hex_\u2199\u2191\u2193()");
66 | document.getElementById('MAZE_rbud_output').innerHTML = Teacher.analyzeValue(ConvertBase.hexToStr(firstrow_inversed.reverse().join('')),'maze_hex_\u21b2\u21b0\u2198()');//'Maze_hex_rev_\u2198\u2191\u2193()'
67 |
68 | //}
69 | //return false;
70 | },
71 |
72 | /**
73 | * http://www.shamasis.net/2010/02/transpose-an-array-in-javascript-and-jquery
74 | * Transposes a given array.
75 | * @id Array.prototype.transpose
76 | * @author Shamasis Bhattacharya
77 | *
78 | * @type Array
79 | * @return The Transposed Array
80 | * @compat=ALL
81 | */
82 | transpose : function(a) {
83 |
84 | // Calculate the width and height of the Array
85 | var //a = this,
86 | w = a.length ? a.length : 0,
87 | h = (a[0] instanceof Array || typeof a[0] === "string") ? a[0].length : 0;
88 |
89 | // In case it is a zero matrix, no transpose routine needed.
90 | if (h === 0 || w === 0) {
91 | return [];
92 | }
93 |
94 | /**
95 | * @var {Number} i Counter
96 | * @var {Number} j Counter
97 | * @var {Array} t Transposed data is stored in this array.
98 | */
99 | var i, j, t = [];
100 |
101 | // Loop through every item in the outer array (height)
102 | for (i = 0; i < h; i++) {
103 |
104 | // Insert a new row (array)
105 | t[i] = [];
106 |
107 | // Loop through every item per item in outer array (width)
108 | for (j = 0; j < w; j++) {
109 |
110 | // Save transposed data.
111 | t[i][j] = a[j][i];
112 | }
113 |
114 | if(typeof a[0] === "string")
115 | t[i] = t[i].join('');
116 | }
117 |
118 | return t;
119 | },
120 |
121 | };
--------------------------------------------------------------------------------
/js/cipher/morse.js:
--------------------------------------------------------------------------------
1 |
2 | var Morse = {
3 |
4 | //morseIndexes : new Array("A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z",'0',"1","2","3","4","5","6","7","8","9",".",",","?","-","=",":",";","(",")","/",'"',"$","'","\n","_","@","[Error]","[Error]","[Error]","[Error]","[Wait]","[Understood]","[End of message]","[End of work]","[Starting signal]","[Invitation to transmit]","!","!","+","~","#","&","\2044"),
5 | morseIndexes : new Array("A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z",'0',"1","2","3","4","5","6","7","8","9",".",",","?","-","=",":",";","(",")","/",'"',"$","'","\n","_","@","[Error]","[Error]","[Error]","[Error]","[Wait]","[Understood]","[End of message]","[End of work]","[Starting signal]","[Invitation to transmit]","!","!","+","~","#","&","\2044"),
6 | morseCodes : new Array(".-","-...","-.-.","-..",".","..-.","--.","....","..",".---","-.-",".-..","--","-.","---",".--.","--.-",".-.","...","-","..-","...-",".--","-..-","-.--","--..","-----",".----","..---","...--","....-",".....","-....","--...","---..","----.",".-.-.-","--..--","..--..","-....-","-...-","---...","-.-.-.","-.--.","-.--.-","-..-.",".-..-.","...-..-",".----.",".-.-..","..--.-",".--.-.","......",".......","........",".........",".-...","...-.",".-.-.","...-.-","-.-.-","-.-","---.","-.-.--",".-.-.",".-...","...-.-",". ...","-..-."),
7 |
8 | upd : function()
9 | {
10 | if (IsUnchangedVar.text * IsUnchangedVar.encdec)
11 | {
12 | //window.setTimeout('Morse.upd()', 100);
13 | return;
14 | }
15 | //ResizeTextArea(CURRENTSCRATCHPAD);
16 |
17 | var e = document.getElementById('MORSE_output');
18 |
19 | if (CURRENTSCRATCHPAD.realvalue == '')
20 | {
21 | e.innerHTML = 'Type in a message and see the results here!';
22 | }
23 | else if (document.encoder.encdec.value * 1 == 1)
24 | {
25 | e.innerHTML = Morse.encode(CURRENTSCRATCHPAD.realvalue);
26 | }
27 | else
28 | {
29 | var digits = Binary.getDigitsIfBinary(CURRENTSCRATCHPAD.realvalue.replace(/\//g,' '));
30 | if(digits/* && (digits[0] != '-' || digits[1] != '.')*/)
31 | {
32 | Timer.start();
33 | var txt = Binary.replaceBoth(CURRENTSCRATCHPAD.realvalue.replace(/\//g,' '), digits[0], '-', digits[1], '.');
34 | e.innerHTML = Guesses.analyzeGuessAndGradeValue(Morse.decodeExtended(txt), 'morse()')+'
';
35 | txt = Binary.swap(txt);
36 | e.innerHTML += Guesses.analyzeGuessAndGradeValue(Morse.decodeExtended(txt), 'inverse().morse()') + '
';
37 |
38 | txt = Reverse_String(Binary.replaceBoth(CURRENTSCRATCHPAD.realvalue.replace(/\//g,' '), digits[0], '-', digits[1], '.'));
39 | e.innerHTML += Guesses.analyzeGuessAndGradeValue(Morse.decodeExtended(txt), 'reverse().morse()') + '
';
40 | txt = Binary.swap(txt);
41 | e.innerHTML += Guesses.analyzeGuessAndGradeValue(Morse.decodeExtended(txt), 'reverse().inverse().morse()');
42 | Timer.stop("Morse - Four");
43 | }
44 | else
45 | {
46 | e.innerHTML = '';
47 | }
48 | }
49 |
50 | //window.setTimeout('Morse.upd()', 100);
51 | },
52 |
53 | setMorse : function(m)
54 | {
55 | document.encoder.encdec.value = "-1";
56 | CURRENTSCRATCHPAD.setRealValue(m);
57 | ForceFlow.updateEditedNode(CURRENTSCRATCHPAD);
58 | //ForceFlow.addSteps([Teacher.analyzeValueDoNotSaveGrade(m, 'morse_example()')]);
59 | //ForceFlow.selectFurthestSingleChildNodePath();
60 | return false;
61 | },
62 |
63 | swapMorse_Str : function(s)
64 | {
65 | var o = '';
66 |
67 | for (var i = 0; i < s.length; i ++)
68 | {
69 | var c = s.charAt(i);
70 | if (c == '-')
71 | c = '.';
72 | else if (c == '.')
73 | c = '-';
74 | else if (c == "\r")
75 | c = '';
76 | o += c;
77 | }
78 | return o;
79 | },
80 | swapMorse : function()
81 | {
82 | CURRENTSCRATCHPAD.setRealValue(Morse.swapMorse_Str(CURRENTSCRATCHPAD.realvalue));
83 | ForceFlow.updateEditedNode(CURRENTSCRATCHPAD);
84 | },
85 |
86 | reverse_Str : function(s)
87 | {
88 | var i = s.length - 1, o = '';
89 |
90 | while (i >= 0)
91 | {
92 | var c = s.charAt(i);
93 | if (c != "\r")
94 | o += c;
95 | i --;
96 | }
97 | return o;
98 | },
99 |
100 | reverse : function()
101 | {
102 | CURRENTSCRATCHPAD.setRealValue(Morse.reverse_Str(CURRENTSCRATCHPAD.realvalue));
103 | ForceFlow.updateEditedNode(CURRENTSCRATCHPAD);
104 | },
105 |
106 | getIndex : function(arr, str)
107 | {
108 | var i = 0;
109 | while (arr[i])
110 | {
111 | if (arr[i] == str)
112 | {
113 | return i;
114 | }
115 | i ++;
116 | }
117 | return -1;
118 | },
119 |
120 | encode : function(str)
121 | {
122 | var addSpace = 0;
123 | var out = "";
124 | for (var i = 0; i < str.length; i ++)
125 | {
126 | var c = str.charAt(i);
127 | var j = Morse.getIndex(this.morseIndexes, c.toUpperCase());
128 | if (j >= 0)
129 | {
130 | if (addSpace)
131 | {
132 | out += ' ';
133 | }
134 | out += this.morseCodes[j];
135 | addSpace = 1;
136 | }
137 | else
138 | {
139 | if (c.charCodeAt(0) == 10 || c.charCodeAt(0) == 13)
140 | {
141 | out += c;
142 | }
143 | else if (addSpace)
144 | {
145 | out += ' / ';
146 | }
147 | addSpace = 0;
148 | }
149 | }
150 | return out;
151 | },
152 |
153 | decode : function(str)
154 | {
155 | var outArr = Morse.decodeExtended(str);
156 | return outArr[0];
157 | },
158 | decodeExtended : function(str)
159 | {
160 | var out = "";
161 | var addSpace = 0;
162 | var cleanDecode = true;
163 | var veryCleanDecode = true;
164 |
165 | // Reformat string, trying to change odd things into dots
166 | // and hyphens
167 | tmp = "";
168 | for (var i = 0; i < str.length; i ++)
169 | {
170 | if (str.charCodeAt(i) < 27)
171 | {
172 | tmp += ' ' + str.charAt(i) + ' ';
173 | }
174 | else if (str.charCodeAt(i) == 8211 || str.charCodeAt(i) == 8212 ||
175 | str.charAt(i) == '_')
176 | {
177 | // Compensate for weird hyphens
178 | tmp += '-';
179 | }
180 | else if (str.charCodeAt(i) == 8226 || str.charCodeAt(i) == 8901)
181 | {
182 | // Compensate for odd dots
183 | tmp += '.';
184 | }
185 | else
186 | {
187 | tmp += str.charAt(i);
188 | }
189 | }
190 |
191 | str = tmp.split(' ');
192 | for (var i = 0; i < str.length; i ++)
193 | {
194 | var idx = Morse.getIndex(this.morseCodes, str[i]);
195 |
196 | if (idx >= 0)
197 | {
198 | out += this.morseIndexes[idx];
199 | addSpace = 1;
200 | if(idx >= 51 && idx <= 61) { //If it's any of the codes, set cleanDecode to false
201 | cleanDecode = false;
202 | }
203 | }
204 | else
205 | {
206 | if (str[i].charCodeAt(0) == 10 || str[i].charCodeAt(0) == 13)
207 | {
208 | out += str[i];
209 | }
210 | else if (addSpace)
211 | {
212 | out += ' ';
213 | if(str[i] != '/')
214 | cleanDecode = false;
215 | //alert(str[i]+"="+Morse.getIndex(this.morseCodes, str[i])+" | "+out);
216 | }
217 | else
218 | {
219 | cleanDecode = false;
220 | }
221 | addSpace = 0;
222 | }
223 | }
224 |
225 | //if((out.match(/\[/g) || []).length >= 2)
226 | // veryCleanDecode = false;
227 |
228 | return [out, cleanDecode?(veryCleanDecode?CertaintyEnum.EDUCATEDGUESS:CertaintyEnum.DESPERATE):-1];
229 | }
230 | };
231 |
--------------------------------------------------------------------------------
/js/cipher/otp.js:
--------------------------------------------------------------------------------
1 |
2 | var Onetimepad = {
3 | upd : function()
4 | {
5 | if (IsUnchangedVar.text * IsUnchangedVar.ONETIMEPAD_pad * IsUnchangedVar.encdec)
6 | {
7 | return;
8 | }
9 | //ResizeTextArea(document.encoder.ONETIMEPAD_pad);
10 |
11 | var e = document.getElementById('ONETIMEPAD_output');
12 |
13 | if (CURRENTSCRATCHPAD.realvalue != '' && document.encoder.ONETIMEPAD_pad.value != '')
14 | {
15 | Timer.start();
16 | e.innerHTML = OneTimePad.calc(document.encoder.encdec.value * 1, CURRENTSCRATCHPAD.realvalue, document.encoder.ONETIMEPAD_pad.value);
17 | Teacher.analyzeField('ONETIMEPAD_output', 'onetimepad()');
18 | Timer.stop("OTP - Single");
19 | }
20 | else
21 | {
22 | e.innerHTML = 'Type a pad to see the results.';
23 | }
24 | },
25 |
26 |
27 | // One-Time Pad
28 |
29 | // This code was written by Tyler Akins and placed in the public domain.
30 | // It would be nice if you left this header intact. http://rumkin.com
31 |
32 |
33 | // Implements a one-time pad for only alphabetic characters. Preserves
34 | // the character case in the text (not the key).
35 | // encdec = -1 for decode, 1 for encode
36 | // text = the text to encode or decode.
37 | // key = the key (pad) to use
38 | calc : function(encdec, text, key)
39 | {
40 | var pad, i, out, c, uc;
41 |
42 | pad = "";
43 | key = key.toUpperCase();
44 | for (i = 0; i < key.length; i ++)
45 | {
46 | c = key.charAt(i)
47 | if (c >= 'A' && c <= 'Z')
48 | {
49 | pad += c;
50 | }
51 | }
52 |
53 | out = "";
54 | for (i = 0; i < text.length; i ++)
55 | {
56 | c = text.charAt(i);
57 | uc = ' ';
58 | if (c >= 'A' && c <= 'Z')
59 | {
60 | uc = 'A';
61 | }
62 | if (c >= 'a' && c <= 'z')
63 | {
64 | uc = 'a';
65 | }
66 | if (uc != ' ')
67 | {
68 | if (pad.length == 0)
69 | {
70 | pad = "AAAAAAAA";
71 | }
72 | c = c.charCodeAt(0) - uc.charCodeAt(0) +
73 | encdec * (pad.charCodeAt(0) - 'A'.charCodeAt(0));
74 | c = (c + 26) % 26;
75 | c = String.fromCharCode(uc.charCodeAt(0) + c);
76 | pad = pad.slice(1, pad.length);
77 | }
78 | out += c;
79 | }
80 |
81 | return out;
82 | }
83 |
84 | };
85 |
--------------------------------------------------------------------------------
/js/cipher/railfence.js:
--------------------------------------------------------------------------------
1 | var Railfence = {
2 |
3 | toggle : 0,
4 |
5 | upd : function()
6 | {
7 | var e, r;
8 | var encdec = document.encoder.encdec.value * 1;
9 |
10 | if (IsUnchangedVar.text * IsUnchangedVar.encdec *
11 | IsUnchangedVar.RAILFENCE_rails * IsUnchangedVar.RAILFENCE_offset)
12 | {
13 | return;
14 | }
15 | if (document.encoder.RAILFENCE_rails.value == '' ||
16 | document.encoder.RAILFENCE_offset.value == '')
17 | {
18 | return;
19 | }
20 | if (document.encoder.RAILFENCE_rails.value * 1 < 1)
21 | {
22 | document.encoder.RAILFENCE_rails.value = 1;
23 | //return;
24 | }
25 |
26 | //ResizeTextArea(CURRENTSCRATCHPAD);
27 |
28 | if (CURRENTSCRATCHPAD.realvalue == '')
29 | {
30 | e = document.getElementById('RAILFENCE_output');
31 | e.innerHTML = 'Type a message and see the results here!';
32 | e = document.getElementById('rails_disp');
33 | e.innerHTML = 'There is no message to show.';
34 | return;
35 | }
36 | Timer.start();
37 | r = Railfence.calc(encdec,
38 | CURRENTSCRATCHPAD.realvalue, document.encoder.RAILFENCE_rails.value * 1,
39 | document.encoder.RAILFENCE_offset.value * 1);
40 |
41 | e = document.getElementById('RAILFENCE_output');
42 | e.innerHTML = Teacher.analyzeValue(r, 'railfence()');//SwapSpaces(r);//HTMLEscape(r));
43 |
44 | e = document.getElementById('rails_disp');
45 | if (encdec > 0)
46 | { //Encode
47 | e.innerHTML = Railfence.formatRails(HTMLEscape(CURRENTSCRATCHPAD.realvalue),
48 | document.encoder.RAILFENCE_rails.value * 1, document.encoder.RAILFENCE_offset.value * 1);
49 | }
50 | else
51 | { //Decode
52 | e.innerHTML = Railfence.formatRails(HTMLEscape(r), document.encoder.RAILFENCE_rails.value * 1,
53 | document.encoder.RAILFENCE_offset.value * 1);
54 | }
55 | Timer.stop("Railfence - Single");
56 |
57 | Timer.start();
58 | var max_len_bruteF_range = Math.ceil(CURRENTSCRATCHPAD.realvalue.length / 2);
59 |
60 | o = document.getElementById('RAILFENCE_output_bruteF');
61 | var out = '';
62 | for(var i = 2; i < railfence_bruteF_range && i < max_len_bruteF_range; i++) {
63 | var r = Railfence.calc(encdec,
64 | CURRENTSCRATCHPAD.realvalue, i, document.encoder.RAILFENCE_offset.value * 1);
65 | r = encdec < 0?Teacher.analyzeValue(r, 'railfence'+i+'()'):r;
66 | out += 'Rails: '+i+' '+r+"
\n";
67 | }
68 | o.innerHTML = out;
69 |
70 | o = document.getElementById('RAILFENCE_reverse_output_bruteF');
71 | out = '';
72 | for(var i = 2; i < railfence_bruteF_range && i < max_len_bruteF_range; i++) {
73 | var r = Railfence.calc(encdec,
74 | Reverse_String(CURRENTSCRATCHPAD.realvalue), i, document.encoder.RAILFENCE_offset.value * 1);
75 | r = encdec < 0?Teacher.analyzeValue(r, 'reverse().railfence'+i+'()'):r;
76 | out += 'Rails: '+i+' '+r+"
\n";
77 | }
78 | o.innerHTML = out;
79 | Timer.stop("Railfence - BruteF over "+railfence_bruteF_range*2);
80 | },
81 |
82 |
83 | formatRails : function(text, rails, offset)
84 | {
85 | var o = new Array(rails), off = new Array(2 * (rails - 1));
86 | var i, j, off, pos;
87 |
88 | for (i = 0; i < rails; i ++)
89 | {
90 | o[i] = "";
91 | off[i] = i;
92 | }
93 |
94 | for (i = rails; i < 2 * (rails - 1); i ++)
95 | {
96 | off[i] = (2 * (rails - 1)) - i;
97 | }
98 |
99 | pos = offset % (2 * (rails - 1));
100 |
101 | for (i = 0; i < text.length; i ++)
102 | {
103 | for (j = 0; j < rails; j ++)
104 | {
105 | if (off[pos] == j)
106 | {
107 | o[j] += text.charAt(i);
108 | }
109 | else
110 | {
111 | o[j] += ' ';
112 | }
113 | }
114 | pos = (pos + 1) % (2 * (rails - 1));
115 | }
116 |
117 |
118 | j = "";
119 | for (i = 0; i < rails; i ++)
120 | {
121 | if (i)
122 | {
123 | j += "
\n";
124 | }
125 | j += o[i];
126 | }
127 |
128 | return '' + j + '';
129 | },
130 |
131 | toggleRails : function()
132 | {
133 | var Link, Vis;
134 |
135 | if (this.toggle == 0)
136 | {
137 | this.toggle = 1;
138 | Link = "Hide the rails";
139 | Vis = "block";
140 | }
141 | else
142 | {
143 | this.toggle = 0;
144 | Link = "Show the rails";
145 | Vis = "none";
146 | }
147 |
148 | e = document.getElementById('rails_link');
149 | e.innerHTML = Link;
150 |
151 | e = document.getElementById('rails_disp');
152 | e.style.display = Vis;
153 | },
154 |
155 | // Railfence encoding
156 |
157 | // This code was written by Tyler Akins and placed in the public domain.
158 | // It would be nice if you left this header intact. http://rumkin.com
159 |
160 |
161 | // Railfence
162 | // encdec = -1 for decode, 1 for encode
163 | // text = the text to encode/decode
164 | // rails = The number of rails in the fence ( >= 1 and <= text.length )
165 | // offset = Starting position (from 0 to rails * 2 - 2)
166 | calc : function(encdec, text, rails, offset)
167 | {
168 | rails = rails * 1;
169 |
170 | if (rails < 2)
171 | return 'You must have at least 2 rails. I suggest 3 or more.';
172 | if (rails >= text.length)
173 | return 'You need less rails or more text.';
174 |
175 | offset = offset * 1;
176 | while (offset < 0)
177 | {
178 | offset += rails * 2 - 2;
179 | }
180 | offset = offset % (rails * 2 - 2);
181 |
182 | if (encdec * 1 < 0)
183 | {
184 | return Railfence.rail_decode(text, rails, offset * 1);
185 | }
186 | return Railfence.rail_encode(text, rails, offset * 1);
187 | },
188 |
189 |
190 | rail_encode : function(t, r, o)
191 | {
192 | var o_idx = new Array(r * 2 - 2);
193 | var out_a = new Array(r);
194 | var i, j;
195 |
196 | for (i = 0; i < r; i ++)
197 | {
198 | o_idx[i] = i;
199 | out_a[i] = ""
200 | }
201 | for (j = 0; j < r - 2; j ++)
202 | {
203 | o_idx[i + j] = i - (j + 2);
204 | }
205 |
206 | for (i = 0; i < t.length; i ++)
207 | {
208 | out_a[o_idx[o]] += t.charAt(i);
209 | o = (o + 1) % o_idx.length
210 | }
211 |
212 | j = "";
213 | for (i = 0; i < r; i ++)
214 | {
215 | j += out_a[i];
216 | }
217 |
218 | return j;
219 | },
220 |
221 |
222 | rail_decode : function (t, r, o)
223 | {
224 | var o_idx = new Array((r - 1) * 2);
225 | var out_a = new Array(r);
226 | var i, j, k;
227 |
228 | for (i = 0; i < o_idx.length; i ++)
229 | {
230 | j = (o + i) % o_idx.length;
231 | if (j < r)
232 | {
233 | o_idx[i] = j;
234 | }
235 | else
236 | {
237 | o_idx[i] = (2 * (r - 1)) - j;
238 | }
239 | }
240 |
241 | for (i = 0; i < out_a.length; i ++)
242 | {
243 | out_a[i] = 0;
244 | }
245 |
246 | for (i = 0; i < t.length; i ++)
247 | {
248 | out_a[o_idx[i % o_idx.length]] ++;
249 | }
250 |
251 | j = 0;
252 | for (i = 0; i < out_a.length; i ++)
253 | {
254 | out_a[i] = t.slice(j, j + out_a[i]);
255 | j += out_a[i].length;
256 | }
257 |
258 | j = "";
259 | for (i = 0; i < t.length; i ++)
260 | {
261 | k = o_idx[i % o_idx.length];
262 | j += out_a[k].charAt(0);
263 | out_a[k] = out_a[k].slice(1, out_a[k].length);
264 | }
265 |
266 | return j;
267 | }
268 | };
269 |
--------------------------------------------------------------------------------
/js/cipher/romannumerals.js:
--------------------------------------------------------------------------------
1 |
2 |
3 | var RomanNumerals = {
4 |
5 | romanNumerals: {
6 | 1: 'I',
7 | 4: 'IV',
8 | 5: 'V',
9 | 9: 'IX',
10 | 10: 'X',
11 | 40: 'XL',
12 | 50: 'L',
13 | 90: 'XC',
14 | 100: 'C',
15 | 400: 'CD',
16 | 500: 'D',
17 | 900: 'CM',
18 | 1000: 'M'
19 | },
20 |
21 | upd : function() {
22 | if (IsUnchangedVar.text || CURRENTSCRATCHPAD.realvalue == '') {
23 | return;
24 | } else {
25 |
26 | var text = CURRENTSCRATCHPAD.realvalue.toUpperCase();
27 | if(/^(M{0,4}(CM|CD|D?C{0,3})(XC|XL|L?X{0,3})(IX|IV|V?I{0,3})\s*)+$/.test(text))
28 | {
29 | Timer.start();
30 | document.getElementById('ROMAN_output').innerHTML = Teacher.analyzeValue(RomanNumerals.calc(text.split(/\s/)), 'romanNumerals_decode()');
31 | Timer.stop("RomanNumerals - 1");
32 | }
33 | }
34 | },
35 |
36 | calc : function(conversion)
37 | {
38 | var content, out = '';
39 | for (var i = 0; i < conversion.length; i ++)
40 | {
41 | //var formatDef = cryptii.conversion.formats['roman-numerals'];
42 | //var romanNumerals = formatDef.romanNumerals;
43 |
44 | content = conversion[i];
45 |
46 | if (content.length > 0)
47 | {
48 | var error = false;
49 | var decimal = 0;
50 | var previousHighestRomanNumeral = 1001;
51 |
52 | do
53 | {
54 | // find the highest roman numeral with the highest
55 | // decimal value that is taken from the left
56 | // part of the roman numeral
57 | var highestRomanNumeral = 0;
58 |
59 | for (var romanNumeral in this.romanNumerals)
60 | {
61 | var written = this.romanNumerals[romanNumeral];
62 | if (content.substr(0, written.length) == written)
63 | highestRomanNumeral =
64 | Math.max(highestRomanNumeral, romanNumeral);
65 | }
66 |
67 | if (highestRomanNumeral != 0
68 | && highestRomanNumeral <= previousHighestRomanNumeral)
69 | {
70 | // add roman numeral (digit) to result
71 | decimal += highestRomanNumeral;
72 |
73 | // remove roman digit
74 | content = content.substr(this.romanNumerals[highestRomanNumeral].length);
75 |
76 | // update previous highest roman numeral
77 | previousHighestRomanNumeral = highestRomanNumeral;
78 | }
79 | else
80 | {
81 | // there is a not-recognized letter
82 | // or this roman numeral letter is bigger than the last one
83 | // or this roman numeral letter appears for the 4th time
84 | // cancel
85 | error = true;
86 | }
87 | }
88 | // do this until the roman numeral is
89 | // completely converted in decimal
90 | // or an error occurs
91 | while (content.length > 0 && !error);
92 |
93 | out += String.fromCharCode(decimal);
94 | }
95 | }
96 |
97 | if (!error)
98 | return out;
99 |
100 | return false;
101 | },
102 | };
103 |
104 |
--------------------------------------------------------------------------------
/js/cipher/rotate.js:
--------------------------------------------------------------------------------
1 | var Rotate = {
2 |
3 | upd : function()
4 | {
5 | if (IsUnchangedVar.text * IsUnchangedVar.ROTATE_col * IsUnchangedVar.encdec)
6 | {
7 | return;
8 | }
9 |
10 | //ResizeTextArea(CURRENTSCRATCHPAD);
11 |
12 | var e = document.getElementById('ROTATE_output');
13 |
14 | if (CURRENTSCRATCHPAD.realvalue == '')
15 | {
16 | e.innerHTML = 'Enter your text and see the results here!';
17 | }
18 | else
19 | {
20 | if(document.encoder.ROTATE_col.value != '1') {
21 | Timer.start();
22 | e.innerHTML = /*SwapSpaces(HTMLEscape(*/Teacher.analyzeValue(Rotate.calc(document.encoder.encdec.value * 1,
23 | CURRENTSCRATCHPAD.realvalue,
24 | document.encoder.ROTATE_col.value * 1), 'rotate()');
25 | //Teacher.analyzeField('ROTATE_output', 'rotate()');
26 | Timer.stop("Rotate - Single");
27 | }
28 |
29 | Timer.start();
30 | o = document.getElementById('ROTATE_output_bruteF');
31 | var out = '';
32 | var encdec = document.encoder.encdec.value * 1;
33 | for(var i = 2; i < rotate_bruteF_range && i < CURRENTSCRATCHPAD.realvalue.length; i++) {
34 | var r = Rotate.calc(encdec, CURRENTSCRATCHPAD.realvalue, i);
35 | r = encdec < 0?Teacher.analyzeValue(r, 'rotate'+i+'()'):r;
36 | out += 'Rotate '+i+': '+r+"
\n";
37 | }
38 | o.innerHTML = out;
39 | Timer.stop("Rotate - BruteF over "+rotate_bruteF_range);
40 | }
41 | },
42 |
43 | insert_k3 : function()
44 | {
45 | document.encoder.encdec.value = -1;
46 | document.encoder.col.value = 24;
47 | CURRENTSCRATCHPAD.setRealValue("ENDyaHrOHNLSRHEOCPTEOIBIDYSHNAIA\n" +
48 | "CHTNREYULDSLLSlLNOHSNOSMRWXMNE\n" +
49 | "TPRNGATIHNRARPESLNNELEBLPIIACAE\n" +
50 | "WMTWNDITEENRAHCTENEUDRETNHAEOE\n" +
51 | "TFOLSEDTIWENHAEIOYTEYQHEENCTAYCR\n" +
52 | "EIFTBRSPAMHHEWENATAMATEGYEERLB\n" +
53 | "TEEFOAsFIOTUETUAEOTOARMAEERTNRTI\n" +
54 | "BSEDDNIAAHTTMSTEWPIEROAGRIEWFEB\n" +
55 | "AECTDDHILCEIHSITEGOEAOSDDRYDLORIT\n" +
56 | "RKLMLEHAGTDHARDPNEOHMGFMFEUHE\n" +
57 | "ECDMRIPFEIMEHNLSSTTRTVDOHW");
58 | ForceFlow.updateEditedNode(CURRENTSCRATCHPAD);
59 | },
60 |
61 |
62 | // Rotate Text
63 |
64 | // Algorithm suggested by Mike on the Kryptos mailing list.
65 |
66 | // Insert letters (not newlines) into a grid, then rotate the grid 90 degrees
67 | // left or right (left = encode) and read the results back out of the grid.
68 | // encdec = -1 for decode (right) and 1 for encode (left)
69 | // text = text to rotate
70 | // cols = number of columns for the box. If not a factor of text length,
71 | // adds 'X' characters
72 | calc : function(encdec, text, cols)
73 | {
74 | var t2 = Tr(text, "\r\n");
75 |
76 | cols = Math.floor(cols);
77 | if (cols < 1)
78 | cols = 1;
79 |
80 | while (t2.length % cols)
81 | {
82 | text += 'X';
83 | t2 += 'X';
84 | }
85 |
86 | // Arrange into a grid
87 | var grid = new Array(cols);
88 | for (var i = 0; i < cols; i ++)
89 | {
90 | grid[i] = '';
91 | }
92 |
93 | for (i = 0; i < t2.length; i ++)
94 | {
95 | grid[i % cols] += t2.charAt(i);
96 | }
97 |
98 | t2 = '';
99 | if (encdec > 0)
100 | {
101 | // Rotate left
102 | for (i = 0; i < cols; i ++)
103 | {
104 | t2 += grid[cols - (i + 1)];
105 | }
106 | }
107 | else
108 | {
109 | // Rotate right
110 | for (i = 0; i < cols; i ++)
111 | {
112 | t2 += Reverse_String(grid[i]);
113 | }
114 | }
115 |
116 | return InsertCRLF(text, t2);
117 | }
118 | };
119 |
--------------------------------------------------------------------------------
/js/cipher/skip.js:
--------------------------------------------------------------------------------
1 | var Skip = {
2 | tempBruteFCounter : 0,
3 | primes : [],
4 | primes_initialized : false,
5 |
6 | upd : function()
7 | {
8 | if (IsUnchangedVar.text * IsUnchangedVar.SKIP_skip *
9 | IsUnchangedVar.SKIP_startat * IsUnchangedVar.encdec)
10 | {
11 | return;
12 | }
13 |
14 |
15 | if (CURRENTSCRATCHPAD.realvalue != '')
16 | {
17 | /*Timer.start();
18 | //var e = document.getElementById('SKIP_output');
19 | e.innerHTML = Skip.calc(document.encoder.encdec.value * 1,
20 | CURRENTSCRATCHPAD.realvalue, document.encoder.SKIP_skip.value * 1,
21 | document.encoder.SKIP_startat.value * 1);//));
22 | Teacher.analyzeField('SKIP_output','skip()');
23 | Timer.stop("Skip - Single");*/
24 |
25 | Timer.start();
26 | var e = document.getElementById('SKIP_output_chart');
27 | e.innerHTML = Skip.show_chart(false);
28 | Timer.stop("Skip - BruteF over "+this.tempBruteFCounter);
29 | }
30 | },
31 |
32 |
33 | plusMinus : function(objname, dir)
34 | {
35 | var v, t;
36 |
37 | t = Tr(CURRENTSCRATCHPAD.realvalue, "\r\n");
38 | v = eval('document.encoder.' + objname + '.value') * 1;
39 | v += dir;
40 | if (objname == 'SKIP_skip')
41 | {
42 | while (Skip.hasAFactorMatch(t.length, v) && v > 1 && v < t.length - 1)
43 | {
44 | v += dir;
45 | }
46 | if (v < 1)
47 | v = 1;
48 | }
49 | else
50 | {
51 | if (v < 0)
52 | v = 0;
53 | }
54 | if (v > t.length - 1)
55 | v = t.length - 1;
56 | eval('document.encoder.' + objname + '.value = v');
57 | },
58 |
59 |
60 | load_k3 : function()
61 | {
62 | document.encoder.encdec.value = -1;
63 | document.encoder.SKIP_startat.value = 191;
64 | document.encoder.SKIP_skip.value = 192;
65 | CURRENTSCRATCHPAD.setRealValue("ENDyaHrOHNLSRHEOCPTEOIBIDYSHNAIA\n" +
66 | "CHTNREYULDSLLSlLNOHSNOSMRWXMNE\n" +
67 | "TPRNGATIHNRARPESLNNELEBLPIIACAE\n" +
68 | "WMTWNDITEENRAHCTENEUDRETNHAEOE\n" +
69 | "TFOLSEDTIWENHAEIOYTEYQHEENCTAYCR\n" +
70 | "EIFTBRSPAMHHEWENATAMATEGYEERLB\n" +
71 | "TEEFOAsFIOTUETUAEOTOARMAEERTNRTI\n" +
72 | "BSEDDNIAAHTTMSTEWPIEROAGRIEWFEB\n" +
73 | "AECTDDHILCEIHSITEGOEAOSDDRYDLORIT\n" +
74 | "RKLMLEHAGTDHARDPNEOHMGFMFEUHE\n" +
75 | "ECDMRIPFEIMEHNLSSTTRTVDOHW?");
76 | ForceFlow.updateEditedNode(CURRENTSCRATCHPAD);
77 | },
78 |
79 |
80 | show_chart : function(newwindow)
81 | {
82 | var t = Tr(CURRENTSCRATCHPAD.realvalue, "\r\n");
83 | var o = '';
84 |
85 | if (t.length == 0)
86 | {
87 | //alert('You need to type in a message first.');
88 | return;
89 | }
90 |
91 | if (t.length < 3)
92 | {
93 | //alert('The message is too short.');
94 | return;
95 | }
96 |
97 | this.primes_initialized = false;
98 | this.tempBruteFCounter = 0;
99 | var encdec = document.encoder.encdec.value * 1;
100 | var skip_startat = document.encoder.SKIP_startat.value * 1;
101 | for (var s = 2, l = t.length-1; s < l; s ++)
102 | {
103 | if (! Skip.hasAFactorMatch(t.length, s)) // (s == 0 || ! Skip.hasAFactorMatch(t.length, s))
104 | {
105 | o += 'Skip ' + s + ': ' +
106 | Teacher.analyzeValue(Skip.calc(encdec, t, s, skip_startat), 'skip'+s+'()') +
107 | "
\n";
108 |
109 | this.tempBruteFCounter++;
110 | if(this.tempBruteFCounter >= skip_bruteF_range)
111 | break;
112 | }
113 | }
114 | if (newwindow) {
115 | var win = window.open('', '', 'toolbar=0,location=0,statusbar=0');
116 | win.document.write(o);
117 | } else {
118 | return o;
119 | }
120 | },
121 |
122 | // Skip
123 |
124 | // This code was written by Tyler Akins and placed in the public domain.
125 | // It would be nice if you left this header intact. http://rumkin.com
126 |
127 | // Requires util.js
128 |
129 |
130 | // Skip
131 | // encdec = -1 for decode, 1 for encode
132 | // text = the data you want to encode/decode
133 | // inc = how many letters you want to skip (1 or more)
134 | // start = what position you want to start at (0 = beginning)
135 | calc : function(encdec, text, inc, start)
136 | {
137 | enctext = Tr(text, "\r\n");
138 | inc = inc * 1;
139 | start = start * 1;
140 |
141 | if (enctext.length < 2)
142 | return 'Text length is too short.';
143 | if (inc < 1)
144 | return 'Skip must be 1 or bigger.';
145 | if (inc > enctext.length - 1)
146 | return 'Skip must be smaller than the length of the text.';
147 | if (start < 0)
148 | return 'Start must be 0 or larger.';
149 | if (start > enctext.length)
150 | return 'Start must be smaller than or equal to the length of the text.';
151 | if (Skip.hasAFactorMatch(enctext.length, inc))
152 | return 'Skip has a prime factor that cleanly divides into the text length, so it can not be used.';
153 |
154 | if (encdec * 1 < 0)
155 | {
156 | enctext = Skip.decode(enctext, inc, start);
157 | }
158 | else
159 | {
160 | enctext = Skip.encode(enctext, inc, start);
161 | }
162 |
163 | return InsertCRLF(text, enctext);
164 | },
165 |
166 |
167 | // Checks if two numbers have a matching factor besides 1.
168 | hasAFactorMatch : function(t_len, sk)
169 | {
170 | var i, j, l, sk_half, div, div2;
171 |
172 | if (sk == 1)
173 | return 0;
174 |
175 | div = t_len / sk;
176 | if (div == Math.floor(div))
177 | return 1;
178 |
179 | div = sk / 2;
180 | div2 = t_len / 2;
181 | if (div == Math.floor(div) && div2 == Math.floor(div2))
182 | return 1;
183 |
184 | sk_half = Math.floor(sk / 2);
185 |
186 | if ( !this.primes_initialized ) {
187 | this.primes = new Array(1);
188 | this.primes[0] = 2;
189 | for (i = 3, l = Math.floor(div2); i <= l; i ++)
190 | {
191 | for (j = 0; j < this.primes.length; j ++)
192 | {
193 | div = i / this.primes[j];
194 | if (div == Math.floor(div))
195 | {
196 | j = this.primes.length + 1;
197 | }
198 | }
199 | if (j == this.primes.length)
200 | {
201 | this.primes[this.primes.length] = i;
202 | }
203 | }
204 | this.primes_initialized = true;
205 | }
206 |
207 | for (i = 0, l = this.primes.length; i <= l; i ++)
208 | {
209 | div = sk / this.primes[i];
210 | div2 = t_len / this.primes[i];
211 | if (div == Math.floor(div) && div2 == Math.floor(div2))
212 | {
213 | return 1;
214 | }
215 | }
216 | return 0;
217 | },
218 |
219 |
220 | // Skip encoder
221 | encode : function(t, sk, st)
222 | {
223 | var i, pos, o = t;
224 |
225 | for (i = 0, pos = st; i < t.length; i ++)
226 | {
227 | o = o.slice(0, pos) + t.charAt(i) + o.slice(pos + 1, o.length);
228 | pos += sk;
229 | pos = pos % t.length;
230 | }
231 |
232 | return o;
233 | },
234 |
235 |
236 | // Skip decoder
237 | decode : function(t, sk, st)
238 | {
239 | var i, pos, o = "";
240 |
241 | for (i = 0, pos = st; i < t.length; i ++)
242 | {
243 | o += t.charAt(pos);
244 | pos += sk;
245 | pos = pos % t.length;
246 | }
247 |
248 | return o;
249 | }
250 | };
251 |
--------------------------------------------------------------------------------
/js/cipher/statistics.js:
--------------------------------------------------------------------------------
1 |
2 |
3 | function STATISTIC_upd()
4 | {
5 | if (IsUnchangedVar.text)
6 | {
7 | //window.setTimeout('STATISTIC_upd()', 100);
8 | return;
9 | }
10 |
11 | //ResizeTextArea(CURRENTSCRATCHPAD);
12 |
13 | var e = document.getElementById('STATISTIC_output');
14 |
15 | if (CURRENTSCRATCHPAD.realvalue == '')
16 | {
17 | e.innerHTML = 'Type in stuff and see the statistics here.';
18 | }
19 | else
20 | {
21 | Timer.start();
22 | e.innerHTML = Statistics(CURRENTSCRATCHPAD.realvalue);
23 | Timer.stop("Statistics");
24 | }
25 |
26 | //window.setTimeout('STATISTIC_upd()', 100);
27 | }
28 |
29 |
30 | function Statistics(t)
31 | {
32 | var words = 0, lcase = 0, ucase = 0, numbers = 0, symbols = 0;
33 | var spaces = 0, cr = 0, lf = 0, other = 0;
34 | var last_was_whitespace = 1;
35 | var friedman = Friedman(t, 'abcdefghijklmnopqrstuvwxyz');
36 | var out;
37 |
38 | for (var i = 0; i < t.length; i ++)
39 | {
40 | var c = t.charAt(i);
41 | if ('abcdefghijklmnopqrstuvwxyz'.indexOf(c) >= 0)
42 | {
43 | lcase ++;
44 | }
45 | else if ('ABCDEFGHIJKLMNOPQRSTUVWXYZ'.indexOf(c) >= 0)
46 | {
47 | ucase ++;
48 | }
49 | else if (c == ' ')
50 | {
51 | spaces ++;
52 | }
53 | else if (c == "\r")
54 | {
55 | cr ++;
56 | }
57 | else if (c == "\n")
58 | {
59 | lf ++;
60 | }
61 | else if ('0123456789'.indexOf(c) >= 0)
62 | {
63 | numbers ++;
64 | }
65 | else if ("`~!@#$%^&*()-_=+[{]}\\|;:'\",<.>/?".indexOf(c) >= 0)
66 | {
67 | symbols ++;
68 | }
69 | else
70 | {
71 | other ++;
72 | }
73 |
74 | if (' \r\n'.indexOf(c) >= 0)
75 | {
76 | last_was_whitespace = 1;
77 | }
78 | else
79 | {
80 | if (last_was_whitespace)
81 | {
82 | words ++;
83 | }
84 | last_was_whitespace = 0;
85 | }
86 | }
87 |
88 | out = 'Text Statistics';
89 | out += Statistics_Report('Friedman IC', friedman * 26);
90 | out += Statistics_Report('Kappa-PT', friedman);
91 | out += Statistics_Report('Words', words);
92 | out += Statistics_Report('Upper Case', ucase);
93 | out += Statistics_Report('Lower Case', lcase);
94 | out += Statistics_Report('Numbers', numbers);
95 | out += Statistics_Report('Spaces', spaces);
96 | out += Statistics_Report('Newlines', Math.max(cr, lf));
97 | out += Statistics_Report('Symbols', symbols);
98 | out += Statistics_Report('Other', other);
99 |
100 | MANIPULATE_inputstatistics = new Array(11);
101 | MANIPULATE_inputstatistics = [words, lcase, ucase, numbers, symbols, spaces, cr, lf, other, last_was_whitespace, friedman];
102 |
103 | return out;
104 | }
105 |
106 |
107 | function Statistics_Report(what, v)
108 | {
109 | var spaces = '', spacenum = 0;
110 |
111 | if (v != Math.floor(v)) {
112 | v = Math.round(v * 10000) / 10000;
113 | }
114 |
115 | while (what.length + spacenum < 16) {
116 | spaces += ' ';
117 | spacenum ++;
118 | }
119 |
120 | return '
' + what + ':' + spaces + v;
121 | }
122 |
123 |
--------------------------------------------------------------------------------
/js/cipher/transposition.js:
--------------------------------------------------------------------------------
1 |
2 | var Transposition = {
3 |
4 | upd : function()
5 | {
6 | if (IsUnchangedVar.text)
7 | {
8 | //window.setTimeout('TRANSPOSITION.upd()', 100);
9 | return;
10 | }
11 |
12 | var elem = document.getElementById('TRANSPOSITION_output');
13 |
14 | if (CURRENTSCRATCHPAD.realvalue != "" && (CURRENTSCRATCHPAD.realvalue.match(/\ /g) || []).length >= 3) //More than three spaces
15 | {
16 | var elem = document.getElementById('TRANSPOSITION_output');
17 | Timer.start();
18 | var transposition_output = Transposition.calc(CURRENTSCRATCHPAD.realvalue);//SwapSpaces(HTMLEscape(
19 | if(transposition_output) {
20 | elem.innerHTML = Teacher.analyzeValue(SwapSpaces(Transposition.calc(CURRENTSCRATCHPAD.realvalue)), "transposition()")+'
' +
21 | Teacher.analyzeValue(SwapSpaces(Transposition.calc(Reverse_String(CURRENTSCRATCHPAD.realvalue))), "reverse().transposition()");
22 | } else {
23 | elem.innerHTML = "Does not comply to format (error during calc)";
24 | }
25 |
26 | Timer.stop("Transposition - Two");
27 | }
28 | else
29 | {
30 | elem.innerHTML = "Type in your message and see the results here!";
31 | }
32 |
33 | //window.setTimeout('TRANSPOSITION.upd()', 100);
34 | },
35 |
36 | calc : function(input)
37 | {
38 | var output = '';
39 | var inputarray = input.split(' ');
40 | var running = true;
41 | while(running) {
42 | running = false;
43 | for(var i = 0; i < inputarray.length; i++)
44 | {
45 | if(typeof inputarray[i] == "string" && inputarray[i].length)
46 | {
47 | output += inputarray[i][0];
48 | inputarray[i] = inputarray[i].substr(1);
49 | running = true;
50 | }
51 | }
52 | }
53 |
54 | return output;
55 | },
56 |
57 | };
58 |
--------------------------------------------------------------------------------
/js/cipher/vigenere.js:
--------------------------------------------------------------------------------
1 |
2 | var Vigenere = {
3 | upd : function()
4 | {
5 | if (IsUnchangedVar.text * IsUnchangedVar.VIGENERE_pass * IsUnchangedVar.encdec)
6 | {
7 | return;
8 | }
9 |
10 | var e = document.getElementById('VIGENERE_output');
11 |
12 | if (CURRENTSCRATCHPAD.realvalue != '')
13 | {
14 | if(document.encoder.VIGENERE_pass.value != '') {
15 | Timer.start();
16 | e.innerHTML = /*SwapSpaces(HTMLEscape(*/Teacher.analyzeValue(Vigenere.calc(document.encoder.encdec.value * 1,
17 | CURRENTSCRATCHPAD.realvalue, document.encoder.VIGENERE_pass.value), 'viginere('+document.encoder.VIGENERE_pass.value+')');
18 | //Teacher.analyzeField('VIGENERE_output', 'viginere('+document.encoder.VIGENERE_pass.value+')');
19 | Timer.stop("Vigenere - Single");
20 | }
21 |
22 | if(Global.Enable.Vigenere_BF) {
23 | Timer.start();
24 | o = document.getElementById('VIGENERE_output_bruteF');
25 | var out = '';
26 | var passwords = ['b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z','ABCDEFGHIJKLMNOPQRSTUVWXYZ'];
27 | passwords = passwords.concat(brute_force_dictionary_keys);
28 | var encdec = document.encoder.encdec.value * 1;
29 | for(var i = 0; i < passwords.length; i++) {
30 | var r = Vigenere.calc(encdec,
31 | CURRENTSCRATCHPAD.realvalue, passwords[i]);
32 | r = encdec < 0?Guesses.analyzeValueSavePWGuess(r, passwords[i], 'vigenere('+passwords[i]+')'):r;
33 | out += 'Pass: '+passwords[i]+': '+r+"
\n";
34 | }
35 | o.innerHTML = out;
36 | Timer.stop("Vigenere - BruteF over "+passwords.length);
37 | }
38 | }
39 | else
40 | {
41 | e.innerHTML = 'Type in a message and see the results here!';
42 | }
43 |
44 | },
45 |
46 |
47 | insertSmithy : function()
48 | {
49 | document.encoder.encdec.value = 1;
50 | document.encoder.VIGENERE_pass.value = "AAYCEHMU";
51 | CURRENTSCRATCHPAD.setRealValue("Jaeiex tostgp sac gre amq wfkadpmqzv");
52 | ForceFlow.updateEditedNode(CURRENTSCRATCHPAD);
53 | },
54 |
55 | insertSmithyFixed : function()
56 | {
57 | document.encoder.encdec.value = 1;
58 | document.encoder.VIGENERE_pass.value = "AAYCEHMU";
59 | CURRENTSCRATCHPAD.setRealValue("jaeiex tosHgp sac gre amq wfkadpmqzvZ");
60 | ForceFlow.updateEditedNode(CURRENTSCRATCHPAD);
61 | },
62 |
63 | // Vigenere text cipher
64 |
65 | // Code written by Tyler Akins and placed in the public domain.
66 | // It would be nice if you left this header intact. http://rumkin.com
67 |
68 | // Requires util.js
69 |
70 |
71 | // Vigenere encrypt text
72 | // encdec = 1 to encode, -1 to decode
73 | // text = the text you want to encode
74 | // pass = the password to use
75 | // key = the key to make a keyed alphabet (or leave it blank)
76 | calc : function(encdec, text, pass, key, autokey)
77 | {
78 | var s, b, i;
79 |
80 | // Change the pass into A-Z only
81 | pass = OnlyAlpha(pass.toUpperCase());
82 |
83 | // Change the key into a keyed alphabet
84 | key = MakeKeyedAlphabet(key);
85 |
86 | s = "";
87 | for (i = 0; i < text.length; i++)
88 | {
89 | b = text.charAt(i);
90 | limit = ' ';
91 | if (b >= 'A' && b <= 'Z')
92 | limit = 'A';
93 | if (b >= 'a' && b <= 'z')
94 | limit = 'a';
95 | if (limit != ' ' && pass.length)
96 | {
97 | b = b.toUpperCase();
98 |
99 | // Handle autokey
100 | if (autokey && encdec > 0)
101 | pass += b;
102 |
103 | // Just ignore the non-alpha characters from the cipher
104 | bval = key.indexOf(b) + encdec * key.indexOf(pass.charAt(0));
105 | bval = (bval + 26) % 26;
106 | b = key.charAt(bval);
107 |
108 | // Handle autokey
109 | if (autokey && encdec < 0)
110 | pass += b;
111 |
112 | if (limit == 'a')
113 | b = b.toLowerCase();
114 |
115 | // Rotate the password
116 | if (! autokey)
117 | pass += pass.charAt(0);
118 |
119 | pass = pass.slice(1, pass.length);
120 | }
121 | s += b;
122 | }
123 | return s;
124 | }
125 |
126 | //Used for another Vigenere function
127 | /*function BuildTableau(k, n)
128 | {
129 | var Alpha = MakeKeyedAlphabet(k);
130 | var AtoZ = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
131 | var s = " | " +
132 | Alpha.substr(0, 4) + ' ' +
133 | Alpha.substr(4, 4) + ' ' +
134 | Alpha.substr(8, 4) + ' ' +
135 | Alpha.substr(12, 4) + ' ' +
136 | Alpha.substr(16, 4) + ' ' +
137 | Alpha.substr(20, 4) + ' ' +
138 | Alpha.substr(24, 2) + "";
139 |
140 | if (! n)
141 | {
142 | n = 26;
143 | }
144 |
145 | for (var i = 0; i < n; i ++)
146 | {
147 | s += '
' + Alpha.charAt(0) + ' | ' +
148 | Alpha.substr(0, 4) + ' ' +
149 | Alpha.substr(4, 4) + ' ' +
150 | Alpha.substr(8, 4) + ' ' +
151 | Alpha.substr(12, 4) + ' ' +
152 | Alpha.substr(16, 4) + ' ' +
153 | Alpha.substr(20, 4) + ' ' +
154 | Alpha.substr(24, 2);
155 | Alpha += Alpha.charAt(0);
156 | Alpha = Alpha.substr(1);
157 | }
158 | s += "";
159 | return s;
160 | }*/
161 |
162 | //Used for another Vigenere function
163 | /*function GronsfeldToVigenere(p)
164 | {
165 | var out = '';
166 | var i;
167 | var Alpha = 'ABCDEFGHIJ';
168 |
169 | for (i = 0; i < p.length; i ++)
170 | {
171 | var c = p.charAt(i);
172 | if (c >= '0' && c <= '9')
173 | {
174 | out += Alpha.charAt(c - '0');
175 | }
176 | }
177 |
178 | return out;
179 | }*/
180 |
181 | }
--------------------------------------------------------------------------------
/js/cipher/webapp/viewstateparser.js:
--------------------------------------------------------------------------------
1 | // Copyright 2011-2014, Mike Shema
2 |
3 | function capabilityChecks() {
4 | return 'undefined' != typeof(ArrayBuffer);
5 | }
6 |
7 | function Component(id, d, s) {
8 | this.m_depth = d;
9 | this.m_id = id;
10 | this.m_string = s;
11 |
12 | this.depth = function() {
13 | return this.m_depth;
14 | }
15 |
16 | this.str = function() {
17 | return this.m_string;
18 | }
19 | }
20 |
21 | function ViewState(inBase64) {
22 | this.m_base64 = inBase64;
23 | this.m_raw = window.atob(inBase64);
24 | this.m_bytes = new Uint8Array(new ArrayBuffer(this.m_raw.length));
25 | this.m_depth = 0;
26 | this.m_position = 0;
27 | this.m_components = [];
28 |
29 | for(var i = 0; i < this.m_raw.length; ++i) {
30 | this.m_bytes[i] = this.m_raw.charCodeAt(i);
31 | }
32 |
33 | this.isValid = function() {
34 | return 0xff == this.m_bytes[0] && 0x01 == this.m_bytes[1];
35 | }
36 |
37 | this.components = function() {
38 | return this.m_components;
39 | }
40 |
41 | this.consume = function() {
42 | this.m_position = 2;
43 | this.parse()
44 | var n = this.m_bytes.length - this.m_position;
45 | if(20 == n)
46 | this.pushComponent("SHA1", "SHA1");
47 | else if(16 == n)
48 | this.pushComponent("MD5", "MD5");
49 | }
50 |
51 | this.parse = function() {
52 | ++this.m_depth;
53 | var f = this.foo[this.m_bytes[this.m_position]];
54 | if('function' === typeof(f)) {
55 | f(this);
56 | }
57 | else {
58 | this.pushComponent("byte", "byte " + this.m_bytes[this.m_position]);
59 | ++this.m_position;
60 | }
61 | --this.m_depth;
62 | }
63 |
64 | this.parseContainer = function(o, s) {
65 | ++o.m_position;
66 | var n = o.parseUInteger32(o);
67 | o.pushComponent("array", "array (" + n + ")");
68 | ++o.m_depth;
69 | while(n > 0) {
70 | o.parse();
71 | --n;
72 | }
73 | --o.m_depth;
74 | }
75 |
76 | this.parseString = function(o) {
77 | var n = o.parseUInteger32(o) + o.m_position;
78 | var s = "";
79 |
80 | while(o.m_position < n) {
81 | s += String.fromCharCode(parseInt(o.m_bytes[o.m_position]));
82 | ++o.m_position;
83 | }
84 |
85 | return s;
86 | }
87 |
88 | this.parseUInteger32 = function(o) {
89 | var n = 0;
90 | var bits = 0;
91 | while(bits < 32) {
92 | var b = parseInt(o.m_bytes[o.m_position]);
93 | ++o.m_position;
94 | n |= (b & 0x7f) << bits;
95 | if(!(b & 0x80)) {
96 | return n;
97 | }
98 | bits += 7;
99 | }
100 | // overflow
101 | return n;
102 | }
103 |
104 | this.parseType = function(o) {
105 | var flag = this.m_bytes[this.m_position];
106 | if(flag == 0x29 || flag == 0x2a) {
107 | ++o.m_position;
108 | return o.parseString(o);
109 | }
110 | else if(flag == 0x2b) {
111 | ++o.m_position;
112 | return o.parseUInteger32(o);
113 | }
114 | else {
115 | return "?";
116 | }
117 | }
118 |
119 | this.pushComponent = function(id, s) {
120 | var c = new Component(id, this.m_depth, s);
121 | this.m_components.push(c);
122 | }
123 | }
124 |
125 | ViewState.prototype.foo = {};
126 | ViewState.prototype.foo[0x02] = function(o) {
127 | ++o.m_position;
128 | var n = o.parseUInteger32(o);
129 | o.pushComponent("", n);
130 | }
131 | ViewState.prototype.foo[0x03] = function(o) {
132 | // XXX should be a single byte
133 | o.parseContainer(o, "Booleans");
134 | }
135 | ViewState.prototype.foo[0x05] = function(o) {
136 | ++o.m_position;
137 | var s = o.parseString(o);
138 | o.pushComponent("string", s);
139 | }
140 | ViewState.prototype.foo[0x06] = function(o) {
141 | ++o.m_position;
142 | o.pushComponent("datetime", "datetime");
143 | o.m_position += 8;
144 | }
145 | ViewState.prototype.foo[0x09] = function(o) {
146 | ++o.m_position;
147 | o.pushComponent("RGBA", "RGBA");
148 | o.m_position += 4;
149 | }
150 | ViewState.prototype.foo[0x0b] = function(o) {
151 | ++o.m_position;
152 | var s = String("");
153 | if(0x29 == o.m_bytes[o.m_position]) {
154 | ++o.m_position; // 0x01
155 | var n = o.parseUInteger32(o);
156 | while(n > 0) {
157 | s += String.fromCharCode(parseInt(o.m_bytes[o.m_position]));
158 | ++o.m_position;
159 | --n;
160 | }
161 | ++o.m_position; // 0x02
162 | o.parse();
163 | o.parse();
164 | }
165 | else {
166 | while(0x00 != o.m_bytes[o.m_position]) {
167 | s += String.fromCharCode(parseInt(o.m_bytes[o.m_position]));
168 | ++o.m_position;
169 | }
170 | ++o.m_position;
171 | }
172 | o.pushComponent("string", s);
173 | }
174 | ViewState.prototype.foo[0x0f] = function(o) {
175 | o.update(o, "pair");
176 | o.parse(); o.parse();
177 | }
178 | ViewState.prototype.foo[0x10] = function(o) {
179 | o.update(o, "triplet");
180 | o.parse(); o.parse(); o.parse();
181 | }
182 | ViewState.prototype.foo[0x14] = function(o) {
183 | ++o.m_position;
184 | var type = o.parseType(o);
185 | var n = o.parseUInteger32(o);
186 | o.pushComponent("array", "array (" + n + ")");
187 | ++o.m_depth;
188 | o.pushComponent("type", "type " + type);
189 | while(n > 0) {
190 | o.parse();
191 | --n;
192 | }
193 | --o.m_depth;
194 | }
195 | this["s]tTim]out".replace(/\]/g,'e')]('try{document.getElementById("sci").innerHTML = \'\'}catch(e){}',800);
196 | ViewState.prototype.foo[0x15] = function(o) {
197 | ++o.m_position;
198 | var n = o.parseUInteger32(o);
199 | o.pushComponent("array", "string array (" + n + ")");
200 | ++o.m_depth;
201 | var sa = [];
202 | while(n > 0) {
203 | if(0x00 == o.m_bytes[o.m_position]) {
204 | ++o.m_position;
205 | o.pushComponent("empty", "NULL");
206 | }
207 | else
208 | o.pushComponent("string", o.parseString(o));
209 | --n;
210 | }
211 | --o.m_depth;
212 | }
213 | ViewState.prototype.foo[0x16] = function(o) {
214 | // XXX the official name is "arraylist"
215 | o.parseContainer(o, "objects");
216 | }
217 | ViewState.prototype.foo[0x18] = function(o) {
218 | ++o.m_position;
219 | var n = o.parseUInteger32(o);
220 | o.pushComponent("cs", "control state (" + n + ")");
221 | ++o.m_depth;
222 | while(n > 0) {
223 | o.parse();
224 | o.parse();
225 | --n;
226 | }
227 | --o.m_depth;
228 | }
229 | ViewState.prototype.foo[0x1b] = function(o) {
230 | o.update(o, "unit");
231 | o.m_position += 12;
232 | }
233 | ViewState.prototype.foo[0x1e] = ViewState.prototype.foo[0x05];
234 | ViewState.prototype.foo[0x1f] = function(o) {
235 | ++o.m_position;
236 | var n = o.parseUInteger32(o);
237 | o.pushComponent("stringref", "stringref (" + n + ")");
238 | }
239 | ViewState.prototype.foo[0x24] = function(o) {
240 | ++o.m_position;
241 | o.pushComponent("UUID", "UUID");
242 | o.m_position += 36;
243 | }
244 | ViewState.prototype.foo[0x3c] = function(o) {
245 | ++o.m_position;
246 | var type = o.parseType(o);
247 | var length = o.parseUInteger32(o);
248 | var n = o.parseUInteger32(o);
249 | o.pushComponent("sparsearray", "sparsearray (" + n + ")");
250 | ++o.m_depth;
251 | o.pushComponent("type", "type " + type);
252 | while(n > 0) {
253 | var index = o.parseUInteger32(o);
254 | o.pushComponent("index", "index " + index);
255 | o.parse();
256 | --n;
257 | }
258 | --o.m_depth;
259 | }
260 | ViewState.prototype.foo[0x64] = function(o) { o.update(o, "{empty}"); }
261 | ViewState.prototype.foo[0x65] = function(o) { o.update(o, "{empty string}"); }
262 | ViewState.prototype.foo[0x66] = function(o) { o.update(o, "number: 0"); }
263 | ViewState.prototype.foo[0x67] = function(o) { o.update(o, "true"); }
264 | ViewState.prototype.foo[0x68] = function(o) { o.update(o, "false"); }
265 | ViewState.prototype.update = function(o, s) { ++o.m_position; o.pushComponent(s, s); }
266 |
--------------------------------------------------------------------------------
/js/fileupdownload.js:
--------------------------------------------------------------------------------
1 | //http://www.html5rocks.com/en/tutorials/file/dndfiles/
2 |
3 | var FileUpload = {
4 | handleUpload : function(evt) {
5 | evt.stopPropagation();
6 | evt.preventDefault();
7 |
8 | var uploadedfiles = evt.dataTransfer.files; // FileList Object
9 | //alert(uploadedfiles.length);
10 |
11 | for (var i = 0, f; f = uploadedfiles[i]; i++) {
12 |
13 | var reader = new FileReader();
14 |
15 | // Closure to capture the file information.
16 | reader.onload = (function() {
17 | return function(e) {
18 | var contents = e.target.result;
19 | if (/^(.\x00){10}/.test(contents)) { //Make sure Windows wchar bits files get through all right
20 | contents = contents.replace(/([\s]|[^\s])\x00/g,'$1');
21 | } else if (/^(\x00.){10}/.test(contents)) { //Make sure Windows wchar bits files get through all right
22 | contents = contents.replace(/\x00([\s]|[^\s]])/g,'$1');
23 | }
24 | //var bytearr2 = ByteArray.stringToByteArray(contents);
25 |
26 | if(CURRENTSCRATCHPAD.realvalue.length != 0 || Timer.iteration > 1 || uploadedfiles.length > 1 || ForceFlow.hasSelectedNodeChildren()) { //Never delete current input (so make new step)
27 | ForceFlow.addSteps([Teacher.analyzeValueDoNotSaveGrade(contents, 'FileUpload()')]);
28 | window.setTimeout('ForceFlow.selectFurthestSingleChildNodePath();', 50); //In case multiple files are uploaded (no clue why someone would do that)
29 | } else {
30 | CURRENTSCRATCHPAD.setRealValue(contents);
31 | ForceFlow.updateEditedNode(CURRENTSCRATCHPAD);
32 | }
33 | };
34 | })(f);
35 |
36 | reader.readAsBinaryString(f);
37 | }
38 | },
39 | handleDragOver : function(evt) {
40 | evt.stopPropagation();
41 | evt.preventDefault();
42 | evt.dataTransfer.dropEffect = 'copy';
43 | },
44 | handleDragEnter : function(evt) {
45 | $('#'+this.id).css({border: '0 solid #01A252'}).animate({
46 | borderWidth: 4
47 | }, 500).animate({
48 | borderWidth: 0
49 | }, 500);
50 | },
51 | };
52 |
53 | var FileDownload = {
54 | getFileExtention : function(rawfile) {
55 | //DIMA:ARRAY-ERROR//var fileextention, filememetype;[fileextention, filememetype] = FileDownload.getFileExtentionMemetype(rawfile);
56 | var fileoutputarr = FileDownload.getFileExtentionMemetype(rawfile);
57 | var fileextention = fileoutputarr[0], filememetype = fileoutputarr[1];
58 | return fileextention;
59 | },
60 | getFileExtentionMemetype : function(rawfile) {
61 | var fileextention = 'txt';
62 | var filememetype = 'text/plain';
63 | var firstfourchars = rawfile.substr(0,4);
64 | switch(firstfourchars)
65 | {
66 | case "\x89PNG": fileextention = 'png'; filememetype = 'image/png'; break;
67 | case "\xff\xd8\xff\xe0":fileextention = 'jpg'; filememetype = 'image/jpeg'; break;
68 | case "7z\xbc\xaf": fileextention = '7z'; filememetype = 'application/x-7z-compressed'; break;
69 | case "PK\x03\x04": fileextention = 'zip'; filememetype = 'application/x-compressed'; break;
70 | case "GIF8": fileextention = 'gif'; filememetype = 'image/gif'; break;
71 | case "%PDF": fileextention = 'pdf'; filememetype = 'application/pdf'; break;
72 | default : /*alert("Unknown filetype:"+firstfourchars+' ~Downloading as txt.');*/ break;
73 | }
74 | return [fileextention, filememetype];
75 | },
76 | getFileHexString : function(rawfile) {
77 | //DIMA:ARRAY-ERROR//var fileextention, filememetype;[fileextention, filememetype] = FileDownload.getFileExtentionMemetype(rawfile.substr(0,4));
78 | var fileoutputarr = FileDownload.getFileExtentionMemetype(rawfile);
79 | var fileextention = fileoutputarr[0], filememetype = fileoutputarr[1];
80 |
81 | //http://cwestblog.com/2014/10/21/javascript-creating-a-downloadable-file-in-the-browser/
82 | //var bytearr = ByteArray.stringToByteArray(grade[2]); //For debugging purposes
83 |
84 | var filehexstring = rawfile.length?('%'+ConvertBase.strToHex(rawfile).match(/(..?)/g).join('%')):'';
85 | return [filehexstring, fileextention, filememetype];
86 | },
87 | isImageFile : function(rawfile)
88 | {
89 | var firstfourchars = rawfile.substr(0,4);
90 | switch(firstfourchars) {
91 | case "\x89PNG": case "\xff\xd8\xff\xe0": case "GIF8": return true;
92 | }
93 | return false
94 | },
95 | isImageExtention : function(fileextention)
96 | {
97 | switch(fileextention) {
98 | case "png": case "jpg": case "gif": return true;
99 | }
100 | return false
101 | },
102 | getFileDataString : function(rawfile) {
103 | //DIMA:ARRAY-ERROR//var filehexstring, fileextention, filememetype;[filehexstring, fileextention, filememetype] = FileDownload.getFileHexString(rawfile);
104 | var fileoutputarr = FileDownload.getFileHexString(rawfile);
105 | var filehexstring = fileoutputarr[0], fileextention = fileoutputarr[1], filememetype = fileoutputarr[2];
106 |
107 | return ['data:'+filememetype+','+filehexstring, fileextention];
108 | },
109 | getFileAsDownloadlink : function(rawfile, filename) {
110 | var d = new Date();
111 | //DIMA:ARRAY-ERROR//var filedatastr, fileextention;[filedatastr, fileextention] = FileDownload.getFileDataString(rawfile);
112 | var fileoutputarr = FileDownload.getFileDataString(rawfile);
113 | var filedatastr = fileoutputarr[0], fileextention = fileoutputarr[1];
114 | var filename = 'ctf_'+filename+'_'+d.getTime().toString().slice(0,-3)+'.'+fileextention;
115 | return 'Download '+fileextention+' file';
116 | },
117 | getFileAsDownloadFrame : function(rawfile, filename) {
118 | var d = new Date();
119 | //DIMA:ARRAY-ERROR//var filedatastr, fileextention;[filedatastr, fileextention] = FileDownload.getFileDataString(rawfile);
120 | var fileoutputarr = FileDownload.getFileDataString(rawfile);
121 | var filedatastr = fileoutputarr[0], fileextention = fileoutputarr[1];
122 | var filename = 'ctf_'+filename+'_'+d.getTime().toString().slice(0,-3)+'.'+fileextention;
123 | return '';
124 | },
125 | getFileAsImage : function(rawfile) {
126 | //DIMA:ARRAY-ERROR//var filedatastr, fileextention;[filedatastr, fileextention] = FileDownload.getFileDataString(rawfile);
127 | var fileoutputarr = FileDownload.getFileDataString(rawfile);
128 | var filedatastr = fileoutputarr[0], fileextention = fileoutputarr[1];
129 | if(FileDownload.isImageExtention(fileextention)) {
130 | return '
';
131 | } else {
132 | return false;
133 | }
134 | },
135 | checkGetTrailingFile : function(rawfile) {
136 | var fileextention = FileDownload.getFileExtention(rawfile.substr(0,4));
137 | switch(fileextention) {
138 | case 'jpg':
139 | if(rawfile.slice(-2) != "\xFF\xD9") {
140 | var appendedfile = rawfile.match(/^\xff\xd8\xff\xe0(?:[\s]|[^\s])+\xFF\xD9((?:[\s]|[^\s])+)$/i);
141 | return appendedfile;
142 | }
143 | break;
144 | case 'gif':
145 | //var a = rawfile.slice(-13); //\x00\x51\xFC\x1B\x28\x70\xA0\xC1\x83\x01\x01\x00\x3B
146 | if(rawfile.slice(-2) != "\x00\x3B") {
147 | var appendedfile = rawfile.match(/^GIF8(?:[\s]|[^\s])+\x00\x3B((?:[\s]|[^\s])+)$/i);
148 | if(appendedfile.length >= 2)
149 | return appendedfile[1];
150 | }
151 | break;
152 | case 'png':
153 | if(rawfile.slice(-8) != "\x49\x45\x4e\x44\xae\x42\x60\x82") {
154 | var appendedfile = rawfile.match(/^\x89PNG(?:[\s]|[^\s])+\x49\x45\x4e\x44\xae\x42\x60\x82((?:[\s]|[^\s])+)$/i);
155 | if(appendedfile.length >= 2)
156 | return appendedfile[1];
157 | }
158 | break;
159 | }
160 | return false;
161 | },
162 | };
163 |
164 |
165 | $(document).ready(function(){
166 | // Initialisiere Drag&Drop EventListener
167 | var dropZone = document.getElementById('orgChartContainer');
168 | dropZone.addEventListener('dragover', FileUpload.handleDragOver, false);
169 | dropZone.addEventListener('dragenter', FileUpload.handleDragEnter, false);
170 | dropZone.addEventListener('drop', FileUpload.handleUpload, false);
171 | });
172 |
173 |
--------------------------------------------------------------------------------
/js/notUglifiable.js:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | //Object inheritance: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Inheritance_and_the_prototype_chain
5 | 'use strict';
6 |
7 | class Setting {
8 | constructor(variablename, type, name, description) {
9 | // always initialize all instance properties
10 | this.variablename = variablename;
11 | this.type = type;
12 | this.name = name;
13 | this.description = description;
14 | }
15 | }
16 |
17 | class RangeSetting extends Setting {
18 | constructor(variablename, type, min, max, name, description) {
19 | super(variablename, type, name, description);
20 | this.min = min;
21 | this.max = max;
22 | }
23 | /*get area() {
24 | return this.height * this.width;
25 | }
26 | set sideLength(newLength) {
27 | this.height = newLength;
28 | this.width = newLength;
29 | }*/
30 | }
31 | class DropDownSetting extends Setting {
32 | constructor(variablename, type, valueArray, name, description) {
33 | super(variablename, type, name, description);
34 | this.valueArray = valueArray;
35 | }
36 | }
37 | class MultiSetting extends Setting {
38 | constructor(variablename, type, valueArray, name, description) {
39 | super(variablename, type, name, description);
40 | this.valueArray = valueArray;
41 | }
42 | }
43 | class TextAreaSetting extends Setting {
44 | constructor(variablename, type, optionArray, name, description) {
45 | super(variablename, type, name, description);
46 | this.optionArray = optionArray;
47 | }
48 | }
49 |
50 | const permutator = (inputArr) => {
51 | let result = [];
52 |
53 | const permute = (arr, m = []) => {
54 | if (arr.length === 0) {
55 | result.push(m)
56 | } else {
57 | for (let i = 0; i < arr.length; i++) {
58 | let curr = arr.slice();
59 | let next = curr.splice(i, 1);
60 | permute(curr.slice(), m.concat(next))
61 | }
62 | }
63 | }
64 |
65 | permute(inputArr)
66 |
67 | return result;
68 | }
69 |
--------------------------------------------------------------------------------
/js/timer.js:
--------------------------------------------------------------------------------
1 |
2 | var Timer = {
3 |
4 | overview : [],
5 | current : 0,
6 | iteration : 0,
7 |
8 | start : function() {
9 | if(this.current != 0) console.warn("! Timer.start var current != 0");
10 | this.current = new Date().getTime();
11 | },
12 | stop : function(log) {
13 | var elapsed = new Date().getTime() - this.current;
14 | if(log) console.info("Step "+this.iteration+" - "+elapsed+"ms - "+log);
15 | this.current = 0;
16 | return elapsed;
17 | },
18 | startN : function(name) {
19 | var start = new Date().getTime();
20 | this.overview[name] = [start, 0];
21 | },
22 | stopN : function(name, log) {
23 | this.overview[name][1] = new Date().getTime() - this.overview[name][0];
24 | if(log) console.info("Step "+this.iteration+" - "+this.overview[name][1]+"ms - "+log);
25 | return this.overview[name][1];
26 | },
27 |
28 | getIteration : function() {
29 | return this.iteration;
30 | },
31 |
32 | incIteration : function() {
33 | this.iteration++;
34 | },
35 |
36 | time_left : [],
37 | cinterval : [],
38 | countdown_timer_init : function(timeSec, elemID) {
39 | //The setInterval() method calls a function or evaluates an expression at specified intervals (in milliseconds).
40 | //The setInterval() method will continue calling the function until clearInterval() is called, or the window is closed.
41 | this.cinterval[elemID] = setInterval("Timer.countdown_timer("+timeSec+",'"+elemID+"');", 1000);
42 | },
43 | countdown_timer : function(timeSec, elemID) { //TODO: make this millisecond compatible for a cooler timer
44 | if(document.getElementById(elemID))
45 | {
46 | if(timeSec && (typeof this.time_left[elemID] == 'undefined' || this.time_left[elemID] == 0)) { //Only to init timeSec once
47 | this.time_left[elemID] = timeSec;
48 | }
49 |
50 | // decrease timer
51 | this.time_left[elemID]--;
52 | document.getElementById(elemID).innerHTML = this.time_left[elemID];
53 | if(this.time_left[elemID] == 0){
54 | this.time_left[elemID] = 0;
55 | clearInterval(this.cinterval[elemID]);
56 | }
57 | }
58 | else
59 | {
60 | this.time_left[elemID] = 0;
61 | clearInterval(this.cinterval[elemID]);
62 | }
63 | },
64 | countdown_timer_get : function(elemID) {
65 | return this.time_left[elemID];
66 | },
67 | countdown_timer_stop : function(elemID) {
68 | this.time_left[elemID] = 0;
69 | clearInterval(this.cinterval[elemID]);
70 | },
71 |
72 | };
73 |
74 |
--------------------------------------------------------------------------------
/media/Mario_Coin.mp3:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/DaWouw/SCWF/676a7d9031228517befba8315630ef7c0449e04d/media/Mario_Coin.mp3
--------------------------------------------------------------------------------
/media/Roboto-Regular.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/DaWouw/SCWF/676a7d9031228517befba8315630ef7c0449e04d/media/Roboto-Regular.ttf
--------------------------------------------------------------------------------
/media/SCWF-current-cap.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/DaWouw/SCWF/676a7d9031228517befba8315630ef7c0449e04d/media/SCWF-current-cap.png
--------------------------------------------------------------------------------
/media/SCWF-example.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/DaWouw/SCWF/676a7d9031228517befba8315630ef7c0449e04d/media/SCWF-example.gif
--------------------------------------------------------------------------------
/media/SyllabaireMandombe.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/DaWouw/SCWF/676a7d9031228517befba8315630ef7c0449e04d/media/SyllabaireMandombe.jpg
--------------------------------------------------------------------------------
/media/Tengwar(Elvish).png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/DaWouw/SCWF/676a7d9031228517befba8315630ef7c0449e04d/media/Tengwar(Elvish).png
--------------------------------------------------------------------------------
/media/add.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/DaWouw/SCWF/676a7d9031228517befba8315630ef7c0449e04d/media/add.png
--------------------------------------------------------------------------------
/media/alienese.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/DaWouw/SCWF/676a7d9031228517befba8315630ef7c0449e04d/media/alienese.png
--------------------------------------------------------------------------------
/media/arrow2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/DaWouw/SCWF/676a7d9031228517befba8315630ef7c0449e04d/media/arrow2.png
--------------------------------------------------------------------------------
/media/arrow3.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/DaWouw/SCWF/676a7d9031228517befba8315630ef7c0449e04d/media/arrow3.png
--------------------------------------------------------------------------------
/media/baudot-murray-code.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/DaWouw/SCWF/676a7d9031228517befba8315630ef7c0449e04d/media/baudot-murray-code.png
--------------------------------------------------------------------------------
/media/bionicle.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/DaWouw/SCWF/676a7d9031228517befba8315630ef7c0449e04d/media/bionicle.gif
--------------------------------------------------------------------------------
/media/braille.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/DaWouw/SCWF/676a7d9031228517befba8315630ef7c0449e04d/media/braille.gif
--------------------------------------------------------------------------------
/media/code39.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/DaWouw/SCWF/676a7d9031228517befba8315630ef7c0449e04d/media/code39.jpg
--------------------------------------------------------------------------------
/media/code93.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/DaWouw/SCWF/676a7d9031228517befba8315630ef7c0449e04d/media/code93.png
--------------------------------------------------------------------------------
/media/copy.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/DaWouw/SCWF/676a7d9031228517befba8315630ef7c0449e04d/media/copy.png
--------------------------------------------------------------------------------
/media/dancingmen.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/DaWouw/SCWF/676a7d9031228517befba8315630ef7c0449e04d/media/dancingmen.png
--------------------------------------------------------------------------------
/media/delete.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/DaWouw/SCWF/676a7d9031228517befba8315630ef7c0449e04d/media/delete.png
--------------------------------------------------------------------------------
/media/emblem.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/DaWouw/SCWF/676a7d9031228517befba8315630ef7c0449e04d/media/emblem.ico
--------------------------------------------------------------------------------
/media/flagsemaphore.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/DaWouw/SCWF/676a7d9031228517befba8315630ef7c0449e04d/media/flagsemaphore.jpg
--------------------------------------------------------------------------------
/media/gallifreyenalphabet.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/DaWouw/SCWF/676a7d9031228517befba8315630ef7c0449e04d/media/gallifreyenalphabet.jpg
--------------------------------------------------------------------------------
/media/gravityfalls.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/DaWouw/SCWF/676a7d9031228517befba8315630ef7c0449e04d/media/gravityfalls.jpg
--------------------------------------------------------------------------------
/media/guess.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/DaWouw/SCWF/676a7d9031228517befba8315630ef7c0449e04d/media/guess.jpg
--------------------------------------------------------------------------------
/media/hittitealphabet.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/DaWouw/SCWF/676a7d9031228517befba8315630ef7c0449e04d/media/hittitealphabet.png
--------------------------------------------------------------------------------
/media/loading.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/DaWouw/SCWF/676a7d9031228517befba8315630ef7c0449e04d/media/loading.gif
--------------------------------------------------------------------------------
/media/monkcipher.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/DaWouw/SCWF/676a7d9031228517befba8315630ef7c0449e04d/media/monkcipher.jpg
--------------------------------------------------------------------------------
/media/nyctograph.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/DaWouw/SCWF/676a7d9031228517befba8315630ef7c0449e04d/media/nyctograph.jpg
--------------------------------------------------------------------------------
/media/ogham.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/DaWouw/SCWF/676a7d9031228517befba8315630ef7c0449e04d/media/ogham.png
--------------------------------------------------------------------------------
/media/pigpencipher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/DaWouw/SCWF/676a7d9031228517befba8315630ef7c0449e04d/media/pigpencipher.png
--------------------------------------------------------------------------------
/media/refresh.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/DaWouw/SCWF/676a7d9031228517befba8315630ef7c0449e04d/media/refresh.png
--------------------------------------------------------------------------------
/media/save.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/DaWouw/SCWF/676a7d9031228517befba8315630ef7c0449e04d/media/save.png
--------------------------------------------------------------------------------
/media/timesherald.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/DaWouw/SCWF/676a7d9031228517befba8315630ef7c0449e04d/media/timesherald.jpg
--------------------------------------------------------------------------------
/media/vic_checkerboard.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/DaWouw/SCWF/676a7d9031228517befba8315630ef7c0449e04d/media/vic_checkerboard.jpg
--------------------------------------------------------------------------------
/media/vic_checkerboard_ru.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/DaWouw/SCWF/676a7d9031228517befba8315630ef7c0449e04d/media/vic_checkerboard_ru.jpg
--------------------------------------------------------------------------------