var LinkExtensions = new Object();

LinkExtensions.extendedLinkSubmit = function(formName, componentName, popupWindowRedirector) {
        
    var form = Tapestry.find(formName);

    if( form.events.onsubmit_handler() ) {
    
        var popup = popupWindowRedirector && popupWindowRedirector.needsRedirect();
    
        if( popup ) {
        
            var windowName = popupWindowRedirector.getWindowName();
        
            window.open('about:blank', windowName, popupWindowRedirector.getWindowFeatures());
            
            var targetOld = form.target;
            form.target = windowName;
            
            var submitnameOld = form.submitname.value;
            
            popupWindowRedirector.preActivate(form);
            
            Tapestry.submit_form(formName, componentName);
            
            popupWindowRedirector.postActivate(form);
            
            form.target = targetOld;
            form.submitname.value = submitnameOld;
            
        } else
            Tapestry.submit_form(formName, componentName);
    }
}

LinkExtensions.fieldSubmit = function(formName, fieldId, value) {

	Tapestry.find(fieldId).value = value;
	Tapestry.submit_form(formName);        
}

function PopupWindowRedirector(windowName, windowFeatures, activationFlagName) {

	this.getWindowName = function() {
		return windowName || '';
	}

	this.getWindowFeatures = function() {
		return windowFeatures || '';
	}
	
	this.needsRedirect = function() {
		return true;
	}
	
	this.preActivate = function(form) {
	
		if( activationFlagName )
	    	form[activationFlagName].value = 'T';	
	}
	
	this.postActivate = function(form) {
	
		if( activationFlagName )
	    	form[activationFlagName].value = 'F';	
	}
}

function ExtendedFormSupportLibrary() {

	var CTRL_CODES = Array(8,9,16,17,20,35,36,37,40,46);
	var keyDown = 0;
		
	function isInArray(array, n) {
        
	    for (i = 0; i < array.length; i++)
	        if (array[i] == n)
	            return true;
	
	    return false;
	}        

    function getEvent(evt) {
        return (evt) ? evt : ((window.event) ? window.event : "");
    }    
    
	function isCtrlCode(c) {
	    return isInArray(CTRL_CODES, c);
	}        
	
	function focusNext(input) {
	        
	    input.form[(getIndex(input)+1) % input.form.length].focus();
	    
	    function getIndex(input) {
	    
	        var index = -1, i = 0, found = false;
	
	        while (i < input.form.length && index == -1)
	            if (input.form[i] == input)
	                index = i;
	            else
	                i++;
	                
	        return index;
	    }
	    
	    return true;
	}    

	this.getEventSource = function(evt) {
    
  	    evt = getEvent(evt);
	    return evt.target || evt.srcElement;
	}

	this.autoTab = function(input, len, e) {
	
	    if (input.value.length >= len && !isCtrlCode(keyDown)) {
	    
	        input.value = input.value.slice(0, len);
	        focusNext(input);
	    }
	    
	    return true;
	}
	
    this.onKeyDown = function(evt) {

        var evt = getEvent(evt);
        keyDown = evt.keyCode;    
    }    
    
    this.displayInputLength = function(input, maxLength, lengthDisplayInput, countDown) {
    
	    if( lengthDisplayInput ) {
	    
		    var length = input.value.length;
	    	lengthDisplayInput.value = countDown ? maxLength - length : length;
	    }	
    }
    
	this.limitInputLength = function(input, maxLength, lengthDisplayInput, countDown) {

	    var length = input.value.length;
	    
	    if( maxLength > -1 && length > maxLength ) {
	    
	        input.value = input.value.slice(0, maxLength);
	        length = input.value.length;
	    }   
	
		this.displayInputLength(input, maxLength, lengthDisplayInput, countDown);
	}
}

var ExtendedFormSupport = new ExtendedFormSupportLibrary();
