/*=... .- .-. ...- . -. / -.-. .- .--. .- -.. .. ... .-.. .. 2007*/

var TDM = {
	Config: {
		Init: {
			Increment: 0,
			Direction: null,
			Postal_Code_Pattern: /^[a-zA-Z]{1}[0-9]{1}[a-zA-Z]{1}[0-9]{1}[a-zA-Z]{1}[0-9]{1}$/,
			Email_Pattern: /^\w+([\.\-]?\w+)*@\w+([\.\-]?\w+)*(\.\w{2,4})+$/,
			SliderCurrent: 0,
			SliderID: 0,
			SliderLength: 0,
			SliderTimeInterval: 4000,
			SliderDatas: [],
			SliderActions: [],
			OpacityStart: 20,
			CurrentTab: 0
		},

		Selectors: {
			Opened: "opened",
			Closed: "closed",
			Selected: "selected",
			Current: "current",
			Hover: "hover",
			DropDownMenu: "interaction_dd_menu",
			TypographyDecrease: "typography_decrease",
			TypographyIncrease: "typography_increase",
			RequiredField: "required_field",
			ValidateRequiredFields: "validate_required_fields",
			FieldValidatePostalCode: "field_validate_postal_code",
			FieldValidateEmail: "field_validate_email",
			FieldValidateEmailIdentical: "field_validate_email_identical",
			FieldValidateEmailMultiple: "field_validate_email_multiple",
			UserRatingSystem: "user_rating_system",
			RatingSystem: "rating_system",
			OpenResourceOnNewWindow: "open_resource_on_new_window",
			Warning: "warning",
			Error: "error",
			ErrorMessage: "error_message",
			Validate: "validate"
		},

		Messages: {	}
	},

	Utils: {
		ClassName: {
			hasClass: function(obj, str) {
				return obj && new RegExp('(?:^|\\s)' + str + '(?:\\s|$)').test(obj.className);
			},
			Add: function (obj, str) {
				if (!this.hasClass(obj, str)) { obj.className += (obj.className ? ' ' : '') + str; }
			},
			Remove: function (obj, str) {
				if (this.hasClass(obj, str)) { obj.className = obj.className.replace(new RegExp('^(?:' + str + '(?:\\s+|$))+|\\s+' + str + '\\s*(?=\\s|$)', 'g'), ''); }
			},
			setClass: function (obj, str, add) {
				return add ? this.Add(obj, str) : this.Remove(obj, str);
			}
		},

		GetElementsByClassName: function (name, nodes, match_type, root) {
			var ret = [];
			var node, i;
			switch (match_type) {
				case 'inner': break;
				case 'front': name = ' ' + name; break;
				case 'back': name = name + ' '; break;
				case 'exact': break;
				default: name = ' ' + name + ' '; break;
			}

			if (!nodes && !root) {
				nodes = document.documentElement.getElementsByTagName('*');
				for (i = 0, l = nodes.length; i < l; i++) {
					node = nodes[i];
					if (node.className && (' ' + node.className + ' ').indexOf(name) >= 0) {
						ret.push(node);
					}
				}
				return ret;
			}

			if (!nodes && root) {
				nodes = root.getElementsByTagName('*');
				for (i = 0, l = nodes.length; i < l; i++) {
					node = nodes[i];
					if (node.className && (' ' + node.className + ' ').indexOf(name) >= 0) {
						ret.push(node);
					}
				}
				return ret;
			}

			if (nodes && !root) {
				for (i = 0, l = nodes.length; i < l; i++) {
					node = nodes[i];
					if (node.className && (' ' + node.className + ' ').indexOf(name) >= 0) {
						ret.push(node);
					}
				}

				return ret;
			}

			if (nodes && root) {
				rcn = root.getElementsByTagName('*');
				for (var j=0; j<rcn.length; j++) {
					for (i = 0, l = nodes.length; i < l; i++) {
						node = nodes[i];
						if ((rcn[j] == node) && node.className && (' ' + node.className + ' ').indexOf(name) >= 0) {
							ret.push(node);
						}
					}
				}
				return ret;
			}
		},


		FindEvent: function (el, evt, handler) {
			for (var events = TDM.Utils.AddEvent.events, i = events.length, e; i--;) {
				e = events[i];
				if (e[0] == el && e[1] == evt && e[2] == handler) {
					return i;
				}
			}
			return -1;
		},

		DelEvent: function (el, evt, handler, flush) {
			if (!el) { return; }
			if (!flush) {
				var i = TDM.Utils.FindEvent(el, evt, handler);
				if (i != -1) { TDM.Utils.AddEvent.events.splice(i, 1); }
			}
			if (el.removeEventListener) {
				el.removeEventListener(evt, handler, false);
			} else if (el.detachEvent) {
				el.detachEvent('on' + evt, handler);
			} else {
				el['on' + evt] = null;
			}
		},

		FlushEvents: function () {
			for (var events = TDM.Utils.AddEvent.events, i = events.length, e; i--;) {
				e = events[i];
				TDM.Utils.DelEvent(e[0], e[1], e[2], true);
			}
			TDM.Utils.AddEvent.events = [];
		},

		HaltEvent: function (evt) {
			if (evt) {
				evt.returnValue = false;
				if (evt.preventDefault) { evt.preventDefault(); }
			}
			return false;
		},

		AddEvent: function (el, evt, handler) {
			if (!el) { return; }
			if (el.addEventListener) {
				el.addEventListener(evt, handler, false);
			} else if (el.attachEvent) {
				el.detachEvent('on' + evt, handler);
				el.attachEvent('on' + evt, handler);
			} else {
				var oldevent = el['on' + evt];
				if (typeof oldevent != 'function') {
					el['on' + evt] = handler;
				} else {
					el['on' + evt] = function(e) {
						oldevent(e);
						handler(e);
					};
				}
			}
			if (TDM.Utils.FindEvent(el, evt, handler) == -1 && evt != 'unload') {
				TDM.Utils.AddEvent.events.push([el, evt, handler]);
			}
		},

		Tabbing: function(datas, actions) {
			var modifyClass = TDM.Utils.ClassName;
			var settings = TDM.Config.Selectors;

			for (var i=0; i<actions.length; i++) {
				TDM.Utils.AddEvent(actions[i], 'click', (function(datas, actions, i) {
					return function(e) {
						TDM.Utils.ShowObject(datas, actions, i);
						e.returnValue = false;
						if (e.preventDefault) { e.preventDefault(); }
					};
				})(datas, actions, i));
			}
		},

		ShowObject: function (datas, actions, change_id) {
			var modifyClass = TDM.Utils.ClassName;
			var settings = TDM.Config.Selectors;
			TDM.Utils.Close(datas[TDM.Config.Init.CurrentTab]);
			modifyClass.Remove(actions[TDM.Config.Init.CurrentTab], settings.Selected);

			TDM.Config.Init.CurrentTab = change_id;
			TDM.Utils.Open(datas[TDM.Config.Init.CurrentTab]);
			modifyClass.setClass(actions[TDM.Config.Init.CurrentTab], settings.Selected, 'add');
		},

		ShowHide: function(datas, actions, internal_anchor_switch) {
			var modifyClass = TDM.Utils.ClassName;
			var settings = TDM.Config.Selectors;

			for (var i=0; i<actions.length; i++) {
				TDM.Utils.AddEvent(actions[i], 'click', function(datas, actions, i, internal_anchor_switch) {
					return function (e) {
						if (modifyClass.hasClass(datas[i], settings.Opened)) {
							TDM.Utils.Close(datas[i]);
						}
						else {
							TDM.Utils.Open(datas[i]);
						}

						if (internal_anchor_switch === false) {
							e.returnValue = false;
							if (e.preventDefault) { e.preventDefault(); }
						}
					};
				}(datas, actions, i, internal_anchor_switch));
			}
		},

		Close: function (obj) {
			var modifyClass = TDM.Utils.ClassName;
			var settings = TDM.Config.Selectors;
			modifyClass.Remove(obj, settings.Opened);
			modifyClass.setClass(obj, settings.Closed, 'add');
		},

		Open: function(obj) {
			var modifyClass = TDM.Utils.ClassName;
			var settings = TDM.Config.Selectors;
			modifyClass.Remove(obj, settings.Closed);
			modifyClass.setClass(obj, settings.Opened, 'add');
		},

		OpenResourceOnNewWindow: function () {
			var new_window_elements = TDM.Utils.GetElementsByClassName(TDM.Config.Selectors.OpenResourceOnNewWindow, '', '', '');

			if (new_window_elements.length > 0) {
				for (var i=0; i < new_window_elements.length; i++) {
					var el = new_window_elements[i];
					TDM.Utils.AddEvent(el, 'click', function (_this) {
						return function (e){
							if (_this.href!=undefined) {
								window.open(_this.href);
								_this.href="#";
								return false;
							}
						}
					}	(el));

					TDM.Utils.AddEvent(el, 'keypress', function (_this) {
						return function (e){
							if (_this.href!=undefined) {
								window.open(_this.href);
								_this.href="#";
								return false;
							}
						}
					}	(el));
				}
			}
		},


		ValidateRequiredFields: function(form_element) {
			var config = TDM.Config;
			var modifyClass = TDM.Utils.ClassName;
			var settings = config.Selectors;
			var constants = config.Init;

			form_element.onsubmit = function () {
				var r_v = true;
				var required_fields = TDM.Utils.GetElementsByClassName(settings.Validate+"_", this.elements, 'front', '');

				var error_message_elements = TDM.Utils.GetElementsByClassName(settings.ErrorMessage, '', 'exact', this);
				if (error_message_elements) {
					for (var e=0; e<error_message_elements.length; e++) {
						var removedChild = error_message_elements[e].parentNode.removeChild(error_message_elements[e]);
					}
				}

				for (var j=0; j<required_fields.length; j++) {
					modifyClass.Remove(required_fields[j], settings.Error);
					var required_field_classes = required_fields[j].className.split(" ");
					for (var c=0; c<required_field_classes.length; c++) {
						var v_re = required_field_classes[c].match(new RegExp('^'+settings.Validate+'_([^_]+)_(.+)'));
						if (v_re) {
							var checktype = v_re[1];
							var fieldname = v_re[2];

							for (var v=0; v<TDM.Config.ValidationFunctionList.length; v++) {
								if (TDM.Config.ValidationFunctionList[v].checktype==checktype) {
									if(!TDM.Config.ValidationFunctionList[v].func(required_fields[j].value, required_field_classes[c])){
										TDM.Utils.Set.ErrorClass(required_fields[j]);
										TDM.Utils.Set.ErrorMessage(required_fields[j], checktype+'_'+fieldname, TDM.Config.ValidationFunctionList[v].error);
										r_v = false;
									}
								}
							}
						}
					}
				}

				location.hash= '#' + this.id;

				if (!r_v) {
					TDM.Utils.Set.ErrorMessageGlobal(form_element);
				}

				return r_v && true;
			};

		},

		ValidateField: {
			Isset: function(str) {
				if (str.length > 0) {
					var r_v = true;
				}
				return r_v || false;
			},
			Pattern: {
				Email: function (str) {
					if (TDM.Config.Init.Email_Pattern.test(str)) {
						var r_v = true;
					}
					return r_v || false;
				},
				EmailMultiple: function (str) {
					multiple_emails = str.split(" ");
					var r_v = true;
					for (var y=0; y<multiple_emails.length; y++) {
						if (!TDM.Config.Init.Email_Pattern.test(multiple_emails[y])) {
							r_v = false;
						}
					}
					return r_v || false;
				},

				PostalCode: function(str) {
					if (TDM.Config.Init.Postal_Code_Pattern.test(str)) {
						var r_v = true;
					}
					return r_v || false;
				}
			},
			Identical: function (str_x, str_y) {
				if (str_x.toLowerCase() == str_y.toLowerCase()) {
					var r_v = true;
				}
				return r_v || false;
			},
			IdenticalField: function (str, element_class) {
				var elements = TDM.Utils.GetElementsByClassName(element_class, '', '', '');
				var init_value = '';
				var r_v = true;

				for (var i=0; i<elements.length; i++) {
					if (init_value === '') {
						init_value = elements[i].value;
					}
					else {
						if (elements[i].value.toLowerCase() != init_value.toLowerCase()) {
							r_v = false;
						}
					}
				}
				return r_v || false;
			}
		},
		Set: {
			ErrorClass: function(el) {
				var modifyClass = TDM.Utils.ClassName;
				var settings = TDM.Config.Selectors;

				modifyClass.Add(el, settings.Error);
				el.onfocus = function () {
					modifyClass.Remove(this, settings.Error);
				};
			},
			ErrorMessage: function (el, error_message_value, default_error) {
				var modifyClass = TDM.Utils.ClassName;
				var settings = TDM.Config.Selectors;
				var error_message_text = (TDM.Config.Messages.Errors[error_message_value]) ? TDM.Config.Messages.Errors[error_message_value] : default_error;
				var error_message = document.createElement("em");
				var error_message_textCDATA = document.createTextNode(error_message_text);
				modifyClass.setClass(error_message, settings.ErrorMessage, 'add');
				error_message.appendChild(error_message_textCDATA);

				el.parentNode.insertBefore(error_message, el.nextSibling);
			},
			ErrorMessageGlobal: function(el) {
				var default_error="";
				var modifyClass = TDM.Utils.ClassName;
				var settings = TDM.Config.Selectors;

				var error_message_global_text = (TDM.Config.Messages.Errors['error_message_global_value']) ? TDM.Config.Messages.Errors['error_message_global_value'] : default_error;
				var error_message_global_textCDATA = document.createTextNode(error_message_global_text);
				var error_message_global = document.createElement("p");
				error_message_global.id = "error_message_global";
				error_message_global.appendChild(error_message_global_textCDATA);

				modifyClass.setClass(error_message_global, settings.ErrorMessage, 'add');

				fieldset_zero = el.getElementsByTagName('fieldset')[0];
				var fcn = fieldset_zero.childNodes;
				for (var i=0; i<fcn.length; i++) {
					if (fcn[i].nodeType == 1) {
						fieldset_zero.insertBefore(error_message_global, fcn[i]);
						break;
					}
				}
			}
		},

		WindowPrint: function (actions) {
			for (var i=0; i<actions.length; i++) {
				TDM.Utils.AddEvent(actions[i], 'click', function() {
						window.print();
					}
				);
			}
		},

		FigureView: {},
		PageInformation: {}
	},
	setCookie: function (c_name,value,expiredays) {
		var exdate=new Date();
		exdate.setDate(exdate.getDate()+expiredays);
		document.cookie=c_name+ "=" +escape(value)+
		((expiredays==null) ? "" : ";expires="+exdate.toGMTString());
	},
	getCookie: function (c_name){
    var nameEQ = c_name + "=";
    var ca = document.cookie.split(';');
  	for(var i=0;i < ca.length;i++) {
  		var c = ca[i];
  		while (c.charAt(0)==' ') c = c.substring(1,c.length);
  		if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length,c.length);
  	}
	  return null;
	}

};


