function isDefined(variable){
    return (typeof(variable) != 'undefined');
};

var multiqueryHandler = function(waitfor, handle_function){
    this.finished = 0;
    this.waitfor = waitfor;
    this.handler = handle_function;
};

var loading_layer = ' <div id="loading_layer" class="white_content" style="left: 48%;" onKeyUp = \'javascript:checkSubmission(event, "3");\'>    <img src="./images/loader.gif" />HOLA  </div>'
var phyDB = {
    /* Performs an asynchronous request to the phylomeDB core
       server. 

       If result_handler is the name of a DOM object, ajax response
       updates the HTML content of the object. If append_content
       variable is defined and is True, the response text is appended
       to current object HTML content.

       You can specify either a layer to update with AJAX response or
       a js function that will be called with the response.

       If fn(function) is not defined it can be setted automatically
       by looking a by-default actions associated to certain phyDB
       queries.

       a multiqueryHandler can be passed to control the function that
       will be executed after the last query of a group ends.

    */
    query: function(query, params, layer, fn, append_content, multiquery_handler){

	if (isDefined(layer) && layer){
	    show_layer(layer);
	    dojo.byId(layer).innerHTML = '<img align=center  src="./images/loader.gif" />';
	}

	dojo.xhrPost( {
		url: "./dbquery/"+query,
		handleAs: "text",
		timeout: 600000,
		content: params,
		node: layer,
		load: function(response, xhr){

		    if (isDefined(layer) && layer){
			var obj = dojo.byId(xhr.args.node);
			if (isDefined(append_content) && append_content){
			    obj.innerHTML += response;
			}
			else{
			    obj.innerHTML = response;
			}
		    } 
		    if (isDefined(fn) && fn!=null){
			   fn(response);
		    }

		    if (isDefined(multiquery_handler)){
			multiquery_handler.finished ++;
			if (multiquery_handler.finished == multiquery_handler.waitfor){
			    multiquery_handler.handler();
			}
		    }
		},
		error: function(response, xhr){
		    if (isDefined(layer) && layer){
			var html = '<div class="error"><img src="img/error.png"/>'+response+'<div>' ;
			var obj = dojo.byId(xhr.args.node);
			if (isDefined(append_content)){
			    obj.innerHTML += response;
			}
			else{
			    obj.innerHTML = response;
			}
		    }

		    if (isDefined(multiquery_handler)){
			multiquery_handler.finished ++;
		    }
		},
		handle: function(response, xhr){
//			hide_loading_window();		
		}
	    }
	    ) 
    },
    

    search: function(seqname, phylomes, model){
	if (!isDefined(seqname)){
	    var seqid= dojo.byId('seqid').value; 
	}
	else{

	    dojo.byId('seqid').value = seqname; 
	    var seqid = seqname;
	}
	

	if (!isDefined(phylomes)){
	    var phy_list = dojo.byId('phylome_selector_form'); 
	    // Reads the phylome ids in which search has to be performed
	    var checked_phylomes = new Array();
	    
	    if (isDefined(phy_list.phyids) & phy_list.phyids!=null){
		for (var i=0; i < phy_list.phyids.length; i++) {
		    if (phy_list.phyids[i].checked == true) {
			checked_phylomes[checked_phylomes.length] = phy_list.phyids[i].value;
		    }
		}
	    }
	}
	else{
	    var checked_phylomes = phylomes;
	}

	var at_search_end = new multiqueryHandler(2, update_history);
	// If some specific phylomes have been selected, performs
	// search on them
	console.log("phylomes selected:",checked_phylomes);
	if (checked_phylomes.length>0){

	    this.query('seqid_browser',{'seqname':seqid, 'phylomes':checked_phylomes }, "browser_layer", convert_browser_to_tree, false, at_search_end);
	    this.query('seqid_tree', {'seqname':seqid, 'phylomes':checked_phylomes, 'method':model }, "main_layer", null, false, at_search_end);
	}
	// otherwise, performs search on default phylomes (controled
	// by python server)
	else{

	    this.query('seqid_browser', {'seqname':seqid}, "browser_layer", convert_browser_to_tree, false, at_search_end);
	    this.query('seqid_tree', {'seqname':seqid }, "main_layer", null, false, at_search_end);
	}


    },

    sequence_blast_search: function() {
	var sequence = dojo.byId('blast_seq').value; 
	var phy_list = dojo.byId('phylome_selector_form'); 

	// Reads the phylome ids in which search has to be performed
	var checked_phylomes = new Array();
	if (isDefined(phy_list.phyids) & phy_list.phyids!=null){
		for (var i=0; i < phy_list.phyids.length; i++) {
		    if (phy_list.phyids[i].checked == true) {
			checked_phylomes[checked_phylomes.length] = phy_list.phyids[i].value;
		    }
		}
	    }
	// If some specific phylomes have been selected, performs
	// search on them
	if (checked_phylomes.length>0){
	    this.query('blast_hits',{'sequence':sequence, 'phylomes':checked_phylomes}, "main_layer", update_history);
	}
	// otherwise, performs search on default phylomes (controled
	// by python server)
	else{
	    this.query('blast_hits',{'sequence':sequence}, "main_layer", update_history);
	}
    }
};

function convert_browser_to_tree(data){
    if (isDefined(data) & data!=''){
	show_layer('browser_layer');
	var myTree = dhtmlXTreeFromHTML('browser_tree');
    }
	
}


function download_file(murl){
    alert(murl);
    dojo.io.iframe.send({
	url:"kkkk", timeout:3000
    });
    alert(murl);
}
