var type_names    = new Array("Author","Title","Year","Journal","Pubmed ID","Abstract","Reference","HvrBase ID","Version");
var type_values   = new Array("author","title","year","journal","pubmed_id","abstract","ref_str","ref_id","version");
var choose_names  = new Array("AND","OR","AND NOT");
var choose_values = new Array("and","or","and not");

var types = new Object();
types.all        = "field";
types.author     = "field";
types.title      = "field";
types.year       = "selection";
types.journal    = "selection";
types.pubmed_id  = "selection";
types.abstracts  = "field";
types.keyword    = "selection";
types.ref_id     = "selection";
types.version    = "field";
types.abstract   = "field";
types.ref_str    = "field";     

var rownumber = 1;

var http_request = false;
var http_request_timeout;

function makeRequest(url,cform) {

    var submitstr = formData2QueryString(cform);

    http_request = false;

    if (window.XMLHttpRequest) { 
	http_request = new XMLHttpRequest();
	if (http_request.overrideMimeType) {
	    http_request.overrideMimeType('text/xml');
	}
    } else if (window.ActiveXObject) { 
	try {
	    http_request = new ActiveXObject("Msxml2.XMLHTTP");
	} catch (e) {
	    try {
		http_request = new ActiveXObject("Microsoft.XMLHTTP");
	    } catch (e) {}
	}
    }
    
    if (!http_request) {
	alert('Ende :( No XMLHTTP-Instance found');
	return false;
    }
    http_request.onreadystatechange = get_result;
    http_request.open('POST', url, true);
    http_request.setRequestHeader('Content-Type','application/x-www-form-urlencoded');
    http_request.send(submitstr);   
    http_request_timeout = window.setTimeout("abort_xhttp_request()", 20000); // 20 Sec
}



function get_result() {
    if (http_request.readyState == 4) {
	if (http_request.status == 200) {
	    document.getElementById("result").innerHTML = http_request.responseText;
	}
	else {
	    alert('XMLHtmlRequest failed : ' + http_request.status);
	}
    }
    window.clearTimeout(http_request_timeout);
}

function abort_xhttp_request() {
   http_request.abort();
   document.getElementById("result").innerHTML = "<b>XMLHtmlRequest-Timeout</b>";
}




// The var docForm should be a reference to a <form>
function formData2QueryString(docForm) {

    var strSubmitContent = '';
    var formElem;
    var strLastElemName = '';
	
    for (i = 0; i < docForm.elements.length; i++) {
		
	formElem = docForm.elements[i];
	switch (formElem.type) {
	    // Text fields, hidden form elements
	case 'text':
	case 'hidden':
	case 'password':
	case 'textarea':
	case 'select-one':
	    strSubmitContent += formElem.name + '=' + escape(formElem.value) + '&'
		break;
				
	    // Radio buttons
	case 'radio':
	    if (formElem.checked) {
		strSubmitContent += formElem.name + '=' + escape(formElem.value) + '&'
		    }
	    break;
	    
	    // Checkboxes
	case 'checkbox':
	    if (formElem.checked) {
		// Continuing multiple, same-name checkboxes
		if (formElem.name == strLastElemName) {
		    // Strip of end ampersand if there is one
		    if (strSubmitContent.lastIndexOf('&') == strSubmitContent.length-1) {
			strSubmitContent = strSubmitContent.substr(0, strSubmitContent.length - 1);
		    }
		    // Append value as comma-delimited string
		    strSubmitContent += ',' + escape(formElem.value);
		}
		else {
		    strSubmitContent += formElem.name + '=' + escape(formElem.value);
		}
		strSubmitContent += '&';
		strLastElemName = formElem.name;
	    }
	    break;
	    
	}
    }
    
    // Remove trailing separator
    strSubmitContent = strSubmitContent.substr(0, strSubmitContent.length - 1);
    //alert ("Parameter send:" + strSubmitContent);
    return strSubmitContent;
}


function display_abstract (num) {

    var ab = document.getElementById("abstract"+num);

    if (ab.style.display == "none") {
	ab.style.display = "inline";
    }
    else {
	ab.style.display = "none";
    }
}



function change_query_mode(mode) {

    var simple  = document.getElementById("simple");
    var complex = document.getElementById("complex");

    if (complex.childNodes.length == 1) {
	/*alert("COMPLEX NOT EXIST " + complex.childNodes[0].nodeName);*/
	create_complex(complex);
    }


    if ("complex" === mode) {
	simple.style.display="none";
	complex.style.display="inline";
    }
    else {
	simple.style.display="inline";
	complex.style.display="none";
    }
}

