// General Purpose Functions and Objects

function isMail(value){
	return value.match(/\w{1,}[@]([\w\-]{1,}[.]){1,3}[\w\-]{2,4}$/);
}

function isDefined(element) {
	return (element != undefined && element != null); 
}

function isEmpty(value) {
	if (value==null || value.length==0) return true;
	else return false;
}

function isInteger(value) {
	return value.match(/^\d+$/);
}

function isArray(obj) {
	return obj.constructor.toString().indexOf("Array") != -1;
}

function isSelect(htmlElement) {
	return (htmlElement.nodeName == 'SELECT');
}

function isInput(htmlElement) {
	return (htmlElement.nodeName == 'INPUT');
}

// DOM manipulation functions

function get(id, documentReference) {
	var element = (documentReference == null)?document.getElementById(id):documentReference.document.getElementById(id);
	return element;
}

function getElementsGroup(name, documentReference) {
	var element = (documentReference == null)?document.getElementsByName(name):documentReference.document.getElementsByName(name);
	return element;
}

function getValue(id, documentReference) {
	var element = get(id, documentReference);
	return (element == null)?null:element.value;
}

function create(type, id, text) {
	var newElement = document.createElement(type);
	if (id != null) newElement.id = id;
	if (text != null) newElement.appendChild(document.createTextNode(text));
	return newElement;
}

function createOption(value, text, selected) {
	var opt = new Option(text, value);
    if (selected) opt.selected = true;
    else opt.selected = false;
	return opt;
}

// url and navigation functions 

function go(url, target) {
	(target == null)? document.location.href = url: target.location.href = url; 
}

function addParams(url, params) {
	for (var i = 0; i < params.length; i++)
		url = addParam(url, params[i]);
	return url;
}

function addParam(url, param) {
	var QUERYSTRING_CHAR = '?';
	var PARAM_SEPARATOR_CHAR = '&';
	url += (url.indexOf(QUERYSTRING_CHAR) != -1)?PARAM_SEPARATOR_CHAR:QUERYSTRING_CHAR;
	if (url.indexOf(QUERYSTRING_CHAR + PARAM_SEPARATOR_CHAR) != -1) url = url.substring(0, url.length-1);
	if (param.indexOf(PARAM_SEPARATOR_CHAR) == 0 || param.indexOf(QUERYSTRING_CHAR) == 0)
		param = param.substring(1);
	return url + param; 
}

// Loading Functions

function loadingProcess(id, className, txt) {
	var element = get(id);
	if (element == null) return;
	if (className != '' && element.className == className) return true;
	element.className = className;
	if (element.nodeName == 'INPUT') element.value = txt;
	else element.innerHTML = txt; 
	return false;
}

// Layer visibility Functions

function loading(loadingDivName, visible, txt) {
	if (visible) show(get(loadingDivName));
	else hide(get(loadingDivName));
	if (txt != null)
		get(loadingDivName).innerHTML = txt;
}
function showHide(elementId, listElementsToShow) {
	var element = get(elementId);
	if (element == null) return;
	var visible = switchDisplay(element);
	if (listElementsToShow != null && visible) {
		for (var i = 0; i < listElementsToShow.length; i++) {
			hide(get(listElementsToShow[i]));
		}
	}
}

function showHideLayerInGroup(groupName, groupMemberId, startIndex) {
	var SEPARATOR = "|";
	var selectedMemberId = groupName + SEPARATOR + groupMemberId;
	var memberId = (startIndex == null)?0:startIndex;
	var member = null;
	do {
    	member = get(groupName + SEPARATOR + memberId++);
    	if (member != null) {
    		if (member.id == selectedMemberId) switchDisplay(member); 
    		else hide(member);
    	}
	} while (member != null);
}

function switchDisplay(element) {
	var visible = false;
	if (element.style.display == "none" || element.style.display == "") { // Show Element
		show(element);
		visible = true;
	} else { // Hide Element
		hide(element);
		visible = false;
	}
	
	return visible;
}

function show(element) {
	element.style.display = "block";
}

function hide(element) {
	element.style.display = "none";
}

/* 
 * Switch the visibility of a layer in a set (tabs, folders, etc)
 * activeLayer : Name of variable containing the currently active layer within the set.
 * objId : Id of the layer to hide or show
 * Important!! Initialize activeLayer.
 */
function layerSwitch(activeLayer, objId){
	if(eval(activeLayer) != null && eval(activeLayer) != objId){
		hide(get(eval(activeLayer)));
	}
	var obj = get(objId);
	if(obj.style.display == "none"){
		show(obj);
	}
	eval(activeLayer+' = objId');
}

