//Text Combination/Permutation Generators (Javascript) is Copyright 2010 TextMechanic.com All Rights Reserved

function clrgen1(){
document.perm.input1.value = '';
document.perm.input2.value = '';
document.perm.input3.value = '';
document.perm.input4.value = '';
document.perm.output.value = '';
document.perm.prefix.value = '';
document.perm.suffix.value = '';
document.perm.divider1.value = '';
document.perm.divider2.value = '';
document.perm.divider3.value = '';
if (document.perm.inc_4.checked == true) document.getElementById('upcount').innerHTML = 'Combination Results = Prefix + Input1 + Divider1 + Input2 + Divider2 + Input3 + Divider3 + Input4 + Suffix&nbsp;&nbsp;&nbsp;&nbsp;<b>NOTE:</b> Empty fields produce no output.&nbsp;';
if (document.perm.inc_3.checked == true) document.getElementById('upcount').innerHTML = 'Combination Results = Prefix + Input1 + Divider1 + Input2 + Divider2 + Input3 + Suffix&nbsp;&nbsp;&nbsp;&nbsp;<b>NOTE:</b> Empty fields produce no output.&nbsp;';
if (document.perm.inc_2.checked == true) document.getElementById('upcount').innerHTML = 'Combination Results = Prefix + Input1 + Divider1 + Input2 + Suffix&nbsp;&nbsp;&nbsp;&nbsp;<b>NOTE:</b> Empty fields produce no output.&nbsp;';}

function lnecnt1(){
var text = document.perm.input1.value;
text = text.replace(/\r/g,'');
text = text.split('\n');
lincnt = text.length;
if (document.perm.inc_4.checked == true){
if (lincnt > 10) alert('Limit of 10 lines per input field.');
if (lincnt > 10) document.perm.input1.value = text.slice(0,10).join('\n');}
if (document.perm.inc_3.checked == true){
if (lincnt > 20) alert('Limit of 20 lines per input field.');
if (lincnt > 20) document.perm.input1.value = text.slice(0,20).join('\n');}
if (document.perm.inc_2.checked == true){
if (lincnt > 50) alert('Limit of 50 lines per input field.');
if (lincnt > 50) document.perm.input1.value = text.slice(0,50).join('\n');}
if (text[0].length != 0) document.perm.line_count1.value = lincnt; else document.perm.line_count1.value = '0'}
function charcnt1(){
var text = document.perm.input1.value;
var lincnt = text;
var textout = new Array();
lincnt = lincnt.replace(/\r/g,'');
lincnt = lincnt.replace(/\n/g,'');
lincnt = lincnt.split('');
lincnt = lincnt.length;
if (lincnt > 500) alert('Limit of 500 characters per input field.');
if (lincnt > 500){
text = text.replace(/\r/g,'');
text = text.split('');
for (x = 0; x < 500; x++){
textout[x] = text[x];}
textout = textout.join('');
document.perm.input1.value = textout;}
document.perm.char_count1.value = lincnt;}

function lnecnt2(){
var text = document.perm.input2.value;
text = text.replace(/\r/g,'');
text = text.split('\n');
lincnt = text.length;
if (document.perm.inc_4.checked == true){
if (lincnt > 10) alert('Limit of 10 lines per input field.');
if (lincnt > 10) document.perm.input2.value = text.slice(0,10).join('\n');}
if (document.perm.inc_3.checked == true){
if (lincnt > 20) alert('Limit of 20 lines per input field.');
if (lincnt > 20) document.perm.input2.value = text.slice(0,20).join('\n');}
if (document.perm.inc_2.checked == true){
if (lincnt > 50) alert('Limit of 50 lines per input field.');
if (lincnt > 50) document.perm.input2.value = text.slice(0,50).join('\n');}
if (text[0].length != 0) document.perm.line_count2.value = lincnt; else document.perm.line_count2.value = '0'}

