var clip = null;

var numberNames = [
	  "zero",
	  "one",
	  "two",
	  "three",
	  "four",
	  "five",
	  "six",
	  "seven",
	  "eight",
	  "nine"
  ];
  
var policeLetters = [
		  "Alpha",
		  "Bravo",
		  "Charlie",
		  "Delta",
		  "Echo",
		  "Foxtrot",
		  "Gold",
		  "Hotel",
		  "India",
		  "Juliet",
		  "Kilo",
		  "Lima",
		  "Mike",
		  "November",
		  "Oscar",
		  "Papa",
		  "Quebec",
		  "Romeo",
		  "Sierra",
		  "Tango",
		  "Uniform",
		  "Victor",
		  "Whisky",
		  "X-ray",
		  "Yankee",
		  "Zulu"
		  ];

function getSymbolName(targetSymbol) {
	  if (targetSymbol == '!') {
		  return "exclamation";
	  } else if (targetSymbol == '"') {
		  return "quote";
	  } else if (targetSymbol == '?') {
		  return "question";
	  } else if (targetSymbol == '$') {
		  return "dollar";
	  } else if (targetSymbol == '%') {
		  return "percent";
	  } else if (targetSymbol == '^') {
		  return "circumflex";
	  } else if (targetSymbol == '&') {
		  return "ampersand";
	  } else if (targetSymbol == '*') {
		  return "asterisk";
	  } else if (targetSymbol == '(') {
		  return "left parenthesis";
	  } else if (targetSymbol == ')') {
		  return "right parenthesis";
	  } else if (targetSymbol == '_') {
		  return "underscore";
	  } else if (targetSymbol == '-') {
		  return "dash";
	  } else if (targetSymbol == '+') {
		  return "plus";
	  } else if (targetSymbol == '=') {
		  return "equal";
	  } else if (targetSymbol == '{') {
		  return "left curly bracket";
	  } else if (targetSymbol == '}') {
		  return "right curly bracket";
	  } else if (targetSymbol == '[') {
		  return "left square bracket";
	  } else if (targetSymbol == ']') {
		  return "right square bracket";
	  } else if (targetSymbol == ':') {
		  return "colon";
	  } else if (targetSymbol == ';') {
		  return "semicolon";
	  } else if (targetSymbol == '@') {
		  return "at";
	  } else if (targetSymbol == '\'') {
		  return "apostrophe";
	  } else if (targetSymbol == '~') {
		  return "tilde";
	  } else if (targetSymbol == '#') {
		  return "hash";
	  } else if (targetSymbol == '|') {
		  return "vertical bar";
	  } else if (targetSymbol == '<') {
		  return "less-than";
	  } else if (targetSymbol == '>') {
		  return "greater-than";
	  } else if (targetSymbol == ',') {
		  return "comma";
	  } else if (targetSymbol == '.') {
		  return "dot";
	  } else if (targetSymbol == '/') {
		  return "slash";
	  } 
	  return "?";
}

function refreshPassword(saveConfiguration) {
	var minChars = 8;
	var maxChars = 14;
	var includeLetters = document.getElementById("includeLetters").checked;
	var includeUppercase = document.getElementById("includeUppercase").checked;
	var includeNumbers = document.getElementById("includeNumbers").checked;
	var includeSymbols = document.getElementById("includeSymbols").checked;
	var excludeSimilar = document.getElementById("excludeSimilar").checked;
	
	try {
		minChars = parseInt(document.getElementById("minChars").value);
	} catch (e) {
	}
	
	try {
		maxChars = parseInt(document.getElementById("maxChars").value);
	} catch (e) {
	}
	
	if (saveConfiguration) {
		var confString = "" + minChars + "-" + maxChars + "-" + (includeLetters ? "1" : "") + "-" + (includeUppercase ? "1" : "") + "-" + (includeNumbers ? "1" : "") + "-" + (includeSymbols ? "1" : "") + "-" + (excludeSimilar ? "1" : "");
		jaaulde.utils.cookies.set('conf', confString, {path: '/', expiresAt: new Date( 2020, 1, 1 )});
	}
	
	// Create password
	var resultPassword = "";
	var resultSpelling = "";
	  
	try {
		var palette = "";
		if (minChars < 1)
			minChars = 1;
		if (maxChars > 100)
			maxChars = 100;
		
		var numberChars;
		if (minChars > maxChars) {
			var i = maxChars;
			maxChars = minChars;
			minChars = i;
		}
		if (minChars == maxChars) {
			numberChars = minChars;
		} else {
			numberChars = Math.floor(Math.random()*(maxChars - minChars)) + minChars;
		}
		  
		if (includeLetters) {
			palette += "abcdefghjkmnpqrtuvvwxyz";
			if (!excludeSimilar) {
				palette += "ilos";
			}
		}
		if (includeUppercase) {
			palette += "ACDEFGHJKLNNPQRTUVWYXZ";
			if (!excludeSimilar) {
				palette += "BIOS";
			}
		}
		if (includeNumbers) {
			palette += "234679";
			if (!excludeSimilar) {
				palette += "0815";
			}
		}
		if (includeSymbols) {
			palette += "!\"?$%^&*()_-+={[}]:;@'~#|<,>./";
		}
		var paletteLength = palette.length;
		for (var c=0;c<numberChars;c++) {
			if (c > 0) {
				resultSpelling += " - ";
			}
			var pos = Math.floor(Math.random()*paletteLength);
			var currentChar = palette.charCodeAt(pos);
			var currentCharString = palette.charAt(pos);
			if ((currentChar >= 97) && (currentChar <= 122)) {
				resultSpelling += policeLetters[currentChar - 97];
			} else if ((currentChar >= 65) && (currentChar <= 90)) {
				resultSpelling += policeLetters[currentChar - 65].toUpperCase();
			} else if ((currentChar >= 48) && (currentChar <= 57)) {
				resultSpelling += numberNames[currentChar - 48];
			} else {
				resultSpelling += getSymbolName(currentCharString);
			}
	
			resultPassword += currentCharString;
		}
	} catch (e) {
	}
	lastPassword = resultPassword;
	document.getElementById("generatedPassword").innerHTML = htmlize(resultPassword);
	document.getElementById("generatedSpelling").innerHTML = resultSpelling;
}

function htmlize(input) {
	return input.replace('&', '&amp;').replace('<', '&lt;').replace('>', '&gt;');
}

function init() {
	document.getElementById("jsPasswordBox").style.visibility = "visible";
	document.getElementById("jsPasswordRefresh").style.visibility = "visible";
	
	ZeroClipboard.setMoviePath( '/res/ZeroClipboard.swf' );
	clip = new ZeroClipboard.Client();
	clip.setHandCursor( true );
	
	clip.addEventListener('mouseOver', function (client) {
		// update the text on mouse over
		clip.setText( lastPassword );
	});
	clip.addEventListener('mouseDown', function (client) {
		// update the text on mouse over
		clip.setText( lastPassword );
	});
	
	clip.glue( 'd_clip_button', 'd_clip_container' );
}
window.onload = init;
