State.Inherits(Map);
function State(name){
	if(typeof(name) == "undefined"){
		name = "State";
	}
	
	this.Inherits(Map, name);
	
	this.height += 30;
	
	this.coordOrigin = 0; 
	this.top = 15;
	this.left = 0;
	this.pfColor = "#fcfcd9";
	this.psColor = "#a9cb96";
	this.phColor = "#fadc5e";
	this.psSize = 1;
	this.activefColor = "#c0dbb2";
	this.inactivefColor = "#fcfcd9";
	this.ftColor = "#6d6d6d";
	this.htColor = "#454545";
	
}

State.prototype.init = function(canvas){
	this.initMap(canvas);
	var stateName = new QueryString().get("stateName");
	this.canvas.appendChild(this.draw(stateName));
	this.prepareStateFill();
}

State.prototype.draw = function(stateName){
	var state = this.getData(stateName);
	var len = state.length;
	
	var self = this;
	switch(getBrowser()){
		case "Explorer":{
			var vmlGroup = document.createElement("v:group");
			vmlGroup.style.width = self.width;
			vmlGroup.style.height = self.height;
			vmlGroup.setAttribute("coordsize", self.width + " " + self.height);
			
			for(var i=0; i<len; i++){		
				var polygon = new Polygon();
				polygon.width = self.width;
				polygon.height = self.height;
				polygon.fillColor = self.pfColor;
				polygon.strokeColor = self.psColor;
				polygon.strokeSize = self.psSize;
				polygon.opacity = self.opacity;
				polygon.create(state[i].code, state[i].coordinate);
				
				sPolygon = polygon.polygon;
				
				vmlGroup.appendChild(sPolygon);
				
				try{
					text = new Text();
					for(j=0; j<state[i].city.length; j++){
						cityLeft = state[i].city[j].left - 5;
						cityTop = state[i].city[j].top + 5;
						
						text.fSize = 10;
						text.fColor = self.ftColor;
						sPolygon.appendChild(text.draw(state[i].city[j].name, cityLeft, cityTop));
					}
					
				}catch(ex){}
				
			}
			self.drawingCanvas = vmlGroup;
			return vmlGroup;
			break;
		}default:{
			var svg_ns = 'http://www.w3.org/2000/svg'; 
			var xhtml_ns = 'http://www.w3.org/1999/xhtml'; 
			
			var embed = document.createElement("embed");
			embed.src = "svg/svg.svg";
			embed.type = "image/svg+xml";
			embed.width = this.width;
			embed.height = this.height;
			embed.style.position = "absolute";
			 
			embed.addEventListener('load', function (evt) {
				var svgDoc = this.getSVGDocument();
				svgDoc.height = this.height;
				svgDoc.width = this.width;
				
				for(i=0; i<len; i++){
					var polygon = new Polygon();
					polygon.width = self.width;
					polygon.height = self.height;
					polygon.fillColor = self.pfColor;
					polygon.strokeColor = self.psColor;
					polygon.strokeSize = self.psSize;
					polygon.opacity = self.opacity;
					polygon.create(state[i].code, state[i].coordinate);
					
					sPolygon = polygon.polygon;
					
					svgDoc.documentElement.appendChild(sPolygon);
					
					try{
						text = new Text();
						for(j=0; j<state[i].city.length; j++){
							cityLeft = state[i].city[j].left - 5;
							cityTop = state[i].city[j].top + 5;
							
							text.fSize = 10;
							text.fColor = self.ftColor;
							sPolygon.appendChild(text.draw(state[i].city[j].name, cityLeft, cityTop));
						}
						
					}catch(ex){}
					
				}
				self.drawingCanvas = svgDoc;
				
			}, false);
			return embed;
			break;
		}
	}
}