function charcnt2(){
var text = document.perm.input2.value;
var lincnt = text;
var textout = new Array();
lincnt = lincnt.replace(/\r/g,'');
lincnt = lincnt.replace(/\n/g,'');
lincnt = lincnt.split('');
lincnt = lincnt.length;
if (lincnt > 500) alert('Limit of 500 characters per input field.');
if (lincnt > 500){
text = text.replace(/\r/g,'');
text = text.split('');
for (x = 0; x < 500; x++){
textout[x] = text[x];}
textout = textout.join('');
document.perm.input2.value = textout;}
document.perm.char_count2.value = lincnt;}

function lnecnt3(){
var text = document.perm.input3.value;
text = text.replace(/\r/g,'');
text = text.split('\n');
lincnt = text.length;
if (document.perm.inc_4.checked == true){
if (lincnt > 10) alert('Limit of 10 lines per input field.');
if (lincnt > 10) document.perm.input3.value = text.slice(0,10).join('\n');}
if (document.perm.inc_3.checked == true){
if (lincnt > 20) alert('Limit of 20 lines per input field.');
if (lincnt > 20) document.perm.input3.value = text.slice(0,20).join('\n');}
if (document.perm.inc_2.checked == true){
if (lincnt > 50) alert('Limit of 50 lines per input field.');
if (lincnt > 50) document.perm.input3.value = text.slice(0,50).join('\n');}
if (text[0].length != 0) document.perm.line_count3.value = lincnt; else document.perm.line_count3.value = '0'}

function charcnt3(){
var text = document.perm.input3.value;
var lincnt = text;
var textout = new Array();
lincnt = lincnt.replace(/\r/g,'');
lincnt = lincnt.replace(/\n/g,'');
lincnt = lincnt.split('');
lincnt = lincnt.length;
if (lincnt > 500) alert('Limit of 500 characters per input field.');
if (lincnt > 500){
text = text.replace(/\r/g,'');
text = text.split('');
for (x = 0; x < 500; x++){
textout[x] = text[x];}
textout = textout.join('');
document.perm.input3.value = textout;}
document.perm.char_count3.value = lincnt;}

function lnecnt4(){
var text = document.perm.input4.value;
text = text.replace(/\r/g,'');
text = text.split('\n');
lincnt = text.length;
if (document.perm.inc_4.checked == true){
if (lincnt > 10) alert('Limit of 10 lines per input field.');
if (lincnt > 10) document.perm.input4.value = text.slice(0,10).join('\n');}
if (document.perm.inc_3.checked == true){
if (lincnt > 25) alert('Limit of 25 lines per input field.');
if (lincnt > 25) document.perm.input4.value = text.slice(0,25).join('\n');}
if (document.perm.inc_2.checked == true){
if (lincnt > 50) alert('Limit of 50 lines per input field.');
if (lincnt > 50) document.perm.input4.value = text.slice(0,50).join('\n');}
if (text[0].length != 0) document.perm.line_count4.value = lincnt; else document.perm.line_count4.value = '0'}

function charcnt4(){
var text = document.perm.input4.value;
var lincnt = text;
var textout = new Array();
lincnt = lincnt.replace(/\r/g,'');
lincnt = lincnt.replace(/\n/g,'');
lincnt = lincnt.split('');
lincnt = lincnt.length;
if (lincnt > 500) alert('Limit of 500 characters per input field.');
if (lincnt > 500){
text = text.replace(/\r/g,'');
text = text.split('');
for (x = 0; x < 500; x++){
textout[x] = text[x];}
textout = textout.join('');
document.perm.input4.value = textout;}
document.perm.char_count4.value = lincnt;}

function inboxes4(){
document.perm.inc_3.checked = false;
document.perm.inc_2.checked = false;
document.getElementById('di_2').style.display = 'block';
document.getElementById('di_3').style.display = 'block';
document.getElementById('in_3').style.display = 'block';
document.getElementById('in_4').style.display = 'block';
document.getElementById('linlim').innerHTML = '10';
document.getElementById('upcount').innerHTML = 'Combination Results = Prefix + Input1 + Divider1 + Input2 + Divider2 + Input3 + Divider3 + Input4 + Suffix&nbsp;&nbsp;&nbsp;&nbsp;<b>NOTE:</b> Empty fields produce no output.&nbsp;';}

