FieldValidator = Class.create();

FieldValidator.prototype = {

  initialize: function(field,verifier,options) {
    this.field = $(field);
    this.verifier = verifier;
	
	this.msgError=options.get('msgError'); //fix div
	this.cusFieldname=options.get('cusFieldname');
    this.options = Object.extend(
      {
        //errorContainer: 'errorContainer', //float div
        errorClassName: 'fieldInError', //float div
        paramName: 'value'
      },
      options
    );
    //this.errorContainer = $(this.options.errorContainer);
	this.errorContainer=$(options.get('errorContainer'));
    this.field.validator = this;
    this.field.onblur = function() {
      this.validator.validate();
    }		
  },

  validate: function() {
  
    this.clearError();
    if (this.verifier instanceof Function) {
      var message = this.verifier(this.field);
     // if (message != null) this.markInError(message);
	   if (message != null) this.markInError(message,this.hideErrorDiv,this.errorContainer);
    }
    else {
      var validator = this;
      var paramHash = {};
      paramHash[this.options.paramName] = $F(this.field);
      new Ajax.Request(
        this.verifier,
        {
          parameters: $H(paramHash).toQueryString(),
          method: 'get',
          onSuccess: function(transport) {
            if (transport.responseText != '') {
              validator.markInError(transport.responseText);
            }
          }
        }
      );
    }
  },

  markInError: function(message,hide,errorContainer) {
    Element.addClassName(this.field,
                         this.options.errorClassName);
    this.errorMessageElement = document.createElement('div');
    this.errorMessageElement.appendChild(
      document.createTextNode(message) );
    this.errorContainer.appendChild(
      this.errorMessageElement);
	  this.arrangeDOM();
    Element.show(this.errorContainer);	
	if (this.msgError) {
		Element.show(this.msgError);
	}
	
	
	if(this.options.get('autohide')==true){	
		setTimeout(function(){hide(errorContainer);},9000);
	}
	
  },
 hideErrorDiv: function(errorContainer){
	
	Element.hide(errorContainer);

}
,


  clearError: function() {
  	if (this.msgError) {
		Element.hide(this.msgError);
	}
    Element.removeClassName(this.field,
                            this.options.errorClassName);
    if (this.errorMessageElement) {
		if (this.errorMessageElement.parentNode) { //ar add this line
			this.errorMessageElement.parentNode.removeChild(this.errorMessageElement);			
		} //ar add this line
		
		//ar add
		//if($(this.options.errorContainer).descendants()==""){	//work!!
		
		/*
		if($(this.options.errorContainer).innerHTML==""){					
			 $(this.options.errorContainer).hide();
		}*/
		
		if($(this.errorContainer).descendants()==""){// will check correct if innerHTML have space character 
		//if($(this.errorContainer).innerHTML==""){					
			 $(this.errorContainer).hide();
		}
		
	}

	
	
  },
  arrangeDOM:function(){  //ar add
	var list = this.errorContainer;
var items = list.childNodes;
var itemsArr = [];
for (var i in items) {
	if (items[i]) { //ar add this line
		if (items[i].nodeType == 1) { // get rid of the whitespace text nodes
			itemsArr.push(items[i]);
		}
	}//ar add this line
}

itemsArr.sort(function(a, b) {
  return a.innerHTML == b.innerHTML
          ? 0
          : (a.innerHTML > b.innerHTML ? 1 : -1);
});

for (i = 0; i < itemsArr.length; ++i) {
  list.appendChild(itemsArr[i]);
}

}

}

FieldValidator.verifier = {};

FieldValidator.verifier.NotBlank = function(field) {
  if ($F(field) == '') {
    //return 'The ' + field.name + ' field cannot be blank';
	
	  if(this.cusFieldname){
  	name=this.cusFieldname;
  }else{
  	name=field.name;
  }
  
  return 'ข้อมูล ' + name + ' ไม่ได้กรอกครับ';
	
	
	
	//return 'ข้อมูล ' + field.name + ' ไม่ได้กรอกครับ';
  }
  else {
    return null;
  }
}

FieldValidator.verifier.IsNumeric = function(field) {
  if ($F(field) == '' || isNaN(new Number($F(field)))) {
  // return 'The ' + field.name + ' field must be numeric';
  
  if(this.cusFieldname){
  	name=this.cusFieldname;
  }else{
  	name=field.name;
  }
  
  return 'ข้อมูล ' + name + ' ไม่ใช่ตัวเลขครับ';
	//return 'ข้อมูล ' + field.name + ' ไม่ใช่ตัวเลขครับ';
  }
  else {
    return null;
  }
}

FieldValidator.verifier.IsEmail =function (field) {
if(($F(field).search(/^\w+((-\w+)|(\.\w+))*\@[A-Za-z0-9]+((\.|-)[A-Za-z0-9]+)*\.[A-Za-z0-9]+$/) != -1)==false){
	return 'ข้อมูล อีเมล์ ไม่ถูกต้องครับ';	
}else{
	return null;
}
}


