// SpryUtils.js - version 0.3 - Spry Pre-Release 1.6.1
//
// Copyright (c) 2007. Adobe Systems Incorporated.
// All rights reserved.
//
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions are met:
//
//   * Redistributions of source code must retain the above copyright notice,
//     this list of conditions and the following disclaimer.
//   * Redistributions in binary form must reproduce the above copyright notice,
//     this list of conditions and the following disclaimer in the documentation
//     and/or other materials provided with the distribution.
//   * Neither the name of Adobe Systems Incorporated nor the names of its
//     contributors may be used to endorse or promote products derived from this
//     software without specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
// POSSIBILITY OF SUCH DAMAGE.

var Spry;
if (!Spry)
	Spry = {};
if (!Spry.Utils)
	Spry.Utils = {};
Spry.Utils.submitForm = function(form, callback, opts) {
	if (!form)
		return true;
	if (typeof form == 'string')
		form = Spry.$(form) || document.forms[form];
	var frmOpts = {};
	frmOpts.method = form.getAttribute('method');
	frmOpts.url = form.getAttribute('action') || document.location.href;
	frmOpts.enctype = form.getAttribute('enctype');
	Spry.Utils.setOptions(frmOpts, opts);
	var submitData = Spry.Utils.extractParamsFromForm(form, frmOpts.elements);
	if (frmOpts.additionalData)
		submitData += "&" + frmOpts.additionalData;
	if (!frmOpts.enctype
			|| frmOpts.enctype.toLowerCase() != 'multipart/form-data') {
		frmOpts.method = (frmOpts.method && frmOpts.method.toLowerCase() == "post") ? 'POST'
				: 'GET';
		if (frmOpts.method == "GET") {
			if (frmOpts.url.indexOf('?') == -1)
				frmOpts.url += '?';
			else
				frmOpts.url += '&';
			frmOpts.url += submitData;
		} else {
			if (!frmOpts.headers)
				frmOpts.headers = {};
			if (!frmOpts.headers['Content-Type']
					|| frmOpts.headers['Content-Type']
							.indexOf("application/x-www-form-urlencoded") == -1)
				frmOpts.headers['Content-Type'] = 'application/x-www-form-urlencoded';
			frmOpts.postData = submitData;
		}
		Spry.Utils
				.loadURL(frmOpts.method, frmOpts.url, true, callback, frmOpts);
		return false;
	}
	return true;
};
Spry.Utils.extractParamsFromForm = function(form, elements) {
	if (!form)
		return '';
	if (typeof form == 'string')
		form = document.getElementById(form) || document.forms[form];
	var formElements;
	if (elements)
		formElements = ',' + elements.join(',') + ',';
	var compStack = new Array();
	var el;
	for ( var i = 0; i < form.elements.length; i++) {
		el = form.elements[i];
		if (el.disabled || !el.name) {
			continue;
		}
		if (!el.type) {
			continue;
		}
		if (formElements && formElements.indexOf(',' + el.name + ',') == -1)
			continue;
		switch (el.type.toLowerCase()) {
		case 'text':
		case 'password':
		case 'textarea':
		case 'hidden':
		case 'submit':
			compStack.push(encodeURIComponent(el.name) + '='
					+ encodeURIComponent(el.value));
			break;
		case 'select-one':
			var value = '';
			var opt;
			if (el.selectedIndex >= 0) {
				opt = el.options[el.selectedIndex];
				value = opt.value || opt.text;
			}
			compStack.push(encodeURIComponent(el.name) + '='
					+ encodeURIComponent(value));
			break;
		case 'select-multiple':
			for ( var j = 0; j < el.length; j++) {
				if (el.options[j].selected) {
					value = el.options[j].value || el.options[j].text;
					compStack.push(encodeURIComponent(el.name) + '='
							+ encodeURIComponent(value));
				}
			}
			break;
		case 'checkbox':
		case 'radio':
			if (el.checked)
				compStack.push(encodeURIComponent(el.name) + '='
						+ encodeURIComponent(el.value));
			break;
		default:
			break;
		}
	}
	return compStack.join('&');
};