function resetCombo(objCmp) {
       objCmp.setValue('');
       objCmp.setDisabled(false);
       return objCmp;
}

function show(cmp) {
	cmp.enable();// for validation
    cmp.show();
	cmp.getEl().up('.x-form-item').setDisplayed(true); 
}
function hide(cmp) {
	cmp.disable();// for validation
	cmp.hide();
	cmp.getEl().up('.x-form-item').setDisplayed(false); 	
}

function showHide(cmp, cnt) {
	if (cnt <= 0) {
		cmp.disable();// for validation
		cmp.hide();
		cmp.getEl().up('.x-form-item').setDisplayed(false); 
	} else {
		cmp.enable();// for validation
	    cmp.show();
		cmp.getEl().up('.x-form-item').setDisplayed(true); 
	}	
}

function getObjComboBox(objIx,label,theStore,theListeners) {
	var objComboBox =
        new Ext.form.ComboBox({
            fieldLabel: label,
            hiddenName:'obj'+objIx,
            store: theStore,
            displayField:'value',
            valueField:'key',
            typeAhead: true,
            mode: 'local',
            triggerAction: 'all',
            emptyText:'Select object...',
            selectOnFocus:true,
            width:190,
			listeners:theListeners
        });
    objComboBox.objIx = objIx;
    return objComboBox;
}




