/**
  * Checks all form rules
  *
  * @return null
  */
 public function validate()
 {
     $attribs = $this->formHandler->getAttributes();
     foreach ($attribs as $key => $attributes) {
         if (!array_key_exists($key, $attribs)) {
             throw new Exception("The field '{$key}' does not exists!");
         }
         $label = array_key_exists('label', array_keys($this->options)) ? $attributes["label"] : $key;
         $all_attribs = array();
         foreach ($attributes as $attr) {
             $all_attribs[$attr->getName()] = $attr->getValue();
         }
         foreach ($attributes as $name => $attr) {
             $name = $attr->getName();
             $value = $attr->getValue();
             $attrib = $this->formHandler->getAttribute($label, "value");
             $form_value = !is_null($attrib) ? $attrib->getValue() : null;
             switch ($name) {
                 case 'required':
                     $validator = new Zend_Validate_NotEmpty();
                     break;
                 case 'minlength':
                     $validator = new Zend_Validate_StringLength(array('min' => $value));
                     break;
                 case 'maxlength':
                     $validator = new Zend_Validate_StringLength(array('max' => $value));
                     break;
                 case 'type':
                     switch ($value) {
                         case 'number':
                             $validator = new Zend_Validate_Digits();
                             break;
                         case 'email':
                             $validator = new Zend_Validate_EmailAddress();
                             break;
                         case 'date':
                             $validator = new Zend_Validate_Date();
                             break;
                         case 'url':
                             $validator = new Drone_Validate_Uri();
                             break;
                     }
                     break;
                 case 'min':
                     if (array_key_exists('type', $all_attribs) && in_array($all_attribs['type'], array('number', 'range'))) {
                         $validator = new Drone_Validate_GreaterThan(array('min' => $value, 'inclusive' => true));
                     } else {
                         throw new Exception("The input type must be 'range' or 'number'");
                     }
                     break;
                 case 'max':
                     if (array_key_exists('type', $all_attribs) && in_array($all_attribs['type'], array('number', 'range'))) {
                         $validator = new Drone_Validate_LessThan(array('max' => $value, 'inclusive' => true));
                     } else {
                         throw new Exception("The input type must be 'range' or 'number'");
                     }
                     break;
                 case 'step':
                     $baseValue = array_key_exists('min', $all_attribs) ? $all_attribs['min'] : 0;
                     if (array_key_exists('type', $all_attribs) && in_array($all_attribs['type'], array('range'))) {
                         $validator = new Drone_Validate_Step(array('baseValue' => $baseValue, 'step' => $value));
                     } else {
                         throw new Exception("The input type must be 'range'");
                     }
                     break;
             }
             if (in_array($name, array('required', 'digits', 'minlength', 'maxlength', 'type', 'min', 'max', 'date', 'step'))) {
                 $validator->setTranslator($this->translator);
                 if (gettype($form_value) == 'array') {
                     foreach ($form_value as $val) {
                         $valid = $validator->isValid($val);
                         $this->setValid($valid);
                         if (!$valid) {
                             if (!in_array($key, array_keys($this->messages))) {
                                 $this->messages[$key] = array();
                             }
                             $this->messages[$key] = array_merge($this->messages[$key], $validator->getMessages());
                         }
                     }
                 } else {
                     $valid = $validator->isValid($form_value);
                     $this->setValid($valid);
                     if (!$valid) {
                         if (!in_array($key, array_keys($this->messages))) {
                             $this->messages[$key] = array();
                         }
                         $this->messages[$key] = array_merge($this->messages[$key], $validator->getMessages());
                     }
                 }
             }
         }
     }
     foreach ($this->options as $key => $options) {
         if (isset($options["validators"]) and is_array($options["validators"])) {
             $attrib = $this->formHandler->getAttribute($key, "required");
             $isRequired = !is_null($attrib) ? $attrib = $attrib->getValue() : false;
             $validator = new Zend_Validate_NotEmpty();
             $validator->setTranslator($this->translator);
             $value = $this->formHandler->getAttribute($key, "value")->getValue();
             if ($isRequired || $validator->isValid($value)) {
                 foreach ($options["validators"] as $class => $params) {
                     $className = 'Zend_Validate_' . $class;
                     if (!class_exists($className)) {
                         throw new Exception("The class '{$className}' does not exists");
                     }
                     $validator = new $className($params);
                     $form_value = $this->formHandler->getAttribute($key, "value")->getValue();
                     $validator->setTranslator($this->translator);
                     $valid = $validator->isValid($form_value);
                     $this->setValid($valid);
                     if (!$valid) {
                         if (!in_array($key, array_keys($this->messages))) {
                             $this->messages[$key] = array();
                         }
                         $this->messages[$key] = array_merge($this->messages[$key], $validator->getMessages());
                     }
                 }
             }
         }
     }
 }