
Validation.addAllThese([
	/*
	Example: <input id='email' class='validate-ajax' validateUrl='http://localhost:8080/validate-email.jsp' validateFailedMessage='email already exists'>
  */
	['validate-userNameExist',function(v,elm,args,metadata) {
	  /*
	  form element必須有id
	  args[0]=url
	  args[1]=posshopno/shopno
    */
		var ajaxObj=new AjaxValidation();
		var pars=Form.serializeElements(new Array(elm)) + ValidationUtils.format("&what=%s&value=%s",[elm.name,encodeURIComponent(v)]);
		ajaxObj.setPars(pars);
		ajaxObj.setAjaxReqObj();
		if (ajaxObj.getValidResult()){
			return true;
		} else {
			metadata._error=ajaxObj.getMsg();
			return false;	
		}
	}],
	['validate-userNamePwdExist',function(v,elm,args,metadata) {
	  /*
	  form element必須有id
	  args[0]=url
	  args[1]=posshopno/shopno
    */
		var ajaxObj=new AjaxValidation();
		var pars=Form.serializeElements(new Array($(args[1]),elm)) + ValidationUtils.format("&what=%s&value=%s",[elm.name,encodeURIComponent(v)]);
		ajaxObj.setPars(pars);
		ajaxObj.setAjaxReqObj();
		if (ajaxObj.getValidResult()){
			return true;
		} else {
			metadata._error=ajaxObj.getMsg();
			return false;	
		}
	}],
	['validate-one-required-fromGrandParent', function (v,elm,args,metadata) {
		var p = elm.parentNode.parentNode;
		var options = p.getElementsByTagName('INPUT');
		return $A(options).any(function(elm) {
			return $F(elm);
		});
	},{ignoreEmptyValue : false}],	
	['validate-one-required-fromParent', function (v,elm,args,metadata) {
		/*
		In 'validate-one-required' case, all the element like checkbox should be in 1 container. 
		Otherwise, getElementsByTagName cannot get the checkbox list if every checkbox put in <li>, <td> etc.
		To solve this problem we should know how many levels we should go back, for example
		<table>
			<tbody>
				<tr><td><input type="checkbox" name="userID[]" value="XXX" /></td></tr>
				<tr><td><input type="checkbox" name="userID[]" value="XXX" /></td></tr>
				<tr><td><input type="checkbox" name="userID[]" value="XXX" /></td></tr>
				<tr><td><input type="checkbox" name="userID[]" value="XXX" /></td></tr>
			</tbody>
		</table>
		<div id="advice-validate-one-required-fromParent-4-confirmUserID[]" class="validation-advice" style="display:none"></div>
		
		so there are 4(args[0]) levels exists
		<input> --> <td> --> <tr> --> <tbody> --> <table>
		alert(elm.parentNode.parentNode.parentNode.tagName);
		*/
		var options = elm.up(parseInt(args[0])).getElementsByTagName('INPUT');
		return $A(options).any(function(elm) {
			return $F(elm);
		});
	},{ignoreEmptyValue : false}],	
	['validate-one-trigger-others', function (v,elm,args,metadata) {
		/*when one radio button value is same with args[0], then the user must input args[1] and args[2], args[3] is the warning msg*/
		if (args[3]!=''){
			metadata._error=args[3];
		}
		var p = elm.parentNode;
		var options = p.getElementsByTagName('INPUT');
		var result=$A(options).detect(function(elm) {
			return $F(elm);
		});
		if (result.value==args[0]){
			if((!Validation.get('required').test($F(args[1]))) || (!Validation.get('required').test($F(args[2])))){
				return false;
			} else {
				return true;
			}
		}
		return true;
	},{ignoreEmptyValue : false}],
	['validate-codeNotExist',function(v,elm,args,metadata) {
	  /*
	  form element必須有id
	  args[0]=url
	  args[1]=Unique ID field name
    */
		var ajaxObj=new AjaxValidation();
		var pars=ValidationUtils.format("&what=%s&value=%s&idName=%s&idValue=%s",[elm.name,encodeURIComponent(v),encodeURIComponent(args[1]),encodeURIComponent($(args[1]).value)]);
		ajaxObj.setUrl(args[0]);
		ajaxObj.setPars(pars);
		ajaxObj.setAjaxReqObj();
		if (ajaxObj.getValidResult()){
			return true;
		} else {
			metadata._error=ajaxObj.getMsg();
			return false;	
		}
	}],
	['validate-alphanumline',/^[a-zA-Z0-9_-]+$/],
	['validate-captcha',function(v,elm,args,metadata) {
	  /*
	  form element必須有id
	  args[0]=url
	  args[1]=Unique ID field name
    */
		var ajaxObj=new AjaxValidation('checkCaptcha');

//		var pars="id=" + encodeURIComponent(args[1]) + "&" + Form.serializeElements(new Array(elm));
		var pars=ValidationUtils.format("what=%s&value=%s",[elm.name,encodeURIComponent(v)]);
		ajaxObj.setUrl(args[0]);
		ajaxObj.setPars(pars);
		ajaxObj.setAjaxReqObj();
		if (ajaxObj.getValidResult()){
			return true;
		} else {
			metadata._error=ajaxObj.getMsg();
			return false;	
		}
	}]
]);


function checkResponse(transport){
    setLog('ajax checking','debug');
    logConsoleResponse(transport);
    var exception=transport.responseXML.getElementsByTagName("exception");
    if (exception.length==0){
        var responses=transport.responseXML.getElementsByTagName("responses")[0];
        var result=getElementTextNS("","result",responses,0);
        if (result){
            return '';
        } else {
            return getElementTextNS("","msg",responses,0);
        }
    }
}