
function process_keydown(e) {
	e = e ||  window.event;	// get event depending on broswer  	var obj = e.srcElement || e.target;	// get element clicked depending on browser  
	var elem = e.srcElement || e.target;	// get element clicked depending on browser  
	var keyCode = e.keyCode || e.which;	
	var bShiftKey = e.shiftKey;
	 if(isNS) { 
		if(e.modifiers & Event.SHIFT_MASK)
			bShiftKey = true;
	} 
	var nMove = 0;
	
	if( elem.id.search("search")!=-1 )
	    return true;
	
	if(keyCode==40  || (keyCode == 13 && !bShiftKey ))
		nMove = 1; //move forward
	else if(keyCode==38 || (keyCode == 13 && bShiftKey ))
		nMove = -1; //move backwards
	else if(keyCode==8 && isIE)
		e.cancelBubble=true;
	 
	if(nMove == -1 || nMove == 1) { 
		if (window.event) 
			window.event.returnValue=false;
		else if (e.stopPropagation) {
			e.stopPropagation();
			e.preventDefault();
		} 
		currentTabIndex = parseInt(elem.getAttribute("tabindex"));
		if( isNaN( currentTabIndex ) )
			currentTabIndex = null; 
		var nImperfectMatch = null;
		for( var i=0; i<document.forms.length; i++)
			for( var j=0; j<document.forms[i].elements.length; j++)
				if( document.forms[i].elements[j] == elem) {
					j+=nMove;
					for(	;j >= 0 &&  j< document.forms[i].elements.length; j+= nMove) {
						var formelem = document.forms[i].elements[j];
						if( currentTabIndex == "" ||currentTabIndex == 0 ||	currentTabIndex == null ) {
							if( (formelem.type == "text" ||
								formelem.type == "textarea" ||
								formelem.type == "password") && !formelem.disabled ) {
                                try {
    								formelem.focus();
    								if( formelem.select )
                                        formelem.select();
    								break;
    							}
    							catch(e) {
    							}
							}
						}
						else {
							TabIndex = parseInt(formelem.getAttribute("tabindex"));
							if( TabIndex <= 0 || isNaN(TabIndex) )
								continue;
							
							if(  ( nMove == -1 &&  TabIndex <=  currentTabIndex  )
									|| (nMove ==  1 &&  TabIndex >= currentTabIndex ) )  {
								
								if( formelem.type!="hidden" && !formelem.disabled) { 
									try {
										formelem.focus();
										if( formelem.select )
		                                	formelem.select();
										break;
									}
    								catch(e) {
    								}
								}
							}								
						}
					} 
					break;
				}
	} 
	return true;	
}

function dont_bubble_backspace(e){
	if(isIE){
		e = window.event;
		elem = e.srcElement;
		
		if( e.keyCode == 8) e.cancelBubble = true;	
	}
	return true;	
}

function drop_backspace(e) {
	if(isIE) {
		e=window.event;
		if(e.keyCode == 8) { 
			e.cancelBubble = true;
			return false;
		}
	}
	else if( isNS) { 
	}
	else {
	}
	return true;	
}

// Adds the appropriate key handler to an element provided it is a text input, password input, or text area
function KeyHandler_AddKeyHandler( leElem ) {
    if( leElem ) {
        if( leElem.type == "text" && leElem.name != "email" ) 
            KeyHandling_Attach_Process_KeyDown(leElem);
        else if( leElem.type == "password" || leElem.name == "email" || leElem.type == "textarea" )
            KeyHandling_Attach_Dont_Bubble_Backspace(leElem);
    }
}

function KeyHandling_Attach_Process_KeyDown( leElem ) {
	//leElem.onkeydown = process_keydown;
	if( leElem ) {
    	template_removeEventListener(leElem, "keydown", process_keydown);
    	template_addEventListener(leElem, "keydown", process_keydown);
    }
}

function KeyHandling_Attach_Dont_Bubble_Backspace( leElem ) {
	//leElem.onkeydown = process_keydown;
	if( leElem ) {
    	template_removeEventListener(leElem, "keydown", dont_bubble_backspace);
    	template_addEventListener(leElem, "keydown", dont_bubble_backspace);
    }
}

function KeyHandling_Attach_Drop_Backspace( leElem ) {
	//leElem.onkeydown = process_keydown;
	if( leElem ) {
		template_removeEventListener(leElem, "keydown", drop_backspace);
		template_addEventListener(leElem, "keydown", drop_backspace);
    }
}

if(isIE) {
	for(i=0; i<document.forms.length; i++){
		for(j=0; j<document.forms[i].elements.length; j++){
			var elem = document.forms[i].elements[j];
			if( elem.type == "text" && elem.name != "email" ) {
				//elem.onkeydown = process_keydown;
				KeyHandling_Attach_Process_KeyDown(elem);
            }
			else if( elem.type == "textarea" || 
				elem.type == "password"  ||
				elem.name == "email" ) {
                //elem.onkeydown = dont_bubble_backspace;
				KeyHandling_Attach_Dont_Bubble_Backspace(elem);
            }
			else {
				//elem.onkeydown = drop_backspace;
				KeyHandling_Attach_Drop_Backspace(elem);
            }				
		}
		//document.forms[i].onkeydown = drop_backspace;
		KeyHandling_Attach_Drop_Backspace(document.forms[i]);
	}
	//document.onkeydown = drop_backspace;
	KeyHandling_Attach_Drop_Backspace(document);	
}
else if(isNS || isFF) {
	for(var i=0; i<document.forms.length; i++) {
		for(j=0; j<document.forms[i].elements.length; j++) {
			var elem = document.forms[i].elements[j];
			if( elem.type=="text" && elem.type!="password" ) {
				//elem.onkeydown = process_keydown;
				KeyHandling_Attach_Process_KeyDown(elem);				
			}
		}
	}
}
else
	;

