//Dependencies: acssearch.aspx, prototype.js
//This service is incomplete -  hard coded for Relay COE results
//TODO make all query params ACSSearch Criteria objects, JSON serialized, and complete the remaining services

function COEService(){

	COEService.prototype.proxyURL = 'http://labs.cancer.org/acssearch.aspx';
	COEService.prototype.results = {};
		
	COEService.prototype.getEvents = function(  zip, radius, city, state, onSuccess, onFailure, onException ){
	
		COEService.prototype.onSuccess = onSuccess;

		var requestXML	= '<request><type>coe</type><input><COECriteria><City>';
		requestXML	+= ( city.length > 0 )? city : '';
		requestXML	+= '</City><State>';
		requestXML	+= ( state.length > 0 )? state : '';
		requestXML  += '</State><ZipCode>';
		requestXML	+= ( zip.length > 0 )? zip : '';
		requestXML	+= '</ZipCode><SortTerm>Distance</SortTerm><Page StartRecord="0" RecordCount="100" />';
		requestXML  += '<PastAndFuture>false</PastAndFuture><COEEventTypes><SearchAllEventTypes>false'
		requestXML	+= '</SearchAllEventTypes><EventTypes><COEEventType EventTypeID="5"><Name />'
		requestXML	+= '<Title /><Description /><Location /></COEEventType></EventTypes></COEEventTypes>'
		requestXML	+= '<Radius>'+radius+'</Radius></COECriteria></input></request>';

		new Ajax.Request( this.proxyURL, {
			method:'post',
			contentType:'text/xml',
			postBody:requestXML,
			onSuccess: function( transport ) {
			//alert( transport.responseText );
				COEService.prototype.parseEventXML( transport.responseText );
			},		
			onFailure : onFailure,
			onException : onException
		});	
	}
	
	COEService.prototype.getEventDetails = function( EventID, onSuccess  ){
		new Ajax.Request( this.proxyURL, {
			method:'post',
			contentType:'text/xml',
			postBody:'<request><type>coeEventDetails</type><input>'+ EventID +'</input></request>',
			onException:function( obj, ex ){
				//alert("Exception : " +ex);
			},
			onFailure:function( transport ){
				alert("There has been an error. Failure : " + transport.responseText);
			},
			onSuccess:  onSuccess

		});
	}

	COEService.prototype.getXMLDOM = function( xmlText ){
		try { 	return new DOMParser().parseFromString( xmlText, 'text/xml'); }	catch(e){}
		try {	var xmldom = new ActiveXObject('Microsoft.XMLDOM');
				xmldom.async="false";
				xmldom.loadXML( xmlText );
				return xmldom;
		}catch(e){}
	}
		
	COEService.prototype.xmlToObject = function( xmlNode){
		//TODO complete recursive serialization utility that handles all node types and attributes
		var obj = {};
		var numChildren = xmlNode.childNodes.length;
		
		for( var i=0; i<numChildren; i++ ){
			var child = xmlNode.childNodes[i];			
			if (child && child.firstChild && child.firstChild.nodeValue) {
				obj[ child.nodeName ] = child.firstChild.nodeValue;
			}
		}
		return obj;
	}	

	COEService.prototype.formatDecimal = function( dmsStr ){
		var len =  dmsStr.length;
		var deg =  dmsStr.substring( 0, len-4);
		var dec =  dmsStr.substring( len-4, len ); 
		return deg +'.'+dec;
	}
	
		
	COEService.prototype.parseEventDetailsXML = function ( xmlText ){
		var xmldom = this.getXMLDOM( xmlText );
		var details = xmldom.getElementsByTagName('COEEventDetails')[0]; 	
		
		var obj = this.xmlToObject( details );	
			
		this.results[ obj.EventID ].eventDetails = obj;
		
	}
	
	COEService.prototype.parseEventXML = function ( xmlText ){ 
		var xmldom = this.getXMLDOM( xmlText );
		var events = xmldom.getElementsByTagName('COEEvent'); 
		var numEvents = events.length;
		
		if( numEvents > 0 ){
		
			for( var i=0; i<numEvents-1; i++ ){
				var obj = this.xmlToObject( events[i] );
				obj.EventID = events[i].getAttribute("EventID");
				obj.Longitude = this.formatDecimal( obj.Longitude );
				obj.Latitude = this.formatDecimal( obj.Latitude );			
				obj.Address = events[i].getElementsByTagName('Address')[0].getElementsByTagName('Address1')[0].childNodes[0].nodeValue;
				obj.City = events[i].getElementsByTagName('Address')[0].getElementsByTagName('City')[0].childNodes[0].nodeValue;
				obj.State = events[i].getElementsByTagName('Address')[0].getElementsByTagName('State')[0].childNodes[0].nodeValue;
				this.results[ obj.EventID ] = { event:obj };
				this.getEventDetails( obj.EventID  , function( transport ){
					COEService.prototype.parseEventDetailsXML( transport.responseText );		
				});
			}
			
			var last = events[numEvents-1];
			var obj = this.xmlToObject( last );
			obj.EventID = last.getAttribute("EventID");
			obj.Longitude = this.formatDecimal( obj.Longitude );
			obj.Latitude = this.formatDecimal( obj.Latitude );
			obj.Address = last.getElementsByTagName('Address')[0].getElementsByTagName('Address1')[0].childNodes[0].nodeValue;
			obj.City = last.getElementsByTagName('Address')[0].getElementsByTagName('City')[0].childNodes[0].nodeValue;
			obj.State = last.getElementsByTagName('Address')[0].getElementsByTagName('State')[0].childNodes[0].nodeValue;
			this.results[ obj.EventID ] = { event:obj };
			
			this.getEventDetails( obj.EventID , function( transport){
					COEService.prototype.parseEventDetailsXML( transport.responseText );
					COEService.prototype.onSuccess( COEService.prototype.results );		
			});
				
		}					
	}	
	

	
}