function inboxes3(){
document.perm.inc_4.checked = false;
document.perm.inc_2.checked = false;
document.getElementById('di_2').style.display = 'block';
document.getElementById('di_3').style.display = 'none';
document.getElementById('in_3').style.display = 'block';
document.getElementById('in_4').style.display = 'none';
document.getElementById('linlim').innerHTML = '20';
document.getElementById('upcount').innerHTML = 'Combination Results = Prefix + Input1 + Divider1 + Input2 + Divider2 + Input3 + Suffix&nbsp;&nbsp;&nbsp;&nbsp;<b>NOTE:</b> Empty fields produce no output.&nbsp;';}

function inboxes2(){
document.perm.inc_4.checked = false;
document.perm.inc_3.checked = false;
document.getElementById('di_2').style.display = 'none';
document.getElementById('di_3').style.display = 'none';
document.getElementById('in_3').style.display = 'none';
document.getElementById('in_4').style.display = 'none';
document.getElementById('linlim').innerHTML = '50';
document.getElementById('upcount').innerHTML = 'Combination Results = Prefix + Input1 + Divider1 + Input2 + Suffix&nbsp;&nbsp;&nbsp;&nbsp;<b>NOTE:</b> Empty fields produce no output.&nbsp;';}

function unvperm(){
var permin1 = document.perm.input1.value.replace(/\r/g,'').replace(/^\s*|\s*$/g,'').split('\n');
var permin2 = document.perm.input2.value.replace(/\r/g,'').replace(/^\s*|\s*$/g,'').split('\n');
var permin3 = document.perm.input3.value.replace(/\r/g,'').replace(/^\s*|\s*$/g,'').split('\n');
var permin4 = document.perm.input4.value.replace(/\r/g,'').replace(/^\s*|\s*$/g,'').split('\n');
var prefix = document.perm.prefix.value;
var divider1 = document.perm.divider1.value;
var divider2 = document.perm.divider2.value;
var divider3 = document.perm.divider3.value;
var suffix = document.perm.suffix.value;
var perm1len = permin1.length;
var perm2len = permin2.length;
var perm3len = permin3.length;
var perm4len = permin4.length;
var out = new Array();
var subout1 = new Array();
var subout2 = new Array();
var subout3 = new Array();
var subout4 = new Array();
for (v=0; v<perm1len; v++){
var perm1 = permin1[v];
for (w=0; w<perm2len; w++){
var perm2 = permin2[w];
for (x=0; x<perm3len; x++){
var perm3 = permin3[x];
for (y=0; y<perm4len; y++){
var perm4 = permin4[y];
subout4[y] = prefix + perm1 + divider1 + perm2 + divider2 + perm3 + divider3 + perm4 +suffix;}
subout3[x] = subout4.join('\n');}
subout2[w] = subout3.join('\n');}
subout1[v] = subout2.join('\n');}
var lcount = perm1len*perm2len*perm3len*perm4len;
document.getElementById('upcount').innerHTML = lcount + ' combinations.';
var out = subout1.join('\n');
document.perm.output.value = out;}

function clrgen3(){
document.lperm.l_letters.value ='';
document.lperm.l_output.value ='';
document.lperm.l_prefix.value = '';
document.lperm.l_suffix.value ='';
document.getElementById('letgencnt').innerHTML = 'Combinations will display below.'}

