/*
new in 0.3:

- addDropDownToggle: Allow multiple targets for toggle
- drop down animations now queued in parallel
- showRow() checks for object before execution
- cleaned up validate() 
- updated initValidation with try-catch for debug purposes

*/
function addDropDownToggle () {
	if (arguments.length > 0) {
		var settings = arguments[0];
		if (settings.index) {
			settings.dropdown.index = settings.index;
			settings.dropdown.target = settings.target;
			settings.dropdown.oldClassName = settings.dropdown.target.className;
			Event.observe(settings.dropdown, 'change', function(event) {
				if (event.element().selectedIndex == event.element().index) {
					// 0.3
					event.element().target.constructor == Array ? event.element().target.each(showRow) : showRow(event.element().target);
				}
				else {
					event.element().target.constructor == Array ? event.element().target.each(hideRow) : hideRow(event.element().target);
				}
			});

			return true;
		}
		else {
			return false;
		}
	}
	else {
		return false;
	}
}
// 0.3
function hideRow(target) {
	if ($(target)) {
		var s = Effect.BlindUp(target, { queue: 'parallel', duration: 0.5 });
	}
}
function showRow(target) {

	// may not exist, allow for debug
	if ($(target)) {
		$(target).setStyle({ display: 'none' });
		$(target).removeClassName(_ERROR_CLASS_HIDDEN);
		var s = Effect.BlindDown(target, { queue: 'parallel', duration: 0.5 });
	}
}
function initFields() {
	if (typeof prefillForm != 'function') {
		$$('input[type="text"]').each(function(obj) { obj.value = '' });
		$$('select').each(function(obj) { obj.selectedIndex = 0; });
	}
	initErrorImages();
}
function initErrorImages() {
	
	//$$('img[src="images/error.gif"]').each(function(img) {
	$$('img[id*="error"]').each(function(img) {
		Event.observe(img,'mouseover',function(e) {

			$('error-message-description').innerHTML = _CONFIG[e.element().offset].errormsg;
			$('error-message-format').innerHTML = _CONFIG[e.element().offset].format;
			var posLeft = e.element().positionedOffset().left; //+ e.element().getOffsetParent().positionedOffset().left;
			var posTop = e.element().positionedOffset().top; //+ e.element().getOffsetParent().positionedOffset().top;
			try {
				e.element().getOffsetParent().positionedOffset().left ? posLeft += e.element().getOffsetParent().positionedOffset().left : '';
				e.element().getOffsetParent().positionedOffset().top ? posTop += e.element().getOffsetParent().positionedOffset().top : '';
			}
			catch(err) {}
			var offsetWidth = e.element().getWidth();
			$('error-message').style.top = eval(posTop - $('error-message').getHeight()) + 'px';
			$('error-message').style.left = eval(posLeft + offsetWidth) + 'px'; 
			$('error-message').removeClassName(_ERROR_CLASS_HIDDEN);
		});
		Event.observe(img,'mouseout',function(e) {
			$('error-message').addClassName(_ERROR_CLASS_HIDDEN);
		});
	});

}
function validate(e) {
	var valid = true;
	_CONFIG.each(function(d) {
		if (!d.valid) {
			valid = false;
			showError($(d.name).offset);
		}
	});
	if (valid) {
		_CONFIG.each(function(g) { typeof g.process == 'function' ? g.process() : '' });
		typeof processFunctions == 'function' ? processFunctions() : '';
		$$('input[type="submit"]').each(function(e) { e.disabled = true });
	}
	else {
		Event.stop(e);
	}
}
function initClient() {
	BrowserDetect.init();
	BrowserDetect.browser == 'Safari' ? _ERROR_CLASS_IMG = 'error-alert-safari' : _ERROR_CLASS_IMG = 'error-alert';
//	$$('img[src="images/error.gif"]').each(function(img) { img.addClassName(_ERROR_CLASS_IMG); });
	$$('img[id*="error"]').each(function(img) { img.addClassName(_ERROR_CLASS_IMG); });
}
function initConfig() {
	_REQUEST = new Array();
	$$('script').each(function(e) { 
		var pattern = /init-([A-Za-z\-]+)\.js?/;
		if (e.src.match(pattern)) {
			var arrSrc = e.src.split('?');
			if (arrSrc.length>1) {
				arrSrc[1].split('&').each(function(pair) {
					var arrPair = pair.split('=');
					arrPair.length > 1 ? _REQUEST[arrPair[0]] = arrPair[1] : '';
				});
			}
		}
	});
	_REQUEST['config'] ? _REQUEST['config'].split(',').each(function(f) {
			document.write('<script type="text/javascript" src="'+_PATH_CONFIG+f+'.js"><\/script>');
		}) : '';
}

