//************************************
//*	MILESPLIT.AJAX
//* By Jason Byrne

///////////////////////////////////////////
// VARIABLES

var MileSplit_ApiKey = '3421-742-173-641';
var MileSplit_Method = 'post';
var MileSplit_ApiUrl = '/api';
var MileSplit_ApiVer = '1.0';
var MileSplit_Format = 'xml';
var MileSplit_SessionKey = '';
var MileSplit_UserName = '';
var MileSplit_CallID = '';


///////////////////////////////////////////
// INITIALIZATION


// Look in the query strings for values
var url = window.location.toString();
url.match(/\?(.+)$/);
var qstr = RegExp.$1;
// Split up the query string and store in an associative array
var qstr = qstr.split("&");
var qs = {};
// Create associative array
for(var i=0; i < qstr.length; i++) {
     var tmp = qstr[i].split("=");
     qs[tmp[0]] = unescape(tmp[1]);
}
// Look for certain values
if (qs['u']) MileSplit_UserName = qs['u'];
if (qs['s']) MileSplit_UserName = qs['s'];

///////////////////////////////////////////
// WRAPPER FUNCTIONS


function MileSplit_FetchMeetsHtmlByDateInto(target, state, date) {
	var params = new Array();
	params[0] = new Array('method', 'meets.search');
	params[1] = new Array('date', date);
	params[2] = new Array('state', state);
	params[3] = new Array('format', 'html');
   	MileSplit_Ajax_LoadInto(target, MileSplit_ApiUrl, MileSplit_MakeQueryString(params), MileSplit_Method)
}

function MileSplit_FetchVenuesHtmlByState(target, state) {
	var params = new Array();
	params[0] = new Array('method', 'venues.search');
	params[1] = new Array('state', state);
	params[2] = new Array('format', 'html');
   	MileSplit_Ajax_LoadInto(target, MileSplit_ApiUrl, MileSplit_MakeQueryString(params), MileSplit_Method)
}

function MileSplit_FetchVenuesHtmlByName(target, name) {
	var params = new Array();
	params[0] = new Array('method', 'venues.search');
	params[1] = new Array('name', name);
	params[2] = new Array('format', 'html');
   	MileSplit_Ajax_LoadInto(target, MileSplit_ApiUrl, MileSplit_MakeQueryString(params), MileSplit_Method)
}

function MileSplit_FetchTeamsHtmlByState(target, state, selectname) {
	var params = new Array();
	params[0] = new Array('method', 'teams.search');
	params[1] = new Array('state', state);
	params[2] = new Array('format', 'html');
	params[3] = new Array('selectname', selectname);
   	MileSplit_Ajax_LoadInto(target, MileSplit_ApiUrl, MileSplit_MakeQueryString(params), MileSplit_Method)
}

function MileSplit_FetchTeamsHtmlByName(target, name, selectname) {
	var params = new Array();
	params[0] = new Array('method', 'teams.search');
	params[1] = new Array('name', name);
	params[2] = new Array('format', 'html');
	params[3] = new Array('selectname', selectname);
   	MileSplit_Ajax_LoadInto(target, MileSplit_ApiUrl, MileSplit_MakeQueryString(params), MileSplit_Method)
}

function MileSplit_FetchGeneralMeetsHtmlByName(target, name) {
	var params = new Array();
	params[0] = new Array('method', 'meets.general.search');
	params[1] = new Array('name', name);
	params[2] = new Array('format', 'html');
   	MileSplit_Ajax_LoadInto(target, MileSplit_ApiUrl, MileSplit_MakeQueryString(params), MileSplit_Method)
}

function MileSplit_FetchAthletesHtmlByName(target, name) {
	var params = new Array();
	params[0] = new Array('method', 'athletes.search');
	params[1] = new Array('name', name);
	params[2] = new Array('format', 'html');
   	MileSplit_Ajax_LoadInto(target, MileSplit_ApiUrl, MileSplit_MakeQueryString(params), MileSplit_Method)
}

