/******************************
* handles mouse events for the expressionGrpah
* partial implemented in _expression_graph.rhtml
*******************************/
function expressionGraphWidget(theDiv) 
{  
//public properties
	this.rootElement = theDiv;
	this.imageWebPath = "";
	this.sivPath = "/siv";
	this.imageWidth = 210;
	this.imageHeight = 120;
	this.imageType = "primary";

//private properties
	var self = this;
  	var originalImage = new Object();
	var sivWindow = null;
	
//public methods
	this.changeImageType = function(newType) {
		trace("changing imageType to " + newType);
		if(newType != "composite" && newType != "primary" && newType != "express" && newType != "nissl")
			return(-1);
		
		this.imageType = newType;	
		//change the type for any of the stored original src values
		for(imgId in originalImage) {
			var src = originalImage[imgId];
			src = replaceImageType(src, newType)
			originalImage[imgId] = src;

			//now update all the actual images
			var img = document.getElementById(imgId);
			img.src = replaceImageType(img.src, newType);
			setBackground(img);
		}		
		trace("type changed");
	}

	this.revertImages = function() {
		this.changeImageType("primary");
		for(imgId in originalImage) {
			var img = document.getElementById(imgId);
			img.src = originalImage[imgId];			
			trace("orginal src = " + originalImage[imgId]);
		}		
	}

	this.getImageTypeString = function() {
		return(getImageTypeString(this.imageType));
	}

//object initialization
	applyBehaviors();
	
//private methods
	function applyBehaviors() {
		//apply mouseout behavior to the table containing the graphs
		var divs = self.rootElement.getElementsByTagName("div");
		for(j = 0; j < divs.length; j++) {
			if(divs[j].getAttribute("graphSeriesId")) {
				trace("applied mouseout to " + divs[j].tagName + " with graphSeriesId = " + divs[j].getAttribute("graphSeriesId"));
				divs[j].onmouseout = offStructure;
			}
		}
		//apply behaviors to the graph bars
		for(i = 0; i < divs.length; i++) {
			if(divs[i].getAttribute("structureId") !== null) {
				divs[i].onmouseover = overStructure;
				divs[i].onclick = clickStructure;
			}
		}
		//add all the orginal thumbnails to the hash table so we can recall them later
		var imgs = self.rootElement.getElementsByTagName("img");
		for(k = 0; k < imgs.length; k++) {
			if(imgs[k].getAttribute("example") !== null) {
				originalImage[imgs[k].id] = imgs[k].src;
				trace("orginal SRC = " + imgs[k].src);
			}
			//add a click handler to thumbnails to open the SIV
			if(imgs[k].getAttribute("thumbnail") !== null) {
				imgs[k].onclick=showImage;
			}
		}
	}

 	function overStructure(evt) {
    		evt = (evt) ? evt : event;
	    	var sender = (evt.target) ? evt.target : evt.srcElement;

   		var imgId = "img" + sender.getAttribute("imageseriesId");
   		var img = document.getElementById(imgId);
    
   	 	if(!originalImage[imgId])
    	    		originalImage[imgId] = img.src;
       
   	 	img.src = self.imageWebPath + "/GetImage?structure=" + sender.getAttribute("structureId") + "&imageseries=" 
					    + sender.getAttribute("imageseriesId") + "&zoom=1&width=" + self.imageWidth 
                                            + "&height=" + self.imageHeight + getImageTypeString(self.imageType);
 	}
 
 	//Invoked when the mouse moves off of the table containing
 	//the expression graph.  Unfortuanately the event also fires
 	//any time the mouse moves into any object contained _within_
 	//the table.  This routine determines which is the case.
 	function offStructure(evt) {
 	}
 
 	function clickStructure(evt) {
    		evt = (evt) ? evt : event;
	    	var sender = (evt.target) ? evt.target : evt.srcElement;

		//var sivExp = (self.imageType == "express"?"?initExp=y":"");
		var initType = getInitType("?");
    		window.open(self.sivPath + "/" + sender.getAttribute("imageseriesId") + "/" + sender.getAttribute("structureId") + initType, "siv");
 	}

	function getInitType(connector) {
		var initType = "";
		switch(self.imageType) {
			case "express":
				initType = connector + "initExp=y";
				break;
			case "nissl":
				initType = connector + "initNissl=y";
				break;
			default:
				initType = "";
		}
		return(initType);
	}

	function replaceImageType(url, newImageType) {
		var typeIndex = url.indexOf("&imgType");
		url = url.substring(0,typeIndex);
		url += getImageTypeString(newImageType);	
		return(url);
	}

	function getImageTypeString(typeName) {
		return( (typeName == "composite")?"&imgType=comp&composite=0.2,0.2,20":"&imgType=" + typeName );
	}

	function setBackground(img) {
		if(self.imageType == "express") {
			img.parentNode.style.backgroundColor = "#000000";
		} else {
			img.parentNode.style.backgroundColor = "#ffffff";
		}
	}

	function showImage(evt) {
    		evt = (evt) ? evt : event;
	    	var sender = (evt.target) ? evt.target : evt.srcElement;

		var imageId = sender.getAttribute("thumbnail");
		var initType = getInitType("&");
		var url = self.sivPath + "?imageId=" + imageId + initType;
		//url += (graphWidget.imageType=="express"?"y":"n");

		if(sivWindow !== null) {
			if(!sivWindow.closed) {
				sivWindow.location.href = url;
				return;
			}
		}

		sivWindow = window.open(url, "siv");
	}
}