function showError(offset) {

	var objConfig = _CONFIG[offset];
	var objField = $(objConfig.name);

	objField.addClassName(_ERROR_CLASS);
	$(objConfig.name+_ERROR_SUFFIX).removeClassName(_ERROR_CLASS_HIDDEN);

	_CONFIG[offset].valid = false;
}
function hideError(offset) {
	var objConfig = _CONFIG[offset];
	var objField = $(objConfig.name);

	objField.removeClassName(_ERROR_CLASS);
	$(objConfig.name+_ERROR_SUFFIX).addClassName(_ERROR_CLASS_HIDDEN);
	_CONFIG[offset].valid = true;
}
function initValidation() {

	var j = 0;
	try { // 0.3
		var debugindex;
		_CONFIG.each(function(e,i) {
			debugindex = i;
			$(e.name).offset = j;
			$(e.name+_ERROR_SUFFIX).offset = j;
			if (e.type == _FIELD_DROP) {
				Event.observe(e.name, 'change', function(event) {
					validateInput(event.element(),_FIELD_DROP);
				});
			}
			else if (e.type == _FIELD_MULTISELECT) {
				Event.observe(e.name, 'change', function(event) {
					validateInput(event.element(),_FIELD_MULTISELECT);
				});
			}
			else {
				Event.observe(e.name, 'blur', function(event) {
					validateInput(event.element(),null);
				});
			}
			j++;
		});
	}
	catch(e) {
		var m = e.message || '';
		var n = _CONFIG[debugindex].name;
		alert(m+'\nFatal error at: '+n);
	}

	// validate form
	Event.observe($('form-content'),'submit', validate);
}
function validateInput(obj) {
	if (arguments.length > 1) {
		switch (arguments[1]) {
			case _FIELD_DROP:
				obj.selectedIndex != 0 ? hideError(obj.offset) : showError(obj.offset);
				break;
			case _FIELD_MULTISELECT:
				var selected = 0;
				for (var i=1; i<obj.options.length; i++) {
					if (obj.options[i].selected) {
						selected++;
					}
				}
				selected > 0 ? hideError(obj.offset) : showError(obj.offset);
				break;
			default:
				if (!_CONFIG[obj.offset].regex.test(obj.value)) {
					showError(obj.offset);
				}
				else {
					hideError(obj.offset);
				}
		}
	}
	else {
	}
}

var BrowserDetect = {
	init: function () {
		this.browser = this.searchString(this.dataBrowser) || "An unknown browser";
		this.version = this.searchVersion(navigator.userAgent)
			|| this.searchVersion(navigator.appVersion)
			|| "an unknown version";
		this.OS = this.searchString(this.dataOS) || "an unknown OS";
	},
	searchString: function (data) {
		for (var i=0;i<data.length;i++)	{
			var dataString = data[i].string;
			var dataProp = data[i].prop;
			this.versionSearchString = data[i].versionSearch || data[i].identity;
			if (dataString) {
				if (dataString.indexOf(data[i].subString) != -1)
					return data[i].identity;
			}
			else if (dataProp)
				return data[i].identity;
		}
	},
	searchVersion: function (dataString) {
		var index = dataString.indexOf(this.versionSearchString);
		if (index == -1) return;
		return parseFloat(dataString.substring(index+this.versionSearchString.length+1));
	},
	dataBrowser: [
		{
			string: navigator.userAgent,
			subString: "Chrome",
			identity: "Chrome"
		},
		{ 	string: navigator.userAgent,
			subString: "OmniWeb",
			versionSearch: "OmniWeb/",
			identity: "OmniWeb"
		},
		{
			string: navigator.vendor,
			subString: "Apple",
			identity: "Safari",
			versionSearch: "Version"
		},
		{
			prop: window.opera,
			identity: "Opera"
		},
		{
			string: navigator.vendor,
			subString: "iCab",
			identity: "iCab"
		},
		{
			string: navigator.vendor,
			subString: "KDE",
			identity: "Konqueror"
		},
		{
			string: navigator.userAgent,
			subString: "Firefox",
			identity: "Firefox"
		},
		{
			string: navigator.vendor,
			subString: "Camino",
			identity: "Camino"
		},
		{		// for newer Netscapes (6+)
			string: navigator.userAgent,
			subString: "Netscape",
			identity: "Netscape"
		},
		{
			string: navigator.userAgent,
			subString: "MSIE",
			identity: "Explorer",
			versionSearch: "MSIE"
		},
		{
			string: navigator.userAgent,
			subString: "Gecko",
			identity: "Mozilla",
			versionSearch: "rv"
		},
		{ 		// for older Netscapes (4-)
			string: navigator.userAgent,
			subString: "Mozilla",
			identity: "Netscape",
			versionSearch: "Mozilla"
		}
	],
	dataOS : [
		{
			string: navigator.platform,
			subString: "Win",
			identity: "Windows"
		},
		{
			string: navigator.platform,
			subString: "Mac",
			identity: "Mac"
		},
		{
			string: navigator.platform,
			subString: "Linux",
			identity: "Linux"
		}
	]

};
function initCalendar(cal) {
	if ($(cal)) {
		Calendar.setup({
			inputField: cal,
			ifFormat: '%B %e, %Y',
			button: cal,
			align: 'Bl',
			singleClick: true,
			weekNumbers: false
		});
	}
}
function initQueryString() {

	// check for querystring
	var cur = location.href;
	var urlSegments = cur.split('?');
	urlSegments.shift();
	var queryString = urlSegments.join('?');

	// if exists, check for email address
	if (queryString.length > 0) {

		// parse querystring
		var pairs = queryString.split('&');

		// parse pairs and create array
		pairs.each(function(pair) {
			nv = pair.split('=');
			pairName = nv[0];
			nv.shift();
			pair.length > 1 ? pairValue = nv.join('=') : pairValue = '';
			_GET[pairName] = unescape(pairValue);
		});
	}
}
