	/*function Date2Str(date){
		return date.getFullYear() + '-' + (date.getMonth() + 1) + '-' + date.getDate();
	}*/
	function CheckValidFileName(sObjectId, sExtensions) {
		var obj = $('#file' + sObjectId)[0];
		if (obj.value != '') {
			var ext = obj.value.substring(obj.value.lastIndexOf('.') + 1, obj.value.length).toLowerCase();
			if (sExtensions != null && sExtensions.length > 0 && ! Contains(sExtensions.split(','), ext)){
				return 'El archivo seleccionado es de un tipo inválido\n';
			}
		}
		return '';
	}

	function qryHowOld(varAsOfDate, varBirthDate) {
		var dtAsOfDate;
		var dtBirth;
		var dtAnniversary;
		var intSpan;
		var intYears;
		var intMonths;
		var intWeeks;
		var intDays;
		var intHours;
		var intMinutes;
		var intSeconds;
		var strHowOld;

	  // get born date
	  dtBirth = new Date(varBirthDate);

	  // get as of date
	  dtAsOfDate = new Date(varAsOfDate);

	  // if as of date is on or after born date
	  if ( dtAsOfDate >= dtBirth ) {
	  	// get time span between as of time and birth time
	    intSpan = (dtAsOfDate.getUTCHours() * 3600000 +
	               dtAsOfDate.getUTCMinutes() * 60000 +
	               dtAsOfDate.getUTCSeconds() * 1000) -
	              (dtBirth.getUTCHours() * 3600000 +
	               dtBirth.getUTCMinutes() * 60000 +
	               dtBirth.getUTCSeconds() * 1000)

			// start at as of date and look backwards for anniversary

	    // if as of day (date) is after birth day (date) or
	    //    as of day (date) is birth day (date) and
	    //    as of time is on or after birth time
	    if ( dtAsOfDate.getUTCDate() > dtBirth.getUTCDate() || ( dtAsOfDate.getUTCDate() == dtBirth.getUTCDate() && intSpan >= 0 ) ) {
	    	// most recent day (date) anniversary is in as of month
	      dtAnniversary = new Date( Date.UTC( dtAsOfDate.getUTCFullYear(), dtAsOfDate.getUTCMonth(), dtBirth.getUTCDate(), dtBirth.getUTCHours(), dtBirth.getUTCMinutes(), dtBirth.getUTCSeconds()));
	    } else {
	      // if as of day (date) is before birth day (date) or
	      //    as of day (date) is birth day (date) and
	      //    as of time is before birth time
	      // most recent day (date) anniversary is in month before as of month
	      dtAnniversary = new Date( Date.UTC( dtAsOfDate.getUTCFullYear(), dtAsOfDate.getUTCMonth() - 1, dtBirth.getUTCDate(), dtBirth.getUTCHours(), dtBirth.getUTCMinutes(), dtBirth.getUTCSeconds()));
	      // get previous month
	      intMonths = dtAsOfDate.getUTCMonth() - 1;
	      if ( intMonths == -1 )
	      	intMonths = 11;
	      // while month is not what it is supposed to be (it will be higher)
	      while ( dtAnniversary.getUTCMonth() != intMonths )
	        // move back one day
	        dtAnniversary.setUTCDate( dtAnniversary.getUTCDate() - 1 );
	     	}
	      // if anniversary month is on or after birth month
	      if ( dtAnniversary.getUTCMonth() >= dtBirth.getUTCMonth() ) {
	         // months elapsed is anniversary month - birth month
	         intMonths = dtAnniversary.getUTCMonth() - dtBirth.getUTCMonth();
	         // years elapsed is anniversary year - birth year
	         intYears = dtAnniversary.getUTCFullYear() - dtBirth.getUTCFullYear();
	      } else {
	       	// if birth month is after anniversary month
	        // months elapsed is months left in birth year + anniversary month
	        intMonths = (11 - dtBirth.getUTCMonth()) + dtAnniversary.getUTCMonth() + 1;
	        // years elapsed is year before anniversary year - birth year
	        intYears = (dtAnniversary.getUTCFullYear() - 1) - dtBirth.getUTCFullYear();
	      }

				// to calculate weeks, days, hours, minutes and seconds
	      // we can take the difference from anniversary date and as of date
		    // get time span between two dates in milliseconds
		    intSpan = dtAsOfDate - dtAnniversary;
		    // get number of weeks
		    intWeeks = Math.floor(intSpan / 604800000);
		    // subtract weeks from time span
		    intSpan = intSpan - (intWeeks * 604800000);
		    // get number of days
		    intDays = Math.floor(intSpan / 86400000);
		    // subtract days from time span
		    intSpan = intSpan - (intDays * 86400000);
		    // get number of hours
		    intHours = Math.floor(intSpan / 3600000);
		    // subtract hours from time span
		    intSpan = intSpan - (intHours * 3600000);
		    // get number of minutes
		    intMinutes = Math.floor(intSpan / 60000);
		    // subtract minutes from time span
		    intSpan = intSpan - (intMinutes * 60000);
		    // get number of seconds
		    intSeconds = Math.floor(intSpan / 1000);
		    // create output
		    var ret_value = Array();
		    if ( intYears > 0 )
	      	ret_value[0] = intYears;

	      if ( intMonths > 0 )
	    		ret_value[1] = intMonths;

	      if ( intWeeks > 0 )
	      	ret_value[2] = intWeeks;

		    if ( intDays > 0 )
		    	ret_value[3] = intDays;

	     	if ( intHours > 0 )
	     		ret_value[4] = intHours;

	      if ( intMinutes > 0 )
	      	ret_value[5] = intMinutes;

	      if ( intSeconds > 0 )
	      	ret_value[6] = intSeconds;
	  } else
	  	strHowOld = 'Not Born Yet'

	  return ret_value;
	}

	function AsignarKeyPress(idControl, funcion){
		$('#' + idControl).keypress (funcion);
	}

	function AsignarKeyUp(idControl, funcion){
		$('#' + idControl).keyup (funcion);
	}
	function AsignarChange(idControl, funcion) {
		$('#' + idControl).change (funcion);
	}

	function Contains(aElems, elem){
		for (var i = 0; i < aElems.length; i ++){
			if (aElems[i] == elem){
				return true;
			}
		}
		return false;
	}

  function ClearForm(oform){
  	var elems = oform.getElementsByTagName("input");
  	for(var i = 0; i < elems.length; i ++) {
			if(elems[i].type == 'text')
				elems[i].value = '';
			if(elems[i].type == 'checkbox')
				elems[i].checked = false;
  	}

  	elems = oform.getElementsByTagName("select");
  	for(var i = 0; i < elems.length; i ++) {
			elems[i].selectedIndex = 0;
  	}

  	elems = oform.getElementsByTagName("textarea");
  	for(var i = 0; i < elems.length; i ++) {
			elems[i].value = '';
  	}
  }

	function DecimalSeparator() {
		if (parseFloat("0.2") > 0)
			return '.';
		else
			return ',';
	}

	// Right way to use this function: onkeypress='return NumericKey(event, allowDecimal);'
	function NumericKey(evt, allowDecimal) {
		var kCode;
		if (evt.keyCode) kCode = evt.keyCode;
			else if (evt.which) kCode = evt.which;

		// - = 45
		if (kCode == 45) {
			return EventSource(evt).value.indexOf('-') == -1 && EventSource(evt).value.length == 0;
		}

		// 8 = backslash; 9 = tab; 37 left arrow; 39 right arrow (and also '); 35 end; 36 home; 46 delete (in FF)
		if (kCode == 8 || kCode == 9 || kCode == 37 || kCode == 39 || kCode == 35 || kCode == 36 || (evt.keyCode == 46 && evt.charCode == 0 && evt.which == 0))
			return true;

		if (allowDecimal && kCode == DecimalSeparator().charCodeAt(0)) {
			// Do not allow double separator
			return EventSource(evt).value.indexOf(DecimalSeparator()) == -1;
		}

		// 44 = , ; 46 = .
		if (allowDecimal && (kCode == 44 || kCode == 46) && kCode != DecimalSeparator().charCodeAt(0)) {
			if (evt.keyCode) evt.keyCode = DecimalSeparator().charCodeAt(0);
				else if (evt.which) {
			    var newEvent = document.createEvent("KeyEvents")
			    newEvent.initKeyEvent("keypress", true, true, document.defaultView, evt.ctrlKey, evt.altKey,
																evt.shiftKey,evt.metaKey, 0, DecimalSeparator().charCodeAt(0))
			    evt.preventDefault()
			    evt.target.dispatchEvent(newEvent);
			    return false;
				}
			// Do not allow double separator
			return EventSource(evt).value.indexOf(DecimalSeparator()) == -1;
		}

		if (kCode < 48 || kCode > 57) {
			// Show alert delayed so that WatiN can process it !!!!
			var srcId = EventSource(evt).id;
			setTimeout("alert(NumericKeyErrorMessage());if(document.getElementById('" + srcId + "').focus) document.getElementById('" + srcId + "').focus();", 50);
			return false;
		}
		return true;
	}

	// Right way to use this function: onkeypress='return TextKey(event, iMaxlength);'
	function TextKey(evt, iMaxLength, sFieldName) {
		var kCode;
		if (evt.keyCode) kCode = evt.keyCode;
			else if (evt.which) kCode = evt.which;

		// 8 = backslash; 9 = tab; 37 left arrow; 39 right arrow; 35 end; 36 home; 46 delete
		if (kCode == 8 || kCode == 9 || kCode == 37 || kCode == 39 || kCode == 35 || kCode == 36 || kCode == 46)
			return true;

		var valid = EventSource(evt).value.length < iMaxLength;
		if (! valid) {
			var message = MaxLengthErrorMessage().replace('{Name}', sFieldName + '');
			setTimeout("alert('" + message + "');", 50);
			EventSource(evt).value = EventSource(evt).value.substr(0, iMaxLength);
		}
		return valid;
	}

	function CheckNumeric(sObjectId, sFieldName, allowEmpty, min, max) {
		var obj = $('#' + sObjectId)[0];
		var iValue;
		var isWrong = obj == null || obj.value == null; // Object exists and has value
		if (!isWrong && ! allowEmpty && obj.value.length == 0) {// Allows empty values or is not empty
			isWrong = false;
		}
		if (!isWrong && allowEmpty && obj.value.length == 0){ // If it is empty and it is allowed, finish check here
			$('#' + sObjectId).removeClass('fieldError');
			return '';
		}

		if (!isWrong) {
			iValue = parseFloat(obj.value);
			isWrong = iValue != obj.value; // Value before and after parse must be the same !
		}

		if (!isWrong && typeof(min) != 'undefined') {// Check for min if it exists
			isWrong = min > iValue;
		}

		if (!isWrong && typeof(max) != 'undefined') {// Check for max if it exists
			isWrong = max < iValue;
		}

		if (isWrong) {
			var a = IsNumericErrorMessage();
			$('#' + sObjectId).addClass('fieldError');
			a = a.replace('{Name}', sFieldName + '');
			a = a.replace('{MinValue}', min + '');
			return a.replace('{MaxValue}', max + '') + '\n';
		} else {
			$('#' + sObjectId).removeClass('fieldError');
			return '';
		}
	}

	function CheckTextLength(sObjectId, sFieldName, iMaxLength) {
		var obj = $(sObjectId);
		if (obj == null || obj.value == null || obj.value.length > iMaxLength) {
			var a = MaxLengthErrorMessage();
			obj.addClassName('fieldError');
			return a.replace('{Name}', sFieldName + '') + '\n';
		} else {
			obj.removeClassName('fieldError');
			return '';
		}
	}

	function CheckNotEmpty(sObjectId, sFieldName) {
		var obj = $('#' + sObjectId)[0];
		if (obj == null || obj.value == null || obj.value.length == 0) {
			var a = CampoObligatorioErrorMessage();
			$('#' + sObjectId).addClass('fieldError');
			return a.replace('{Name}', sFieldName + '') + '\n';
		} else {
			$('#' + sObjectId).removeClass('fieldError');
			return '';
		}
	}

	function CheckValidPassord(sObject1Id, sObject2Id) {
		var obj1 = $('#' + sObject1Id)[0];
		var obj2 = $('#' + sObject2Id)[0];
		if (obj1 == null || obj1.value == null || obj1.value.length == 0 || obj2 == null || obj2.value == null || obj2.value.length == 0 || obj1.value != obj2.value) {
			var a = PasswordIncorrectaErrorMessage();
			$('#' + sObject1Id).addClass('fieldError');
			$('#' + sObject2Id).addClass('fieldError');
			return a + '\n';
		} else {
			$('#' + sObject1Id).removeClass('fieldError');
			$('#' + sObject2Id).removeClass('fieldError');
			return '';
		}
	}

	function CheckRadioNotEmpty(sObjectId, sFieldName) {
		var value = GetRadioValue(sObjectId);
		if (value == null) {
			var a = RadioEmptyErrorMessage();
			return a.replace('{Name}', sFieldName + '') + '\n';
		} else {
			return '';
		}
	}

	function CheckValidEmail(sObjectId, sFieldName) {
		var obj = $('#' + sObjectId)[0];
		var filter=/^([\w-]+(?:\.[\w-]+)*)@((?:[\w-]+\.)*\w[\w-]{0,66})\.([a-z]{2,6}(?:\.[a-z]{2})?)$/i;
		if (obj.value.length == 0 || filter.test(obj.value)) {
			$('#' + sObjectId).removeClass('fieldError');
			return '';
		} else {
			var a = InvalidMailErrorMessage();
			$('#' + sObjectId).addClass('fieldError');
			return a.replace('{Name}', sFieldName + '') + '\n';
		}
	}

	function CheckEqual(sObject1Id, sObject2Id, sFieldName1, sFieldName2) {
		var obj1 = $('#' + sObject1Id)[0];
		var obj2 = $('#' + sObject2Id)[0];

		if (obj1.value != obj2.value) {
			var a = NotEqualErrorMessage();
			obj1.addClassName('fieldError');
			obj2.addClassName('fieldError');
			a = a.replace('{Name1}', sFieldName1 + '');
			return a.replace('{Name2}', sFieldName2 + '') + '\n';
		} else {
			obj1.removeClassName('fieldError');
			obj2.removeClassName('fieldError');
			return '';
		}
	}

	// Check that sObject1Id <= sObject2Id
	function CheckLowerEqual(sObject1Id, sObject2Id, sFieldName1, sFieldName2) {
		if ($F(sObject1Id).length > 0 && $F(sObject2Id).length > 0 && parseInt($F(sObject1Id)) > parseInt($F(sObject2Id))) {
			var a = NotLowerEqualErrorMessage();
			$('#' + sObject1Id)[0].addClassName('fieldError');
			$('#' + sObject2Id)[0].addClassName('fieldError');
			a = a.replace('{Name1}', sFieldName1 + '');
			return a.replace('{Name2}', sFieldName2 + '') + '\n';
		} else {
			$('#' + sObject1Id)[0].removeClassName('fieldError');
			$('#' + sObject2Id)[0].removeClassName('fieldError');
			return '';
		}
	}

	var _alreadySubmitted = false;

	function ResetDoubleSubmit() {
		_alreadySubmitted = false;
	}

	function PreventDoubleSubmit() {
	  if (_alreadySubmitted) {
	    alert (DoubleSubmitErrorMessage());
	    return false;
	  }
	  else {
	    _alreadySubmitted = true;
	    return true;
	  }
	}

	function TestSubmitForm(sAction, doOnBeforeSubmit){
		var sError = (typeof(ValidateForm) != 'undefined' ? ValidateForm(sAction) : '');
		var frm = document.getElementById('frm');
		if (sError == 'CANCEL_SUBMIT') return false;
		if (sError == null || sError.length == 0){
			frm.txtAccion.value = sAction;
			if (doOnBeforeSubmit && typeof(OnBeforeSubmit) != 'undefined'){
				OnBeforeSubmit();
			}
			return true;
		}else{
			alert(sError);
		}
		return false;
	}

	var _submitForm_eventSrc;
	var _submitting = 0;
	function SubmitForm(sAction, evt){
		var evtSrc = EventSource(evt);
		evtSrc.disabled = true;
		_submitForm_eventSrc = evtSrc;
		if (_submitting == 1) {
			alert(SubmitErrorMessage());
			return;
		}
		if (TestSubmitForm(sAction, true)) {
			_submitting = 1;
			var frm = document.getElementById('frm');
			if (typeof(UploadFileAndSubmit) != 'undefined'){
				UploadFileAndSubmit();
			} else {
				frm.submit();
			}
		} else {
			_submitting = 0;
			evtSrc.disabled = false;
			return false;
		}
	}

	function ViewReport(reportUrl, width, height, name, evt){
		var sError = (typeof(ValidateForm) != 'undefined' ? ValidateForm(reportUrl) : '');
		if (sError == null || sError.length == 0){
			OpenPopUp("", width, height, name);
			var frm = document.getElementById('frm');
			frm.action = reportUrl;
			frm.target = name;
			frm.submit();
		} else {
			alert(sError);
			return false;
		}
	}



	function ForEachInput(sType, action){
		var inputs = document.getElementsByTagName('input');
		for (var i = 0; i < inputs.length; i ++){
			if (inputs[i].type == sType){
				var elem = inputs[i];
				eval(action);
			}
		}
	}

	function EventSource(evt){
		var targ;
		if (evt.currentTarget) targ = evt.currentTarget;
			else
				if (evt.srcElement) targ = evt.srcElement;
		if (targ.nodeType == 3) // defeat Safari bug
			targ = targ.parentNode;
		return targ;
	}

	function RegisterEventHandler(evt, handler){
		var old = (evt) ? evt : function () {};
		return function () {old(); handler()};
	}

	//Register onload function to add autocomplete off to all input so that firefox does not throw errors
	window.onload = RegisterEventHandler(window.onload, SetAutocompleteOff);
	window.onload = RegisterEventHandler(window.onload, AddDefaultSubmit);
	window.onload = RegisterEventHandler(window.onload, DoJsOnLoad);

	function DoJsOnLoad(){
		if(typeof(JsOnLoad) != "undefined")
			JsOnLoad();
	}

	function SetAutocompleteOff() {
		if (document.getElementsByTagName) {
			var inputElements = document.getElementsByTagName('input');
			for (i = 0; inputElements[i]; i++)
				inputElements[i].setAttribute('autocomplete','off');
		}
	}

	function addInputSubmitEvent(form, input) {
		input.onkeydown = function(e) {
			e = e || window.event;
			if (e.keyCode == 13) {
				SubmitEnterPressed();
				return false;
			}
		};
	}

	function AddDefaultSubmit(){
		if(typeof(SubmitEnterPressed) != "undefined") {
			var forms = document.getElementsByTagName('form');
			for (var i = 0; i < forms.length; i++) {
				var inputs = forms[i].getElementsByTagName('input');
				for (var j = 0;j < inputs.length; j++) {
					if(inputs[j].tagName.toLowerCase() != 'textarea'){
						addInputSubmitEvent(forms[i], inputs[j]);
					}
				}
			}
		}
	}

	function GoBack(){
		history.go(-1);
	}

	function SelectAllText(objId){
		setTimeout("$('#" + objId + "')[0].select();", 100);
	}

	function GetElementsByName(sName){
		var rootAll = document.getElementsByTagName('*');
		var retCol = new Array();
		for(var i=0, ii=rootAll.length; i < ii; i ++) {
			var attrib = (rootAll[i].attributes != null && rootAll[i].attributes.getNamedItem('name') != null ? rootAll[i].attributes.getNamedItem('name').value : null);

			if (rootAll[i].name != null && rootAll[i].name.length > 0) // IE Hack
				attrib = rootAll[i].name;  // IE Hack

			if (attrib == sName)
				retCol.push(rootAll[i]);
		}
		return retCol;
	}

	function GetElementsBegginingWithName(sName){
		var rootAll = document.getElementsByTagName('*');
		var retCol = new Array();
		var lenName = sName.length;
		for(var i = 0, ii = rootAll.length; i < ii; i ++) {
			var attrib = (rootAll[i].attributes != null && rootAll[i].attributes.getNamedItem('name') != null ? rootAll[i].attributes.getNamedItem('name').value : null);

			if (rootAll[i].name != null && rootAll[i].name.length > 0) // IE Hack
				attrib = rootAll[i].name;  // IE Hack

			if (attrib != null && attrib.substr(0, lenName) == sName)
				retCol.push($('#' + rootAll[i].id)[0]);
		}
		return retCol;
	}

	function RemoveSelectedOptions(sControlId){
		var sel = $('#' + sControlId)[0];
		if (sel != null) {
			for(var i = 0; i < sel.options.length; i ++) {
				if (sel.options[i].selected) {
					sel.remove(i);
					i --;
				}
			}
		}
	}

	function ValidateElement(sComboId){
		var elem = $('#' + sComboId)[0];
		var retVal;
		if(elem.multiple && elem.selectAll) elem.selectAll(); // For lists, select all so that the value changes, and then deselectAll. This may pose a problem if there's a list where the user has to select a subset with ctrl !

		if (! elem.disabled && elem.visible() && elem.value == '') {
			elem.addClassName('fieldError');
			retVal = false;
		} else {
			elem.removeClassName('fieldError');
			retVal = true;
		}
		if(elem.multiple && elem.deselectAll) elem.deselectAll();
		return retVal;
	}

	function OpenPopUp(url, width, height, name) {
		if (width === undefined) width = 600;
		if (height === undefined) height = 400;
		if (name === undefined) name = "__another_popup" + (Math.random() + "").replace(/\./g, "");
		var popup = window.open(url, name, "scrollbars=1,height=" + height + ",width=" + width + ",menubar=0,status=0,toolbar=0,resizable=1");
		CenterWindow(popup, width, height);
		popup.focus();
		return popup;
	}

	function CenterWindow(win, width, height){
		if (win === undefined || width === undefined || height === undefined ) {
			height = document.documentElement.clientHeight;
			width = document.documentElement.clientWidth;
			win = window;
		}
		win.moveTo((screen.availWidth / 2) - (width / 2) - 0, (screen.availHeight / 2) - (height / 2) - 0);
	}

	function MaximizeWindow(win){
		win.moveTo(0, 0);
		win.resizeTo(screen.availWidth, screen.availHeight);
	}

	function SetRadioValue(radioName, value) {
		var radios = document.getElementsByName(radioName);
		if (radios != null) {
			for (var i = 0; i < radios.length; i ++) {
				radios[i].checked = radios[i].value == value;
				if (radios[i].value == value)
					radios[i].click();
			}
		}
	}

	function GetRadioValue(radioName) {
		var radios = document.getElementsByName(radioName);
		if (radios != null) {
			for (var i = 0; i < radios.length; i ++) {
				if (radios[i].checked)
					return radios[i].value;
			}
		}
		return null;
	}

	function ChangeFormPart(iPart, totalParts) {
		var iCurrentPart;
		var sError;
		for(var i = 0; i < totalParts; i ++) {
			if ($('#FormPart' + i)[0].visible())
				iCurrentPart = i;
		}

		sError = ValidateFormPart(iCurrentPart);

		if (sError.length == 0) {
			for(var i = 0; i < totalParts; i ++) {
				if (i == iPart) {
					$('#FormPart' + i)[0].show();
					$('#menuFormPart' + i)[0].addClassName('seleccionado');
				}	else {
					$('#FormPart' + i)[0].hide();
					$('#menuFormPart' + i)[0].removeClassName('seleccionado');
				}
			}
		} else {
			alert(sError);
		}
	}

	/*<div id="tempDiv" style="display:none"></div>*/
	function getOuterHTML(obj){
		var temp = document.getElementById(obj).cloneNode(true);
		document.getElementById('tempDiv').appendChild(temp);
		var outer = document.getElementById('tempDiv').innerHTML;
		document.getElementById('tempDiv').innerHTML = '';
		return outer
	}