// Dates functions

function parseDate(str) {
	var _dateArray = str.split("/");
	if (isArray(_dateArray) && _dateArray.length == 3 && isInteger(_dateArray[2]) && _dateArray[2].length == 4 && isInteger(_dateArray[1]) && _dateArray[1].length <= 2 && isInteger(_dateArray[0]) && _dateArray[0].length <= 2) {
		var date = new Date(_dateArray[2], (parseInt(_dateArray[1],10)-1), _dateArray[0]);  // string months from 1-12
		initDate(date);
		return date;
	} else {
		alert('invalid date format');
		return null;
	}
}

function formatDate(date) {
	return date.getDate() + "/" + (date.getMonth()+1) + "/" + date.getFullYear();
}

// returns a 'comfortable' index for day Date Object index so that is easier to use in loops

function getComfortableDayOfTheWeekIndex(jsDateObjectIndex) {
	return (jsDateObjectIndex == 0) ?7:(jsDateObjectIndex);
}

// returns today Date Object

function getToday(addDays){
	var today = new Date();
	initDate(today);
	if (addDays != null) today.setDate((today.getDate() + addDays));
	return today;
}

// Copies a JS date object. Usefull to guarantee that any modification affects not to original date
// 'addDays', 'addMonths', 'addYear' values add the spefied amount of days, months and/or years to original date
// Important: For security reasons, month operations ('addDays', 'addMonths', 'addYear') should work with first day of the month assignment.
// (Example: (31/Dec - 1Month) => 31/Nov => 1/Dec)

function copyDate(date, addDays, addMonths, addYears){
	if (date == null) return null;
	var dateCopy = new Date();
	initDate(dateCopy);
	if (addDays == null) addDays = 0;
	if (addMonths == null) addMonths = 0;
	if (addYears == null) addYears = 0;
	dateCopy.setDate(1);
	dateCopy.setFullYear(date.getFullYear() + addYears);
	dateCopy.setMonth(date.getMonth() + addMonths);
	dateCopy.setDate(date.getDate() + addDays);
	return dateCopy;
}

function initDate(date) {
	date.setHours(0);date.setMinutes(0);date.setSeconds(0);date.setMilliseconds(0);
	return date;
}

function getNumberOfNights(fromDate, toDate) {
	var timeElapsed = toDate.getTime() - fromDate.getTime();
	return (timeElapsed/1000/60/60/24).toFixed(0);
}

// Object utils functions
function arrayToObject(array) {
	var object = new Object();
	for (var i=0; i<array.length; i++)
		object[array[i]] = true;
	return object;
}

function objectLength(object) {
	var length = 0;
	if (object == null) return length;  
	for (id in object) length++;
	return length;
}

// Other util functions

function reloadOriginalText(object, text) {
	if(object.value == '') {
		object.value = text;
	}
}

function cleanText(object, text) {
	if(object.value == text) {
		object.value = '';
	}
}

// Insert a class in item. Native Method: addClass isn't support by IE.
function addClass(ele,cls) {
	if (!this.hasClass(ele,cls)) ele.className += " "+cls;
}

// Remove a class in item. Native Method: removeClass isn't support by IE.
function removeClass(ele,cls) {
	if (hasClass(ele,cls)) {
		var reg = new RegExp('(\\s|^)'+cls+'(\\s|$)');
		ele.className=ele.className.replace(reg,' ');
	}
}

// Native Method: hasClass of javascript isn't support by IE.
function hasClass(ele,cls) {
	return ele.className.match(new RegExp('(\\s|^)'+cls+'(\\s|$)'));
}

function markOptionAsSelected(combo, i) {
	combo.selectedIndex = i;
	combo.options[i].selected = true;
}

// Order a ComboBox (tag SELECT of HTML) after to have inserted the options (tag OPTION).
function sortComboBox(id) {
    var arr = new Array();
	var obj = document.getElementById(id);
    for(i = 0; i < obj.options.length; i++){
        arr[arr.length] = new Array(obj[i].text, obj[i].value);
    }
    arr.sort();
    for(var i = 0; i < obj.options.length; i++) {
        obj[i] = new Option(arr[i][0], arr[i][1], false, false);
    }
}

function makeSureSubmit(f, text) {
	var ok = confirm((text != null)?text:'Are uou sure?');
	if (ok) {
		f.submit();
		return true;
	} else {
		return false;
	}
}