var TDT = {
	GoogleMaps: {
		gethCards: function (w) {
			if (document.getElementById('google_map')) {
				var map;
				var map_hcards = TDM.Utils.GetElementsByClassName('map_hcard', '', '', '');

				for (var i=0; i<map_hcards.length; i++) {
					var l_a="";
					switch(w){
						case 'address':
							l_a = get_adress_vcard(map_hcards[i]);
						break;
						case 'zipcode':
							l_a = get_zipcode_vcard(map_hcards[i]);
						break;
						default:
							return;
						break;
					} // switch

					if (l_a!="") {
						card = {
							node: map_hcards[i],
							loc: l_a,
							type: w,
							addMap:
								function(response){
									addToMap(response, card);
								}
						};
						cards.push(card);
					}

				}
			}
			if (cards.length>0) {
				LoadGoogleMap('google_map', cards);
			}
		}
	}
};



/**
 *
 * @access public
 * @return void
 **/
function get_adress_vcard(obj){
	var l_a="";
	var location_street_address = TDM.Utils.GetElementsByClassName('street-address', '', '', obj);
	if (location_street_address.length > 0) {
		l_a = location_street_address[0].innerText || location_street_address[0].textContent;

		var location_locality = TDM.Utils.GetElementsByClassName('locality', '', '', obj);
		if (location_locality.length > 0) {
			l_l = location_locality[0].innerText || location_locality[0].textContent;
			l_a = l_a + ", " + l_l;
		}

		var location_country_name = TDM.Utils.GetElementsByClassName('country-name', '', '', obj);
		if (location_country_name.length > 0) {
			l_c_n = location_country_name[0].textContent || location_country_name[0].innerText;
			l_a = l_a + ", " + l_c_n;
		}
	}
	return l_a;
}

