var xmlHttp = null;
var entityArray=new Array();
var xmlHandler="../handlers/xmlSearchH.jsp?_attributeValue=";
var dataName="";
var benchMark="";
var attName="";
var currentAjax=null;
var ajaxInputs=new Array();
function searchXml(dataName,attName,entityType,displayName,keyCode)
{
    this.dataName=dataName;
    try{
        xmlHttp = new XMLHttpRequest();
    }
    catch(e){}
    if(window.ActiveXObject) {
        try {
            xmlHttp = new ActiveXObject("Msxml2.XMLHTTP");
        }
        catch(e) {
            try {
                xmlHttp= new ActiveXObject("Microsoft.XMLHTTP");
            }
            catch(e) {
                throw new Error("Could not find an XMLHttpRequest alternative.")
            }
        }   
    }
    xmlHandler="../handlers/xmlSearchH.jsp?_attributeValue=";
    attName=attName.substring(1,attName.length);
    this.attName=attName;
    setBenchMark(dataName,attName);
    xmlHandler=xmlHandler+document.getElementById(dataName).value+"&_attributeName="+attName+"&_entityType="+entityType;
    currentAjax=getAjaxElement(seperateCompartor(dataName,true));
    if(checkKeyCode(keyCode))
        return;
    if(!currentAjax.xmlSearch)
        return;
    setAjaxDisplay(filterDisplayName(displayName));
    xmlHandler=xmlHandler+currentAjax.attributeString;
    xmlHttp.open("GET",xmlHandler, true);
    xmlHttp.onreadystatechange = autopopulate;
    xmlHttp.send(null);
    
    
}

function getAllElements(dataName,ajaxObj)
{
    
    var elements= document.forms['vmForm'].elements;
    for( i=0; i<elements.length; i++){
        var element=elements[i];
        if( element !=null && element.name.indexOf(dataName)!=-1 && element.name.indexOf("_")==-1  && element.name != dataName ){
            ajaxObj.formElement[ajaxObj.formElement.length]=element;
            if(element.type == "select-one"){
                ajaxObj.attributeString=ajaxObj.attributeString+"&"+getRelevantAttributes(element.name+".ID");
            }
            else{
                ajaxObj.attributeString=ajaxObj.attributeString+"&"+getRelevantAttributes(element.name);
            }
        }
        
    }
}
function checkKeyCode(keyCode){
    if( (keyCode >= 33 && keyCode <=40) || keyCode == 9 ){
        var select=document.getElementById("_"+dataName+"_select");
        if(select!= null && select.length>0){
            select.focus();
            getEntityType(true);
        }
        return true;
    }
    return false;
}
function getRelevantAttributes(elementName){
    
    var startingString=elementName.substring(elementName.indexOf(benchMark));
    return startingString.substring(startingString.indexOf(".")+1);
    
}

function getAttributeName(dataName){
    return dataName.substring(dataName.lastIndexOf(".")+1);
}

function setBenchMark(dataName,startString){
    var str=dataName.substring(0,dataName.indexOf(startString)-1);
    str=str.substring(str.lastIndexOf(".")+1);
    this.benchMark=str;
    
}

function seperateCompartor(dataName,useBenchMark){
    if(useBenchMark==true){
        return dataName.substring(0,dataName.lastIndexOf(benchMark))+benchMark;
        
    }
    else{
        return dataName.substring(0,dataName.lastIndexOf("."));
    }
}

function AjaxElement(baseName,xmlSearch){
    this.baseName=baseName;
    this.xmlSearch=xmlSearch;
    this.formElement=new Array();
    this.formLinks=new Array();
    this.formSelect=new Array();
    this.getAjaxElement=getAjaxElement;
    this.attributeString="";
    this.display="";
    getAllElements(baseName,this);
    getAllLinks(baseName,this);
    getAllSelect(baseName,this);
}

