
function gi_init(_s_action_url, s_single_action_url, _s_log_container_id)
{
	//we add the infos in our static object:
	gi_static['options']['ms_action_url'] = _s_action_url;
	gi_static['options']['ms_single_action_url'] = s_single_action_url;
	gi_static['options']['ms_log_container_id'] = _s_log_container_id;
}

var gi_static = new Abstract({
	options: {
		ms_action_url: null,
		ms_single_action_url: null,
		ms_log_container_id: null,
		ms_multiple_elements: ''
	},
	add_multiple_elements: function(_s_element_id, _arr_group_elements)
	{
		var s_group = '';
		for(var i = 0; i < _arr_group_elements.length; i++)
		{
			var s_delimiter = ((i + 1) == _arr_group_elements.length) ? '' : '*';
			s_group += _arr_group_elements[i] + s_delimiter;
		}

		gi_static['options']['ms_multiple_elements'] += '&*' + _s_element_id + '=' + s_group;
	},
	sendajax: function(_s_data, _b_is_single, _b_evalscript)
	{
		var s_url = (_b_is_single) ? gi_static['options']['ms_single_action_url'] : gi_static['options']['ms_action_url'];
		var s_data = { 
						data: _s_data, 
						method: 'get', 
						update: gi_static['options']['ms_log_container_id'], 
						evalScripts: _b_evalscript
					};
		new Ajax(s_url, s_data).request();
	},
	sendajaxform: function(_s_data, _b_evalscript)
	{
		//we empty the logs:
		$(gi_static['options']['ms_log_container_id']).empty();
		var s_data = { 
						data: _s_data + gi_static['options']['ms_multiple_elements'], 
						method: 'post', 
						update: gi_static['options']['ms_log_container_id'], 
						evalScripts: _b_evalscript
					};
		new Ajax(gi_static['options']['ms_action_url'], s_data).request();
	},
	show_logs: function(_arr_obj)
	{
		for(var i = 0; i < _arr_obj.length; i++)
		{
			//we set the message into the container:
			if (
				($(_arr_obj[i]['container']) != undefined) && 
				(_arr_obj[i]['message'] != undefined)
			)
			{
				$(_arr_obj[i]['container']).setText(_arr_obj[i]['message']);
			}

			//we show & hide the elements:
			if (
				($(_arr_obj[i]['container_show']) != undefined) && 
				($(_arr_obj[i]['container_hide']) != undefined) && 
				(_arr_obj[i]['message'] != undefined)
			)
			{
				$(_arr_obj[i]['container_show']).setStyle('display', 'block');
				$(_arr_obj[i]['container_show']).setText(_arr_obj[i]['message']);
				$(_arr_obj[i]['container_hide']).setStyle('display', 'none');
			}
		}
	}
});

var gi_base = new Class({
	initialize: function(){},
	validate: function(_s_id)
	{
		$(_s_id).addEvent('change', function(e)
		{
			var s_data = {"gi_single_ajax_id": this.id, "gi_single_ajax_value": this.value};
			gi_static.sendajax(s_data, true, true);
		});
	},
	validate_same: function(_s_original_id, _s_comparison_id)
	{
		$(_s_comparison_id).addEvent('change', function(e)
		{
			var s_data = {"gi_single_ajax_id": this.id, "gi_single_ajax_value": $(_s_original_id).value + "***" + this.value};
			gi_static.sendajax(s_data, true, true);
		});
	},
	add_trigger: function(_s_container_id, _s_trigger_btn_id, _s_show_element_id, _b_show)
	{
		var obj_base = this;
		$(_s_trigger_btn_id).addEvent('click', function(e)
		{
			obj_base.show(_s_container_id, _s_show_element_id, _b_show);
		});
	},
	show: function(_s_container_id, _s_id, _b_show)
	{
		var s_style = (_b_show) ? 'block' : 'none';
		$(_s_id).setStyle('display', s_style);
	}

});


var gi_form = gi_base.extend({
	options: {
		ms_form_id: null,
		ms_success_id: null
	},
	initialize: function(_s_form_id, _s_success_id)
	{
		this.parent();
		this.ms_form_id = _s_form_id;
		this.ms_success_id = _s_success_id;

		$(this.ms_form_id).addEvent('submit', function(e)
		{
			//we stop the event:			
			new Event(e).stop();

			var s_data = this.toQueryString();
			gi_static.sendajaxform(s_data, true);
		});
	},
	success: function(_s_message)
	{
		//we hide our form:
		this.show('', this.ms_form_id, false);

		//we show our success message:
		this.show('', this.ms_success_id, true);

		//we add the message into our success div:
		$(this.ms_success_id).setText(_s_message);
	}
});

var gi_inputtext = new Class({
	options: {
		ms_id: null
	},
	initialize: function(_s_id)
	{
		this.ms_id = _s_id;

		//we add the event:
		$(this.ms_id).addEvent('change', function(e)
		{
			var s_data = {"gi_single_ajax_id": this.id, "gi_single_ajax_value": this.value};
			gi_static.sendajax(s_data, true, true);
		});
	}

});

