/**
  * Validate and handle adding and removing bikes via AJAX
  *
  * @return void
  */
 public function bicycleAction()
 {
     $output = array();
     $pageSession = new Zend_Session_Namespace('tenants_insurance_quote');
     $bike = new Datasource_Insurance_Policy_Cycles($pageSession->CustomerRefNo, $pageSession->PolicyNumber);
     $ajaxForm = new TenantsInsuranceQuote_Form_Json_Bicycle();
     // Ignore 'bicycle' field for AJAX requests
     $ajaxForm->subform_bicycle->getElement('bicycle')->setRequired(false);
     $request = $this->getRequest();
     $postdata = $request->getPost();
     // Filter to mirror the subform element definitions.
     $currencyFilterElements = array('bicycle_value');
     foreach ($currencyFilterElements as $filterElement) {
         if (isset($postdata[$filterElement])) {
             $postdata[$filterElement] = preg_replace(array('/[^\\d\\.]/'), array(''), $postdata[$filterElement]);
         }
     }
     // Force the elements to be required as this is an add item click - ugly :(
     if (isset($postdata['addBike']) && $postdata['addBike'] == 1) {
         $ajaxForm->subform_bicycle->getElement('bicycle_make')->setRequired(true);
         $ajaxForm->subform_bicycle->getElement('bicycle_model')->setRequired(true);
         $ajaxForm->subform_bicycle->getElement('bicycle_serial')->setRequired(false);
         $ajaxForm->subform_bicycle->getElement('bicycle_value')->setRequired(true);
     }
     $quoteManager = new Manager_Insurance_TenantsContentsPlus_Quote(null, null, $pageSession->PolicyNumber);
     if ($ajaxForm->isValid($postdata)) {
         // Check if a new bike's details are being added and bicycles is below max
         if (isset($postdata['addBike']) && $postdata['addBike'] == 1) {
             $cleanData = $ajaxForm->getValues();
             $bike->addNew($cleanData['subform_bicycle']);
         }
         // Check if an existing bike's details are being removed
         if (isset($postdata['removeBike']) && $postdata['removeBike'] == 1) {
             $bike->remove($postdata['bikeNum']);
         }
         $totalValue = $bike->getTotalValue();
         // Now we need to update the total amounts covered in the quote manager
         $quoteManager->setCoverAmount($totalValue, Manager_Insurance_TenantsContentsPlus_Quote::PEDALCYCLES);
     }
     $errorMessages = $ajaxForm->getMessagesFlattened();
     $output['errorJs'] = $errorMessages;
     $output['errorCount'] = count($errorMessages);
     $output['errorHtml'] = $this->view->partial('partials/error-list.phtml', array('errors' => $errorMessages));
     // Tell page if max bikes reached
     $output['disableAdd'] = $bike->countBikes() == $bike->maxBicycles ? 1 : 0;
     $output['html'] = $this->view->yourBicycle();
     $premiums = $quoteManager->calculatePremiums();
     $fees = $quoteManager->getFees();
     $output['premiums'] = $premiums;
     $output['fees'] = $fees;
     echo Zend_Json::encode($output);
 }