State.prototype.prepareStateFill = function(){
	var dataAccess = new DataAccess();
	var self = this;
	
	var progressBar = showProgressBar(this.canvas);
	progressBar.style.display = "block";
	this.canvas.appendChild(progressBar);
	
	var queryString = new QueryString();
	var stateName = queryString.get("stateName");
	var request=dataAccess.getRequest();
	request.onreadystatechange = function(){
		if (request.readyState==4){
			if (request.status==200 || window.location.href.indexOf("http")==-1){
				if(request.responseXML != null){
					var responseRoot = request.responseXML.documentElement;
					if(responseRoot != undefined){
						dataAccess.prepareTree(responseRoot);
						var xmlData = dataAccess.parseDocument(responseRoot);
						xmlData = xmlData["gov.fec.map"];
					
					
						switch(getBrowser()){
							case "Explorer":{
								var tooltip = new Tooltip().create();
								
								var stateGroup = self.drawingCanvas.getElementsByTagName("group");
								var stateLen = stateGroup.length;
								
								for(var i=0; i<stateLen; i++){
									var vmlGroup = stateGroup[i];
									
									if(vmlGroup.id == stateName){
										vmlGroup.title = "State: " + vmlGroup.id;
										
										var arrBodyText = xmlData.state.tooltip.split("<br/>");
										vmlGroup.bodyText = arrBodyText;
										vmlGroup.link = xmlData.state.link;
										vmlGroup.tooltip = tooltip;
										
										vmlGroup.onmouseover = function(event){self.MouseOver(event);};
										vmlGroup.onmouseout = function(event){self.MouseOut(event);};
										vmlGroup.onmousemove = function(event){self.MouseMove(event);};
										vmlGroup.onclick = function(event){self.MouseClick(event);};
									}	
								}
			
								self.drawingCanvas.appendChild(tooltip.vmlTooltip);
								break;
							}default:{
								var svgDoc = self.drawingCanvas;
								svgDoc.height = self.height;
								svgDoc.width = self.width;
								
								var tooltip = new Tooltip().create(svgDoc);
								
								for(var i=0; i<svgDoc.getElementsByTagName("g").length; i++){
									var svgGroup = svgDoc.getElementsByTagName("g")[i];
									svgGroup.title = "State: " + svgGroup.id;
									
									var arrBodyText = xmlData.state.tooltip.split("<br/>");
									svgGroup.bodyText = arrBodyText;
									svgGroup.fillColor = self.pfColor;
									svgGroup.link = xmlData.state.link;
									svgGroup.tooltip = tooltip;
									
									
									svgGroup.addEventListener("mouseover", function(event){self.MouseOver(event);}, false);
									svgGroup.addEventListener("mouseout", function(event){(self.MouseOut(event));}, false);
									svgGroup.addEventListener("click", function(event){(self.MouseClick(event));}, false);
									svgGroup.addEventListener("mousemove", function(event){(self.MouseMove(event));}, false);
								}
								svgDoc.documentElement.appendChild(tooltip.svgTooltip);
								break;
							}
						}
					}
				}
			}/*else{
				alert("An error has occured making the request");
			}*/
			
			progressBar.style.display = "none";
		}
	}
    
	request.open("POST", "houseSenateSenateMapApp.do", true);
	request.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
	request.send("drillLevel=state&stateName="+stateName+"&election_yr="+getElectionYear());
}

State.prototype.MouseOver = function(e){
	var workElement = (e==undefined)? event.srcElement : e.currentTarget;
	
	switch(getBrowser()){
		case "Explorer":{
			var vmlGroup = workElement.parentNode;
			while(vmlGroup.nodeName != "group"){
				vmlGroup = vmlGroup.parentNode;
			}
			vmlGroup.style.cursor = "hand";
			
			for(var i=0; i<vmlGroup.childNodes.length; i++){
				if(vmlGroup.childNodes[i].nodeName == "textbox"){
					vmlGroup.childNodes[i].fillColor = this.ftColor;
				}else if(vmlGroup.childNodes[i].nodeName == "shape"){
					vmlGroup.childNodes[i].fillColor = this.phColor;
				}
			}
			vmlGroup.tooltip.setTitle(vmlGroup.title);
			vmlGroup.tooltip.setBodyText(vmlGroup.bodyText);
			vmlGroup.tooltip.show();
			break;
		}
		default:{
			this.defaultFillColor = workElement.childNodes[0].getAttribute("fill");
			for(i=0; i<workElement.childNodes.length; i++){
				if(workElement.childNodes[i].nodeName == "text"){
					workElement.childNodes[i].setAttributeNS(null, "fill", this.ftColor);
				}else{
					workElement.childNodes[i].setAttributeNS(null, "fill", this.phColor);
				}
			}
			
			workElement.style.cursor = "pointer";
			
			workElement.tooltip.setTitle(workElement.title);
			workElement.tooltip.setBodyText(workElement.bodyText);
			workElement.tooltip.show();
			
			break;
		}
	}
}