var gi_zipcode = new Class({
	options: {
		ms_left_id: null,
		ms_right_id: null
	},
	initialize: function(_s_left_id, _s_right_id)
	{
		this.ms_left_id = _s_left_id;
		this.ms_right_id = _s_right_id;

		//we set this at off, so that we can setfocus without any error:
		$(this.ms_left_id).setAttribute('autocomplete','off'); 
		$(this.ms_right_id).setAttribute('autocomplete','off'); 

		//we add the events:
		$(this.ms_left_id).addEvent('keyup', validate);
		$(this.ms_right_id).addEvent('keyup', validate);
		
		//we add our multiple elements:
		gi_static.add_multiple_elements(_s_right_id, Array(_s_left_id, _s_right_id));

		//this is our validation function
		function validate(_event)
		{
			this.value = this.value.toUpperCase();
			if (this.value.length == 3)
			{
				if (this.getProperty('id') == _s_left_id)
				{
					$(_s_right_id).disabled = false;
					$(_s_right_id).focus();
					return;
				}

				
				var s_data = {"gi_single_ajax_id": this.id, "gi_single_ajax_value": $(_s_left_id).value + '***' + this.value};
				gi_static.sendajax(s_data, true, true);
				return;
			}
		}
	}
});

var gi_phone = new Class({
	options: {
		ms_left_id: null,
		ms_middle_id: null,
		ms_right_id: null
	},
	initialize: function(_s_left_id, _s_middle, _s_right_id)
	{
		this.ms_left_id = _s_left_id;
		this.ms_middle_id = _s_middle;
		this.ms_right_id = _s_right_id;

		//we set this at off, so that we can setfocus without any error:
		$(this.ms_left_id).setAttribute('autocomplete','off'); 
		$(this.ms_middle_id).setAttribute('autocomplete','off'); 
		$(this.ms_right_id).setAttribute('autocomplete','off'); 

		//we add the events:
		$(this.ms_left_id).addEvent('keyup', validate);
		$(this.ms_middle_id).addEvent('keyup', validate);
		$(this.ms_right_id).addEvent('keyup', validate);

		//we add our multiple elements:
		gi_static.add_multiple_elements(_s_right_id, Array(_s_left_id, _s_middle, _s_right_id));

		function validate(_event)
		{
			if (this.value.length < 3)
				return;

			switch(this.id)
			{
				case _s_left_id:
				{
					$(_s_middle).disabled = false;
					$(_s_middle).focus();
					break;
				}
				case _s_middle:
				{
					$(_s_right_id).disabled = false;
					$(_s_right_id).focus();
					break;
				}
				case _s_right_id:
				{
					if (this.value.length < 4)
						return;

					var s_data =  {
								"gi_single_ajax_id": this.id, 
								"gi_single_ajax_value": $(_s_left_id).value + "***" + $(_s_middle).value + "***" + this.value
						};
					gi_static.sendajax(s_data, true, true);
					break;
				}
			}
		}
	}
});



var gi_datepicker = new Class({
	option: {
		ms_calendar_input_id: null,
		ms_btn_picker_id: null,
		marr_min_date: Array(),
		marr_max_date: Array()
	},
	initialize: function(_s_calendar_input_id, _s_btn_picker_id, _arr_min_date, _arr_max_date)
	{
		this.ms_calendar_input_id = _s_calendar_input_id;
		this.ms_btn_picker_id = _s_btn_picker_id;
		this.marr_min_date = _arr_min_date;
		this.marr_max_date = _arr_max_date;

		//we add our events:
		$(this.ms_btn_picker_id).addEvent('click', function(e)
		{
			new Event(e).stop();

			//we show the calendar in a floating div:
			obj_calendar = new Calendar(1, null, selecthandler, closehandler);
			obj_calendar.setDateStatusHandler(disable_date);
			obj_calendar.weekNumbers = false;
	
			obj_calendar.create();
			//obj_calendar.showAtElement($(_s_calendar_input_id).nextSibling, 'Br');

			//we get the position of our element:
			var obj_pos = $(_s_btn_picker_id).getPosition();
			var obj_size = $(_s_btn_picker_id).getSize();
			obj_calendar.showAt(obj_pos.x + obj_size.size.x, obj_pos.y);
		});

		function selecthandler(_obj_cal, _s_date)
		{
			$(_s_calendar_input_id).value = _s_date;
			$(_s_calendar_input_id).disabled = false;
			
			//we send the ajax request to validate:
			var s_data =  {"gi_single_ajax_id": $(_s_calendar_input_id).getProperty('id'), "gi_single_ajax_value": _s_date};
			gi_static.sendajax(s_data, true, true);
		}

		function closehandler(_obj_cal, _s_date)
		{
			_obj_cal.hide();
			_obj_cal.destroy();
			_obj_cal = null;
		}

		function disable_date(_obj_data)
		{
			//if our arrays are not set, we always show the elements:
			if (
				(_arr_min_date[0] == 0) || 
				(_arr_min_date[1] == 0) || 
				(_arr_min_date[1] == 0) || 
				(_arr_max_date[0] == 0) || 
				(_arr_max_date[1] == 0) || 
				(_arr_max_date[1] == 0)
			)
				return false;

			//we reset our hours:
			_obj_data.setHours(0, 0, 0, 0);

			//we make the date min object:
			var date_min = new Date();
			date_min.setHours(0, 0, 0, 0);

			date_min.setDate(_arr_min_date[0]);
			date_min.setMonth(_arr_min_date[1] - 1);
			date_min.setFullYear(_arr_min_date[2]);

			//we make the date max object:
			var date_max = new Date();
			date_max.setHours(0, 0, 0, 0);

			date_max.setDate(_arr_max_date[0]);
			date_max.setMonth(_arr_max_date[1] - 1);
			date_max.setFullYear(_arr_max_date[2]);

			//if our date is between the intervals of our min & max, we return true, otherwise false:
			if (
				(_obj_data.getTime() >= date_min.getTime()) && 
				(_obj_data.getTime() <= date_max.getTime())
			)
				return false;

			return true;
		}
		
	}
	
});


