_properties = array(); $this->_positions = array(); $this->_priorities = array(); $this->_max_priority = 0; } function apply(&$state) { $properties = $this->getPropertiesRaw(); foreach ($properties as $property) { $key = $property->get_code(); $value = $property->get_value(); $handler =& CSS::get_handler($key); $handler->replace($value, $state); }; } function ©() { $collection =& new CSSPropertyCollection(); for ($i = 0, $size = count($this->_properties); $i < $size; $i++) { $property =& $this->_properties[$i]; $collection->_properties[] =& $property->copy(); }; $collection->_positions = $this->_positions; $collection->_priorities = $this->_priorities; $collection->_max_priority = $this->_max_priority; return $collection; } function add_property($property) { $this->_max_priority ++; $code = $property->get_code(); /** * Important properties shoud not be overridden with non-important ones */ if ($this->is_important($code) && !$property->is_important()) { return; }; if (array_key_exists($code, $this->_positions)) { $this->_properties[$this->_positions[$code]] = $property; $this->_priorities[$this->_positions[$code]] = $this->_max_priority; } else { $this->_properties[] = $property; $this->_priorities[] = $this->_max_priority; $this->_positions[$code] = count($this->_priorities)-1; }; } function contains($code) { return isset($this->_positions[$code]); } function getMaxPriority() { return $this->_max_priority; } function getPropertiesSortedByPriority() { $properties = $this->_properties; $priorities = $this->_priorities; array_multisort($priorities, $properties); return $properties; } function getPropertiesRaw() { return $this->_properties; } function is_important($code) { if (!isset($this->_positions[$code])) { return false; }; return $this->_properties[$this->_positions[$code]]->is_important(); } function &get_property_value($code) { if (!isset($this->_positions[$code])) { $null = null; return $null; }; if (!isset($this->_properties[$this->_positions[$code]])) { $null = null; return $null; }; $property =& $this->_properties[$this->_positions[$code]]; return $property->get_value(); } function set_property_value($code, $value) { $this->_properties[$this->_positions[$code]]->set_value($value); } /** * Merge two sets of CSS properties, overwriting old values * with values from $collection */ function merge($collection) { $properties = $collection->getPropertiesSortedByPriority(); foreach ($properties as $property) { $this->add_property($property); }; } } ?>