function outputComparisonForm(type,objLabels,varLabels,varTypes,objs,vars,objNames) {
	var objStores = [];
	var objComboBoxes = [];
	var objIds = [];
	var objFields = [];
	var objButtons = [];
	var objWins = [];
	var objTrees = [];
	var objCurVal = [];
	var selObjs = [];
	var formItems = [];
	var varInputs = [];
	var textInputs = [];
    var nonNullObjLength = 0;
    var selObjValue = null;
    
	for(var ix=0; ix<objLabels.length; ++ix) {
		objStores[ix] = null;
		objComboBoxes[ix] = null;
		objIds[ix] = null;
		objFields[ix] = null;
		textInputs[ix] = null;
		objButtons[ix] = null;
		objWins[ix] = null;
		objTrees[ix] = null;
		objCurVal[ix] = null;
		selObjs[ix] = null;
		
		if(objLabels[ix]!=null) {
			formItems[ix] = null;
		}
	}
	for(var ix=0; ix<varLabels.length; ++ix) {
		varInputs[ix] = null;
	}
	
	// Initiates the default obj ids
	for (var ix=0; ix<objs.length; ++ix) {
       objCurVal[ix] = objs[ix];
       if (objs[ix] != null) 
          nonNullObjLength++;
    }

	for(var objIx=0; objIx<objLabels.length; ++objIx) {
		if(objLabels[objIx]==null)
			continue;
		
		objIds[objIx] = new Ext.form.TextField({
			id: 'obj'+ objIx +'Id',
			name: 'obj'+ objIx +'Id',
			hideLabel: true,
	        hidden: true	
			});
		
		objButtons[objIx] = new Ext.Button({ 
		    xtype: 'button',
			text: 'Choose '+ objLabels[objIx] +' =>',
			curObjIx: objIx,
			listeners: {
				click: function(n) {
					var curObjIx = this.curObjIx;
				
					var url = '/know/num/ComparisonTree?compType='+ type +'&which='+curObjIx;
					// enable subsequent tree choosing buttons
					for(var otherObjIx=0; otherObjIx<curObjIx; ++otherObjIx) {
						url += '&obj'+ otherObjIx +'='+ objCurVal[otherObjIx];
					}
				
	            	if(!objWins[curObjIx]){
//TODO: make this use the cached url
	            		objTrees[curObjIx] = makeTree('obj'+ curObjIx +'-tree-div',url, objLabels[curObjIx],curObjIx);
	            	}
	            	
//TODO: does addListener replace the current listener with the 'click' id or does it add additional listeners? If it adds additional then we need to disable the old ones.	            	
					
					objTrees[curObjIx].addListener('click', function (node, event){
					    var chooseBtn = Ext.getCmp('chooseBtn_'+curObjIx);
						if(node.isLeaf()) {
						    chooseBtn.enable();
							if(node.parentNode) 
								selObjs[curObjIx] = node.parentNode.attributes.text + " --> ";
							
							selObjs[curObjIx] += node.attributes.text;
							//objCurVal[curObjIx] = node.attributes.id;
							selObjValue = node.attributes.id;
						   
							// enable subsequent tree choosing buttons
							for(var buttonIx=curObjIx+1; buttonIx<objStores.length; ++buttonIx) {
								if(objButtons[buttonIx]!=null)
									objButtons[buttonIx].enable();
							}
							
						} else {
                            //disable the choose button except when the user has clicked on a leaf node.							
							chooseBtn.disable();
						}
	     				}); 

	            	if(!objWins[curObjIx]){
	            	    // This only happens for creating first popup window
	   					objWins[curObjIx] = createWin('obj'+curObjIx+'-win', objTrees[curObjIx], objLabels[curObjIx], curObjIx);
					} else if(curObjIx > 0) {
						// For all windows except the first one, reload the tree when it's opened.
						objTrees[curObjIx].getLoader().dataUrl = url;
//TODO: shouldn't this be done after the addListener?						
						objTrees[curObjIx].getRootNode().reload();
					}
					
	        		objWins[curObjIx].show();
				}
	       	}
			});
		
		var objName = objNames[objIx] == null ? '': objNames[objIx];
	    objFields[objIx] = new Ext.form.TextField ({
			fieldLabel: objLabels[objIx],
			name: 'obj'+ objIx,
			value: objName,
			anchor: '95%',
			allowBlank: false,
			listeners: {
			  	focus: function (n) {
					this.blur();
				}
			}
		});
        
		formItems[objIx] = {
			curObjIx: objIx,
            layout: 'form',
            border: false,
            buttonAlign: "center",
            items: [
                objFields[objIx],
                objButtons[objIx]
				]
			};
	}

	for(var buttonIx=0; buttonIx<objStores.length; ++buttonIx) {
		if(objFields[buttonIx] != null && objFields[buttonIx].getValue().length <= 0)
		    if (objButtons[buttonIx+1] != null) 
				objButtons[buttonIx+1].disable();
	}

	for(var varIx=0; varIx<varLabels.length; ++varIx) {
		if(varLabels[varIx]!=null) {
			var input = new Ext.form.TextField({
				fieldLabel: varLabels[varIx],
				hiddenName: 'var'+varIx
				});
			if(vars[varIx] != null) {
				input.setValue(vars[varIx]);
			}
			input.allowBlank = false;
			
			if(varTypes[varIx]==2) {
				// number
				input.regex = new  RegExp("^[+-]?[0-9,]*([.][0-9]+)?([eE][+-]?[0-9]+)?$");
				input.maskRe = new  RegExp("^[0-9,.eE+-]+$");
			} else if(varTypes[varIx]==3) {
				// date
				input.regex = new  RegExp("^[0-9]{4,}(-[0-9]{1,2}(-[0-9]{1,2})?)?$");
			} else if(varTypes[varIx]==4) {
				// timestamp
				input.regex = new  RegExp("^[0-9]{4,}(-[0-9]{1,2}(-[0-9]{1,2})?)?"
					+"( "+
						"[0-9]{1,2}:[0-9]{1,2}(:[0-9]{1,2}(.[0-9]{1,3})?)?"
					+")?$"
					);
			}
			
			varInputs[varIx] = input;
			
		}
	}

	for(var ix=0; ix<varInputs.length; ++ix) {
		if(varInputs[ix]!=null)
			formItems.push(varInputs[ix]);
	}
    
    var viewButton = new Ext.Button({
            text: 'view',
            formBind: true,
            handler:function() {
				simpleForm.submit();
            }
        });
	 
	var simpleForm = new Ext.FormPanel({
        frame:true,
	
        labelAlign: 'top',
        //labelWidth: 120,
        title: 'Comparison Chooser',
        bodyStyle:'padding:10px',
		renderTo: 'chooseForm',
		 
        items: [{
            //layout:'column',
            layout: 'form',
            border:false,
            items:formItems
        }],

        buttons: [viewButton],
        buttonAlign: "left",
        
        onSubmit: Ext.emptyFn,
        submit: function() {
        	var actionStr = '/know/num/nexus?compType='+ type;
        	
        	for(var ix=0; ix<objCurVal.length; ++ix) {
        		if(objCurVal[ix]!=null)
        			actionStr += "&obj"+ ix +"="+ objCurVal[ix];
			}
        	for(var ix=0; ix<vars.length; ++ix) {
        		if(varInputs[ix]!=null)
        			vars[ix] = varInputs[ix].getValue();
        		else
        			vars[ix] = null;
//TODO: urlencode vars[ix]        			
        		if(vars[ix]!=null)
        			actionStr += "&var"+ ix +"="+ vars[ix];
			}
        	this.getForm().getEl().dom.action = actionStr;
            this.getForm().getEl().dom.submit();
        },
 

		keys: [{
				key: Ext.EventObject.ENTER,
				fn: function() { simpleForm.submit(); }
			}]
			
    });

	function createWin(name, tr, buttonText, objIx) {
		var win = new Ext.Window({
        	el: name,
            layout:'fit',
            width:500,
            height:400,
            closeAction:'hide',
            plain: true,
                
            items: tr,

            buttons: [{
            	text:'Choose',
            	id: 'chooseBtn_'+objIx,
				handler: function () {
				    objCurVal[objIx] = selObjValue;
					objFields[objIx].setValue(selObjs[objIx]);
					objIds[objIx].setValue(objCurVal[objIx]);
	
					for(var i = objIx+1; i < nonNullObjLength; i++) {
					       objFields[i].setValue('');
					       objIds[i].setValue('');
					       objCurVal[i] = null;
					}      
					win.hide();	
				}
            },{
            	text: 'Never Mind',
                handler: function(){
                	win.hide();
                }
            }]
        });	
		return win;
	}
	
	function makeTree (treeDivId, url, treeRootLabel, objIx) {
		var Tree = Ext.tree;
		var tree = new Tree.TreePanel({
        	el: treeDivId,
        	autoScroll:true,
        	animate:true,
        	enableDD:true,
        	containerScroll: true, 
        	loader: new Tree.TreeLoader({
				dataUrl: url
        	})
    		});

    	// set the root node
    	var root = new Tree.AsyncTreeNode({
        	text: treeRootLabel,
        	draggable:false,
        	id:'source'
    		});
    	tree.setRootNode(root);

    	// render the tree
    	tree.render();
    	root.expand();
	  	return tree;
	}

}