/**
 *
 * @access public
 * @return void
 **/
function get_zipcode_vcard(obj){
	var l_a="";
	var location_postal_code = TDM.Utils.GetElementsByClassName('postal-code', '', '', obj);
	if (location_postal_code.length > 0) {
		l_a = location_postal_code[0].textContent || location_postal_code[0].innerText;
	}
	return l_a;
}

/**
 *
 * @access public
 * @return void
 **/
function add_to_bookmarks(obj){
	var title = obj.title!="" ? obj.title : document.title;
	if(document.all) window.external.AddFavorite(location.href,title);
	else if(window.sidebar) window.sidebar.addPanel(title,location.href,'');
}


var cards = [];

TDM.Config.ValidationFunctionList = [
{"checktype":"isset", "func":TDM.Utils.ValidateField.Isset, "error":"error: no set"},
{"checktype":"patternemail", "func":TDM.Utils.ValidateField.Pattern.Email, "error":"error: incorrect email format"},
{"checktype":"patternemailmultiple", "func":TDM.Utils.ValidateField.Pattern.EmailMultiple, "error":"error: seperate by space AND check pattern"},
{"checktype":"identicalemail", "func":TDM.Utils.ValidateField.IdenticalField, "error":"error: unidentical emails"}
];


function Go() {
	TDM.Utils.AddEvent(window, 'unload', TDM.Utils.FlushEvents);

	TDT.GoogleMaps.gethCards("address");

	if (document.getElementById('photo_gallery')) {
		TDM.Utils.FigureView(TDM.Utils.GetElementsByClassName('figure','','',document.getElementById('photo_gallery')));
	}

	if (document.getElementById('document_options')) {
		TDM.Utils.WindowPrint(TDM.Utils.GetElementsByClassName('action_print','','',document.getElementById('document_options')));
	}

	if (document.getElementById('send_to_friend_data')) {
		TDM.Utils.Close(document.getElementById('send_to_friend_data'));
		TDM.Utils.ShowHide([document.getElementById('send_to_friend_data')], [document.getElementById('send_to_friend_action')], false);
		TDM.Utils.ShowHide([document.getElementById('send_to_friend_data')], [document.getElementById('send_to_friend_container_action')], false);
		TDM.Utils.ValidateRequiredFields(document.getElementById('send_to_friend_data'));
	}

	if (document.getElementById('contact_us')) {
		TDM.Utils.ValidateRequiredFields(document.getElementById('contact_us'));
	}


	if (document.getElementById('more_particulars_link')) {
		TDM.Utils.ShowHide([document.getElementById('more_particulars')], [document.getElementById('more_particulars_link')], false);
		TDM.Utils.ShowHide([document.getElementById('more_particulars_link')], [document.getElementById('more_particulars_link')], false);
	}

	if (document.getElementById('fewer_particulars_link')) {
		TDM.Utils.ShowHide([document.getElementById('more_particulars')], [document.getElementById('fewer_particulars_link')], false);
		TDM.Utils.ShowHide([document.getElementById('more_particulars_link')], [document.getElementById('fewer_particulars_link')], false);
	}

	if (document.getElementById('sauvegarder_recherche_link')) {
		TDM.Utils.ShowHide([document.getElementById('sauvegarder_recherche')], [document.getElementById('sauvegarder_recherche_link')], false);
	}

	if (document.getElementById('search_save')) {
		TDM.Utils.ShowHide([document.getElementById('sauvegarder_recherche')], [document.getElementById('search_save')], false);
	}

	if (document.getElementById('cancel_search_save')) {
		TDM.Utils.ShowHide([document.getElementById('sauvegarder_recherche')], [document.getElementById('cancel_search_save')], false);
	}

	if (document.getElementById('show_hide_search_form_show')) {
		TDM.Utils.ShowHide([document.getElementById('search_form_residence')], [document.getElementById('show_hide_search_form_hide')], false);
		TDM.Utils.ShowHide([document.getElementById('search_form_residence')], [document.getElementById('show_hide_search_form_show')], false);

		TDM.Utils.AddEvent(document.getElementById('show_hide_search_form_hide'), 'click', function(){
			TDM.Utils.Close(document.getElementById('show_hide_search_form_hide'));
			TDM.Utils.Open(document.getElementById('show_hide_search_form_show'));
			/*
			if (document.getElementById('sauvegarder_recherche_link')) {
        			TDM.Utils.Open(document.getElementById('sauvegarder_recherche_link'));
      			}
			*/
			TDM.setCookie("searchOpen", 1, 30);
		});

		TDM.Utils.AddEvent(document.getElementById('show_hide_search_form_show'), 'click', function(){
			TDM.Utils.Close(document.getElementById('show_hide_search_form_show'));
			TDM.Utils.Open(document.getElementById('show_hide_search_form_hide'));
			/*
      			if (document.getElementById('sauvegarder_recherche_link')) {
			  TDM.Utils.Close(document.getElementById('sauvegarder_recherche_link'));
			}
			*/
			TDM.setCookie("searchOpen", 0, 30);
		});

		//TDM.Utils.Open(document.getElementById('search_form_residence'));
		if (search_state == "opened") {
			TDM.Utils.Close(document.getElementById('show_hide_search_form_hide'));
			TDM.Utils.Open(document.getElementById('show_hide_search_form_show'));
		}else {
			TDM.Utils.Close(document.getElementById('show_hide_search_form_show'));
			TDM.Utils.Open(document.getElementById('show_hide_search_form_hide'));
		}

	}

	TDM.Utils.OpenResourceOnNewWindow();
}