function create_complex (complex) {

    var cform = document.createElement("form");
    cform.setAttribute("id","cform");
    cform.setAttribute("taget","_self");
    cform.setAttribute("action","javascript:makeRequest('pubsearch_response.pl',document.getElementById('cform'))");
    cform.setAttribute("method","post");

    var csubmit = document.createElement("input");
    csubmit.setAttribute("id","csubmit");
    csubmit.setAttribute("type","submit");
    csubmit.setAttribute("value","Submit");
    csubmit.setAttribute("name","formtype");

    var clink = document.createElement("a");
    clink.setAttribute("href","javascript:change_query_mode('simple')");
    clink.appendChild(document.createTextNode("back to Search"));
    /*clink.style.marginLeft="0mm";*/
    clink.style.fontSize="0.9em";
    
    var addrow = document.createElement("input");
    addrow.setAttribute("id","addrow");
    addrow.setAttribute("type","button");
    addrow.setAttribute("value","Add Row");
    addrow.setAttribute("name","Add Row");
    addrow.setAttribute("onclick","javascript:this.form.insertBefore(create_crow(),document.getElementById('csubmit'))");


    var clear = document.createElement("input");
    clear.setAttribute("id","Clear");
    clear.setAttribute("type","button");
    clear.setAttribute("value","Clear");
    clear.setAttribute("name","clear");
    clear.setAttribute("onclick","clear_form()");

    var pp = document.createElement("p");
    pp.style.margin="1.5mm 0mm";


    complex.appendChild(cform);

    for (rownumber=1; rownumber<4;) {
	if (rownumber == 1) {
	    cform.appendChild(create_crow(1));
	}
	cform.appendChild(create_crow());
    }
    cform.appendChild(csubmit);
    cform.appendChild(addrow);
    cform.appendChild(clear);
    cform.appendChild(pp);
    cform.appendChild(clink);
    

}

function clear_form () {

    var complex = document.getElementById("complex");
    complex.removeChild(document.getElementById("cform"));
    create_complex (complex);
}

function create_crow (hide_radio) {

    var crow = document.createElement("div");
    crow.setAttribute("id","crow"+rownumber);
    /*crow.style.height="1cm";*/
    crow.style.margin="2mm 3mm 2mm 3mm";
    

    var rdiv = document.createElement("div");
    rdiv.setAttribute("id","rdiv"+rownumber);
    rdiv.style.fontSize="Small";
    rdiv.style.display="inline";
    rdiv.style.marginRight="5mm";

    if (hide_radio != null) {
	rdiv.style.visibility="hidden";
    }

    for (var i=0; i < choose_names.length; i++) {
	var rradio = document.createElement("input");
	rradio.setAttribute("type","radio");
	/*rradio.setAttribute("id","rradio"+rownumber);*/
	rradio.setAttribute("name","rradio"+rownumber);
	rradio.setAttribute("value",choose_values[i]);
	if (i == 0) {
	    rradio.setAttribute("checked","checked");
	}

	rdiv.appendChild(rradio);
	rdiv.appendChild(document.createTextNode(choose_names[i]));
	/*if (i == 4) {
	    rdiv.appendChild(document.createElement("br"));
	}*/
    }


    var ctype = document.createElement("select");
    ctype.setAttribute("size",1);
    ctype.setAttribute("id","ctype"+rownumber);
    ctype.setAttribute("name","ctype"+rownumber);
    ctype.setAttribute("onchange","javascript:add_selection_field (this,"+rownumber+")");


    thisselected = "true";
    for ( var i=0; i < type_names.length; i++) { 
	var new_value = new Option(type_names[i],type_values[i], thisselected,false);
	ctype.options[ctype.length] = new_value;
	thisselected = "false";
    }
  
    var cinput = document.createElement("input");
    cinput.setAttribute("size",50);
    cinput.setAttribute("id","sstring_"+rownumber);
    cinput.setAttribute("name","sstring_"+rownumber);


    crow.appendChild(rdiv);
    crow.appendChild(ctype);
    crow.appendChild(cinput);
   
    rownumber++;
    return(crow);
}    


function add_selection_field (crow,rnumber) {

    var infield_old =  document.getElementById("sstring_"+rnumber);

    switch (types[crow.value]) {
    case "field":
	
	if (infield_old.nodeName == "INPUT") {
	    //alert("BREAK: INPUT EXIST")
	    break;
	}

	var infield = document.createElement("input");
	infield.setAttribute("size",50);
	infield.setAttribute("id","sstring_"+rnumber);
	infield.setAttribute("name","sstring_"+rnumber);
	crow.parentNode.replaceChild(infield,infield_old);
	
	//alert("ADD FIELD");
	break;
    case "selection":

	var infield = create_dropdown_search(crow.value,rnumber);

	crow.parentNode.replaceChild(infield,infield_old);
	//alert("ADD SELECTION");
	break;
    default:
	alert("Wrong parameter for " + type + types[type]); 
    }
  
}
      

function create_dropdown_search(type,rnumber) {

    var box = document.createElement("select");
    box.setAttribute("size",1);
    box.setAttribute("id","sstring_"+rnumber);
    box.setAttribute("name","sstring_"+rnumber);
    box.style.width="110mm";

    var thisselected = "true";

    switch (type) {

    case "journal":   
	for ( var i=0; i < journal_names.length; i++) { 
	    var new_value = new Option(journal_names[i],journal_values[i], thisselected,false);
	    box.options[box.length] = new_value;
	    thisselected = "false";
	}
	break;

    case "pubmed_id":   
	for ( var i=0; i < pubmed_names.length; i++) { 
	    var new_value = new Option(pubmed_names[i],pubmed_values[i], thisselected,false);
	    box.options[box.length] = new_value;
	    thisselected = "false";
	}
	break;	
    case "year":   
	for ( var i=0; i < year_names.length; i++) { 
	    var new_value = new Option(year_names[i],year_values[i], thisselected,false);
	    box.options[box.length] = new_value;
	    thisselected = "false";
	}
	break;
    case "ref_id":   
	for ( var i=0; i < refid_names.length; i++) { 
	    var new_value = new Option(refid_names[i],refid_values[i], thisselected,false);
	    box.options[box.length] = new_value;
	    thisselected = "false";
	}
	break;	

    default:

	var new_value = new Option("DEFAULT", "1", false, true);
	box.options[box.length] = new_value;
	break;
    } 
    return(box);
}

