
// create a namespace if not already defined
flykit.namespace("flykit.flytedstage");




flykit.flytedstage.provenance = "retrieved on 2010-07-09";

/**
 * TODO doc me
 */
flykit.flytedstage.Service = function (endpointURL) {
	/**
	 * @private
	 */
	this._endpoint = endpointURL;
};

// extend
flykit.flytedstage.Service.prototype = new flykit.sparql.Service();



/**
 * TODO doc me
 */
flykit.flytedstage.Service.prototype.findProbesExpressedInStage = function( stageName, success, failure ) {
    var _context = "flykit.flytedstage.Service.prototype.findProbesExpressedInStage";
	try {
		flykit.info("stageName: "+stageName, _context);
        var successChain = flykit.chain(flykit.flytedstage.Service.responseToGenes, success);	
		var query = flykit.flytedstage.Service._buildQueryForFindProbesExpressedInStage(stageName);
		this.postQuery(query, successChain, failure);
	}catch (error) {
        throw new flykit.UnexpectedException(_context, error);
    }
};




/**
 * TODO doc me
 */
flykit.flytedstage.Service.prototype.findProbesExpressedInStageBatch = function( stageNames, success, failure ) {
    var _context = "flykit.flytedstage.Service.prototype.findProbesExpressedInStage";
	try {
		
        var successChain = flykit.chain(flykit.flytedstage.Service.responseToGenes, success);	
		var query = flykit.flytedstage.Service._buildQueryForFindProbesExpressedInStageBatch(stageNames);
		this.postQuery(query, successChain, failure);
	}catch (error) {
        throw new flykit.UnexpectedException(_context, error);
    }
};





flykit.flytedstage.Service.responseToGenes = function( response ) {
    var _context = "flykit.flytedstage.Service.responseToGenes";
    try {
        flykit.debug("response status: "+response.status, _context);
        flykit.debug("try parsing response text as json", _context);
        flykit.debug("response text: "+response.responseText, _context);
        var resultSet = YAHOO.lang.JSON.parse(response.responseText);
        flykit.debug("convert result set to an array of genes", _context);
        var genes = flykit.flytedstage.Gene.newInstancesFromSPARQLResults(resultSet);
        return genes;
    } catch (e) {
        flykit.debug("caught "+e.name+", "+e.message, _context);
        throw new flykit.UnexpectedException(_context, e);
    }
};









/**
 * Build a SPARQL query to retrieve probes by expression stage
 * @param {String} stageName the development stage name to search by
 * @return a SPARQL query
 * @type String
 * @private
 * @static
 */
flykit.flytedstage.Service._buildQueryForFindProbesExpressedInStage = function( stageName ) {

    var _context = "flykit.flytedstage.Service._buildQueryForFindProbesExpressedInStage";

	try {
		var prefixes = 	"PREFIX flyted: <http://purl.org/net/flyted/schema/> \n" +
						"PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> \n" +
						"PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#> \n";
						
		var body = 		"SELECT DISTINCT ?probe ?flybase\n" +  
		                //"FROM <http://purl.org/net/dataset/flyted-latest>\n" + 
		                "WHERE { \n" +
							"?image " +
								"flyted:expression <http://purl.org/net/open-biomed/id/flyted/expression/" + stageName + "> ; \n" +
								"flyted:probe ?probe .\n" +
							"?probe flyted:hybridisesTranscriptOf ?flybase .\n" +	
						"}";
							
		var query = prefixes + body;
		
		flykit.debug("query :" + query, _context);
	
		return query;
	}catch (error) {
        throw new flykit.UnexpectedException("flykit.flytedstage.Service._buildQueryForFindProbesExpressedInStage", error);
    }
};






/**
 * Build a SPARQL query to retrieve probes by expression stage
 * @param {String} stageName the development stage name to search by
 * @return a SPARQL query
 * @type String
 * @private
 * @static
 */
flykit.flytedstage.Service._buildQueryForFindProbesExpressedInStageBatch = function( stageNames ) {

    var _context = "flykit.flytedstage.Service._buildQueryForFindProbesExpressedInStage";

	try {
		var prefixes = 	"PREFIX flyted: <http://purl.org/net/flyted/schema/> \n" +
						"PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> \n" +
						"PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#> \n";
						
		var head = 		"SELECT DISTINCT ?probe ?flybase\n" +  
		                //"FROM <http://purl.org/net/dataset/flyted-latest>\n" + 
		                "WHERE { \n" +
							"?image flyted:expression " ;
							
        var body = "";
        
        for (var i = 0 ; i < stageNames.length-1; i ++) {
            body += "    <http://purl.org/net/open-biomed/id/flyted/expression/" + stageNames[i] + "> , \n";
        }
        
        body += "    <http://purl.org/net/open-biomed/id/flyted/expression/" + stageNames[stageNames.length-1] + "> . \n" + 
				"    ?image flyted:probe ?probe .\n" +
				"?probe flyted:hybridisesTranscriptOf ?flybase .\n" +	
			    "}";
							
		var query = prefixes + head + body;
		
		flykit.debug("query :" + query, _context);
	
		return query;
	}catch (error) {
        throw new flykit.UnexpectedException("flykit.flytedstage.Service._buildQueryForFindProbesExpressedInStage", error);
    }
};



flykit.flytedstage.Gene = function () {

    this.probeURI = null;
    
    this.probeLabel = null;
    
    this.flybase = null;
};





/**
 * TODO doc me
 */
flykit.flytedstage.Gene.newInstancesFromSPARQLResults = function(resultSet){

    var _context = "flykit.flytedstage.Gene.newInstancesFromSPARQLResults";
    
	try {
		var bindings = resultSet.results.bindings;
		
		var probes = new Array();
		
		for (var i=0; i<bindings.length; i++) {
		
		    var probe = new flykit.flytedstage.Gene();
		    
			var binding = bindings[i];
			
			var probeURI = binding.probe.value;
			
			probe.probeURI = probeURI;
			
			probe.probeLabel = probeURI.substring(probeURI.indexOf("probe/")+6, probeURI.length);
			
			//flykit.debug("probe label :" + probe.probeLabel, _context);
			
			probe.flybase = binding.flybase.value;
			
			probes[probes.length] = probe;
		}	
		
		return probes;
		
	}catch (error) {
        throw new flykit.UnexpectedException("flykit.flytedstage.Gene.newInstancesFromSPARQLResults", error);
    }
};
