function FormValidate(form,scroller){                
    var _msjs = {
                   'required':'Información requerida.',
                   'mail':'Formato incorrecto.',
                   'date':'Fecha inválida.'
                 };
    var _errClass   = 'error';
    var _tagMsj     = 'strong';
    var _dateFormat = 'yyyy-mm-dd';
    // Cuenta cantidad errores
    var _err = 0;
    // Validar mail
    var _isMail        = function(str) {var filter=/^([\w\-\.]+)@((\[([0-9]{1,3}\.){3}[0-9]{1,3}\])|(([\w\-]+\.)+)([a-zA-Z]{2,4}))$/;return(filter.test(str));}
    var _validMails    = function(fields){var f;for(var i in fields){f=fields[i];if(f.val()!=''&&!_isMail(f.val())){_err++;_ShowErr(f,_msjs.mail);}else if(f.val()!=''&&!f.hasClass('v_required')){_ClearErr(f);}}}
    var _isDate        = function(str){var format=_dateFormat;var result=false,fD='(0?[1-9]|([1-2][0-9])|(3[0-1]))',fM='((0?[1-9])|(1[0-2]))',fY='[0-9]{4}';var regExp=format.replace('dd',fD);regExp = regExp.replace('mm',fM);regExp = regExp.replace('yyyy',fY);var filter = new RegExp('^'+regExp+'$');result = filter.test(str);if(result){var sep=format.replace(/[ a-z]/g,'');sep=sep.substring(0,1);var arrF = format.split(sep);var arrD = str.split(sep);var dd,mm,yyyy;for(var i=0;i<arrF.length;i++){switch(arrF[i]){case 'dd':dd = parseInt(arrD[i]);break;case 'mm':mm = parseInt(arrD[i]); break;case 'yyyy':yyyy = parseInt(arrD[i]);break;}}result=_ckeckDate(mm,dd,yyyy);}return result;}
    var _ckeckDate     = function(mm,dd,yyyy){switch(mm){case 4:case 6:case 9:case 11:if(dd==31)return false;break;case 2:if(29<dd||(dd==29&&!_Bisiesto(yyyy)))return false;break;}return true;}
    var _Bisiesto      = function (year){return(((year%4==0)&&(year%100!=0))||(year%400==0))?1:0;}
    var _validDate     = function(fields){var f;for(var i in fields){f=fields[i];if(f.val()!=''&&!_isDate(f.val())){_err++;_ShowErr(f,_msjs.date);}else if(f.val()!=''&&!f.hasClass('v_required')){_ClearErr(f);}}}
    var _validRequired = function(fields){var f;for(var i in fields){f=fields[i];if(f.val()==''||f.val()==0){_err++;_ShowErr(f,_msjs.required);}else{_ClearErr(f);}}}
    var _ShowErr       = function(elem,msj){var fC = elem.parents('dd');fC.addClass(_errClass);$(_tagMsj+'.'+_errClass,fC).remove();var mC = $('<'+_tagMsj+' class="'+_errClass+'"></'+_tagMsj+'>');mC.css({display: 'none'});mC.html(msj);mC.appendTo(fC).fadeIn('slow');fC = elem.parents('li');fC.addClass(_errClass);$(_tagMsj+'.'+_errClass,fC).remove();var mC = $('<'+_tagMsj+' class="'+_errClass+'"></'+_tagMsj+'>');mC.css({display: 'none'});mC.html(msj);mC.appendTo(fC).fadeIn('slow');}
    var _ClearErr      = function(elem){var fC = elem.parent();elem.removeClass(_errClass);$(_tagMsj+'.'+_errClass,fC).remove();}
    var _validar       = function(clase){
                           var fields = new Array();
                           var i = 0;
                           $('.'+clase,form).each(function(){
                             fields[i++] = $(this);
                           });
                           switch(clase){
                               case 'v_mail':
                                    _validMails(fields);
                                    break;
                               case 'v_date':
                                    _validDate(fields);
                                    break;
                               case 'v_required':
                                    _validRequired(fields);
                                    break;
                           }
                        }
    //  Valido
    this.Validate = function(){
                            _err = 0;
                            _validar('v_required');
                            _validar('v_mail');
                            _validar('v_date');

                            if(_err==0){
                              return true;
                            }else{
                                try{$.fancybox.resize();}catch(ex){}
                                
                              var self = this;
                              scroller = scroller==undefined?true:scroller;
                              if(!scroller)return false;
                              /*Si no valido posisiono la pagina en el primer campo que fallo*/
                              var al=$('.'+_errClass,self.form).eq(0).position();var d=$(document);var sE=parseInt(al.top);var sD=d.scrollTop();var wH=$(window).height();sE-=30;
                              if(sE<=sD){var timerInter = setInterval(function(){sD = Math.floor((sD+sE)/2);d.scrollTop(sD);if(sD<=sE)clearInterval(timerInter);},100);}else if((sD+wH)<=sE){var timerInter=setInterval(function(){sD=Math.ceil((sD+sE)/2);d.scrollTop(sD);if(sE<=sD)clearInterval(timerInter);},100);}
                              return false;
                            }
                    }
    }
