//------------------------------------------------------
// ERROR - Fehlerbehandlung
//------------------------------------------------------

// Fehlerobjekt
// @id : ID des Elemnts, das den Fehler auslöst
// @message : Fehlermeldung
// @type : Fehlertyp / Fehlergrad
function Error(id, message, type) {
	this.id = id;
	this.message = message;
	this.type = type;
}

// Aktualisiert alle unter errors(Array) bekannten Fehler in der GUI 
function Errors(){

  // Objekte Error[id, message, type]
  this.errors = new ArrayList();

  // Fügt eine weitere Fehlermeldung hinzu
  Errors.prototype.add = function(id, message, type){
    this.errors.add(id, new Error(id, message, type));   
  }

  // Entfernt eine weitere Fehlermeldung hinzu
  Errors.prototype.sub = function(id){
    this.errors.sub(id);   
  }

  // Nimmt ein Array an Fehlern auf
  Errors.prototype.setErrors = function(errors){
    // Alle Fehler löschen
    this.errors.clear();
    for(var i=0; i < errors.length; i++)
      this.errors.add(errors[i].id, new Error(errors[i].id, errors[i].message, errors[i].type));  
    // Fehlermeldungen in der GUI setzen
  }
  
  // Erstellt ein Feld mit der Fehlermeldung
  Errors.prototype.createMessage = function(current_error){
    var span = document.createElement("span");
    span.setAttribute("class", "error_"+current_error.type);
    span.innerHTML = "* "+current_error.message;
    return span;
  }

  // Setzt alle Fehlermeldungen in die GUI
  Errors.prototype.setMessages = function(){
    var keys = this.errors.getKeys();
    for(var i=0; i < keys.length; i++){
      // aktueller Fehler Objekte [id, message, type]
      var current_error = this.errors.get(keys[i]);
      if(current_error.id == "global"){
        // Globale Fehlermeldung
        var error_div = document.getElementById("global_error");
        error_div.innerHTML = "";
        error_div.appendChild(this.createMessage(current_error));
        error_div.style.display = "block";
      
      } else {    
        // Eingabefeld
        var current_element = document.getElementById(current_error.id);
        if(isset(current_element)){
          // Class anpassen
          var current_classname = current_element.className;
          current_classname = current_classname.replace(current_error.type,"");
          setClass(current_element, current_classname+current_error.type);
        }
        // Message setzen
        var error_div = document.getElementById(current_error.id+"_error");
        error_div.innerHTML = "";
        error_div.appendChild(this.createMessage(current_error));
        error_div.style.display = "block";
      } 
    }
  }
  
} 

//------------------------------------------------------
// VALIDATOR - validiert Clientseitig Eingabefelder
//------------------------------------------------------

function Validator(){

  // Validierung RegExp
  // @obj : ID des Objekts das Validiert wird
  // @pattern : Pattern
  Validator.prototype.pattern = function(obj, pattern){
    var regExp = new RegExp(pattern,"i");
    // RegExp anwenden
    var result = obj.value.search(regExp);
    // Fehlermeldung ausgeben
    if(result == -1){
      Errors.add(obj.id, "Das Format ist ungültig.", "error"); 
      Errors.setMessages();
    }
  }
  
  // Validierung Datum
  // @obj : ID des Objekts das Validiert wird
  Validator.prototype.date = function(obj){
    var pattern = "^[0-9]{2}\.[0-9]{2}\.[0-9]{4}\ [0-9]{2}\:[0-9]{2}$";
    var regExp = new RegExp(pattern,"i");
    // RegExp anwenden
    var result = obj.value.search(regExp);
    // Fehlermeldung ausgeben
    if(result == -1){
      Errors.add(obj.id, "Das Format ist ungültig. Gebt ein gültiges Datumsformat ein. Bsp.: 01.12.2010 23:59", "error"); 
      Errors.setMessages();
    } else {
      Errors.sub(obj.id); 
      Errors.setMessages();
    }
  }
  
  // Validierung Länge
  // @obj : ID des Objekts das Validiert wird
  // @min : Mindestlänge
  // @max : Maximallänge
  Validator.prototype.length = function(obj, min, max){
    if(obj.value.length > max){
      Errors.add(obj.id, "Eingabe zu lang. Maximal "+max+" Zeichen zulässig.", "error"); 
      Errors.setMessages();
    } else if(obj.value.length < min) {
      Errors.add(obj.id, "Eingabe zu kurz. Mindestens "+min+" Zeichen notwendig.", "error"); 
      Errors.setMessages();
    } else {
      Errors.sub(obj.id); 
      Errors.setMessages();    
    }
  }
  
  // Validierung Zahlenbereich
  // @obj : ID des Objekts das Validiert wird
  // @min : Mindestreichweite
  // @max : Maximalreichweite
  Validator.prototype.range = function(obj, min, max){
    var value = parseInt(obj.value);
    if(value > max){
      Errors.add(obj.id, "Die maximale Eingabe beträgt "+max+".", "error"); 
      Errors.setMessages();
    } else if(value < min) {
      Errors.add(obj.id, "Die minimale Eingabe beträgt "+max+".", "error"); 
      Errors.setMessages();
    } else {
      Errors.sub(obj.id); 
      Errors.setMessages();    
    }
  }
  
}


//------------------------------------------------------
// DISPLAY - setzt Sichtbarketeiten von Objekten
//------------------------------------------------------

function Display(){

  // Elemente einblenden
  // @args : IDs
  Display.prototype.block = function(){
    for(var i=0; i < arguments.length; i++){
      var obj = document.getElementById(arguments[i]);
      if(isset(obj))
        obj.style.display = "block";   
    } 
  }
  
  // Elemente ausblenden
  // @args : IDs
  Display.prototype.none = function(){
    for(var i=0; i < arguments.length; i++){
      var obj = document.getElementById(arguments[i]);
      if(isset(obj))
        obj.style.display = "none";   
    } 
  }
  
  // Invertiert alle Sichtbarkeiten, die als ID übergeben werden
  // @args : IDs
  Display.prototype.invert = function(){
    for(var i=0; i < arguments.length; i++){
      // Hier kann das Objekt oder die ID übergeben werden
      var obj = arguments[i];
      if(typeof(arguments[i]) != 'object')
        obj = document.getElementById(arguments[i]);
      
      if(!isset(obj.style.display) || obj.style.display != "none")
        obj.style.display = "none";   
      else         
        obj.style.display = "block";
        
    }
  }
}


Display = new Display();
Errors = new Errors();
Validator = new Validator();