function lperms(){
var lets = document.lperm.l_letters.value;
var sholest = lets;
lets = lets.replace(/ /g,'').split('');
var pre = document.lperm.l_prefix.value;
var suf = document.lperm.l_suffix.value;
var arr1 = lets;
var arr2 = lets;
var arr3 = lets;
var arr4 = lets;
var arr5 = lets;
var arr6 = lets;
var arr1len = lets.length;
var arr2len = lets.length;
var arr3len = lets.length;
var arr4len = lets.length;
var arr5len = lets.length;
var arr6len = lets.length;
var subout1 = new Array();
var subout2 = new Array();
var subout3 = new Array();
var subout4 = new Array();
var subout5 = new Array();
var subout6 = new Array();
if (document.lperm.l_6.checked == true){
for (u=0; u<arr1len; u++){
var lets1 = arr1[u];
for (v=0; v<arr2len; v++){
var lets2 = arr2[v];
for (w=0; w<arr3len; w++){
var lets3 = arr3[w];
for (x=0; x<arr4len; x++){
var lets4 = arr4[x];
for (y=0; y<arr5len; y++){
var lets5 = arr5[y];
for (z=0; z<arr6len; z++){
var lets6 = arr6[z];
subout6[z] = lets1 + lets2 + lets3 + lets4 + lets5 + lets6;}
subout5[y] = subout6.join('\n');}
subout4[x] = subout5.join('\n');}
subout3[w] = subout4.join('\n');}
subout2[v] = subout3.join('\n');}
subout1[u] = subout2.join('\n');}}
if (document.lperm.l_6.checked == true){
for (u=0; u<arr1len; u++){
var lets1 = arr1[u];
for (v=0; v<arr2len; v++){
var lets2 = arr2[v];
for (w=0; w<arr3len; w++){
var lets3 = arr3[w];
for (x=0; x<arr4len; x++){
var lets4 = arr4[x];
for (y=0; y<arr5len; y++){
var lets5 = arr5[y];
for (z=0; z<arr6len; z++){
var lets6 = arr6[z];
subout6[z] = pre + lets1 + lets2 + lets3 + lets4 + lets5 + lets6 + suf;}
subout5[y] = subout6.join('\n');}
subout4[x] = subout5.join('\n');}
subout3[w] = subout4.join('\n');}
subout2[v] = subout3.join('\n');}
subout1[u] = subout2.join('\n');}}
if (document.lperm.l_5.checked == true){
for (u=0; u<arr1len; u++){
var lets1 = arr1[u];
for (v=0; v<arr2len; v++){
var lets2 = arr2[v];
for (w=0; w<arr3len; w++){
var lets3 = arr3[w];
for (x=0; x<arr4len; x++){
var lets4 = arr4[x];
for (y=0; y<arr5len; y++){
var lets5 = arr5[y];
subout5[y] = pre + lets1 + lets2 + lets3 + lets4 + lets5 + suf;}
subout4[x] = subout5.join('\n');}
subout3[w] = subout4.join('\n');}
subout2[v] = subout3.join('\n');}
subout1[u] = subout2.join('\n');}}
if (document.lperm.l_4.checked == true){
for (u=0; u<arr1len; u++){
var lets1 = arr1[u];
for (v=0; v<arr2len; v++){
var lets2 = arr2[v];
for (w=0; w<arr3len; w++){
var lets3 = arr3[w];
for (x=0; x<arr4len; x++){
var lets4 = arr4[x];
subout4[x] = pre + lets1 + lets2 + lets3 + lets4 + suf;}
subout3[w] = subout4.join('\n');}
subout2[v] = subout3.join('\n');}
subout1[u] = subout2.join('\n');}}
if (document.lperm.l_3.checked == true){
for (u=0; u<arr1len; u++){
var lets1 = arr1[u];
for (v=0; v<arr2len; v++){
var lets2 = arr2[v];
for (w=0; w<arr3len; w++){
var lets3 = arr3[w];
subout3[w] = pre + lets1 + lets2 + lets3 + suf;}
subout2[v] = subout3.join('\n');}
subout1[u] = subout2.join('\n');}}
if (document.lperm.l_2.checked == true){
for (u=0; u<arr1len; u++){
var lets1 = arr1[u];
for (v=0; v<arr2len; v++){
var lets2 = arr2[v];
subout2[v] = pre + lets1 + lets2 + suf;}
subout1[u] = subout2.join('\n');}}
if (document.lperm.l_2.checked == true) {arr3len = 1; arr4len = 1; arr5len = 1; arr6len = 1;}
if (document.lperm.l_3.checked == true) {arr4len = 1; arr5len = 1; arr6len = 1;}
if (document.lperm.l_4.checked == true) {arr5len = 1; arr6len = 1;}
if (document.lperm.l_5.checked == true) arr6len = 1;
var lcount = arr1len*arr2len*arr3len*arr4len*arr5len*arr6len;
document.getElementById('letgencnt').innerHTML = '' + lcount + ' combinations generated for letters/characters <b>' + sholest + '</b>';
var out = subout1.join('\n');
document.lperm.l_output.value = out;}