var gi_boolean = gi_base.extend({
	options: {
		marr_registered_data: null
	},
	initialize: function()
	{
		this.parent();
		this.marr_registered_data = Array();
	},
	register_data: function(_s_key, _mixed_data)
	{
		this.marr_registered_data[_s_key] = _mixed_data;
	},
	//the slide doesnt work that weel n IE:
	/*show: function(_s_container_id, _s_id, _b_show)
	{
		if (_s_container_id != null)
		{
			var s_data = {"gi_single_ajax_id": _s_container_id, "gi_single_ajax_value": (_b_show) ? 1 : 0};
			gi_static.sendajax(s_data, true, false);
		}


		var myEffects = new Fx.Styles(_s_id, {duration: 500, transition: Fx.Transitions.linear});

		//we get the height of our element:
		var i_height = $(_s_id).getStyle('height').toInt();
		var i_opacity =  $(_s_id).getStyle('opacity').toInt();

		if (!_b_show) //we hide the element
		{
			myEffects.start({
			    			'height': [i_height, 0],
			    			'opacity': [i_opacity, 0]
					});

			return;
		}


		//we get the old height of the element:
		var i_old_height = this.marr_registered_data[_s_id]['height'];
		var i_old_opacity = this.marr_registered_data[_s_id]['opacity'];

		//we show the element:
		myEffects.start({
			    		'height': [i_height, i_old_height],
			    		'opacity': [i_opacity, i_old_opacity]
				});
	}*/
	show: function(_s_container_id, _s_id, _b_show)
	{
		var s_style = (_b_show) ? 'block' : 'none';
		$(_s_id).setStyle('display', s_style);
	}
});

var gi_email_confirm = gi_base.extend({
	options: {
		ms_original_id: null,
		ms_confirm_id: null
	},
	initialize: function(_s_original_id, _s_confirm_id)
	{
		this.ms_original_id = _s_original_id;
		this.ms_confirm_id = _s_confirm_id;

		//we add our multiple elements:
		gi_static.add_multiple_elements(_s_original_id, Array(_s_original_id, _s_confirm_id));
	},
	validate: function() { this.validate_same(this.ms_original_id, this.ms_confirm_id); }
});


var gi_expiration = new Class({
	options: {
		mobj_left: null,
		mobj_right: null
	},
	initialize: function(_s_left_id, _s_right_id)
	{
		this.mobj_left = $(_s_left_id);
		this.mobj_right = $(_s_right_id);

		//we set this at off, so that we can setfocus without any error:
		this.mobj_left.setAttribute('autocomplete','off'); 
		this.mobj_right.setAttribute('autocomplete','off'); 

		var obj = this;

		//we add the events:
		this.mobj_left.addEvent('keyup', function(e) { obj.validate_left(); });
		this.mobj_right.addEvent('keyup', function(e) { obj.validate_right(); });

		//we add our multiple elements:
		gi_static.add_multiple_elements(_s_right_id, Array(_s_left_id, _s_right_id));
	},
	validate_left: function()
	{
		if (this.mobj_left.value.length < 2)
			return;

		this.mobj_right.disabled = false;
		this.mobj_right.focus();
	},
	validate_right: function()
	{
		if (this.mobj_right.value.length < 4)
			return;

		//we send our ajax request:
		var s_data = {
				"gi_single_ajax_id": this.mobj_right.id, 
				"gi_single_ajax_value": this.mobj_left.value + '***' + this.mobj_right.value
			};

		gi_static.sendajax(s_data, true, true);
	}
});
