








function wValidate(){
  
  this.validationTexts      = new Array()
  this.validationTexts[0]   = new Object();
    
  this.setValidationTexts = function(id, text){
    this.validationTexts[0][id] = text;
  }

   this.validateFileName = function(object, caption, value, required, lang) {

    if(required && !this.validateRequired(object, caption, value, lang)){
      return false;
    }
    
    if(value.search(/^[a-zA-Z0-9_\.]+$/) == -1){

      wShowMessagebox('validateName', '', this.validationTexts[0]['fileName_pre'] + " " + caption + " " + this.validationTexts[0]['fileName_post'], 'cancel', 'warning', object.id);
      return false;  
    }
    
    return true;
  }
  
   this.validateEmail = function(object, caption, value, required, message, lang) {
    
    if(required && !this.validateRequired(object, caption, value, lang)){
      return false;
    }
    
    if(value.search(/[a-zA-Z0-9\.\-_]+@[a-zA-Z0-9][a-zA-Z0-9\.-]*\.\w\w+/) == -1){
      if(message){

        wShowMessagebox('validateEmail', '', this.validationTexts[0]['email_format_pre'] + " " + caption + " " + this.validationTexts[0]['email_format_post'], 'cancel', 'warning', object.id);
      }
      else{
        object.focus();
        object.className = 'validationInputError';
      }
      return false;
    }
    object.className = 'wInput';
    return true;
  }

  this.validateRequired = function(object, caption, value, type, lang){
    var temp = value.replace(/^\s+|\s+$/, ''); 
    if(temp.length < 1){
      if(type != ''){
        if(typeof this.validationTexts[0]['required_' + type + '_pre'] == 'string'){ 

          wShowMessagebox('validateRequired', '', this.validationTexts[0]['required_' + type + '_pre'] + " " + caption + " " + this.validationTexts[0]['required_' + type + '_post'], 'cancel', 'warning', object.id);
        }
        else{

          wShowMessagebox('validateRequired', '', this.validationTexts[0]['required_pre'] + " " + caption + " " + this.validationTexts[0]['required_post'], 'cancel', 'warning', object.id);
        }
      }
      else{

        wShowMessagebox('validateRequired', '', this.validationTexts[0]['required_pre'] + " " + caption + " " + this.validationTexts[0]['required_post'], 'cancel', 'warning', object.id);
      }
      return false;
    }
    return true;
  }

}

function wValidateObject(){
  
  this.validateObject = new Array();
  
  this.addValidateObject = function(object, type, required){
    var index   = this.validateObject.length;
    this.validateObject[index]              = new Object();
    this.validateObject[index]['object']    = object;
    this.validateObject[index]['type']      = type;
    this.validateObject[index]['required']  = required;
  }
  
  this.validateRequiredValues = function(){
    var result = true;
    for(var i = 0; i < this.validateObject.length; i++){
      if(this.validateObject[i]['required'] && this.validateObject[i]['object'].value == ''){
        var classNameObject = 'wInputError';
        this.validateObject[i]['object'].className = this.validateObject[i]['object'].className.replace(/\swInputError|\swSelectError/, "") + " " + classNameObject;
        result = false;
      }
    }
    return result;
  }
  
}

function wValidateFilename(value){
  if(value.search(/^[a-zA-Z0-9_\.]+$/) == -1){
    return false;
  }
  return true;
}

function wValidateUsername(value){
  if(value.search(/^[a-zA-Z0-9_\.]+$/) == -1){
    return false;
  }
  return true;
}

function messagebox_validateName_onConfirm(rtc, objectId){

  var object     = document.getElementById(objectId);
  if(object != null && typeof object == 'object'){
     object.focus();
   }
}

function messagebox_validateEmail_onConfirm(rtc, objectId){

  var object     = document.getElementById(objectId);
  if(object != null && typeof object == 'object'){
    object.className = 'validationInputError';
     object.focus();
   }
}

function messagebox_validateRequired_onConfirm(rtc, objectId){

  var object     = document.getElementById(objectId);
  if(object != null && typeof object == 'object'){
     object.focus();
   }
  
}