function clrgen2(){
document.kperm.k_input.value = '';
document.kperm.k_output.value = '';
document.kperm.k_prefix.value = '';
document.kperm.k_suffix.value = '';
document.kperm.k_divider.value = ' ';
document.getElementById('kcount').innerHTML = 'Combinations will display in the field below.';}

function lnecnt(){
var text = document.kperm.k_input.value;
text = text.replace(/\r/g,'');
text = text.split('\n');
lincnt = text.length;
if (lincnt > 10) alert('Limit of 10 lines into input field.');
if (lincnt > 10) document.kperm.k_input.value = text[0] + '\n' + text[1] + '\n' + text[2] + '\n' + text[3] + '\n' + text[4] + '\n' + text[5] + '\n' + text[6] + '\n' + text[7] + '\n' + text[8] + '\n' + text[9];
if (text[0].length != 0) document.kperm.k_line_count.value = lincnt; else document.kperm.k_line_count.value = '0'}
function charcnt(){
var text = document.kperm.k_input.value;
var lincnt = text;
var textout = new Array();
lincnt = lincnt.replace(/\r/g,'');
lincnt = lincnt.replace(/\n/g,'');
lincnt = lincnt.split('');
lincnt = lincnt.length;
if (lincnt > 500) alert('Limit of 500 characters into input field.');
if (lincnt > 500){
text = text.replace(/\r/g,'');
text = text.split('');
for (x = 0; x < 500; x++){
textout[x] = text[x];}
textout = textout.join('');
document.kperm.k_input.value = textout;}
document.kperm.k_char_count.value = lincnt;}

Array.prototype.unique = function (){
var r = new Array();
o:for(var i = 0, n = this.length; i < n; i++){
for(var x = 0, y = r.length; x < y; x++){
if(r[x]==this[i]){continue o;}}
r[r.length] = this[i];}
return r;}

function kperms(){
var wrds = document.kperm.k_input.value.replace(/\r/g,'').replace(/^\s*|\s*$/g,'').split('\n');
var pre = document.kperm.k_prefix.value;
var suf = document.kperm.k_suffix.value;
var div = document.kperm.k_divider.value;
var arr1 = wrds;
var arr2 = wrds;
var arr3 = wrds;
var arr4 = wrds;
var arrlen = wrds.length;
var subout1 = new Array();
var subout2 = new Array();
var subout3 = new Array();
var subout4 = new Array();
for (u=0; u<arrlen; u++){
var wrd1 = arr1[u];
for (v=0; v<arrlen; v++){
var wrd2 = arr2[v];
for (w=0; w<arrlen; w++){
var wrd3 = arr3[w];
for (x=0; x<arrlen; x++){
var wrd4 = arr4[x];
var makeuq = [wrd1,wrd2,wrd3,wrd4];
subout4[x] = pre + makeuq.unique().join(div) + suf;}
subout3[w] = subout4.join('\n');}
subout2[v] = subout3.join('\n');}
subout1[u] = subout2.join('\n');}
var out = subout1.join('\n');
function cisort(a,b){
var x = a.toString().toLowerCase(), y = b.toString().toLowerCase(),
nC = String.fromCharCode(0),
xN = x.replace(/([-]{0,1}[0-9.]{1,})/g, nC + '$1' + nC).split(nC),
yN = y.replace(/([-]{0,1}[0-9.]{1,})/g, nC + '$1' + nC).split(nC);
for (var cLoc=0, numS = Math.max( xN.length, yN.length); cLoc < numS; cLoc++){
if ((parseFloat(xN[cLoc]) || xN[cLoc]) < (parseFloat(yN[cLoc]) || yN[cLoc]))
return -1;
else if ((parseFloat(xN[cLoc]) || xN[cLoc]) > (parseFloat( yN[cLoc]) || yN[cLoc]))
return 1;}return 0;}
out = out.split('\n').unique().sort(cisort);
var lcount = out.length - arrlen;
document.getElementById('kcount').innerHTML = '' + lcount + ' combinations.';
document.kperm.k_output.value = out.join('\n');}

