function cValidate()
{    
	/**
	 * Attach event to all form element with 'required' class
	 */	
	this.message = ''; 
	 
	  	
	this.init = function(formid){		
		jQuery('#community-wrap #'+formid+' .required').blur(
			function(){
				if( ! jQuery(this).hasClass('validate-custom-date') )
				{
					if(cvalidate.validateElement(this))
						cvalidate.markValid(this);
					else					
						cvalidate.markInvalid(this);
				}	
			}
		);
		
		jQuery('#community-wrap #'+formid+' .validate-custom-date').blur(
			function(){
				if(cvalidate.validateElement(this))
					cvalidate.markValid(this);
				else					
					cvalidate.markInvalid(this);
			}
		);		
		
		jQuery('#community-wrap #'+formid+' .validateSubmit').click(
			function(){
				if(cvalidate.validateForm(formid)){
					return true;
				} else {
					alert('Required entry missing or entry contain invalid value!');
					jQuery('#community-wrap #'+formid+' .required[value=""]').each(
						function(i){cvalidate.markInvalid(this);}
					);
// 					jQuery('#'+formid+' input[type="checkbox"].required[checked=""]').each(
// 						function(i){cvalidate.markInvalid(this);}
// 					);
					
					return false;
				}
			}
		);
	}
	
	this.markInvalid= function(el){
	    var fieldName = el.name;
	    
        if(jQuery(el).hasClass('validate-custom-date')){
	       //since we knwo custom date come from an array. so we have to invalid all.
	       jQuery("input[name='"+fieldName+"']").addClass('invalid');
	       jQuery("select[name='"+fieldName+"']").addClass('invalid');
	    } else {
           jQuery(el).addClass('invalid');
	    }
	}
	
	this.markValid= function(el){
	    var fieldName = el.name;
	    	    
	    if(jQuery(el).hasClass('validate-custom-date')){
	       //since we knwo custom date come from an array. so we have to valid all.
	       jQuery("input[name='"+fieldName+"']").removeClass('invalid');
	       jQuery("select[name='"+fieldName+"']").removeClass('invalid');	       
	       
	    } else {	
		    jQuery(el).removeClass('invalid');
		}

	    //hide error only for those custom fields
	    if(fieldName != null){
			fieldName = fieldName.replace('[]','');
		    jQuery('#err'+fieldName+'msg').hide();	          
			jQuery('#err'+fieldName+'msg').html('&nbsp');
		}		
		
	}
	
	/**
	 *
	 */	
	this.validateElement = function(el){
	    var isValid = true;	    
	    
	    //console.log(jQuery(el).attr('type'));
	    var fieldName = el.name;
	    
	    if(jQuery(el).attr('type') == 'text' || jQuery(el).attr('type') == 'password' || jQuery(el).attr('type') == 'textarea'){
	    
	       if(jQuery.trim(jQuery(el).val()) == '') {	       
	          isValid = false;
	          //show error only for those custom fields
	          fieldName = fieldName.replace('[]','');	    		   
	               	           
	          lblName   = jQuery('#lbl'+fieldName).html();
	      
	          if(lblName == null){
		          lblName = 'Field';
	          } else {	              
	              lblName = lblName.replace('*','');
	          }
	          	          		      
		      this.setMessage(fieldName, lblName, 'CC INVALID VALUE');		      
	          
		   } else {
		   		   		   
		       if(jQuery(el).hasClass('validate-name')){
		           //checking the string length
		           if(jQuery('#jsname').val().length < 3){
			           this.setMessage('jsname', '', 'CC NAME TOO SHORT');
		               isValid = false;
		           } else {
		               jQuery('#errjsnamemsg').hide();
					   jQuery('#errjsnamemsg').html('&nbsp');
		               isValid = true;		           
		           }
		       }		   
		   
		       if(jQuery(el).hasClass('validate-username')){
		           //use ajax to check the pages.
		           if(jQuery('#usernamepass').val() != jQuery(el).val()){
		               isValid = cvalidate.ajaxValidateUserName(jQuery(el));
		               //cvalidate.ajaxValidateUserName(jQuery(el));
		           }//end if
		       }		   
		       if(jQuery(el).hasClass('validate-email')){
		   		   regex=/^[a-zA-Z0-9._-]+@([a-zA-Z0-9.-]+\.)+[a-zA-Z0-9.-]{2,4}$/;
			       isValid = regex.test(jQuery(el).val());
			       
			       if(isValid == false){
					   this.setMessage('jsemail', '', 'CC INVALID EMAIL');
			       } else {
					   
		               jQuery('#errjsemailmsg').hide();
					   jQuery('#errjsemailmsg').html('&nbsp');					   
					   				   
			           //use ajax to check the pages.
			           if(jQuery('#emailpass').val() != jQuery(el).val()){
			               isValid = cvalidate.ajaxValidateEmail(jQuery(el));
			           }//end if
				   }				          
		       }
		       
		       if(jQuery(el).hasClass('validate-password') && el.name == 'jspassword'){
		           if(jQuery('#jspassword').val().length < 6){
					   this.setMessage('jspassword', '', 'CC PASSWORD TOO SHORT');
		               isValid = false;
		           } else {
		               jQuery('#errjspasswordmsg').hide();
					   jQuery('#errjspasswordmsg').html('&nbsp');
		               isValid = true;		           
		           }
		       }		       
		       
		       if(jQuery(el).hasClass('validate-passverify') && el.name == 'jspassword2'){
		           //isValid = (jQuery('input[type="password"].validate-password, input[name="jspassword"]').val() == jQuery(el).val());		           
		           isValid = (jQuery('#jspassword').val() == jQuery(el).val());
		           
		           if(isValid == false){
					   this.setMessage('jspassword2', '', 'CC PASSWORD NOT SAME');
		           } else {
		               jQuery('#errjspassword2msg').hide();
					   jQuery('#errjspassword2msg').html('&nbsp');		           
		           }
		       }
		       
		       //now check for any custom field validation
		       if(jQuery(el).hasClass('validate-custom-date')){
		           isValid = this.checkCustomDate(el);
		       }
		       
           }//end if else
	       
	    } else if(jQuery(el).attr('type') == 'checkbox'){
	       if(jQuery(el).hasClass('validate-custom-checkbox')){
	           var cbObj = jQuery("input[name='"+fieldName+"']");
	       	           
	           if(cbObj.length > 1){
	               var checkCnt = 0;
		       	   for(var i=0; i < cbObj.length; i++){
					  if(cbObj[i].checked){
					      checkCnt++;
					  }//end if
				   }//end for
				   
				   if(checkCnt == 0){
				       isValid = false;
				   }//end if
				   
			   } else {
	               if(! cbObj.checked) isValid = false;		   
			   }
			   
			   if(isValid == false){
		          fieldName = fieldName.replace('[]','');
		          lblName   = jQuery('#lbl'+fieldName).html();		      
		          if(lblName == null){
			          lblName = 'Field';
		          } else {	              
		              lblName = lblName.replace('*','');
		          }
		          
		          
		          this.setMessage(fieldName, lblName, 'CC INVALID VALUE');
			   }//end if
	       	       	       	       	       	       	       
	       
	       } else {
              if(! jQuery(el).attr('checked')) isValid = false;	       
	       }	    	    	       	       
	       
	       
	    } else if(jQuery(el).attr('type') == 'select-one'){	       
	       if(jQuery(el).children(':selected').length == 0) isValid = false;
		   
		   
	       //now check for any custom field validation
	       if(jQuery(el).hasClass('validate-custom-date')){
	           isValid = this.checkCustomDate(el);
	       } else if(isValid == false){
		          fieldName = fieldName.replace('[]','');	    		   
		               	           
		          lblName   = jQuery('#lbl'+fieldName).html();
		      
		          if(lblName == null){
			          lblName = 'Field';
		          } else {
		              lblName = lblName.replace('*','');
		          }
                  this.setMessage(fieldName, lblName, 'CC INVALID VALUE');
	       }
		   	       	       
        } else if(jQuery(el).attr('type') == 'select-multiple') {
              if(jQuery(el).children(':selected').length == 0) isValid = false;
                            
              if(isValid == false){
		          fieldName = fieldName.replace('[]','');
		          lblName   = jQuery('#lbl'+fieldName).html();
		      
		          if(lblName == null){
			          lblName = 'Field';
		          } else {	              
		              lblName = lblName.replace('*','');
		          }
		          this.setMessage(fieldName, lblName, 'CC INVALID VALUE');
              }              
        }
        
        //console.log(jQuery(el).val());
        
		return isValid;   
	} 	
	
	/**
	 * Check & validate form elements
	 */	 	
	this.validateForm = function(formid){
	    var isValid = true;
	    jQuery('#community-wrap #'+formid+' .required').each(
						function(i){
							if(! cvalidate.validateElement(this)) isValid = false;
						}
			  );
		return isValid;
	}
	
	/**
	 * temp leave this here. If someting is wrong, will revert to this one.
	 */
	 this.ajaxValidateUserName_old = function(el){	     	     
		 var x = jQuery.ajax({
			data: 'view=register&task=ajaxCheckUserName&username='+jQuery(el).val(),
			url: 'index.php?option=com_community',
			type: 'POST',
			timeout: 2500,
			error: function() {
				console.log('Failed');	
			},
			success: function(e) {
			    //var myJson = eval(e); //always assume the return type is json string.
			    var myJson = eval('(' + e + ')');
				switch (myJson.status) {
					case 'KO':
						jQuery('#errjsusernamemsg').addClass('invalid');
						jQuery('#errjsusernamemsg').show();
						jQuery('#errjsusernamemsg').html('<br/>' + myJson.message);
						jQuery('#usernamepass').val('N');
						cvalidate.markInvalid(jQuery(el));
						return false;						
						break;
					case 'OK':
					default:					    
						jQuery('#errjsusernamemsg').removeClass('invalid');
						jQuery('#errjsusernamemsg').html('&nbsp');
						jQuery('#errjsusernamemsg').hide();
						jQuery('#usernamepass').val(jQuery(el).val());
						cvalidate.markValid(jQuery(el));						
						return true;
						break;
				}
			}	
		 });		 
	 }
	 
	/**
	 * Check the username whether already exisit or not.
	 */	 
	 this.ajaxValidateUserName = function(el){		 
	     jax.call('community', 'register,ajaxCheckUserName',jQuery(el).val());	      	     	 
	 }
	 
	/**
	 * Check the email whether already exisit or not.
	 */
	 this.ajaxValidateEmail = function(el){
	     jax.call('community', 'register,ajaxCheckEmail',jQuery(el).val());	 	     	     		 
	 }
	 
	 /**
	  * check custom date
	  */
	  this.checkCustomDate = function(el){
	      var isValid = true;
	      var fieldName = el.name;
	       //now check for any custom field validation
	       if(jQuery(el).hasClass('validate-custom-date')){
	           //we know this field is an array type.
	           fieldId = fieldName.replace('[]','');
	           var dateObj = jQuery("input[name='"+fieldName+"']");
	           
	           for(var i=0; i < dateObj.length; i++){
	               if (!/^-?\d+$/.test(dateObj[i].value)){
					    isValid = false;
				   }//end if
	           }//end for
	           
	           //now check whether the date is valid or not.
	           var dateObj2 = jQuery("select[name='"+fieldName+"']");
	           
	           //dd / mm/ yyyy
	           var dd = dateObj[0].value;
	           var mm = dateObj2[0].value;
	           var yy = dateObj[1].value;		           
	           		           		           
	           var dayobj = new Date(yy, eval(mm-1), dd);
	           
	           if ((dayobj.getMonth()+1!=mm)||(dayobj.getDate()!=dd)||(dayobj.getFullYear()!=yy)){
	               isValid = false;
	           }
	           
	           if(isValid == false){
                   this.setMessage(fieldId, '', 'CC INVALID DATE');				   		           
	           } else {
                   jQuery('#err'+fieldId+'msg').hide();
		           jQuery('#err'+fieldId+'msg').html('&nbsp');		           
	           }
	       }
		   return isValid;
	  
	  }
	  
	  /*
	   * Get the message text from langauge file using ajax
	   */
	  this.setMessage = function(fieldName, txtLabel, msgStr){
	      jax.call('community', 'register,ajaxSetMessage',fieldName, txtLabel, msgStr);	      
	  }
	
}

var cvalidate = new cValidate();