function getAjaxElement(baseName){
    ajaxObj=this.ajaxInputs[baseName];
    if(!ajaxObj){
        ajaxObj=new AjaxElement(baseName,true);
        this.ajaxInputs[baseName]=ajaxObj;
    }
    return ajaxObj;
}
function setAjaxDisplay(displayName){
    if(displayName!=null && displayName != "")
        currentAjax.display=displayName;
    else 
        currentAjax.display=getRelevantAttributes(dataName);
    if(currentAjax.attributeString.indexOf(displayName) == -1){
        currentAjax.attributeString=currentAjax.attributeString+"&"+displayName
    }
    
}
function filterDisplayName(displayName){
    if(displayName.indexOf("/") !=-1 ){
        displayName=displayName.substring(displayName.indexOf("/")+1);
    }
    if(displayName.indexOf(".")==0 ){
        displayName=displayName.substring(1);
    }
    return displayName;
}

function getAllLinks(dataName,ajaxObj){
    var documentLinks= document.links;
    for( i=0; i<documentLinks.length; i++){
        var elementLink=documentLinks[i];
        if(elementLink!=null && elementLink.name.indexOf(dataName)!=-1 ){
            ajaxObj.formLinks[ajaxObj.formLinks.length]=elementLink;
            
        }
    }
    
}

function getAllSelect(dataName,ajaxObj){
    var documentSelects= document.getElementsByTagName("select");
    for( i=0; i<documentSelects.length; i++){
        var select=documentSelects[i];
        if(select!=null && select.name.indexOf("_select")!=-1 && select.name.indexOf(dataName)!=-1  ){
            ajaxObj.formSelect[ajaxObj.formSelect.length]=select;
        }
    }
}

function keyPressed(keyCode){
    if(keyCode >= 33 && keyCode <=40 ){
        getEntityType(true);
    }
    
}
function EntityType( entityType ) {
    this.getValue = getValue;
    this.entityType = entityType;
    this.id = this.getValue( "id" );
    this.elementValue=new Array();
    var ajaxInputs=currentAjax.formElement;
    for( i=0; i<ajaxInputs.length; i++){
        if(ajaxInputs[i].type == "select-one"){
            this.elementValue[i]=this.getValue(getRelevantAttributes(ajaxInputs[i].name+".ID")); 
        } 
        else {
            this.elementValue[i]=this.getValue(getRelevantAttributes(ajaxInputs[i].name)); 
        }
    }
    
}

function getValue( fieldName ){
    node = this.entityType.getElementsByTagName( fieldName )[0].childNodes[0];
    if ( node )
        return node.nodeValue;
    else
        return "";
}

function getEntityType(fromSelect){
    if(fromSelect==false){
        entityType = new EntityType( response.getElementsByTagName('entityType')[0] );
    }
    else{
        index=document.getElementById("_"+this.dataName+"_select").value;
        entityType=entityArray[index];
    }
    var ajaxInputs=currentAjax.formElement;
    for( i=0; i<ajaxInputs.length; i++){
        if(this.currentAjax.formElement[i].type=="select-one"){
            setSelectList(ajaxInputs[i],entityType.elementValue[i]);
        }
        else if(ajaxInputs[i].type =="checkbox"  || ajaxInputs[i].type =="radio"){
            if(entityType.elementValue[i]=="true"){
                ajaxInputs[i].checked=true;   
            }
            else {
                ajaxInputs[i].checked=false;   
            }
            if(document.getElementById("false_"+ajaxInputs[i].name) != null){
                document.getElementById("false_"+ajaxInputs[i].name).disabled=true;
            }   
        }
        else{
            ajaxInputs[i].value=entityType.elementValue[i];
        }
        ajaxInputs[i].disabled=true;
    }
    document.getElementById(currentAjax.baseName).value=entityType.id;
    document.getElementById(currentAjax.baseName).disabled=false;
}

function autopopulate(){
    
    if (xmlHttp.readyState == 4) {
        xml = xmlHttp.responseXML;
        response = xml.documentElement;
        var select=document.getElementById("_"+dataName+"_select");
        select.options.length=0;
        select.style["display"]="none";
        
        if(response.getElementsByTagName('entityType').length==0){
            //alert("No corresponding entry found in database.");
            //showLinks("_addHyperlink");
            currentAjax.xmlSearch=false;
            document.getElementById(currentAjax.baseName).value="";
            document.getElementById(currentAjax.baseName).disabled=true;
        }
        else if(response.getElementsByTagName('entityType').length==1){
            getEntityType(false);
        }
        else{
            entityArray=new Array();
            for ( arrayI =0 ; arrayI < response.getElementsByTagName('entityType').length; arrayI++ ){
                newEntityType = new EntityType( response.getElementsByTagName('entityType')[arrayI] );
                entityArray[arrayI] = newEntityType ;
                select.options[arrayI]=new Option(newEntityType.getValue(currentAjax.display),arrayI);
                select.style["display"]="inline";
                // if(arrayI==0){
                //    getEntityType(true);
                // }
                
            }
            //select.focus();
        }
    }
    
}