function wFormObject(obj){
 
  this.formObject   = obj;
  this.elements     = new Array();
  this.errorHandler = new Array();
  this.errorMsg     = new Array();
  this.classNames   = new Array();

  this.setFocus     = false;
  
  this.constructor  = function(){
    
    this.elements[0]      = new Object();
    this.errorHandler[0]  = new Object();
    this.classNames[0]    = new Object();
    this.classNames[0]['input']             = 'wglInputError';
    this.classNames[0]['select']            = 'wglSelectError';
    this.classNames[0]['calendarSelect']    = 'wglSelectError';
    this.classNames[0]['radio']             = 'wglRadiobuttonError';
    this.classNames[0]['default']           = 'wglInputError';
    this.classNames[1]    = new Object();
    this.classNames[1]['input']             = 'wglInputOk';
    this.classNames[1]['checkbox']          = 'wglInputCheckboxOk';
    this.classNames[1]['select']            = 'wglSelectOk';
    this.classNames[1]['calendar']          = 'wglInputCalendar';
    this.classNames[1]['calendarClock']     = 'wglInputCalendar';
    this.classNames[1]['calendarSelect']    = 'wglSelectOk';
    this.classNames[1]['radio']             = 'wglRadiobuttonOk';
    this.classNames[1]['default']           = 'wglInputOk';
    this.classNames[2]    = new Object();
    this.classNames[2]['default']           = /\swglInputError|\swglSelectError|\swglInputOk|\swglSelectOk/;
    this.classNames[2]['checkbox']          = /\swglInputError|\swglSelectError|\swglInputOk|\swglInputCheckboxOk|\swglSelectOk/;
    this.classNames[2]['radio']             = /\swglRadiobuttonError|\swglInputError|\swglSelectError|\swglRadiobuttonOk|\swglInputOk|\swglSelectOk/;
    this.errorMsg[0]      = new Object();
    this.errorMsg[0]['required']          = 'required';
    this.errorMsg[0]['default']           = 'Type not valid: ';
  }
  this.constructor();

  this.registerElement = function(name, object, type, required, caption, regExp, uniqueId){
    
    var index = 0;
    if(!this.elements[0][name]){
      this.elements[0][name]    =  new Array(); 
      this.elements[0][name][0] = new Object();
    }
    this.elements[0][name][index]             = new Object();
    this.elements[0][name][index]['object']   = object;
    this.elements[0][name][index]['type']     = type;
    this.elements[0][name][index]['required'] = required;
    this.elements[0][name][index]['valid']    = true;
    this.elements[0][name][index]['error']    = '';
    this.elements[0][name][index]['regExp']   = regExp;
    this.elements[0][name][index]['uniqueId'] = uniqueId;
    this.elements[0][name][index]['caption']  = name;
    if(caption != 'undefined'){
      this.elements[0][name][index]['caption'] = caption;
    }
  }

  this.setClassNames = function(data){
    this.classNames = data;
  }

  this.setErrorMsg = function(name, type){
    if(!this.elements[0][name][0]['valid']){
      if(type == '' || type == 'undefined'){
        type = this.elements[0][name][0]['type'];
      }
      var separator = '';
      if(this.elements[0][name][0]['error'] != ''){
        separator = ', ';
      }
      
      this.elements[0][name][0]['error'] += separator + this.errorMsg[0][type];
    }
  }

  this.validateElements = function(){
    this.setFocus = false;
    var result  = true;
    var temp    = null;
    for(var nameElement in this.elements[0]){
      if(this.formObject.elements[nameElement]){
        temp = this.validateElement(nameElement);
        if(!temp){
          result = false;
        } 
      }
    }
    return result;
  }

  this.validateUnique = function(name, uniqueId){
    
    var result = true; 
    try{    
      var uniqueValue = this.elements[0][name][0]['object'].value;
      for(var nameElement in this.elements[0]){
        if(name != nameElement && this.elements[0][nameElement][0]['uniqueId'] == uniqueId && this.elements[0][nameElement][0]['object'].value == uniqueValue){
          throw 'notUnique';
        } 
      }
    }
    catch (e){
      if(e == 'notUnique'){
        result = false;
      }
    }
    return result;
  }

  this.validateRequired = function(name){
    
    var result = false;
    var object = this.elements[0][name];

    if(object[0]['type'] == 'checkbox' || object[0]['type'] == 'radio'){
      if(object[0]['object'].nodeName == 'INPUT' && object[0]['object'].checked){
        result = true;
      }
      else{
        for(var i = 0; i < object[0]['object'].length && !result; i++){
          if(object[0]['object'][i].checked){
            result = true;
          }
        }
      }
    }

    else if(object[0]['object'].length && !object[0]['object'].nodeName){
      for(var i = 0; i < object[0]['object'].length && !result; i++){
        if(object[0]['object'][i].value.replace(/^\s+|\s+$/, '') != ''){
          result = true;
        }
      }  
    }

    else if(object[0]['object'].value.replace(/^\s+|\s+$/, '') != ''){
      result = true;
    }
    return result;
  }

  this.isElement = function(name){
    var result = false;
    if(this.elements[0][name]){
      result = true;
    }
    return result;
  }

  this.validateType = function(name){
  
    var result  = true;
    var object  = this.elements[0][name];
    var type    = object[0]['type'];

    if(object[0]['object'].length && !object[0]['object'].nodeName){
      for(var i = 0; i < object[0]['object'].length && result; i++){
        result = this.validateString(name, object[0]['object'][i].value, type);
      }
    }

    else{
      var str     = object[0]['object'].value;
      result = this.validateString(name, str, type);
    }
    
    if(!result){
      this.setErrorMsg(name);
    }
    
    return result;
  }

  this.validateString = function(name, str, type){
  
    var result = true; 
    if(str && str.length > 0){
      var regExp = this.elements[0][name][0]['regExp'];
      if(regExp && regExp != '' && regExp != 'undefined'){
        result = true;
        if(str.search(eval(regExp)) == -1){
          result = false;
        }
      }
      else if(type == 'char' && !str.match(/^[a-z ]+$/i)){
        result = false; 
      }
      else if(type == 'int' && !str.match(/^[0-9]+$/i)){
        result = false; 
      }
      else if(type == 'file' && !str.match(/^[a-zA-Z0-9_\.]+$/)){
        result = false; 
      }

      else if(type == 'fileMultiple'){
        var parts = str.split('|');
        for(var i = 0; i < parts.length && result; i++){
          if(!parts[i].match(/[a-zA-Z0-9_\.]+$/)){
            result = false;
          }
        }
      }

      else if(type == 'dir' && !str.match(/^[^\.]+$/)){
        result = false; 
      }

      else if(type == 'dirMultiple'){
        var parts = str.split('|');
        for(var i = 0; i < parts.length && result; i++){
          if(!parts[i].match(/^[^\.]+$/)){
            result = false;
          }
        }
      }

      else if(false && type == 'filePath' && !str.match(/[a-zA-Z0-9_\.]+$/)){
        result = false; 
      }
      else if(type == 'htmlName' && !str.match(/^[a-zA-Z0-9_\.]+$|^[a-zA-Z0-9_\.]+\[\]$/)){
        result = false; 
      }
      else if(type == 'email'){
        if(str.search(/([a-zA-Z0-9\.\-_]+@[a-zA-Z0-9][a-zA-Z0-9\.-]*\.\w\w+)/) != 0){
          result = false;
        }
        else if(RegExp.$1.length != str.length){
          result = false;
        }
      }
    }
    
    return result;
  }

  this.setClassName = function(name){
     var object   = this.elements[0][name];
     var typeMsg  = object[0]['type'];
     var index    = 1;
     if(!object[0]['valid']){
       index = 0;
       object[0]['object'].title = object[0]['errorMsg']; 
       this.errorHandler[0][name] = object[0]['caption'] + ': ' + object[0]['errorMsg'];
     }
     else{
       object[0]['object'].title = object[0]['object'].name;
       this.errorHandler[0][name] = null;
     }
     
     if(!this.classNames[index][typeMsg]){
       typeMsg = 'default';
     }
     
     var className = this.classNames[index][typeMsg];

     if(object[0]['type'] == 'checkbox' || object[0]['type'] == 'dirMultiple' || object[0]['type'] == 'fileMultiple'){
       object[0]['object'].parentNode.className = object[0]['object'].parentNode.className.replace(this.classNames[2][object[0]['type']], "") + " " + className;
     }

     else if(object[0]['type'] == 'radio'){
       for(var i = 0; i < object[0]['object'].length; i++){
         object[0]['object'][i].className = object[0]['object'][i].className.replace(this.classNames[2]['radio'], "") + " " + className;
       }
     }

     else if(object[0]['object'].length && !object[0]['object'].nodeName){
       for(var i = 0; i < object[0]['object'].length; i++){
          object[0]['object'][i].className = object[0]['object'][i].className.replace(this.classNames[2]['default'], "") + " " + className;
       }
     }

     else{
       object[0]['object'].className = object[0]['object'].className.replace(this.classNames[2]['default'], "") + " " + className;
     }

   }

  this.validateElement = function(name){
    var result = true;
    var vObject = this.elements[0][name][0]['object'];
    var type = this.elements[0][name][0]['type'];
    var required = this.elements[0][name][0]['required'];
    var uniqueId = this.elements[0][name][0]['uniqueId'];

    if(typeof wOnBeforeValidateElement == 'function'){
      result = wOnBeforeValidateElement(name, this.elements[0][name][0]);
    }
    if(result){
      try{

        if(uniqueId && uniqueId != ''){
          result = this.validateUnique(name, uniqueId);
          this.elements[0][name][0]['errorMsg'] = 'value not unique';
        }

        if(result && required == '1'){
          result = this.validateRequired(name);
          this.elements[0][name][0]['errorMsg'] = 'value required';
        }

        if(result && !this.validateType(name) && (vObject.value != '' || type == 'calendarSelect')){
          result = false;
          this.elements[0][name][0]['errorMsg'] = 'value not valid, type: ' + type;
        }

        if(!this.setFocus && !result){
          if(vObject.length && !vObject.nodeName){
            vObject[0].focus();
          }
          else{
            vObject.focus();
            if(typeof vObject.select == 'function'){
              vObject.select();
            }
          }
          this.setFocus = true;
        }
        this.elements[0][name][0]['valid'] = result;

        this.setClassName(name);
      }
      catch(e){
        result = true;
      }

      if(typeof wOnAfterValidateElement == 'function'){
        result = wOnAfterValidateElement(name, this.elements[0][name][0], result);       
      } 
    }
        
    return result;
  } 

  this.getErrorMsgs = function(name){
    var errorMsg = 'Validation Failed: <br/>';
    if(!name){
      for(var objName in this.errorHandler[0]){
        if(this.errorHandler[0][objName] != null){
          errorMsg += this.errorHandler[0][objName] + '; <br/>';
        }
      }
    }
    else{
      errorMsg = this.errorHandler[0][name];
    }
    return errorMsg;
  }
  
}