/*
	function setMaxHeight(to, notChanging){
		// to = elemento al que se le sube el height
		// notChanging = elemento cuya altura no tiene que cambiar
		var originalHeightNotChanging = $("#" + notChanging).height();
		alert(originalHeightNotChanging);
	}
*/

	function m$(controlId) {
		return document.getElementById(controlId);
	}

	function Edad(anio, mes, dia) {
		if (anio == 0 || mes == 0 || dia == 0)
			return '';
		else {
			var dToday, edad;
			dToday = new Date();
			return dToday.getUTCFullYear() - anio - (new Date(dToday.getUTCFullYear(), mes - 1, dia) <= dToday ? 0: 1);
		}
	}


	function CheckNotEmpty(sObjectId, sFieldName) {
		var obj = $('#' + sObjectId)[0];
		if (obj == null || obj.value == null || obj.value.length == 0) {
			var a = CampoObligatorioErrorMessage();
			$('#' + sObjectId).addClass('fieldError');
			return a.replace('{Name}', sFieldName + '') + '\n';
		} else {
			$('#' + sObjectId).removeClass('fieldError');
			return '';
		}
	}

	function IsValidDate(sObjectId) {
		var obj_day = $('#ddlDay' + sObjectId)[0];
		var obj_month = $('#ddlMonth' + sObjectId)[0];
		var obj_year = $('#ddlYear' + sObjectId)[0];

		var nDays

		if (obj_day == null || obj_month == null || obj_year == null
			  || obj_day.value == null || obj_month.value == null || obj_year.value == null
				|| (obj_year.value.length == 0 && obj_month.value.length == 0 && obj_day.value.length == 0)) {
			return true;
		}
		if (obj_day.value == 0 || obj_month.value == 0 || obj_year.value == 0) {
			return false;
		}
		if (obj_month.value != 2) {
			if (obj_month.value == 4 || obj_month.value == 6 || obj_month.value == 9 || obj_month.value == 11) {
				nDays = 30;
			} else {
				nDays = 31;
			}
		} else {
			if ((obj_year.value) == (parseInt(obj_year.value / 4) * 4)) {
				nDays = 29;
			} else {
				nDays = 28;
			}
		}
		if (obj_day.value > nDays) {
			return false;
		}

		return true;
	}

	function CheckValidDate(sObjectId, sFieldName) {
		if (IsValidDate(sObjectId)) {
			$('#ddlDay' + sObjectId).removeClass('fieldError');
			return '';
		} else {
			var error = InvalidDateErrorMessage();
			$('#ddlDay' + sObjectId).addClass('fieldError');
			return error.replace('{Name}', sFieldName + '') + '\n';
		}
	}

	function IsEmptyDate (sObjectId) {
		var obj_day = $('#ddlDay' + sObjectId)[0];
		var obj_month = $('#ddlMonth' + sObjectId)[0];
		var obj_year = $('#ddlYear' + sObjectId)[0];

		if (obj_day == null || obj_month == null || obj_year == null
			  || obj_day.value == null || obj_month.value == null || obj_year.value == null
				|| (obj_year.value.length == 0 && obj_month.value.length == 0 && obj_day.value.length == 0)) {
				return true;
		} else {
			return false;
		}
	}

  function CheckEmptyDate(sObjectId, sFieldName) {
  	if (IsEmptyDate(sObjectId)) {
			var error = EmptyDateErrorMessage();
			$('#ddlDay' + sObjectId).addClass('fieldError');
			return error.replace('{Name}', sFieldName + '') + '\n';
  	} else {
			$('#ddlDay' + sObjectId).removeClass('fieldError');
			return '';
  	}

  }

	function GetDate(sObjectId) {
		if (! $('#ddlYear' + sObjectId)[0].disabled && ! IsEmptyDate(sObjectId) && IsValidDate(sObjectId)) {
			return new Date($('#ddlYear' + sObjectId)[0].value, $('#ddlMonth' + sObjectId)[0].value - 1, ($('#ddlDay' + sObjectId).length > 0 ? $('#ddlDay' + sObjectId)[0].value : 1));
		} else
			return null;
	}

	function SetDate(sObjectId, date) {
		if (date != null) {
			$('#ddlYear' + sObjectId)[0].value = date.getFullYear();
			$('#ddlMonth' + sObjectId)[0].value = date.getMonth() + 1;
			$('#ddlDay' + sObjectId)[0].value = date.getDate();
		}
	}





  /*


  var curDate=new Date();
	startDate=date1;
	endDate=date2;
	curDate.DateDiff({interval:"d",date1:startDate,date2:endDate});
	alert(curDate.difference);

  */




