ShadowScript = {};
ShadowScript.VirtualKeyboard = {};

ShadowScript.VirtualKeyboard.domRefs = new Array();
ShadowScript.VirtualKeyboard.inputRefs = new Array();

ShadowScript.VirtualKeyboard.frameDiv = false;
ShadowScript.VirtualKeyboard.cur_input = false;
ShadowScript.VirtualKeyboard.cur_callback = false;
ShadowScript.VirtualKeyboard.caps_on = false;
ShadowScript.VirtualKeyboard.shift_on = false;
ShadowScript.VirtualKeyboard.layout = false;

ShadowScript.VirtualKeyboard.initialize = function(forceLoad)
{
	if(!forceLoad)
		forceLoad = false;

	if(document.loaded != true && !forceLoad)
	{
		Event.observe(document,'dom:loaded',function(e) { ShadowScript.VirtualKeyboard.initialize(1); });
		return 0;
	}

	var div = document.getElementById('vkbrd_frame');

	// Set the master
	ShadowScript.VirtualKeyboard.frameDiv = div;

	// Get the layout
	var layout = ShadowScript.VirtualKeyboard.getLayout();

	// Array to hold all of our dom objects
	var dom_refs = new Array();

	// Build it all up
	var html = '';
	
	// Initialize the table
	html += '<table cellspacing="0" cellpadding="0" border="0"><tr><td>';
	
	// ================ Build the first line
	html += '<div>';
	for(var i=0;i<layout[0][0].length;i++)
	{
		var l_id = 'vkbrd_key_0_' + i;
		html += '<input id="' + l_id + '" type="button" class="key" value="' + layout[0][0][i] + '">';
		dom_refs[dom_refs.length] = l_id;
	}
	
	var l_id = 'vkbrd_ctl_backspace';
	html += '<input id="' + l_id + '" type="button" class="key_backspace" value="Backspace">';
	dom_refs[dom_refs.length] = l_id;

	html += '</div>';
	
	
	// ================ Build the second line
	html += '<div>';

	var l_id = 'vkbrd_ctl_tab';
	html += '<input id="' + l_id + '" type="button" class="key_tab" value="Tab">';
	dom_refs[dom_refs.length] = l_id;

	for(var i=0;i<layout[1][0].length;i++)
	{
		var l_c = 'key';
		if(i + 1 == layout[1][0].length)
			l_c = 'key_slash';
		
		var l_id = 'vkbrd_key_1_' + i;
		html += '<input id="' + l_id + '" type="button" class="' + l_c + '" value="' + layout[1][0][i] + '">';
		dom_refs[dom_refs.length] = l_id;
	}
	html += '</div>';
	
	// ================ Build the third line
	html += '<div>';
	
	var l_id = 'vkbrd_ctl_capslock';
	html += '<input id="' + l_id + '" type="button" class="key_capslock" value="Caps Lock">';
	dom_refs[dom_refs.length] = l_id;

	for(var i=0;i<layout[2][0].length;i++)
	{
		var l_id = 'vkbrd_key_2_' + i;
		html += '<input id="' + l_id + '" type="button" class="key" value="' + layout[2][0][i] + '">';
		dom_refs[dom_refs.length] = l_id;
	}

	var l_id = 'vkbrd_ctl_enter';
	html += '<input id="' + l_id + '" type="button" class="key_enter" value="Enter">';
	dom_refs[dom_refs.length] = l_id;

	html += '</div>';	
	
	// ================ Build the fourth line
	html += '<div>';

	var l_id = 'vkbrd_ctl_shift';
	html += '<input id="' + l_id + '" type="button" class="key_shift" value="Shift">';
	dom_refs[dom_refs.length] = l_id;

	for(var i=0;i<layout[3][0].length;i++)
	{
		var l_id = 'vkbrd_key_3_' + i;
		html += '<input id="' + l_id + '" type="button" class="key" value="' + layout[3][0][i] + '">';
		dom_refs[dom_refs.length] = l_id;
	}
	
	var l_id = 'vkbrd_ctl_shift2';
	html += '<input id="' + l_id + '" type="button" class="key_shift" value="Shift">';
	dom_refs[dom_refs.length] = l_id;

	html += '</div>';	
	
	// ================ Build the last line with the space bar

	html += '<table cellspacing="0" cellpadding="0" border="0" width="100%"><tr>';
	html += '<td align="left" width="60"></td>';

	var l_id = 'vkbrd_ctl_spacebar';
	html += '<td align="center"><input id="' + l_id + '" type="button" class="key_spacebar" value=""></td>';
	dom_refs[dom_refs.length] = l_id;
	
	html += '<td align="right" width="60"></td>';
	html += '</td></tr>';
	html += '</td></tr></table>';

	// Set the HTML
	div.innerHTML = html;
	
	// Grab all of the DOM objects for the keyboard and save them away
	for(var i=0;i<dom_refs.length;i++)
	{
		ShadowScript.VirtualKeyboard.domRefs[i] = document.getElementById(dom_refs[i]);
	}

	// Set the master layout
	ShadowScript.VirtualKeyboard.layout = layout;
	
	// Setup the event handleers
	ShadowScript.VirtualKeyboard.setHandlers();
}

