function logDebug(msg) {
	$('debug') ? $('debug').innerHTML += msg + '<br />' : '';
}
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) {
					$(event.element().target).setStyle({ display: 'none' });
					$(event.element().target).removeClassName(_ERROR_CLASS_HIDDEN);
					var s = Effect.BlindDown(event.element().target, { queue: 'end' });
				}
				else {
					var s = Effect.BlindUp(event.element().target, { queue: 'end'} );
				}
			});

			return true;
		}
		else {
			return false;
		}
	}
	else {
		return false;
	}
}
function initFields() {

	$$('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;
			var posTop = e.element().positionedOffset().top;
			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(e) {
		if (!e.valid) {
			valid = false;
			showError($(e.name).offset);
		}
	});
	if (valid) {
		_CONFIG.each(function(e) {
			(typeof e.process == 'function') ? e.process() : '';
		});
	}
	valid ? '' : 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;
	logDebug('iterate _CONFIG');
	_CONFIG.each(function(e) {


		logDebug('process '+e.name);
		$(e.name).offset = j;
		$(e.name+_ERROR_SUFFIX).offset = j;
		if (e.type == _FIELD_DROP) {

			logDebug('field: '+e.type);
			Event.observe(e.name, 'change', function(event) {
				event.element().selectedIndex != 0 ? hideError(event.element().offset) : showError(event.element().offset);
			});
		}
		else if (e.type == _FIELD_MULTISELECT) {

			logDebug('field: '+e.type);
			Event.observe(e.name, 'change', function(event) {
				var selected = 0;
				for (var i=1; i<event.element().options.length; i++) {
					if (event.element().options[i].selected) {
						selected++;
					}
				}
				selected > 0 ? hideError(event.element().offset) : showError(event.element().offset);
			});
		}
		else {
			logDebug('field: '+e.type);
			Event.observe(e.name, 'blur', function(event) {
				if (!_CONFIG[event.element().offset].regex.test(event.element().value)) {
					showError(event.element().offset);
				}
				else {
					hideError(event.element().offset);
				}
			});
		}
		j++;
	});

	logDebug('attach form validate');
	// validate form
	Event.observe($('form-content'),'submit', validate);
}

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
		});
	}
}