
// returns form token
function get_Params() {
	var current = "";
	var params = "";
	var sep = ",";
	var empty = 0;
	var num = 0;
	var value;

	for (var i = 0, len1 = document.forms.length; i < len1; i++) {
		value = document.forms[i].name;
		if (value == "") { value = "noname"; }
		current += "form-name" + (i + 1) + "=" + value;
		current += "&form-values" + (i + 1) + "=(";

		for (var j = 0, len2 = document.forms[i].elements.length; j < len2; j++) {
			switch (document.forms[i].elements[j].type) {
				case "submit":
					break; // dont stamp submit buttons
				case "reset":
					break; // dont stamp reset buttons
				case "button":
					break; // dont stamp generic buttons
				case "password":
					if (document.forms[i].elements[j].value == "") { empty++; }
					break; // flag but dont stamp passwords
				case "file":
					if (document.forms[i].elements[j].value == "") { empty++; }
					break; // flag but dont stamp files
				case "text":
					value = document.forms[i].elements[j].value;
					if (value == "") { value = "none"; empty++; }
					current += "text-" + document.forms[i].elements[j].name + "=" + value + sep;
					break;
				case "hidden":
					value = document.forms[i].elements[j].value;
					if (value == "") { value = "none"; empty++; }
					current += "hidden-" + document.forms[i].elements[j].name + "=" + value + sep;
					break;
				case "textarea":
					value = document.forms[i].elements[j].value;
					if (value == "") { value = "none"; empty++; }
					current += "textarea-" + document.forms[i].elements[j].name + "=" + value + sep;
					break;
				case "radio":
					current += "radio-" + document.forms[i].elements[j].name + "=" + document.forms[i].elements[j].checked + sep;
					if (!document.forms[i].elements[j].checked) { empty++; }
					break;
				case "checkbox":
					current += "checkbox-" + document.forms[i].elements[j].name + "=" + document.forms[i].elements[j].checked + sep;
					if (!document.forms[i].elements[j].checked) { empty++; }
					break;
				case "select-one":
					value = document.forms[i].elements[j].options[document.forms[i].elements[j].selectedIndex].value;
					if (value == "") { value = "none"; empty++; }
					current += "select-one-" + document.forms[i].elements[j].name + "=" + value + sep;
					break;
				case "select-multiple":
					current += "select-multiple-" + document.forms[i].elements[j].name + "=";
					if (document.forms[i].elements[j].selectedIndex != -1) {
						for (var k = 0, len3 = document.forms[i].elements[j].options.length; k < len3; k++) {
							if (document.forms[i].elements[j].options[k].selected) {
								current += document.forms[i].elements[j].options[k].value + sep;
							}
						}
						// remove last separator
						current = current.substring(0, (current.length - 1)) + sep;
					} else { current += "none"; empty++; }
					break;
				default:
					break;
			}
		}

		// prevent tracking unmodified forms
		if (empty != document.forms[i].elements.length) {
			// remove last separator
			if (current.substring((current.length - sep.length), current.length) == sep) {
				current = current.substring(0, (current.length - sep.length));
			}

			// encapsulate form values
			current += ")";

			// add separator if there are multiple forms
			if ((i + 1) != document.forms.length) { current += "&"; }

			// append to tracking log
			params += current;
		} else { num++; }

		// reset modified flags
		current = "";
		empty = 0;
	}

	if (params != "") {
		var char = params.substring((params.length - 1), params.length);
		// remove last separator
		if (char == sep || char == "&") { client_params = (i - num) + "&" + encodeURI(params.substring(0, (params.length - 1))); }
		else { client_params = (i - num) + "&" + encodeURI(params); }
	} else { client_params = empty; }
}

// overloaded click handler to return link urls and trigger request
function get_URL(url) { client_next_url = url; trigger_Request(); }

// overloaded click handler for google ads
function get_Next() {
	window.focus();
	client_next_url = window.status;
}

// adds click handler to all document links
function register_Handler() {
	for (var i = 0, len = document.links.length; i < len; i++) {
		// overload current click handler
		if (document.links[i].title.substring(0,6) != "Add to:") {
			var on_Click = (document.links[i].onclick) ? document.links[i].onclick : function () {};
			document.links[i].onclick = function () { on_Click(); get_URL(this.href) };
		} else {
			document.links[i].onclick = function() { get_URL(this.href) };
		}
	}

	// overload form submit handler
	for (var i = 0, len = document.forms.length; i < len; i++) {
		var on_Submit = (document.forms[i].onsubmit) ? document.forms[i].onsubmit : function () { return true; };
		document.forms[i].onsubmit = function () { trigger_Request(); return on_Submit(); };

	}
}

// global AJAX response object
function AJAX_Response(args) {
	// release global object
	AJAX.on_Unload();
	return true;
}

// triggers AJAX request
function trigger_Request() {
	// collect any form values
	get_Params();

	var args = "action=track_clicks&track_params=" + client_params + "&track_curr_url=" + client_curr_url;
	if ((window.screenTop) && (window.screenTop > 9999)) { client_next_url = "exit_browser"; }
	if (client_next_url != "") { args += "&track_next_url=" + client_next_url; }

	// REQUIRED since onunload fires before onclick
	if (!AJAX.idle) { AJAX.abort_Request(); }

	// send AJAX request
	AJAX.queue_Request("sget", args, AJAX_Response);

	return true;
}