function separateByComas(list, char) {
	if (char == null) char = ',';
	if (list == null) return '';
	var csv = "";
	for (var i = 0; i < list.length; i++) {
		if (list[i].id != null) // if element have an id attribute 
			csv+= list[i].id; 
		else
			csv+= list[i];
		csv+= char;
	}
	csv = csv.substring(0, csv.length-1);
	return csv;
}

// Stop the events
function stop(e) {
	if (!e) var e = window.event;
	if (e == undefined) return;
	e.cancelBubble = true;
	if (e.stopPropagation) e.stopPropagation();
}

// JSF util functions

var JSF_GENERATED_ID_SEPARATOR = ':';

function generateJSFId(jsfGroupPrefix, newLineIndex) {
	var bits = jsfGroupPrefix.split(JSF_GENERATED_ID_SEPARATOR);
	bits[bits.length - 2] = newLineIndex; 
	var newJSFId = "";
	for (var i = 0; i < (bits.length); i++) newJSFId += (bits[i] + JSF_GENERATED_ID_SEPARATOR); 
	return newJSFId.substr(0, newJSFId.length-1);
}

function getJSFGroupPrefix(jsfId) {
	var bits = jsfId.split(JSF_GENERATED_ID_SEPARATOR);
	var groupPrefix = "";
	for (var i = 0; i < (bits.length-1); i++) groupPrefix += (bits[i] + JSF_GENERATED_ID_SEPARATOR); 
	return groupPrefix;
}

//Implementacion de toggle. 
	function toggle(eId) {
		var e = $(eId);
		var display = e.getStyle('display');
		if (display == "none"){
			e.setStyle('display','block');  
		} else {
			e.setStyle('display','none');  
		}
	} ;
	
// Prices format
function formatPrice(price, thousandSeparator, decimalSeparator) {
	if(thousandSeparator == null || decimalSeparator == null) return price;
	// In JS, the decimal separator is a . for a float variable.
	var integerPart = price.split('.')[0];
	var decimalPart = price.split('.')[1];
	
	// Adding the thousand separator
	var inverseIntegerPart = '';
	for (i=integerPart.length-1; i>=0; i--) 
	{
		inverseIntegerPart = inverseIntegerPart + integerPart.charAt(i);
	}

	price = '';
	for (i=0; i<inverseIntegerPart.length; i++) {
	  if (i%3 == 0 && i!=0) price =  inverseIntegerPart.charAt(i) + thousandSeparator + price;
	  else price = inverseIntegerPart.charAt(i) + price;
	}

	// Adding the decimal separator
	if (decimalPart != null) price += (decimalSeparator + decimalPart);
	
	return price;
}

// Open Popup
function openPopUp(url, name, properties) {
    window.open(url, name, properties);
}

function addOnloadFunction(code) {
	if(typeof window.onload == 'function') {
		// Almacenar la posible funcion existente
		var existing = window.onload;                                                   
		//redefinir el manejador del evento onload
		window.onload = function() {
						//invocar la funcion existente
						existing();                                                                   
						// invocar a la nueva funcion
						eval(code);
					}		
	} else {
		//setup onload function
	   window.onload =  function() { eval(code) };
	}
}


/* functions for popup  */

function moveWindowToCenter(width, height){
	var x = (screen.width - width) / 2;
	var y = (screen.height - height) / 2;
	moveTo(x, y);	
}
	
function isDomainOfHesperia(domain){
	if((typeof(fromNHHesperia) != "undefined") && fromNHHesperia) return true; //for OBE. In NHSE fromNHHesperia is false
	else return domain.search('hesperia') != -1;
}

/* ***** Functions for optimized load of pages. Others functions in commonsJQuery.js ****** */

function loadFuntionsListOnLoad(){
	//WARNING: The functions or _funtionsList code must end with a semicolon
	//_funtionsList is Array() object, defined in template head.
	if(isDefined(_functionsList) && _functionsList.length > 0){
		var functionsListString = "";
		for(i = 0; i < _functionsList.length; i++){
			functionsListString += _functionsList[i];
		}
		addOnloadFunction(functionsListString);
	}
}

function loadJSFile(url){
	var scriptElement = document.createElement('script'); 
	scriptElement.type = "text/javascript"; 
	//scriptElement.async = true;
	scriptElement.src = url;
	var s = document.getElementsByTagName('script')[0]; 
	s.parentNode.insertBefore(scriptElement, s);
}