function MileSplit_FetchAthletesByName(func, name) {
	var params = new Array();
	params[0] = new Array('method', 'athletes.search');
	params[1] = new Array('name', name);
	params[2] = new Array('format', 'xml');
   	MileSplit_Ajax_Request(MileSplit_ApiUrl, MileSplit_MakeQueryString(params), func, MileSplit_Method)
}

function MileSplit_FetchAthletesByNameComplex(func, fname, lname) {
	var params = new Array();
	params[0] = new Array('method', 'athletes.searchComplex');
	params[1] = new Array('fname', fname);
	params[2] = new Array('lname', lname);
	params[3] = new Array('format', 'xml');
   	MileSplit_Ajax_Request(MileSplit_ApiUrl, MileSplit_MakeQueryString(params), func, MileSplit_Method)
}

function MileSplit_FetchTeamsByName(func, name) {
	var params = new Array();
	params[0] = new Array('method', 'teams.search');
	params[1] = new Array('name', name);
	params[2] = new Array('format', 'xml');
   	MileSplit_Ajax_Request(MileSplit_ApiUrl, MileSplit_MakeQueryString(params), func, MileSplit_Method)
}

function MileSplit_FetchMeetsByName(func, name) {
	var params = new Array();
	params[0] = new Array('method', 'meets.search');
	params[1] = new Array('name', name);
	params[2] = new Array('format', 'xml');
   	MileSplit_Ajax_Request(MileSplit_ApiUrl, MileSplit_MakeQueryString(params), func, MileSplit_Method)
}

function MileSplit_FetchFilesByUser(target, user_id, select_name) {
	var params = new Array();
	params[0] = new Array('method', 'users.files.list');
	params[1] = new Array('user_id', user_id);
	params[2] = new Array('format', 'html');
	params[3] = new Array('form_el_name', select_name);
   	MileSplit_Ajax_LoadInto(target, MileSplit_ApiUrl, MileSplit_MakeQueryString(params), MileSplit_Method)
}

function MileSplit_Ajax_ApiCall(api_method, query_string, func) {
	var query = 's=' + MileSplit_SessionKey + '&u=' + MileSplit_UserName + '&k=' + MileSplit_ApiKey + '&c=' + MileSplit_CallID + '&v=' + MileSplit_ApiVer + '&f=' + MileSplit_Format;
	query += "&m=" + api_method + "&" + query_string;
	MileSplit_Ajax_Request(MileSplit_ApiUrl, query, func, MileSplit_Method);
}

///////////////////////////////////////////
// CORE FUNCTIONS

function MileSplit_Ajax_XMLHTTPObject() {
	var obj = false;
	if (window.XMLHttpRequest) {		// Mozilla, Netscape, Safari, Firefox, Opera
		obj = new XMLHttpRequest();
		if (obj.overrideMimeType) obj.overrideMimeType('text/plain');
	} else if (window.ActiveXObject) {	// Internet Explorer
		try {
			obj = new ActiveXObject("Msxml2.XMLHTTP");
		} catch (e) {
			try {
				obj = new ActiveXObject("Microsoft.XMLHTTP");	
			} catch (e) { }
		}
	}
	return obj;
}


function MileSplit_Ajax_LoadInto(target, url, query, method) {
	var el = document.getElementById(target);
	var request = new Ajax.Request(url, {
		method: MileSplit_Method,
		parameters: query,
		contentType: 'application/x-www-form-urlencoded',
		requestHeaders: { 'User-Agent': 'MileSplit Ajax Client' },
		onSuccess: function(transport) {
			el.innerHTML = 	transport.responseText;
		}
	});  
}

function MileSplit_Ajax_Request(url, query, func, method) {
	var request = new Ajax.Request(url, {
		method: MileSplit_Method,
		parameters: query,
		contentType: 'application/x-www-form-urlencoded',
		requestHeaders: { 'User-Agent': 'MileSplit Ajax Client' },
		onSuccess: function(transport) {
			if (func != null) eval(func + '(transport);');
		}
	});      
}

