flykit.namespace("flykit.apps.flyatlasbygenebatch");

/**
 * @class
 * @constructor
 */
flykit.apps.flyatlasbygenebatch.Application = function() {
	
	var that = this;
	
	var batchgenefinder = null;
    var batchflyatlas = null;
    var bdgp = null;
    var flyted = null;
	
	
	this.initBatchGeneFinder = function() {
	    var context = "flykit.apps.flyatlasbygenebatch.Application.initBatchGeneFinder";
	    try {

            flykit.debug("instantiate a service for the batchgenefinder widget", context);
            var service = new flykit.flybase.Service("../../../conf/flybase");
            
            flykit.debug("instantiate a renderer for the batchgenefinder widget", context);
            var renderPane = $("#batchGeneFinderWidget");
            var renderer = new flykit.genefinder.BatchWidget.DefaultRenderer(); // default renderer
            renderer.setCanvas(renderPane);
            
            flykit.debug("instantiate a genefinder widget", context);
            batchgenefinder = new flykit.genefinder.BatchWidget(service, renderer);
	        
        } catch (error) {
            flykit.apps.flyatlasbygenebatch.handleError(error);
        }
	};
		
    this.initBatchFlyatlas = function() {
        var context = "flykit.apps.flyatlasbygenebatch.Application.initBatchFlyatlas";
        try {

            flykit.debug("instantiate a service for the batch flyatlas widget", context);
            var service = new flykit.flyatlas.Service();
            service.setEndpoint("../../../conf/flyatlas");
            
            flykit.debug("instantiate a renderer for the batch flyatlas widget", context);
            var renderPane = $("#batchFlyatlasWidget");
            var renderer = new flykit.flyatlas.BatchWidget.DefaultRenderer(); // default renderer
            renderer.setCanvas(renderPane);
            
            flykit.debug("instantiate a flyatlas widget", context);
            batchflyatlas = new flykit.flyatlas.BatchWidget(service, renderer);
            
        } catch (error) {
            flykit.apps.flyatlasbygenebatch.handleError(error);
        }
    };
    
    this.initBatchBdgp = function() {
        var _context = "flykit.apps.flyatlasbygenebatch.Application.initBatchBdgp";
        try {
            flykit.info("instantiate a service for the bdgp image widget", _context);
            var service = new flykit.bdgp.Service("../../../conf/bdgp");
            
            flykit.info("instantiate a renderer for the bdgp image widget", _context);
            var renderPane = document.getElementById("bdgpBatchImageWidget");
            var renderer = new flykit.bdgp.BatchWidget.DefaultRenderer();
            renderer.setCanvas(renderPane);
            
            flykit.info("instantiate a bdgp image widget", _context);
            bdgp = new flykit.bdgp.BatchWidget(service, renderer);
            
        } catch (error) {
            flykit.apps.flyatlasbygenebatch.handleError(error);
        }
    };
    
    this.initBatchFlyted = function() {
        var _context = "flykit.apps.flyatlasbygenebatch.Application.initBatchFlyted";
        try {

            flykit.info("instantiate a service for the flyted image widget", _context);
            var service = new flykit.flyted.Service("../../../conf/flyted");
            
            flykit.info("instantiate a renderer for the flyted image widget", _context);
            var renderPane = document.getElementById("flytedBatchImageWidget");
            var renderer = new flykit.flyted.BatchWidget.DefaultRenderer();
            renderer.setCanvas(renderPane);
            
            flykit.info("instantiate a flyted image widget", _context);
            flyted = new flykit.flyted.BatchWidget(service, renderer);
            
        } catch (error) {
            flykit.apps.flyatlasbygenebatch.handleError(error);
        }
    }
        
	this.init = function() {
        var context = "flykit.apps.flyatlasbygenebatch.Application.init";
        try {
    		
    		var logReader = new YAHOO.widget.LogReader("logger");

            this.initBatchGeneFinder();
            this.initBatchFlyatlas();
            this.initBatchBdgp();
            this.initBatchFlyted();

            flykit.debug("hook form submission to widget call", context);
            YAHOO.util.Event.addListener("queryForm", "submit", this.onFormSubmitted);
            
            flykit.debug("add listener for genes found event", context);
            batchgenefinder.subscribe("GENESFOUND", this.onGenesFound, null);
            
            flykit.debug("add listener for genes select event", context);
            batchflyatlas.subscribe("GENESELECTED", this.onGeneSelected, null);
            
    		flykit.debug("application loaded, showing main pane", context);
    		$("#loadingPane").hide();
    		$("#applicationPane").show();
    		
        } catch (error) {
            flykit.apps.flyatlasbygenebatch.handleError(error);
        }
	};
	
	this.onFormSubmitted = function(event) {
        var context = "flykit.apps.flyatlasbygenebatch.Application.onFormSubmitted";
        try {
            flykit.debug("form submitted", context);
            $("#errorMessage")
               .hide()
               .html("this should never be visible");
            $("#batchFlyatlasWidget").hide();
            $("#flytedBatchImageWidget").hide();
            $("#bdgpBatchImageWidget").hide();
            var query = document.getElementById("queryInput").value;
            flykit.debug("raw query: "+query, context);

            var names = query.split(" ");
            var cleannames = [];
            for (var i=0; i<names.length; i++) {
                var n = names[i];
                if (n.length > 0) {
                    cleannames[cleannames.length] = n;
                }
            }
            flykit.debug("cleaned names: "+cleannames, context);
            batchgenefinder.findGenesByAnyNameBatch(cleannames);
            

        } catch (error) {
            flykit.apps.flyatlasbygenebatch.handleError(error);
        }
	    
	};
	
    this.onGenesFound = function(type, args) {
        try {
            flykit.debug("application: genes found");
            var querynames = args[0];
            var results = args[1];

            flykit.debug("query names: "+querynames);
            
            var foundnames = [];
            var foundids = [];
            var foundgenes = [];
            
            for (var i=0;i<querynames.length;i++) {
                if (results[querynames[i]].length == 1) {
                    foundnames[foundnames.length] = querynames[i];
                    foundids[foundids.length] = results[querynames[i]][0].flybaseID;
                    foundgenes[foundgenes.length] = results[querynames[i]][0];
                    //flykit.debug("query gene symbol: "+results[querynames[i]][0].annotationSymbols, "onGenesFound");
                    //flykit.debug("query gene symbol: "+foundgenes[i].annotationSymbols, "onGenesFound");
                    //flykit.debug("query gene symbol: "+foundgenes[i].symbols, "onGenesFound");
                }else{
                    for (var k=0; k<results[querynames[i]].length; k++){
                        foundnames[foundnames.length] = querynames[i];
                        foundids[foundids.length] = results[querynames[i]][k].flybaseID;
                        foundgenes[foundgenes.length] = results[querynames[i]][k];
                    }
                }
            }
            
            //flykit.debug("found query names: "+foundnames);
            //flykit.debug("found query ids: "+foundids);
            
            batchflyatlas.getAssaysByGeneBatch(foundnames, foundgenes);
            $("#batchFlyatlasWidget").show();

            
        } catch (error) {
            flykit.apps.flyatlasbygenebatch.handleError(error);
        }
    };
    
    this.onGeneSelected = function(type, args) {
        try {
            flykit.debug("application: fire off a gene selection");
            var querynames = args[0];
            var genes = args[1];
            
            bdgp.findImagesByGeneBatch(querynames, genes);
            $("#bdgpBatchImageWidget").show();
            
            
            flyted.findImagesByGeneBatch(querynames, genes);
            $("#flytedBatchImageWidget").show();
        } catch (error) {
            flykit.apps.flyatlasbygenebatch.handleError(error);
        }
    }; 
	
	
	this.init();
};

flykit.apps.flyatlasbygenebatch.handleError = function(error) {
    flykit.err(error.name+" :: "+error.message);
    $("#errorMessage")
       .html("an error has occurred, please see the log for more details")
       .show();
};
    

// on dom ready, instantiate application
YAHOO.util.Event.onDOMReady(function() {new flykit.apps.flyatlasbygenebatch.Application();});
