/**
  * Inserts $newElement right before $reference.
  *
  * @param Zend_Form $form
  * @param Zend_Form_Element $reference
  * @param Zend_Form_Element $newElement
  */
 protected function insertBefore(Zend_Form $form, Zend_Form_Element $reference, Zend_Form_Element $newElement)
 {
     /* @var $orderedElements array(Zend_Form_Element|Zend_Form|Zend_Form_DisplayGroup) */
     $orderedElements = array_values(iterator_to_array($form));
     // Ensure that each element has a numerical order value.
     $this->assignOrderValues($orderedElements);
     $buttonIndex = array_search($reference, $orderedElements, true);
     $buttonOrder = $orderedElements[$buttonIndex]->getOrder();
     if ($buttonIndex === 0) {
         // Button is the first element, therefore no previous element
         // whose order could be used for calculation exists.
         // Choose a constant value which ensures that the calculated
         // order value for the new element avoids re-ordering.
         $previousElementOrder = $buttonOrder - 2;
     } else {
         $previousElementOrder = $orderedElements[$buttonIndex - 1]->getOrder();
     }
     // Try to assign an order value between previous element and button order value.
     $newElementOrder = (int) round(($previousElementOrder + $buttonOrder) / 2);
     $newElement->setOrder($newElementOrder);
     // Insert $newElement at the position of the button.
     array_splice($orderedElements, $buttonIndex, 0, array($newElement));
     if ($newElementOrder === $buttonOrder) {
         // Order values clash, therefore a re-ordering of the elements
         // starting with the captcha is required.
         $elementsFromCaptcha = array_slice($orderedElements, $buttonIndex);
         $this->assignOrderValues($elementsFromCaptcha);
     }
     $this->reAssignElements($form, $orderedElements);
 }