function clrwp(){
document.word_perm.perm_letters.value = '';
document.word_perm.perm_text_1.value = '';
document.word_perm.perm_text_2.value = '';
document.word_perm.perm_text_3.value = '';
document.word_perm.perm_text_4.value = '';
document.word_perm.perm_text_5.value = '';
document.word_perm.perm_text_6.value = '';
document.word_perm.perm_text_7.value = '';
document.word_perm.perm_prefix.value = '';
document.word_perm.perm_suffix.value = '';
document.word_perm.sep_elms.value = '';
document.word_perm.sep_perms.value = '';
document.word_perm.wpout.value = '';
document.getElementById('wpcount').innerHTML = 'Permutations will display in the field below.';}

Array.prototype.map = function(fn){
var r = [];
var l = this.length;
for(i=0;i<l;i++){
r.push(fn(this[i]));}
return r;};

function wrdperm(){
//+ Jonas Raoni Soares Silva @ http://jsfromhell.com/array/permute
var permute = function(v, m){
for(var p = -1, j, k, f, r, l = v.length, q = 1, i = l + 1; --i; q *= i);
for(x = [new Array(l), new Array(l), new Array(l), new Array(l)], j = q, k = l + 1, i = -1; ++i < l; x[2][i] = i, x[1][i] = x[0][i] = j /= --k);
for(r = new Array(q); ++p < q;)
for(r[p] = new Array(l), i = -1; ++i < l; !--x[1][i] && (x[1][i] = x[0][i], x[2][i] = (x[2][i] + 1) % l), r[p][i] = m ? x[3][i] : v[x[3][i]])
for(x[3][i] = x[2][i], f = 0; !f; f = !f)
for(j = i; j; x[3][--j] == x[2][i] && (x[3][i] = x[2][i] = (x[2][i] + 1) % l, f = 1));
return r;};
//end
var txt;
if (document.word_perm.perm_text_1.value.split('').length != 0){
document.word_perm.perm_letters.value = '';
var input1 = document.word_perm.perm_text_1.value;
var input2 = document.word_perm.perm_text_2.value;
var input3 = document.word_perm.perm_text_3.value;
var input4 = document.word_perm.perm_text_4.value;
var input5 = document.word_perm.perm_text_5.value;
var input6 = document.word_perm.perm_text_6.value;
var input7 = document.word_perm.perm_text_7.value;
if (input2.length!=0) txt = [input1,input2];
if (input3.length!=0) txt = [input1,input2,input3];
if (input4.length!=0) txt = [input1,input2,input3,input4];
if (input5.length!=0) txt = [input1,input2,input3,input4,input5];
if (input6.length!=0) txt = [input1,input2,input3,input4,input5,input6];
if (input7.length!=0) txt = [input1,input2,input3,input4,input5,input6,input7];}else{
var input = document.word_perm.perm_letters.value;
txt = input.split('')}
if (document.word_perm.sep_perms.value.length != 0) var seprm = document.word_perm.sep_perms.value; else seprm = '\n';
var seele = document.word_perm.sep_elms.value;
var pre = document.word_perm.perm_prefix.value;
var suf = document.word_perm.perm_suffix.value;
var out = permute(txt).map(function(elem) {return pre + elem.join(seele) + suf});
var wpcnt = out.length;
document.getElementById('wpcount').innerHTML = '' + wpcnt + ' permutations generated.';
document.word_perm.wpout.value = out.join(seprm);}

function SelectAll(id) {
document.getElementById(id).focus();
document.getElementById(id).select();}