State.prototype.MouseOut = function(e){
	var workElement = (e==undefined)? event.srcElement : e.currentTarget;
	
	switch(getBrowser()){
		case "Explorer":{
			var vmlGroup = workElement.parentNode;
			while(vmlGroup.nodeName != "group"){
				vmlGroup = vmlGroup.parentNode;
			}
			vmlGroup.style.cursor = "hand";
			
			for(var i=0; i<vmlGroup.childNodes.length; i++){
				if(vmlGroup.childNodes[i].nodeName == "textbox"){
					vmlGroup.childNodes[i].fillColor = this.ftColor;
				}else if(vmlGroup.childNodes[i].nodeName == "shape"){
					vmlGroup.childNodes[i].fillColor = this.pfColor;
				}
			}
			
			vmlGroup.tooltip.hide();
			
			break;
		}
		default:{
			for(var i=0; i<workElement.childNodes.length; i++){
				if(workElement.childNodes[i].nodeName == "text"){
					workElement.childNodes[i].setAttributeNS(null, "fill", this.ftColor);
				}else{
					workElement.childNodes[i].setAttributeNS(null, "fill", this.pfColor);
				}
			}
	
			workElement.tooltip.hide();
			
			break;
		}
	}
}

State.prototype.MouseClick = function(e){
	var workElement = (e == undefined)? event.srcElement : e.currentTarget;
	
	switch(getBrowser()){
		case "Explorer":{
			var vmlGroup = workElement.parentNode;
			while(vmlGroup.nodeName != "group"){
				vmlGroup = vmlGroup.parentNode;
			}
			
			if(vmlGroup.link != undefined)
				window.location.replace(vmlGroup.link);
			break;
		}default:{
			if(workElement.link != undefined)
				window.location.replace(workElement.link);
			break;
		}
	}
}


State.prototype.MouseMove = function(e){
	var workElement = (e==undefined)? event.srcElement : e.currentTarget;
	
	switch(getBrowser()){
		case "Explorer":{
			var vmlGroup = workElement.parentNode;
			while(vmlGroup.nodeName != "group"){
				vmlGroup = vmlGroup.parentNode;
			}
			
			vmlGroup.tooltip.resetPosition(event.x, event.y);
			
			break;
		}default:{
			workElement.tooltip.resetPosition(e.clientX, e.clientY);
			break;
		}
	}
}

