// waits for DOM to init and then proceeds
window.addEvent('domready', function() {

function keyHandler() {
	var clickEvents = function(event) { 
		
		var sourceClassName = '';

		// deals with how IE and others handle event targets
		if($(event.srcElement)) { 
			sourceClassName = $(event.srcElement).className;
			sourceClass = $(event.srcElement);
		} else {
			sourceClassName = $(event.target).className;
			sourceClass = $(event.target);
		}
		
		// click events
		if(sourceClassName == 'repository') {
			turnOnKeys();
		}

		if(sourceClassName != 'repository') {
			// Remove Events
			turnOffKeys();
		}	
	}

	turnOnKeys();
}

// turn keys on
function turnOnKeys() {
	// Remove Events
		turnOffKeys();

		// key listener
		$$('html').addEvent('keydown', function(e) {
			//e = new Event(e);
			
			var code = "";
		
			
			function cmd(e) {
				if( e.code == 224 ) {
					return true;
				} else {
					return false;	
				}
			}
			
			if(e.shift) {
				switch(e.code)
				{
					case 9: code = 'tab'; break;
					case 48: code = ')'; break;
					case 49: code = '!'; break;
					case 50: code = '@'; break;
					case 51: code = '#'; break;
					case 52: code = '$'; break;
					case 53: code = '%'; break;
					case 54: code = '^'; break;
					case 55: code = '&'; break;
					case 56: code = '*'; break;
					case 57: code = '('; break;
					case 59: code = ':'; break;
					case 61: code = '+'; break;
					case 65: code = 'A'; break;
					case 66: code = 'B'; break;
					case 67: code = 'C'; break;
					case 68: code = 'D'; break;
					case 69: code = 'E'; break;
					case 70: code = 'F'; break;
					case 71: code = 'G'; break;
					case 72: code = 'H'; break;
					case 73: code = 'I'; break;
					case 74: code = 'J'; break;
					case 75: code = 'K'; break;
					case 76: code = 'L'; break;
					case 77: code = 'M'; break;
					case 78: code = 'N'; break;
					case 79: code = 'O'; break;
					case 80: code = 'P'; break;
					case 81: code = 'Q'; break;
					case 82: code = 'R'; break;
					case 83: code = 'S'; break;
					case 84: code = 'T'; break;
					case 85: code = 'U'; break;
					case 86: code = 'V'; break;
					case 87: code = 'W'; break;
					case 88: code = 'X'; break;
					case 89: code = 'Y'; break;
					case 90: code = 'Z'; break;
					case 107: code = '+'; break;
					case 109: code = '_'; break;
					case 186: code = ':'; break;
					case 187: code = '+'; break;
					case 188: code = '<'; break;
					case 189: code = '_'; break;
					case 190: code = '>'; break;
					case 192: code = '~'; break;
					case 219: code = '{'; break;
					case 220: code = '|'; break;
					case 221: code = '}'; break;
					case 222: code = '\''; break;
				}
			} else if(!e.meta) {
				switch(e.code)
				{
					case 8: code = 'backspace'; break;
					case 9: code = 'tab'; break;
					case 32: code = 'space'; break;
					case 35: code = 'end'; break;
					case 36: code = 'home'; break;
					case 37: code = 'left'; break;
					case 38: code = 'up'; break;
					case 39: code = 'right'; break;
					case 40: code = 'down'; break;
					case 46: code = 'delete'; break;
					case 48: code = '0'; break;
					case 49: code = '1'; break;
					case 50: code = '2'; break;
					case 51: code = '3'; break;
					case 52: code = '4'; break;
					case 53: code = '5'; break;
					case 54: code = '6'; break;
					case 55: code = '7'; break;
					case 56: code = '8'; break;
					case 57: code = '9'; break;
					case 61: code = '='; break;
					case 65: code = 'a'; break;
					case 66: code = 'b'; break;
					case 67: code = 'c'; break;
					case 68: code = 'd'; break;
					case 69: code = 'e'; break;
					case 70: code = 'f'; break;
					case 71: code = 'g'; break;
					case 72: code = 'h'; break;
					case 73: code = 'i'; break;
					case 74: code = 'j'; break;
					case 75: code = 'k'; break;
					case 76: code = 'l'; break;
					case 77: code = 'm'; break;
					case 78: code = 'n'; break;
					case 79: code = 'o'; break;
					case 80: code = 'p'; break;
					case 81: code = 'q'; break;
					case 82: code = 'r'; break;
					case 83: code = 's'; break;
					case 84: code = 't'; break;
					case 85: code = 'u'; break;
					case 86: code = 'v'; break;
					case 87: code = 'w'; break;
					case 88: code = 'x'; break;
					case 89: code = 'y'; break;
					case 90: code = 'z'; break;
					case 96: code = '0'; break;
					case 97: code = '1'; break;
					case 98: code = '2'; break;
					case 99: code = '3'; break;
					case 100: code = '4'; break;
					case 101: code = '5'; break;
					case 102: code = '6'; break;
					case 103: code = '7'; break;
					case 104: code = '8'; break;
					case 105: code = '9'; break;					
					case 106: code = '*'; break;
					case 107: code = '='; break;
					case 109: code = '-'; break;
					case 110: code = '.'; break;
					case 111: code = '/'; break;
					case 187: code = '='; break;
					case 188: code = ','; break;
					case 189: code = '-'; break;
					case 190: code = '.'; break;
					case 191: code = '/'; break;
					case 219: code = '['; break;
					case 221: code = ']'; break;
				}
			}			
			
//			if(e.code != 16) {
//				alert("key pressed, code = " + code);
//			}
			var padid, padobj;
			
			try {
				if(fIndex > -1) {
					padid = mpXML[fIndex];
					padobj = document.getElementById(mpObjects[fIndex]);

					//alert("padid: " + padid + ", padobj: " + padobj);
					
					if(padobj) {
						// mac
						if(e.meta && e.code == 67) {
							padobj.sendKey("copy", true, false);	
						}
						// send cut
						else if(e.meta && e.code == 88) {
							padobj.sendKey("cut", true, false);
						}
						// send paste
						else if(e.meta && e.code == 86) {
							padobj.sendKey("paste", true, false);	
						}
						// send select all
						else if(e.meta && e.code == 65) {
							padobj.sendKey("selectall", true, false);	
						}
						// send bold
						else if(e.meta && e.code == 66) {
							padobj.boldSelection();	
						}						
						
						// send copy
						if(e.control && e.code == 67) {
							padobj.sendKey("copy", true, false);	
						}
						// send cut
						else if(e.control && e.code == 88) {
							padobj.sendKey("cut", true, false);
						}
						// send paste
						else if(e.control && e.code == 86) {
							padobj.sendKey("paste", true, false);	
						}
						// send select all
						else if(e.control && e.code == 65) {
							padobj.sendKey("selectall", true, false);	
						}
						// send bold
						else if(e.control && e.code == 66) {
							padobj.boldSelection();	
						}						
						// testing (uncomment to show xml on ctrl+L)
						//else if(e.control && e.code == 76) {
						//	alert(padobj.getXML());	
						//}						
						
						// send shift left
						else if(e.shift && e.code == 37) {
							padobj.sendKey("shiftleft", false, true);
						}
						// send shift right
						else if(e.shift && e.code == 39) {
							padobj.sendKey("shiftright", false, true);
						}	
						// send shift tab
						else if(e.shift && e.code == 9) {
							padobj.sendKey("tab", false, true);	
						}					
						// send other key
						else if(code != "") {
							padobj.sendKey(code, false, false);
						}
					}
				}
			} catch(err) {
				//alert('sending key failed');
			};
		});
}

// turn keys off
function turnOffKeys() {
	// Remove Events
	$$('html').removeEvents('keydown');
}

// run key handler
keyHandler();

});