function MileSplit_Ajax_FormToQueryString(docForm) {

	var strSubmit = '';
	var formElem;
	var strLastElemName = '';
	var strSubmitContent = '';
	

	for (i = 0; i < docForm.elements.length; i++) {
		formElem = docForm.elements[i];
		switch (formElem.type) {
			// Text, select, hidden, password, textarea elements
			case 'text':
			case 'select-one':
			case 'hidden':
			case 'password':
			case 'textarea':
        		strSubmitContent += formElem.name + '=' + escape(formElem.value) + '&'
				break;
			// Radio buttons
			case 'radio':
				if (formElem.checked) {
					strSubmitContent += formElem.name + '=' + escape(formElem.value) + '&'
				}
				break;
			// Checkboxes
			case 'checkbox':
				if (formElem.checked) {
					// Continuing multiple, same-name checkboxes
					if (formElem.name == strLastElemName) {
						// Strip of end ampersand if there is one
						if (strSubmitContent.lastIndexOf('&') == strSubmitContent.length-1) {
							strSubmitContent = strSubmitContent.substr(0, strSubmitContent.length - 1);
						}
						// Append value as comma-delimited string
						strSubmitContent += ',' + escape(formElem.value);
					}
					else {
						strSubmitContent += formElem.name + '=' + escape(formElem.value);
					}
					strSubmitContent += '&';
					strLastElemName = formElem.name;
				}
				break;
		}
	}

	// Remove trailing separator
	if (strSubmitContent.length > 0) {
		strSubmitContent = strSubmitContent.substr(0, strSubmitContent.length - 1);
	}
	return strSubmitContent;

}

function MileSplit_MakeQueryString(params) {
	var query = 's=' + MileSplit_SessionKey +  '&u=' + MileSplit_UserName + '&k=' + MileSplit_ApiKey + '&c=' + MileSplit_CallID + '&v=' + MileSplit_ApiVer + '&f=' + MileSplit_Format;
	for (i=0; i < params.length; i++) {
		query = query + '&' + params[i][0] + '=' + params[i][1];	
	}
	return query;
}

function MileSplit_XmlNode(source) {
	// Properties
	this.Source = source;	
	this.Properties = new Array();
	// Parse XML Node
	var pos = 0;
	while (pos < this.Source.length) {
		var tagStart = this.Source.indexOf('<', pos);
		if (tagStart >= 0) {
			var tagEnd = this.Source.indexOf('>', tagStart);
			var tagName = this.Source.substr(tagStart+1, tagEnd-tagStart-1);
			var tagClose = this.Source.indexOf('</' + tagName + '>', tagEnd);
			var tagValue = '';
			if (tagClose >= 0) {
				tagValue = this.Source.substr(tagEnd + 1, tagClose-tagEnd-1);
			} else {
				tagValue = this.Source.substr(tagEnd + 1);
			}
			this.Properties[tagName] = tagValue;
			pos = tagClose + tagName.length + 3;
		} else {
			break;
		}
	}
}

function MileSplit_XmlDocument(source) {
	// Properties
	this.Source = source;
	this.Items = new Array();
	this.Status = 0;
	this.Message = '';
	this.Content = '';
	// Get Status
	var statusStart= this.Source.indexOf('<code>', pos) + 6;
	var statusEnd = this.Source.indexOf('</code>', pos);
	var messageStart= this.Source.indexOf('<message>', pos) + 9;
	var messageEnd = this.Source.indexOf('</message>', pos);
	var contentStart= this.Source.indexOf('<content>', pos) + 9;
	var contentEnd = this.Source.indexOf('</content>', pos);
	this.Status = this.Source.substr(statusStart, statusEnd-statusStart);
	this.Message = this.Source.substr(messageStart, messageEnd-messageStart);
	this.Content = this.Source.substr(contentStart, contentEnd-contentStart);
	// Parse XML Document
	var pos = 0;
	while (pos < this.Source.length) {
		var tagStart = this.Source.indexOf('<item>', pos);
		if (tagStart >= 0) {
			var tagEnd = this.Source.indexOf('</item>', tagStart);
			pos = tagEnd + 7;
			this.Items[this.Items.length] = new MileSplit_XmlNode(this.Source.substr(tagStart + 6, tagEnd-tagStart-6));
		} else {
			break;
		}
	}
}
