/**
 * @author Alex Lapinski @ AA | RF
 * 
 */

window.addEvent("domready",function(){
	
	if( document.getElementById("clear-policies") ) {
	    var clearFilterBtn = document.getElementById("clear-policies");
	    
	    var eventName = "click";
	    var eventHandler = function() { 
            var clearURL = window.location.href.replace(/(.*)&policyID=[0-9]+&color=[a-zA-Z]+/i,"$1");
            window.location.replace(clearURL);
	    };
	    
	    if( clearFilterBtn.addEventListener ) {
	        clearFilterBtn.addEventListener(eventName,eventHandler,false);
        } else if ( clearFilterBtn.attachEvent ) {
            clearFilterBtn.attachEvent("on"+eventName,eventHandler);
        }
	}
	
	// Map Areas (Image Map Area elements)
	
	var imageMap_MapAreas = document.getElements("div#map map area").filter(function(item){return $defined(item.getProperty("alt"));});
	
	if(  !$defined(document.getElement("div#map img")) || !$defined(imageMap_MapAreas) || imageMap_MapAreas.length == 0 ) return;
	
	var mapImgCoords = document.getElement("div#map img").getCoordinates();
	
	// All of those areas that have an alt tag, must have a pin on them,
	// The color of the pin is related to the color of the policy pin (on the input)
	
	var stateHashMap = Object();
	var keys = [];
	
	// Verify the Coords are in the proper range
	imageMap_MapAreas.filter(function(item){ return validCoords(item.getProperty("coords")); });
	
	// Create a hash map of the states
	imageMap_MapAreas.each(function(item){
		
		// Verify the Coords are in the proper range
		if( !validCoords(item.getProperty("coords")) ) return;
			
		
		if( !stateHashMap.hasOwnProperty(item.getProperty("alt")) ) {
			// Add an entry
			stateHashMap[item.getProperty("alt")] = new Object();
			
			stateHashMap[item.getProperty("alt")]["coords"] = item.getProperty("coords");
			stateHashMap[item.getProperty("alt")]["area"] = calculateArea(item.getProperty("coords"));
			keys.push(item.getProperty("alt"));
			
		} else { // Update an entry
			var key = item.getProperty("alt");
			
			var newCoords = item.getProperty("coords");
			
			var oldArea = stateHashMap[key].area;
			var newArea = calculateArea(newCoords);
			
			// Essentially, pick the biggest area and make that the state
			if (newArea > oldArea) {
				stateHashMap[key]["coords"] = newCoords;
				stateHashMap[key]["area"] = newArea;
			}
		}
		
	});
	
	var imageDimensions = new Object();
	imageDimensions["blue"] =   { h: 20, w: 23, x: 6, y: 18 };
	imageDimensions["green"] =  { h: 19, w: 23, x: 3, y: 18 };
	imageDimensions["purple"] = { h: 20, w: 23, x: 4, y: 18 };
	imageDimensions["red"] =    { h: 20, w: 23, x: 7, y: 18 };
	imageDimensions["yellow"] = { h: 20, w: 23, x: 6, y: 18 };
	
	keys.each(function(key){
		
			var centroid = calculateCentroid(key,stateHashMap);
			
			// use the center point to position the thumbtack
				 // (for now, just use the coordinate to place the thubtacks upper left.)

			var PinImgElement = new Element("img");
			
			var selectedInput = document.getElements("div.policies div.policies-inner ul li input[type=radio]");
			selectedInput = selectedInput.filter(function(item){return item.getProperty("checked"); });
			
			var color = selectedInput.getParent().getProperty("class");
			PinImgElement.src = "/_assets/images/vital-signs/pushpin-"+color+".png";
			PinImgElement.setStyles({
				
				// All pushpin images are not the same height, so the pixel where the pin starts is defined above
				// within the ImageDimensions Object
				position:"absolute",
				left: mapImgCoords.left + centroid.x - imageDimensions[color].x - 17,
				top: mapImgCoords.top + centroid.y - imageDimensions[color].y,
				zIndex: 10
			});
			
			PinImgElement.inject(document.body);
	});
	
});


function calculateArea(csvListCoords) {
	var coordsArr = csvListCoords.split(",");
	var N = coordsArr.length / 2;
	
	var temp = 0;
	for(var i = 0; i < N*2; i+=2) {

		var Xi = Number(coordsArr[i]);
		var Yi = Number(coordsArr[i+1]);

		var Xi_1; //Xi+1
		var Yi_1; //Yi+1
		if( (i/2)+2 > N ) { // Last point === first point
			Xi_1 = Number(coordsArr[0]);
			Yi_1 = Number(coordsArr[1]);
		} else {
			Xi_1 = Number(coordsArr[i+2]);
			Yi_1 = Number(coordsArr[i+3]);
		}
		
		temp += ( ( Xi * Yi_1 ) - ( Xi_1 * Yi ) );
	}
	
	return temp / 2.0;
}

function calculateCentroid(key,hashMap) {
	var centroid = {x:0,y:0};
	
	var coords = hashMap[key].coords.split(",");
	var N = coords.length / 2;
	
	var sumX = 0;
	var sumY = 0;
	
	for( var i = 0; i < N*2; i+=2 ) {
		var Xi = Number(coords[i]);
		var Yi = Number(coords[i+1]);

		sumX += Xi;
		sumY += Yi;
	}
	
	centroid.x = (sumX) / N;
	centroid.y = (sumY) / N;
	
	return centroid;
}

function validCoords(src_coords) {
	var arrCoords = src_coords.split(",");
	var returnVar = true;
	
	for(var i = 0; i < arrCoords.length; i+=2) {
		var leftOffset = parseInt(arrCoords[i]);
		var topOffset = parseInt(arrCoords[i+1]);
		
		returnVar = returnVar && ( topOffset > 10 && topOffset < 180 && leftOffset > 520 && leftOffset < 700);
	
		if( returnVar == false ) return returnVar;
	}
	
	return returnVar;
}