ShadowScript.VirtualKeyboard.setHandlers = function()
{
	// Set a global body click
	document.onclick = function(e)
	{
		ShadowScript.VirtualKeyboard.hide();
	}

	ShadowScript.VirtualKeyboard.frameDiv.onclick = function(e)
	{
		ShadowScript.VirtualKeyboard.stopEvent(e);
	}

	var ref = ShadowScript.VirtualKeyboard.domRefs;
	for(var i=0;i<ref.length;i++)
	{
		ref[i].onclick = ShadowScript.VirtualKeyboard.onClick;
		
		// Double click handler IF its IE only
		var browserCheck = (document.all) ? 1 : 0;
		if(browserCheck > 0)
			ref[i].ondblclick = ShadowScript.VirtualKeyboard.onClick;
	}
}

ShadowScript.VirtualKeyboard.onClick = function(e)
{
	e = e || window.event;
	var obj = e.target || e.srcElement;
	var k_id = obj.id;			
	var k_val = obj.value;

	// Get the input ref
	var iref = ShadowScript.VirtualKeyboard.cur_input;
	var cur_val = iref.value;
	var new_val = '';
	
	if(k_id == 'vkbrd_ctl_backspace')
	{
		new_val = cur_val.substring(0,cur_val.length - 1);
	}
	else if(k_id == 'vkbrd_ctl_spacebar')
	{
		new_val = cur_val + ' ';
	}
	else if(k_id == 'vkbrd_ctl_tab')
	{
		return;
	}
	else if(k_id == 'vkbrd_ctl_enter')
	{
		ShadowScript.VirtualKeyboard.hide();
		return;
	}
	else if(k_id == 'vkbrd_ctl_capslock')
	{
		ShadowScript.VirtualKeyboard.onClickCapsLock();
		return;
	}
	else if(k_id == 'vkbrd_ctl_shift' || k_id == 'vkbrd_ctl_shift2')
	{
		ShadowScript.VirtualKeyboard.onClickShift();
		return 0;
	}
	else
	{
		// If shift is on, disabke it
		if(ShadowScript.VirtualKeyboard.shift_on == true)
			ShadowScript.VirtualKeyboard.onClickShift();	
	
		new_val = cur_val + k_val;
	}
			 
	iref.value = new_val;
	
	if(typeof ShadowScript.VirtualKeyboard.cur_callback == "function")
		ShadowScript.VirtualKeyboard.cur_callback();

	//iref.focus();
}

ShadowScript.VirtualKeyboard.onClickCapsLock = function()
{
	var obj = document.getElementById('vkbrd_ctl_capslock');
	
	if(ShadowScript.VirtualKeyboard.caps_on == true)
	{
		obj.className = 'key_capslock';
		ShadowScript.VirtualKeyboard.caps_on = false;
		ShadowScript.VirtualKeyboard.convertKeysUpper(false);
	}
	else
	{
		obj.className = 'key_capslock_on';
		ShadowScript.VirtualKeyboard.caps_on = true;
		ShadowScript.VirtualKeyboard.convertKeysUpper(true);
	}
}

ShadowScript.VirtualKeyboard.onClickShift = function()
{
	// Set both shifts as on
	var o_s1 = document.getElementById('vkbrd_ctl_shift');
	var o_s2 = document.getElementById('vkbrd_ctl_shift2');		

	if(ShadowScript.VirtualKeyboard.shift_on == true)
	{
		o_s1.className = 'key_shift';
		o_s2.className = 'key_shift';
		ShadowScript.VirtualKeyboard.shift_on = false;

		if(ShadowScript.VirtualKeyboard.caps_on == false)
			ShadowScript.VirtualKeyboard.convertKeysUpper(false);
		else
			ShadowScript.VirtualKeyboard.convertKeysUpper(true);
	}
	else
	{	
		o_s1.className = 'key_shift_on';
		o_s2.className = 'key_shift_on';
		ShadowScript.VirtualKeyboard.shift_on = true;
		
		if(ShadowScript.VirtualKeyboard.caps_on == false)
			ShadowScript.VirtualKeyboard.convertKeysUpper(true);
		else
			ShadowScript.VirtualKeyboard.convertKeysUpper(false);		
	}
}