State.prototype.getData = function(stateName){
	var dataAccess = new DataAccess();
	var mapData = dataAccess.getXmlData("_xml/states/"+stateName+".xml");
	
	var state = new Array();
	if(mapData.state.length != undefined){
		for(var i=0; i<mapData.state.length; i++){
			state[i]= new Object();
			state[i].code = mapData.state.district[i].code;
			state[i].left = Math.ceil(mapData.state[i].x * this.zoomFactor);
			state[i].top = Math.ceil(mapData.state[i].y * this.zoomFactor);
			state[i].centerX = Math.ceil(mapData.state[i].center_x * this.zoomFactor);
			state[i].centerY = Math.ceil(mapData.state[i].center_y * this.zoomFactor);
			
			var coordLen = 1;
			if(typeof(mapData.state[i].coordinate) == "object"){
				coordLen = mapData.state[i].coordinate.length;
			}
			
			var coordinate = new Array(coordLen);
			if(coordLen != 1){
				for(var j=0; j<coordLen; j++){
					coord = mapData.state[i].coordinate[j].split(",");
					
					var pointArray = new Array();
					
					for(var k=0; k<coord.length; k+=2){
						var point = new Point((state[i].left + Math.ceil(coord[k] * this.zoomFactor)), (state[i].top + Math.ceil(coord[k+1] * this.zoomFactor)));
						
						pointArray.push(point);
						delete point;
					}
					
					coordinate[j] = new Object();
					coordinate[j] = pointArray;
				}
				
			}else{
				coord = mapData.state[i].coordinate.split(",");
				pointArray = new Array();
				
				for(k=0; k<coord.length; k+=2){
					point = new Point((state[i].left + Math.ceil(coord[k] * this.zoomFactor)), (state[i].top + Math.ceil(coord[k+1] * this.zoomFactor)));
					pointArray.push(point);
					delete point;
				}
				
				coordinate[0] = new Object();
				coordinate[0] = pointArray;
			}
			
			state[i].coordinate = coordinate;
			
			try{
				var cityLen = 1;
				if(typeof(mapData.state.city) == "object"){
					cityLen = mapData.state.city.length;
				}
				var city = new Array(cityLen);
				if(cityLen != 1){
					for(j=0; j<cityLen; j++){
						city[j] = new Object();
						city[j].name = mapData.state[i].city[j].name;
						city[j].left = Math.ceil(mapData.state[i].city[j].x * this.zoomFactor);
						city[j].top = Math.ceil(mapData.state[i].city[j].y * this.zoomFactor);
					}
					
				}else{
					city[0] = new Object();
					city[0].name = mapData.state.city.name;
					city[0].left = Math.ceil(mapData.state[i].city.x * this.zoomFactor);
					city[0].top = Math.ceil(mapData.state[i].city.y * this.zoomFactor);
				}
				
				state[i].city = city;
			}catch(ex){}
		}
	}else{	
		state[0] = new Object();
		state[0].code = mapData.state.code;
		state[0].left = Math.ceil(mapData.state.x * this.zoomFactor);
		state[0].top = Math.ceil(mapData.state.y * this.zoomFactor);
		state[0].centerX = Math.ceil(mapData.state.center_x * this.zoomFactor);
		state[0].centerY = Math.ceil(mapData.state.center_y * this.zoomFactor);
		
		coordLen = 1;
		if(typeof(mapData.state.coordinate) == "object"){
			coordLen = mapData.state.coordinate.length;
		}
		
		coordinate = new Array(coordLen);
		if(coordLen != 1){
			for(j=0; j<coordLen; j++){
				coord = mapData.state.coordinate[j].split(",");
				
				var pointArray = new Array();
				
				for(var k=0; k<coord.length; k+=2){
					var point = new Point((state[0].left + Math.ceil(coord[k] * this.zoomFactor)), (state[0].top + Math.ceil(coord[k+1] * this.zoomFactor)));
					
					pointArray.push(point);
					delete point;
				}
				
				coordinate[j] = new Object();
				coordinate[j] = pointArray;
			}
			
		}else{
			coord = mapData.state.coordinate.split(",");
			pointArray = new Array();
			
			for(k=0; k<coord.length; k+=2){
				point = new Point((state[0].left + Math.ceil(coord[k] * this.zoomFactor)), (state[0].top + Math.ceil(coord[k+1] * this.zoomFactor)));
				pointArray.push(point);
				delete point;
			}
			
			coordinate[0] = new Object();
			coordinate[0] = pointArray;
		}
		
		state[0].coordinate = coordinate;
		
		try{
			cityLen = 1;
			if(typeof(mapData.state.city) == "object"){
				cityLen = mapData.state.city.length;
			}
			city = new Array(cityLen);
			if(cityLen != 1){
				for(j=0; j<cityLen; j++){
					city[j] = new Object();
					city[j].name = mapData.state.city[j].name;
					city[j].left = Math.ceil(mapData.state.city[j].x * this.zoomFactor);
					city[j].top = Math.ceil(mapData.state.city[j].y * this.zoomFactor);
				}
				
			}else{
				city[0] = new Object();
				city[0].name = mapData.state.city.name;
				city[0].left = Math.ceil(mapData.state.city.x * this.zoomFactor);
				city[0].top = Math.ceil(mapData.state.city.y * this.zoomFactor);
			}
			
			state[0].city = city;
		}catch(ex){}
		
	}
	
	return state;
}