public function refreshXML()
 {
     $this->xml = new SimpleXMLElement('<' . static::$ROOT . ' />');
     if (isset(static::$attributeMap) && is_array(static::$attributeMap)) {
         foreach (static::$attributeMap as $attribute => $type) {
             $this->xml->addAttribute($attribute, (string) $this->{$attribute});
         }
     }
     foreach ($this->items as $item) {
         /* @var $item EANAbstractSupportModel */
         if (method_exists($item, 'refreshXML')) {
             $item->refreshXML();
         }
         XMLUtils::appendSXE($this->xml, $item->xml);
     }
 }
 /**
  * As if one were to perform tidyPartialHTML and nodeListToString in series.
  * @param string $dirtyHtml The really nasty dirty HTML that should be washed with soap.
  * @param bool $isSpecialCharEncoded Set to true if the incoming is encoded with htmlspecialchars or htmlentities (or Utils::htmlEntitiesEncode).
  * @param bool $autoDetectEncoded Defaults to true, will auto-detect encoded entities/html. Takes precedence over $isSpecialCharEncoded.
  * @return string An empty string on failure, or something clean if successful.
  */
 public static function tidyPartialHTMLToString($dirtyHtml, $isSpecialCharEncoded = false, $autoDetectEncoded = true)
 {
     if (!isset($autoDetectEncoded)) {
         $autoDetectEncoded = false;
     }
     $dirtyHtml = (string) $dirtyHtml;
     if ($autoDetectEncoded) {
         $hasTags = static::hasTags($dirtyHtml);
         $hasEntities = static::hasEntities($dirtyHtml);
         if ($hasEntities && !$hasTags) {
             $dirtyHtml = Utils::htmlEntitiesDecode($dirtyHtml);
         }
     } else {
         if ($isSpecialCharEncoded) {
             $dirtyHtml = Utils::htmlEntitiesDecode($dirtyHtml);
         }
     }
     $cleanHtml = '';
     $nodes = XMLUtils::tidyPartialHTML($dirtyHtml);
     if (isset($nodes)) {
         $cleanHtml = XMLUtils::nodeListToString($nodes);
     }
     return $cleanHtml;
 }
 protected function prepareRequest()
 {
     // if we're working with a cached result, we can only send specific fields
     $cacheKey = $this->get__cacheKey();
     $cacheLocation = $this->get__cacheLocation();
     $supplierType = $this->get__supplierType();
     if (isset($cacheKey, $cacheLocation)) {
         $this->xmlRequest->cacheKey = $cacheKey;
         $this->xmlRequest->cacheLocation = $cacheLocation;
         if (isset($supplierType)) {
             $this->xmlRequest->supplierType = $supplierType;
         }
         return;
     }
     // not working with a cached result, so just prepare the request per usual
     if (isset($this->searchMethod)) {
         $searchMethodProperties = $this->searchMethod->renderPreparedArray();
         foreach ($searchMethodProperties as $tag => $value) {
             $this->xmlRequest->addChild($tag, (string) $value);
         }
     }
     foreach (self::$propertyMap as $property => $type) {
         if (!isset($this->{$property})) {
             continue;
         }
         switch ($type) {
             case 'DateTime':
                 $this->xmlRequest->{$property} = $this->{$property}->format('m/d/Y');
                 break;
             case 'EANRoomGroup':
                 XMLUtils::appendSXE($this->xmlRequest, $this->{$property}->xml);
                 break;
             case 'int':
             case 'float':
             case 'string':
                 if (method_exists($this, 'get__' . $property)) {
                     $this->xmlRequest->{$property} = $this->{'get__' . $property}();
                 } else {
                     $this->xmlRequest->{$property} = (string) $this->{$property};
                 }
                 break;
             case 'boolean':
                 $this->xmlRequest->{$property} = $this->{$property} ? 'true' : 'false';
                 break;
         }
     }
 }
 protected function set__cancellationPolicy($value)
 {
     $this->cancellationPolicy = XMLUtils::tidyPartialHTMLToString($value, true);
 }
 protected function set__checkInInstructions($value)
 {
     $this->checkInInstructions = XMLUtils::tidyPartialHTMLToString($value, true);
 }
 protected function set__renovationsDescription($value)
 {
     $this->renovationsDescription = XMLUtils::tidyPartialHTMLToString($value);
 }
 protected function prepareRequest()
 {
     foreach (self::$propertyMap as $property => $type) {
         if (!isset($this->{$property})) {
             continue;
         }
         switch ($type) {
             case 'DateTime':
                 $this->xmlRequest->{$property} = $this->{$property}->format('m/d/Y');
                 break;
             case 'EANReservationAddress':
             case 'EANReservationInfo':
             case 'EANRoomGroup':
                 $this->{$property}->refreshXML();
                 XMLUtils::appendSXE($this->xmlRequest, $this->{$property}->xml);
                 break;
             case 'int':
             case 'float':
             case 'string':
                 if (method_exists($this, 'get__' . $property)) {
                     $this->xmlRequest->{$property} = $this->{'get__' . $property}();
                 } else {
                     $this->xmlRequest->{$property} = (string) $this->{$property};
                 }
                 break;
             case 'boolean':
                 $this->xmlRequest->{$property} = $this->{$property} ? 'true' : 'false';
                 break;
         }
     }
 }
 /**
  * @return boolean
  */
 public function execute()
 {
     $this->curl = new Curl();
     $this->curl->setOpt(CURLOPT_ENCODING, 'gzip');
     $this->curl->setOpt(CURLOPT_SSL_VERIFYPEER, false);
     $this->curl->setOpt(CURLOPT_HTTPHEADER, array('Accept: application/xml'));
     $this->prepareRequest();
     if (!$this->xmlRequest) {
         $this->lastError = new Exception('Request XML is not defined.');
         return false;
     }
     if (!isset(static::$API_METHOD) || !static::$API_METHOD) {
         $this->lastError = new Exception('API method is not defined.');
         return false;
     }
     $url = rtrim(static::ENDPOINT, '/') . '/' . static::ENDPOINT_VERSION . '/' . static::$API_METHOD;
     $data = array();
     if (static::$HTTP_METHOD === EANFacade::HTTP_METHOD_POST) {
         $data['xml'] = XMLUtils::SXEasXML($this->xmlRequest);
         $url .= '?' . Utils::httpBuildQuery3986($this->params);
     } else {
         $data = array_merge($this->params, array('xml' => XMLUtils::SXEasXML($this->xmlRequest)));
     }
     if (static::$HTTP_METHOD === EANFacade::HTTP_METHOD_GET) {
         $this->curl->get($url, $data);
         $this->curl->close();
     } else {
         if (static::$HTTP_METHOD === EANFacade::HTTP_METHOD_POST) {
             $this->curl->post($url, $data);
             $this->curl->close();
         } else {
             $this->lastError = new Exception('Invalid method for API call.');
             return false;
         }
     }
     if ($this->curl->error) {
         $this->lastError = new Exception($this->curl->errorMessage);
         return false;
     }
     try {
         if ($this->curl->response instanceof SimpleXMLElement) {
             $this->xmlResponse = $this->curl->response;
         } else {
             $this->xmlResponse = new SimpleXMLElement($this->curl->response);
         }
     } catch (Exception $e) {
         $this->lastError = $e;
         return false;
     }
     $this->lastError = null;
     $this->prepareResponse();
     return true;
 }
 /**
  * @return string
  */
 public function asXML()
 {
     return XMLUtils::SXEasXML($this->xml);
 }
 protected function set__shortDescription($value)
 {
     $this->shortDescription = XMLUtils::tidyPartialHTMLToString($value, true);
 }
 protected function set__otherInformation($value)
 {
     $this->otherInformation = XMLUtils::tidyPartialHTMLToString($value);
 }