ShadowScript.VirtualKeyboard.convertKeysUpper = function(way)
{
	if(!way)
		way = false;

	var ref = ShadowScript.VirtualKeyboard.domRefs;
	var layout = ShadowScript.VirtualKeyboard.layout;
	
	// Update all the keyboard items
	for(var i=0;i<ref.length;i++)
	{
		var r_obj = ref[i];
		var r_id = r_obj.id;

		if(r_id.indexOf('vkbrd_key_') == 0)
		{
			// Extract the char
			var r_tmp = r_id.substring(10);
			var r_pair = r_tmp.split('_');
			var r_row = r_pair[0];
			var r_col = r_pair[1];

			if(way == false)
				var new_char = layout[r_row][0][r_col];
			else
				var new_char = layout[r_row][1][r_col];
			
			r_obj.value = new_char;
		}
	}
}

ShadowScript.VirtualKeyboard.getLayout = function()
{
	var layout = {};

	layout['us'] = new Array(
		new Array(
			'`1234567890-=',
			'~!@#$%^&*()_+'
		),
		new Array(
			'qwertyuiop[]\\',
			'QWERTYUIOP{}|'
		),
		new Array(
			'asdfghjkl;\'',
			'ASDFGHJKL:"'
		),
		new Array(
			'zxcvbnm,./',
			'ZXCVBNM<>?'
		)
	);
	
	// Braek up the string into arrays
	var tl = layout['us'];
	
	var p_layout = new Array();
	for(var i=0;i<tl.length;i++)
	{
		p_layout[i] = new Array();
		for(var j=0;j<tl[i].length;j++)
		{
			p_layout[i][j] = new Array();
		
			// Split up the line
			var l = tl[i][j].split('');
			
			for(var y=0;y<l.length;y++)
			{
				p_layout[i][j][y] = l[y];
			}
		}
	}
	
	return p_layout;
}

ShadowScript.VirtualKeyboard.addInput = function(obj,callback)
{
	obj = (typeof obj == "string") ? document.getElementById(obj) : obj;

	// Start Observing this input
	var ir = ShadowScript.VirtualKeyboard.inputRefs;
	ir[ir.length] = obj;
	
	// Leave them the option to NOT use the keyboard
	//obj.readOnly = true;
	obj.onfocus = function (e) {
		ShadowScript.VirtualKeyboard.cur_callback = callback;
		ShadowScript.VirtualKeyboard.inputFocus(e);
	}
	obj.onblur = ShadowScript.VirtualKeyboard.inputBlur;
	
	obj.onkeypress = function(e)
	{
		// Is this a tab or enter?
		if(e.keyCode == 9 || e.keyCode == 13)
		{
			ShadowScript.VirtualKeyboard.hide();
			this.blur();
		}
	}
	obj.onclick = function(e)
	{
		ShadowScript.VirtualKeyboard.stopEvent(e);
	}
}

ShadowScript.VirtualKeyboard.inputFocus = function(e)
{
	e = e || window.event;
	var obj = e.target || e.srcElement;
	
	// Get the position of the keyboard
	var i_x = findPosX(obj);
	var i_y = findPosY(obj);
	
	// Set the position
	var div = ShadowScript.VirtualKeyboard.frameDiv;
	div.style.left = i_x;
	div.style.top = i_y + obj.offsetHeight;

	// Show the keyboard
	ShadowScript.VirtualKeyboard.show();
	
	// Set the current input div
	ShadowScript.VirtualKeyboard.cur_input = obj;
}
	

ShadowScript.VirtualKeyboard.inputBlur = function(e)
{
	//ShadowScript.VirtualKeyboard.hide();
}

ShadowScript.VirtualKeyboard.show = function()
{
	var div = ShadowScript.VirtualKeyboard.frameDiv;
	div.style.display = 'block';
}

ShadowScript.VirtualKeyboard.hide = function()
{
	var div = ShadowScript.VirtualKeyboard.frameDiv;
	div.style.display = 'none';
}

ShadowScript.VirtualKeyboard.stopEvent = function(e)
{
	e = e || window.event;
	e.cancelBubble = true;
	if(e.stopPropagation) e.stopPropagation();
}

function findPosX(obj)
{
	var curleft = 0;
	if(obj.offsetParent)
		while(1) 
		{
    		curleft += obj.offsetLeft;
    		if(!obj.offsetParent)
    			break;
    		obj = obj.offsetParent;
		}
	else if(obj.x)
    	curleft += obj.x;
	return curleft;
}

function findPosY(obj)
{
	var curtop = 0;
	if(obj.offsetParent)
	while(1)
	{
		curtop += obj.offsetTop;
    	if(!obj.offsetParent)
    		break;
    	obj = obj.offsetParent;
	}
    else if(obj.y)
		curtop += obj.y;
	return curtop;
}