// JScript source code
	var DayName=["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"];



	var oneMinute=1000*60;

	var intervalObject=new Object();
	intervalObject["yyyy"]={units:1000*60*60*24*365,measure:"year"};
	intervalObject["m"]={units:1000*60*60*24*30,measure:"month"};
	intervalObject["d"]={units:1000*60*60*24,measure:"day"};
	intervalObject["Q"]={units:intervalObject["m"].units*3,measure:"quarter"};
	intervalObject["H"]={units:oneMinute*60,measure:"hour"};
	intervalObject["N"]={units:oneMinute,measure:"minute"};
	intervalObject["S"]={units:1000,measure:"second"};


	function DateDiff(dateAddObj){
		this.interval=dateAddObj.interval;
		this.date1=dateAddObj.date1;
		this.date2=dateAddObj.date2;
		this.calculate=calculate;
		this.calculate();
	}

	Date.prototype.DateDiff=DateDiff;




	function calculate(){
		var paramDate1Object=this.date1;
		paramDate1Object.setHours(0);
		paramDate1Object.setMinutes(0);
		paramDate1Object.setSeconds(0);
		//paramDate1Object.getTimezoneOffset() * oneMinute;
		var paramDate1ObjectTime=paramDate1Object.getTime();


		var paramDate2Object=this.date2;
		paramDate2Object.setHours(0);
		paramDate2Object.setMinutes(0);
		paramDate2Object.setSeconds(0);
		var paramDate2ObjectTime=paramDate2Object.getTime();

		if(paramDate2Object>paramDate1Object){
			DSTAdjust=(paramDate2Object.getTimezoneOffset() - paramDate1Object.getTimezoneOffset()) * oneMinute;

		}
		else{
			DSTAdjust=(paramDate1Object.getTimezoneOffset() - paramDate2Object.getTimezoneOffset()) * oneMinute;
		}

		if(typeof intervalObject[this.interval]!="undefined"){
			if(typeof intervalObject[this.interval].units=="undefined"){
				alert("Interval is invalid!");
				return false;
			}

			var diff=Math.abs(paramDate2ObjectTime-paramDate1ObjectTime) - DSTAdjust;
			var timeDiff=Math.floor(diff/intervalObject[this.interval].units);
			if(timeDiff>1){
				var rname=intervalObject[this.interval].measure + "s";
			}
			else{
				var rname=intervalObject[this.interval].measure;
			}

			this.difference=parseInt(timeDiff);
		}
		else{
			this.difference="Wrong format of interval!";

		}

	}

 	function fillCombo(data, controlTarget) {
		ii = data.length;
		ClearDropDown(controlTarget, true, 'Seleccionar', "");
		for(i = 0; i < ii; i++) {
				var option = document.createElement('option');
				option.text = data[i].descripcion;
				option.value =  data[i].id;
				document.getElementById(controlTarget).options.add(option, i+1);
		}
 	}
		
	function ClearDropDown(sCombo, bAccionGenerica, sTextoGenerico, sValorGenerico) {
	 if(sCombo!='' && document.getElementById(sCombo))
	 {
	  var oCombo = document.getElementById(sCombo);
	  oCombo.length = 0;
	  oCombo.selectedIndex = 0;
	  if (bAccionGenerica)
	  {
	   var oItem = document.createElement("option");
	   oItem.text = sTextoGenerico;
	   oItem.value = sValorGenerico;
	   oCombo.options.add(oItem,0);
	  }
	 }
	}				