function clearFields(dataName,attName){
    setFields(dataName,attName,true);
    showLinks("_hyperlink");
    var select=document.getElementById("_"+dataName+"_select");
    select.options.length=0;
    select.style["display"]="none";
    
    
}
function hideSelect(){
    
    var selects=currentAjax.formSelect;
    for(selectIndex=0;selectIndex<selects.length;selectIndex++){
        var select=selects[selectIndex];
        select.options.length=0;
        select.style["display"]="none";
    }
    
}
function showLinks(str){
    var links=currentAjax.formLinks;
    for(linkIndex=0;linkIndex<links.length;linkIndex++){
        hyperLink=links[linkIndex];
        if(hyperLink.name.indexOf(str)==-1){
            hyperLink.style["display"]="inline";   
        }
        else{
            hyperLink.style["display"]="none";   
        }
    }
}

function setFields(dataName,attName,bool){
    attName=attName.substring(1,attName.length)
    setBenchMark(dataName,attName);
    currentAjax=getAjaxElement(seperateCompartor(dataName,true));
    hideSelect();
    var elements= currentAjax.formElement;
    for( i=0; i<elements.length; i++){
        var element=elements[i];
        if( element !=null ){
            if(element.type=="select-one"){
                element.selectedIndex=0;
            }
            else if(element.type =="checkbox"  || element.type =="radio"){
                element.checked=!bool;  
                if(document.getElementById("false_"+element.name) != null){
                    document.getElementById("false_"+element.name).disabled=bool;
                }
            }
            else{
                element.value="";
            }
            element.disabled=bool;
        }
    }
    document.getElementById(currentAjax.baseName).value="";
    document.getElementById(currentAjax.baseName).disabled=!bool;
    
    
}

function addEntry(dataName,attName){
    setFields(dataName,attName,false);
    showLinks("_addHyperlink");
    currentAjax.xmlSearch=true;
    
    
}

function newEntry(dataName,attName){
    addEntry(dataName,attName);
    showLinks("_newHyperlink");
    currentAjax.xmlSearch=false;
}

function disableAll(){
    for(disableIndex=0;disableIndex< disableAjax.length;disableIndex++ ){
        var proposedDataName=disableAjax[disableIndex];
        var elements= document.forms['vmForm'].elements;
        for( elementi=0; elementi<elements.length; elementi++){
            var element=elements[elementi];
            if( element !=null && element.name.indexOf(proposedDataName)!=-1 && element.name.indexOf("_")==-1   && element.name != proposedDataName ){
                if(document.getElementById("false_"+element.name) != null){
                    document.getElementById("false_"+element.name).disabled=true;
                }
                element.disabled=true;
            }
        }   
    }    
}

function setSelectList(select,value){
    
    var options=select.options;
    for(selectI=0;selectI<options.length;selectI++){
        if(options[selectI].value==value){
            select.selectedIndex=selectI;
        }
    }//end of for
    
}

function intializeAjaxElements(){
    var url=window.location.href; 
    for(ajaxIndex=0;ajaxIndex<disableAjax.length; ajaxIndex++ ){
        var ajaxFieldName=disableAjax[ajaxIndex];
        if( checkIfAlreadyPresent(ajaxFieldName)==false){
            var newElement=document.createElement('input');
            newElement.setAttribute('type','hidden');
            newElement.setAttribute('id',ajaxFieldName);
            newElement.setAttribute('name',ajaxFieldName);
            if( url.indexOf("create.jsp") !=-1 || ajaxValues[ajaxIndex] == 'disabled'){
                newElement.setAttribute('disabled',true);
                newElement.setAttribute('value','');
            }
            else{
                newElement.setAttribute('value',ajaxValues[ajaxIndex]);
            }
            document.forms['vmForm'].appendChild(newElement);
        }
    }
    
}
