get( $this->START_LIMIT, $value ); } /** * Set start limit. * * If limit: * - is not a numeric value, return original motionValue * - is lower then 0, set limit to 0 * - is higher then start middle, set limit equal to start middle * * @param int $value * @param string $multi_value * * @return string */ public function setStartLimit( $value, $multi_value ) { $value = $this->to_int( $value, $this->getStartLimit( $multi_value ) ); $ranged = $this->range( 0, $this->getStartMiddle( $multi_value ), $value ); return $this->set( $this->START_LIMIT, $ranged, $multi_value ); } /** * Returns start limit. * * @param string $value * * @return int */ public function getEndLimit( $value ) { return $this->get( $this->END_LIMIT, $value ); } /** * Set end limit. * * If limit: * - is not a numeric value, return original motionValue * - is lower then end middle, set limit equal to end middle * - is higher then 100, set limit equal to 100 * * @param int $value * @param string $multi_value * * @return string */ public function setEndLimit( $value, $multi_value ) { $value = $this->to_int( $value, $this->getEndLimit( $multi_value ) ); $ranged = $this->range( $this->getEndMiddle( $multi_value ), 100, $value ); return $this->set( $this->END_LIMIT, $ranged, $multi_value ); } /** * Get start middle. * * @param $value * * @return int */ public function getStartMiddle( $value ) { return $this->get( $this->START_MIDDLE, $value ); } /** * Set start middle limit. * * If limit: * - is not a numeric value, return original motionValue * - is lower then start limit, set limit equal to start limit * - is higher then end middle, set limit equal to end middle * * @param int $value * @param string $multi_value * * @return string */ public function setStartMiddle( $value, $multi_value ) { $value = $this->to_int( $value, $this->getStartMiddle( $multi_value ) ); $ranged = $this->range( $this->getStartLimit( $value ), $this->getEndMiddle( $value ), $value ); return $this->set( $this->START_MIDDLE, $ranged, $multi_value ); } /** * Get end middle. * * @param $value * * @return int */ public function getEndMiddle( $value ) { return $this->get( $this->END_MIDDLE, $value ); } /** * Set end middle limit. * * If limit: * - is not a numeric value, return original motionValue * - is lower then start middle limit, set limit equal to start middle limit * - is higher then end limit, set limit equal to end limit * * @param int $value * @param string $multi_value * * @return string */ public function setEndMiddle( $value, $multi_value ) { $value = $this->to_int( $value, $this->getEndMiddle( $multi_value ) ); $ranged = $this->range( $this->getStartMiddle( $value ), $this->getEndLimit( $value ), $value ); return $this->set( $this->END_MIDDLE, $ranged, $multi_value ); } /** * Returns option value for start. * * @param string $value * * @return string */ public function getStartValue( $value ) { return $this->get( $this->START_VALUE, $value ); } /** * Sets option value for start. * * @param string $value * @param string $multi_value * * @return string */ public function setStartValue( $value, $multi_value ) { return $this->set( $this->START_VALUE, $value, $multi_value ); } /** * Returns option value for middle. * * @param string $value * * @return string */ public function getMiddleValue( $value ) { return $this->get( $this->MIDDLE_VALUE, $value ); } /** * Sets option value for middle. * * @param string $value * @param string $multi_value * * @return string */ public function setMiddleValue( $value, $multi_value ) { return $this->set( $this->MIDDLE_VALUE, $value, $multi_value ); } /** * Returns option value for end. * * @param string $value * * @return string */ public function getEndValue( $value ) { return $this->get( $this->END_VALUE, $value ); } /** * Sets option value for end. * * @param string $value * @param string $multi_value * * @return string */ public function setEndValue( $value, $multi_value ) { return $this->set( $this->END_VALUE, $value, $multi_value ); } /** * Same as Multi.merge, but applies the elements parameter * * @param string $value_1 * @param string $value_2 * * @return string */ public function merge( $value_1, $value_2 ) { return $this->to_value( $this->split( $this->multi()->merge( $value_1, $value_2, $this->LENGTH ) ) ); } /** * Parses array value and converts it to a valid motion array * - array length should be 7 * - first 4 values should be numeric values * - first 4 values should respect 0-100 boundaries * - first 4 values should be ordered in ascending order * - last 3 values should be string values * * @param array $value * * @return array */ protected function parse( array $value ) { $arr = $this->multi()->parse( $value, $this->LENGTH ); $range = array(); $range[ $this->START_LIMIT ] = $this->to_int( array_shift( $arr ), 0 ); $range[ $this->START_MIDDLE ] = $this->to_int( array_shift( $arr ), 50 ); $range[ $this->END_MIDDLE ] = $this->to_int( array_shift( $arr ), 50 ); $range[ $this->END_LIMIT ] = $this->to_int( array_shift( $arr ), 100 ); sort( $range, SORT_NUMERIC ); $range[ $this->START_LIMIT ] = max( $range[ $this->START_LIMIT ], 0 ); $range[ $this->END_LIMIT ] = min( $range[ $this->END_LIMIT ], 100 ); $range[ $this->START_MIDDLE ] = max( $range[ $this->START_MIDDLE ], $range[ $this->START_LIMIT ] ); $range[ $this->END_MIDDLE ] = min( $range[ $this->END_LIMIT ], $range[ $this->END_MIDDLE ] ); return array_merge( $range, $arr ); } /** * Converts a value to a valid motion array value. * * @param string $value * * @return array */ protected function split( $value ) { return $this->parse( $this->multi()->split( $value, $this->LENGTH ) ); } /** * Converts a value to a valid motion string value. * * @param array $value * * @return string */ protected function to_value( array $value ) { return $this->multi()->to_value( $this->parse( $value ), $this->LENGTH ); } /** * @return ET_Builder_Module_Helper_Multi_Value */ protected function multi() { return ET_Builder_Module_Helper_Multi_Value::instance(); } /** * Returns specific key value * * @param int $key * @param string $value * * @return mixed */ protected function get( $key, $value ) { $arr = $this->parse( $this->multi()->split( $value, $this->LENGTH ) ); return $arr[ $key ]; } /** * @param int $key * @param $value * @param string $multi_value * * @return string */ protected function set( $key, $value, $multi_value ) { return $this->multi()->set( $key, $value, $multi_value, $this->LENGTH ); } private function to_int( $value, $default ) { return is_numeric( $value ) ? (int) $value : $default; } /** * @param int $min * @param int $max * @param int $value * * @return int */ private function range( $min, $max, $value ) { return min( $max, max( $min, $value ) ); } }