@ -0,0 +1,587 @@ |
|||
<?php |
|||
/** |
|||
* PHPExcel |
|||
* |
|||
* Copyright (c) 2006 - 2013 PHPExcel |
|||
* |
|||
* This library is free software; you can redistribute it and/or |
|||
* modify it under the terms of the GNU Lesser General Public |
|||
* License as published by the Free Software Foundation; either |
|||
* version 2.1 of the License, or (at your option) any later version. |
|||
* |
|||
* This library is distributed in the hope that it will be useful, |
|||
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
|||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
|||
* Lesser General Public License for more details. |
|||
* |
|||
* You should have received a copy of the GNU Lesser General Public |
|||
* License along with this library; if not, write to the Free Software |
|||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA |
|||
* |
|||
* @category PHPExcel |
|||
* @package PHPExcel |
|||
* @copyright Copyright (c) 2006 - 2013 PHPExcel (http://www.codeplex.com/PHPExcel) |
|||
* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL |
|||
* @version 1.7.9, 2013-06-02 |
|||
*/ |
|||
|
|||
|
|||
/** |
|||
* PHPExcel_DocumentProperties |
|||
* |
|||
* @category PHPExcel |
|||
* @package PHPExcel |
|||
* @copyright Copyright (c) 2006 - 2013 PHPExcel (http://www.codeplex.com/PHPExcel) |
|||
*/ |
|||
class PHPExcel_DocumentProperties |
|||
{ |
|||
/** constants */ |
|||
const PROPERTY_TYPE_BOOLEAN = 'b'; |
|||
const PROPERTY_TYPE_INTEGER = 'i'; |
|||
const PROPERTY_TYPE_FLOAT = 'f'; |
|||
const PROPERTY_TYPE_DATE = 'd'; |
|||
const PROPERTY_TYPE_STRING = 's'; |
|||
const PROPERTY_TYPE_UNKNOWN = 'u'; |
|||
|
|||
/** |
|||
* Creator |
|||
* |
|||
* @var string |
|||
*/ |
|||
private $_creator = 'Unknown Creator'; |
|||
|
|||
/** |
|||
* LastModifiedBy |
|||
* |
|||
* @var string |
|||
*/ |
|||
private $_lastModifiedBy; |
|||
|
|||
/** |
|||
* Created |
|||
* |
|||
* @var datetime |
|||
*/ |
|||
private $_created; |
|||
|
|||
/** |
|||
* Modified |
|||
* |
|||
* @var datetime |
|||
*/ |
|||
private $_modified; |
|||
|
|||
/** |
|||
* Title |
|||
* |
|||
* @var string |
|||
*/ |
|||
private $_title = 'Untitled Spreadsheet'; |
|||
|
|||
/** |
|||
* Description |
|||
* |
|||
* @var string |
|||
*/ |
|||
private $_description = ''; |
|||
|
|||
/** |
|||
* Subject |
|||
* |
|||
* @var string |
|||
*/ |
|||
private $_subject = ''; |
|||
|
|||
/** |
|||
* Keywords |
|||
* |
|||
* @var string |
|||
*/ |
|||
private $_keywords = ''; |
|||
|
|||
/** |
|||
* Category |
|||
* |
|||
* @var string |
|||
*/ |
|||
private $_category = ''; |
|||
|
|||
/** |
|||
* Manager |
|||
* |
|||
* @var string |
|||
*/ |
|||
private $_manager = ''; |
|||
|
|||
/** |
|||
* Company |
|||
* |
|||
* @var string |
|||
*/ |
|||
private $_company = 'Microsoft Corporation'; |
|||
|
|||
/** |
|||
* Custom Properties |
|||
* |
|||
* @var string |
|||
*/ |
|||
private $_customProperties = array(); |
|||
|
|||
|
|||
/** |
|||
* Create a new PHPExcel_DocumentProperties |
|||
*/ |
|||
public function __construct() |
|||
{ |
|||
// Initialise values |
|||
$this->_lastModifiedBy = $this->_creator; |
|||
$this->_created = time(); |
|||
$this->_modified = time(); |
|||
} |
|||
|
|||
/** |
|||
* Get Creator |
|||
* |
|||
* @return string |
|||
*/ |
|||
public function getCreator() { |
|||
return $this->_creator; |
|||
} |
|||
|
|||
/** |
|||
* Set Creator |
|||
* |
|||
* @param string $pValue |
|||
* @return PHPExcel_DocumentProperties |
|||
*/ |
|||
public function setCreator($pValue = '') { |
|||
$this->_creator = $pValue; |
|||
return $this; |
|||
} |
|||
|
|||
/** |
|||
* Get Last Modified By |
|||
* |
|||
* @return string |
|||
*/ |
|||
public function getLastModifiedBy() { |
|||
return $this->_lastModifiedBy; |
|||
} |
|||
|
|||
/** |
|||
* Set Last Modified By |
|||
* |
|||
* @param string $pValue |
|||
* @return PHPExcel_DocumentProperties |
|||
*/ |
|||
public function setLastModifiedBy($pValue = '') { |
|||
$this->_lastModifiedBy = $pValue; |
|||
return $this; |
|||
} |
|||
|
|||
/** |
|||
* Get Created |
|||
* |
|||
* @return datetime |
|||
*/ |
|||
public function getCreated() { |
|||
return $this->_created; |
|||
} |
|||
|
|||
/** |
|||
* Set Created |
|||
* |
|||
* @param datetime $pValue |
|||
* @return PHPExcel_DocumentProperties |
|||
*/ |
|||
public function setCreated($pValue = null) { |
|||
if ($pValue === NULL) { |
|||
$pValue = time(); |
|||
} elseif (is_string($pValue)) { |
|||
if (is_numeric($pValue)) { |
|||
$pValue = intval($pValue); |
|||
} else { |
|||
$pValue = strtotime($pValue); |
|||
} |
|||
} |
|||
|
|||
$this->_created = $pValue; |
|||
return $this; |
|||
} |
|||
|
|||
/** |
|||
* Get Modified |
|||
* |
|||
* @return datetime |
|||
*/ |
|||
public function getModified() { |
|||
return $this->_modified; |
|||
} |
|||
|
|||
/** |
|||
* Set Modified |
|||
* |
|||
* @param datetime $pValue |
|||
* @return PHPExcel_DocumentProperties |
|||
*/ |
|||
public function setModified($pValue = null) { |
|||
if ($pValue === NULL) { |
|||
$pValue = time(); |
|||
} elseif (is_string($pValue)) { |
|||
if (is_numeric($pValue)) { |
|||
$pValue = intval($pValue); |
|||
} else { |
|||
$pValue = strtotime($pValue); |
|||
} |
|||
} |
|||
|
|||
$this->_modified = $pValue; |
|||
return $this; |
|||
} |
|||
|
|||
/** |
|||
* Get Title |
|||
* |
|||
* @return string |
|||
*/ |
|||
public function getTitle() { |
|||
return $this->_title; |
|||
} |
|||
|
|||
/** |
|||
* Set Title |
|||
* |
|||
* @param string $pValue |
|||
* @return PHPExcel_DocumentProperties |
|||
*/ |
|||
public function setTitle($pValue = '') { |
|||
$this->_title = $pValue; |
|||
return $this; |
|||
} |
|||
|
|||
/** |
|||
* Get Description |
|||
* |
|||
* @return string |
|||
*/ |
|||
public function getDescription() { |
|||
return $this->_description; |
|||
} |
|||
|
|||
/** |
|||
* Set Description |
|||
* |
|||
* @param string $pValue |
|||
* @return PHPExcel_DocumentProperties |
|||
*/ |
|||
public function setDescription($pValue = '') { |
|||
$this->_description = $pValue; |
|||
return $this; |
|||
} |
|||
|
|||
/** |
|||
* Get Subject |
|||
* |
|||
* @return string |
|||
*/ |
|||
public function getSubject() { |
|||
return $this->_subject; |
|||
} |
|||
|
|||
/** |
|||
* Set Subject |
|||
* |
|||
* @param string $pValue |
|||
* @return PHPExcel_DocumentProperties |
|||
*/ |
|||
public function setSubject($pValue = '') { |
|||
$this->_subject = $pValue; |
|||
return $this; |
|||
} |
|||
|
|||
/** |
|||
* Get Keywords |
|||
* |
|||
* @return string |
|||
*/ |
|||
public function getKeywords() { |
|||
return $this->_keywords; |
|||
} |
|||
|
|||
/** |
|||
* Set Keywords |
|||
* |
|||
* @param string $pValue |
|||
* @return PHPExcel_DocumentProperties |
|||
*/ |
|||
public function setKeywords($pValue = '') { |
|||
$this->_keywords = $pValue; |
|||
return $this; |
|||
} |
|||
|
|||
/** |
|||
* Get Category |
|||
* |
|||
* @return string |
|||
*/ |
|||
public function getCategory() { |
|||
return $this->_category; |
|||
} |
|||
|
|||
/** |
|||
* Set Category |
|||
* |
|||
* @param string $pValue |
|||
* @return PHPExcel_DocumentProperties |
|||
*/ |
|||
public function setCategory($pValue = '') { |
|||
$this->_category = $pValue; |
|||
return $this; |
|||
} |
|||
|
|||
/** |
|||
* Get Company |
|||
* |
|||
* @return string |
|||
*/ |
|||
public function getCompany() { |
|||
return $this->_company; |
|||
} |
|||
|
|||
/** |
|||
* Set Company |
|||
* |
|||
* @param string $pValue |
|||
* @return PHPExcel_DocumentProperties |
|||
*/ |
|||
public function setCompany($pValue = '') { |
|||
$this->_company = $pValue; |
|||
return $this; |
|||
} |
|||
|
|||
/** |
|||
* Get Manager |
|||
* |
|||
* @return string |
|||
*/ |
|||
public function getManager() { |
|||
return $this->_manager; |
|||
} |
|||
|
|||
/** |
|||
* Set Manager |
|||
* |
|||
* @param string $pValue |
|||
* @return PHPExcel_DocumentProperties |
|||
*/ |
|||
public function setManager($pValue = '') { |
|||
$this->_manager = $pValue; |
|||
return $this; |
|||
} |
|||
|
|||
/** |
|||
* Get a List of Custom Property Names |
|||
* |
|||
* @return array of string |
|||
*/ |
|||
public function getCustomProperties() { |
|||
return array_keys($this->_customProperties); |
|||
} |
|||
|
|||
/** |
|||
* Check if a Custom Property is defined |
|||
* |
|||
* @param string $propertyName |
|||
* @return boolean |
|||
*/ |
|||
public function isCustomPropertySet($propertyName) { |
|||
return isset($this->_customProperties[$propertyName]); |
|||
} |
|||
|
|||
/** |
|||
* Get a Custom Property Value |
|||
* |
|||
* @param string $propertyName |
|||
* @return string |
|||
*/ |
|||
public function getCustomPropertyValue($propertyName) { |
|||
if (isset($this->_customProperties[$propertyName])) { |
|||
return $this->_customProperties[$propertyName]['value']; |
|||
} |
|||
|
|||
} |
|||
|
|||
/** |
|||
* Get a Custom Property Type |
|||
* |
|||
* @param string $propertyName |
|||
* @return string |
|||
*/ |
|||
public function getCustomPropertyType($propertyName) { |
|||
if (isset($this->_customProperties[$propertyName])) { |
|||
return $this->_customProperties[$propertyName]['type']; |
|||
} |
|||
|
|||
} |
|||
|
|||
/** |
|||
* Set a Custom Property |
|||
* |
|||
* @param string $propertyName |
|||
* @param mixed $propertyValue |
|||
* @param string $propertyType |
|||
* 'i' : Integer |
|||
* 'f' : Floating Point |
|||
* 's' : String |
|||
* 'd' : Date/Time |
|||
* 'b' : Boolean |
|||
* @return PHPExcel_DocumentProperties |
|||
*/ |
|||
public function setCustomProperty($propertyName,$propertyValue='',$propertyType=NULL) { |
|||
if (($propertyType === NULL) || (!in_array($propertyType,array(self::PROPERTY_TYPE_INTEGER, |
|||
self::PROPERTY_TYPE_FLOAT, |
|||
self::PROPERTY_TYPE_STRING, |
|||
self::PROPERTY_TYPE_DATE, |
|||
self::PROPERTY_TYPE_BOOLEAN)))) { |
|||
if ($propertyValue === NULL) { |
|||
$propertyType = self::PROPERTY_TYPE_STRING; |
|||
} elseif (is_float($propertyValue)) { |
|||
$propertyType = self::PROPERTY_TYPE_FLOAT; |
|||
} elseif(is_int($propertyValue)) { |
|||
$propertyType = self::PROPERTY_TYPE_INTEGER; |
|||
} elseif (is_bool($propertyValue)) { |
|||
$propertyType = self::PROPERTY_TYPE_BOOLEAN; |
|||
} else { |
|||
$propertyType = self::PROPERTY_TYPE_STRING; |
|||
} |
|||
} |
|||
|
|||
$this->_customProperties[$propertyName] = array('value' => $propertyValue, 'type' => $propertyType); |
|||
return $this; |
|||
} |
|||
|
|||
/** |
|||
* Implement PHP __clone to create a deep clone, not just a shallow copy. |
|||
*/ |
|||
public function __clone() { |
|||
$vars = get_object_vars($this); |
|||
foreach ($vars as $key => $value) { |
|||
if (is_object($value)) { |
|||
$this->$key = clone $value; |
|||
} else { |
|||
$this->$key = $value; |
|||
} |
|||
} |
|||
} |
|||
|
|||
public static function convertProperty($propertyValue,$propertyType) { |
|||
switch ($propertyType) { |
|||
case 'empty' : // Empty |
|||
return ''; |
|||
break; |
|||
case 'null' : // Null |
|||
return NULL; |
|||
break; |
|||
case 'i1' : // 1-Byte Signed Integer |
|||
case 'i2' : // 2-Byte Signed Integer |
|||
case 'i4' : // 4-Byte Signed Integer |
|||
case 'i8' : // 8-Byte Signed Integer |
|||
case 'int' : // Integer |
|||
return (int) $propertyValue; |
|||
break; |
|||
case 'ui1' : // 1-Byte Unsigned Integer |
|||
case 'ui2' : // 2-Byte Unsigned Integer |
|||
case 'ui4' : // 4-Byte Unsigned Integer |
|||
case 'ui8' : // 8-Byte Unsigned Integer |
|||
case 'uint' : // Unsigned Integer |
|||
return abs((int) $propertyValue); |
|||
break; |
|||
case 'r4' : // 4-Byte Real Number |
|||
case 'r8' : // 8-Byte Real Number |
|||
case 'decimal' : // Decimal |
|||
return (float) $propertyValue; |
|||
break; |
|||
case 'lpstr' : // LPSTR |
|||
case 'lpwstr' : // LPWSTR |
|||
case 'bstr' : // Basic String |
|||
return $propertyValue; |
|||
break; |
|||
case 'date' : // Date and Time |
|||
case 'filetime' : // File Time |
|||
return strtotime($propertyValue); |
|||
break; |
|||
case 'bool' : // Boolean |
|||
return ($propertyValue == 'true') ? True : False; |
|||
break; |
|||
case 'cy' : // Currency |
|||
case 'error' : // Error Status Code |
|||
case 'vector' : // Vector |
|||
case 'array' : // Array |
|||
case 'blob' : // Binary Blob |
|||
case 'oblob' : // Binary Blob Object |
|||
case 'stream' : // Binary Stream |
|||
case 'ostream' : // Binary Stream Object |
|||
case 'storage' : // Binary Storage |
|||
case 'ostorage' : // Binary Storage Object |
|||
case 'vstream' : // Binary Versioned Stream |
|||
case 'clsid' : // Class ID |
|||
case 'cf' : // Clipboard Data |
|||
return $propertyValue; |
|||
break; |
|||
} |
|||
return $propertyValue; |
|||
} |
|||
|
|||
public static function convertPropertyType($propertyType) { |
|||
switch ($propertyType) { |
|||
case 'i1' : // 1-Byte Signed Integer |
|||
case 'i2' : // 2-Byte Signed Integer |
|||
case 'i4' : // 4-Byte Signed Integer |
|||
case 'i8' : // 8-Byte Signed Integer |
|||
case 'int' : // Integer |
|||
case 'ui1' : // 1-Byte Unsigned Integer |
|||
case 'ui2' : // 2-Byte Unsigned Integer |
|||
case 'ui4' : // 4-Byte Unsigned Integer |
|||
case 'ui8' : // 8-Byte Unsigned Integer |
|||
case 'uint' : // Unsigned Integer |
|||
return self::PROPERTY_TYPE_INTEGER; |
|||
break; |
|||
case 'r4' : // 4-Byte Real Number |
|||
case 'r8' : // 8-Byte Real Number |
|||
case 'decimal' : // Decimal |
|||
return self::PROPERTY_TYPE_FLOAT; |
|||
break; |
|||
case 'empty' : // Empty |
|||
case 'null' : // Null |
|||
case 'lpstr' : // LPSTR |
|||
case 'lpwstr' : // LPWSTR |
|||
case 'bstr' : // Basic String |
|||
return self::PROPERTY_TYPE_STRING; |
|||
break; |
|||
case 'date' : // Date and Time |
|||
case 'filetime' : // File Time |
|||
return self::PROPERTY_TYPE_DATE; |
|||
break; |
|||
case 'bool' : // Boolean |
|||
return self::PROPERTY_TYPE_BOOLEAN; |
|||
break; |
|||
case 'cy' : // Currency |
|||
case 'error' : // Error Status Code |
|||
case 'vector' : // Vector |
|||
case 'array' : // Array |
|||
case 'blob' : // Binary Blob |
|||
case 'oblob' : // Binary Blob Object |
|||
case 'stream' : // Binary Stream |
|||
case 'ostream' : // Binary Stream Object |
|||
case 'storage' : // Binary Storage |
|||
case 'ostorage' : // Binary Storage Object |
|||
case 'vstream' : // Binary Versioned Stream |
|||
case 'clsid' : // Class ID |
|||
case 'cf' : // Clipboard Data |
|||
return self::PROPERTY_TYPE_UNKNOWN; |
|||
break; |
|||
} |
|||
return self::PROPERTY_TYPE_UNKNOWN; |
|||
} |
|||
|
|||
} |
|||
@ -0,0 +1,218 @@ |
|||
<?php |
|||
/** |
|||
* PHPExcel |
|||
* |
|||
* Copyright (c) 2006 - 2013 PHPExcel |
|||
* |
|||
* This library is free software; you can redistribute it and/or |
|||
* modify it under the terms of the GNU Lesser General Public |
|||
* License as published by the Free Software Foundation; either |
|||
* version 2.1 of the License, or (at your option) any later version. |
|||
* |
|||
* This library is distributed in the hope that it will be useful, |
|||
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
|||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
|||
* Lesser General Public License for more details. |
|||
* |
|||
* You should have received a copy of the GNU Lesser General Public |
|||
* License along with this library; if not, write to the Free Software |
|||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA |
|||
* |
|||
* @category PHPExcel |
|||
* @package PHPExcel |
|||
* @copyright Copyright (c) 2006 - 2013 PHPExcel (http://www.codeplex.com/PHPExcel) |
|||
* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL |
|||
* @version 1.7.9, 2013-06-02 |
|||
*/ |
|||
|
|||
|
|||
/** |
|||
* PHPExcel_DocumentSecurity |
|||
* |
|||
* @category PHPExcel |
|||
* @package PHPExcel |
|||
* @copyright Copyright (c) 2006 - 2013 PHPExcel (http://www.codeplex.com/PHPExcel) |
|||
*/ |
|||
class PHPExcel_DocumentSecurity |
|||
{ |
|||
/** |
|||
* LockRevision |
|||
* |
|||
* @var boolean |
|||
*/ |
|||
private $_lockRevision; |
|||
|
|||
/** |
|||
* LockStructure |
|||
* |
|||
* @var boolean |
|||
*/ |
|||
private $_lockStructure; |
|||
|
|||
/** |
|||
* LockWindows |
|||
* |
|||
* @var boolean |
|||
*/ |
|||
private $_lockWindows; |
|||
|
|||
/** |
|||
* RevisionsPassword |
|||
* |
|||
* @var string |
|||
*/ |
|||
private $_revisionsPassword; |
|||
|
|||
/** |
|||
* WorkbookPassword |
|||
* |
|||
* @var string |
|||
*/ |
|||
private $_workbookPassword; |
|||
|
|||
/** |
|||
* Create a new PHPExcel_DocumentSecurity |
|||
*/ |
|||
public function __construct() |
|||
{ |
|||
// Initialise values |
|||
$this->_lockRevision = false; |
|||
$this->_lockStructure = false; |
|||
$this->_lockWindows = false; |
|||
$this->_revisionsPassword = ''; |
|||
$this->_workbookPassword = ''; |
|||
} |
|||
|
|||
/** |
|||
* Is some sort of dcument security enabled? |
|||
* |
|||
* @return boolean |
|||
*/ |
|||
function isSecurityEnabled() { |
|||
return $this->_lockRevision || |
|||
$this->_lockStructure || |
|||
$this->_lockWindows; |
|||
} |
|||
|
|||
/** |
|||
* Get LockRevision |
|||
* |
|||
* @return boolean |
|||
*/ |
|||
function getLockRevision() { |
|||
return $this->_lockRevision; |
|||
} |
|||
|
|||
/** |
|||
* Set LockRevision |
|||
* |
|||
* @param boolean $pValue |
|||
* @return PHPExcel_DocumentSecurity |
|||
*/ |
|||
function setLockRevision($pValue = false) { |
|||
$this->_lockRevision = $pValue; |
|||
return $this; |
|||
} |
|||
|
|||
/** |
|||
* Get LockStructure |
|||
* |
|||
* @return boolean |
|||
*/ |
|||
function getLockStructure() { |
|||
return $this->_lockStructure; |
|||
} |
|||
|
|||
/** |
|||
* Set LockStructure |
|||
* |
|||
* @param boolean $pValue |
|||
* @return PHPExcel_DocumentSecurity |
|||
*/ |
|||
function setLockStructure($pValue = false) { |
|||
$this->_lockStructure = $pValue; |
|||
return $this; |
|||
} |
|||
|
|||
/** |
|||
* Get LockWindows |
|||
* |
|||
* @return boolean |
|||
*/ |
|||
function getLockWindows() { |
|||
return $this->_lockWindows; |
|||
} |
|||
|
|||
/** |
|||
* Set LockWindows |
|||
* |
|||
* @param boolean $pValue |
|||
* @return PHPExcel_DocumentSecurity |
|||
*/ |
|||
function setLockWindows($pValue = false) { |
|||
$this->_lockWindows = $pValue; |
|||
return $this; |
|||
} |
|||
|
|||
/** |
|||
* Get RevisionsPassword (hashed) |
|||
* |
|||
* @return string |
|||
*/ |
|||
function getRevisionsPassword() { |
|||
return $this->_revisionsPassword; |
|||
} |
|||
|
|||
/** |
|||
* Set RevisionsPassword |
|||
* |
|||
* @param string $pValue |
|||
* @param boolean $pAlreadyHashed If the password has already been hashed, set this to true |
|||
* @return PHPExcel_DocumentSecurity |
|||
*/ |
|||
function setRevisionsPassword($pValue = '', $pAlreadyHashed = false) { |
|||
if (!$pAlreadyHashed) { |
|||
$pValue = PHPExcel_Shared_PasswordHasher::hashPassword($pValue); |
|||
} |
|||
$this->_revisionsPassword = $pValue; |
|||
return $this; |
|||
} |
|||
|
|||
/** |
|||
* Get WorkbookPassword (hashed) |
|||
* |
|||
* @return string |
|||
*/ |
|||
function getWorkbookPassword() { |
|||
return $this->_workbookPassword; |
|||
} |
|||
|
|||
/** |
|||
* Set WorkbookPassword |
|||
* |
|||
* @param string $pValue |
|||
* @param boolean $pAlreadyHashed If the password has already been hashed, set this to true |
|||
* @return PHPExcel_DocumentSecurity |
|||
*/ |
|||
function setWorkbookPassword($pValue = '', $pAlreadyHashed = false) { |
|||
if (!$pAlreadyHashed) { |
|||
$pValue = PHPExcel_Shared_PasswordHasher::hashPassword($pValue); |
|||
} |
|||
$this->_workbookPassword = $pValue; |
|||
return $this; |
|||
} |
|||
|
|||
/** |
|||
* Implement PHP __clone to create a deep clone, not just a shallow copy. |
|||
*/ |
|||
public function __clone() { |
|||
$vars = get_object_vars($this); |
|||
foreach ($vars as $key => $value) { |
|||
if (is_object($value)) { |
|||
$this->$key = clone $value; |
|||
} else { |
|||
$this->$key = $value; |
|||
} |
|||
} |
|||
} |
|||
} |
|||
@ -0,0 +1,52 @@ |
|||
<?php |
|||
/** |
|||
* PHPExcel |
|||
* |
|||
* Copyright (c) 2006 - 2013 PHPExcel |
|||
* |
|||
* This library is free software; you can redistribute it and/or |
|||
* modify it under the terms of the GNU Lesser General Public |
|||
* License as published by the Free Software Foundation; either |
|||
* version 2.1 of the License, or (at your option) any later version. |
|||
* |
|||
* This library is distributed in the hope that it will be useful, |
|||
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
|||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
|||
* Lesser General Public License for more details. |
|||
* |
|||
* You should have received a copy of the GNU Lesser General Public |
|||
* License along with this library; if not, write to the Free Software |
|||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA |
|||
* |
|||
* @category PHPExcel |
|||
* @package PHPExcel |
|||
* @copyright Copyright (c) 2006 - 2013 PHPExcel (http://www.codeplex.com/PHPExcel) |
|||
* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL |
|||
* @version 1.7.9, 2013-06-02 |
|||
*/ |
|||
|
|||
|
|||
/** |
|||
* PHPExcel_Exception |
|||
* |
|||
* @category PHPExcel |
|||
* @package PHPExcel |
|||
* @copyright Copyright (c) 2006 - 2013 PHPExcel (http://www.codeplex.com/PHPExcel) |
|||
*/ |
|||
class PHPExcel_Exception extends Exception { |
|||
/** |
|||
* Error handler callback |
|||
* |
|||
* @param mixed $code |
|||
* @param mixed $string |
|||
* @param mixed $file |
|||
* @param mixed $line |
|||
* @param mixed $context |
|||
*/ |
|||
public static function errorHandlerCallback($code, $string, $file, $line, $context) { |
|||
$e = new self($string, $code); |
|||
$e->line = $line; |
|||
$e->file = $file; |
|||
throw $e; |
|||
} |
|||
} |
|||
@ -0,0 +1,202 @@ |
|||
<?php |
|||
/** |
|||
* PHPExcel |
|||
* |
|||
* Copyright (c) 2006 - 2013 PHPExcel |
|||
* |
|||
* This library is free software; you can redistribute it and/or |
|||
* modify it under the terms of the GNU Lesser General Public |
|||
* License as published by the Free Software Foundation; either |
|||
* version 2.1 of the License, or (at your option) any later version. |
|||
* |
|||
* This library is distributed in the hope that it will be useful, |
|||
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
|||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
|||
* Lesser General Public License for more details. |
|||
* |
|||
* You should have received a copy of the GNU Lesser General Public |
|||
* License along with this library; if not, write to the Free Software |
|||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA |
|||
* |
|||
* @category PHPExcel |
|||
* @package PHPExcel |
|||
* @copyright Copyright (c) 2006 - 2013 PHPExcel (http://www.codeplex.com/PHPExcel) |
|||
* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL |
|||
* @version 1.7.9, 2013-06-02 |
|||
*/ |
|||
|
|||
|
|||
/** |
|||
* PHPExcel_HashTable |
|||
* |
|||
* @category PHPExcel |
|||
* @package PHPExcel |
|||
* @copyright Copyright (c) 2006 - 2013 PHPExcel (http://www.codeplex.com/PHPExcel) |
|||
*/ |
|||
class PHPExcel_HashTable |
|||
{ |
|||
/** |
|||
* HashTable elements |
|||
* |
|||
* @var array |
|||
*/ |
|||
public $_items = array(); |
|||
|
|||
/** |
|||
* HashTable key map |
|||
* |
|||
* @var array |
|||
*/ |
|||
public $_keyMap = array(); |
|||
|
|||
/** |
|||
* Create a new PHPExcel_HashTable |
|||
* |
|||
* @param PHPExcel_IComparable[] $pSource Optional source array to create HashTable from |
|||
* @throws PHPExcel_Exception |
|||
*/ |
|||
public function __construct($pSource = null) |
|||
{ |
|||
if ($pSource !== NULL) { |
|||
// Create HashTable |
|||
$this->addFromSource($pSource); |
|||
} |
|||
} |
|||
|
|||
/** |
|||
* Add HashTable items from source |
|||
* |
|||
* @param PHPExcel_IComparable[] $pSource Source array to create HashTable from |
|||
* @throws PHPExcel_Exception |
|||
*/ |
|||
public function addFromSource($pSource = null) { |
|||
// Check if an array was passed |
|||
if ($pSource == null) { |
|||
return; |
|||
} else if (!is_array($pSource)) { |
|||
throw new PHPExcel_Exception('Invalid array parameter passed.'); |
|||
} |
|||
|
|||
foreach ($pSource as $item) { |
|||
$this->add($item); |
|||
} |
|||
} |
|||
|
|||
/** |
|||
* Add HashTable item |
|||
* |
|||
* @param PHPExcel_IComparable $pSource Item to add |
|||
* @throws PHPExcel_Exception |
|||
*/ |
|||
public function add(PHPExcel_IComparable $pSource = null) { |
|||
$hash = $pSource->getHashCode(); |
|||
if (!isset($this->_items[$hash])) { |
|||
$this->_items[$hash] = $pSource; |
|||
$this->_keyMap[count($this->_items) - 1] = $hash; |
|||
} |
|||
} |
|||
|
|||
/** |
|||
* Remove HashTable item |
|||
* |
|||
* @param PHPExcel_IComparable $pSource Item to remove |
|||
* @throws PHPExcel_Exception |
|||
*/ |
|||
public function remove(PHPExcel_IComparable $pSource = null) { |
|||
$hash = $pSource->getHashCode(); |
|||
if (isset($this->_items[$hash])) { |
|||
unset($this->_items[$hash]); |
|||
|
|||
$deleteKey = -1; |
|||
foreach ($this->_keyMap as $key => $value) { |
|||
if ($deleteKey >= 0) { |
|||
$this->_keyMap[$key - 1] = $value; |
|||
} |
|||
|
|||
if ($value == $hash) { |
|||
$deleteKey = $key; |
|||
} |
|||
} |
|||
unset($this->_keyMap[count($this->_keyMap) - 1]); |
|||
} |
|||
} |
|||
|
|||
/** |
|||
* Clear HashTable |
|||
* |
|||
*/ |
|||
public function clear() { |
|||
$this->_items = array(); |
|||
$this->_keyMap = array(); |
|||
} |
|||
|
|||
/** |
|||
* Count |
|||
* |
|||
* @return int |
|||
*/ |
|||
public function count() { |
|||
return count($this->_items); |
|||
} |
|||
|
|||
/** |
|||
* Get index for hash code |
|||
* |
|||
* @param string $pHashCode |
|||
* @return int Index |
|||
*/ |
|||
public function getIndexForHashCode($pHashCode = '') { |
|||
return array_search($pHashCode, $this->_keyMap); |
|||
} |
|||
|
|||
/** |
|||
* Get by index |
|||
* |
|||
* @param int $pIndex |
|||
* @return PHPExcel_IComparable |
|||
* |
|||
*/ |
|||
public function getByIndex($pIndex = 0) { |
|||
if (isset($this->_keyMap[$pIndex])) { |
|||
return $this->getByHashCode( $this->_keyMap[$pIndex] ); |
|||
} |
|||
|
|||
return null; |
|||
} |
|||
|
|||
/** |
|||
* Get by hashcode |
|||
* |
|||
* @param string $pHashCode |
|||
* @return PHPExcel_IComparable |
|||
* |
|||
*/ |
|||
public function getByHashCode($pHashCode = '') { |
|||
if (isset($this->_items[$pHashCode])) { |
|||
return $this->_items[$pHashCode]; |
|||
} |
|||
|
|||
return null; |
|||
} |
|||
|
|||
/** |
|||
* HashTable to array |
|||
* |
|||
* @return PHPExcel_IComparable[] |
|||
*/ |
|||
public function toArray() { |
|||
return $this->_items; |
|||
} |
|||
|
|||
/** |
|||
* Implement PHP __clone to create a deep clone, not just a shallow copy. |
|||
*/ |
|||
public function __clone() { |
|||
$vars = get_object_vars($this); |
|||
foreach ($vars as $key => $value) { |
|||
if (is_object($value)) { |
|||
$this->$key = clone $value; |
|||
} |
|||
} |
|||
} |
|||
} |
|||
@ -0,0 +1,43 @@ |
|||
<?php |
|||
/** |
|||
* PHPExcel |
|||
* |
|||
* This library is free software; you can redistribute it and/or |
|||
* modify it under the terms of the GNU Lesser General Public |
|||
* License as published by the Free Software Foundation; either |
|||
* version 2.1 of the License, or (at your option) any later version. |
|||
* |
|||
* This library is distributed in the hope that it will be useful, |
|||
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
|||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
|||
* Lesser General Public License for more details. |
|||
* |
|||
* You should have received a copy of the GNU Lesser General Public |
|||
* License along with this library; if not, write to the Free Software |
|||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA |
|||
* |
|||
* @category PHPExcel |
|||
* @package PHPExcel |
|||
* @copyright Copyright (c) 2006 - 2013 PHPExcel (http://www.codeplex.com/PHPExcel) |
|||
* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL |
|||
* @version 1.7.9, 2013-06-02 |
|||
*/ |
|||
|
|||
|
|||
/** |
|||
* PHPExcel_IComparable |
|||
* |
|||
* @category PHPExcel |
|||
* @package PHPExcel |
|||
* @copyright Copyright (c) 2006 - 2013 PHPExcel (http://www.codeplex.com/PHPExcel) |
|||
*/ |
|||
interface PHPExcel_IComparable |
|||
{ |
|||
/** |
|||
* Get hash code |
|||
* |
|||
* @return string Hash code |
|||
*/ |
|||
public function getHashCode(); |
|||
|
|||
} |
|||
@ -0,0 +1,321 @@ |
|||
<?php |
|||
/** |
|||
* PHPExcel |
|||
* |
|||
* Copyright (c) 2006 - 2013 PHPExcel |
|||
* |
|||
* This library is free software; you can redistribute it and/or |
|||
* modify it under the terms of the GNU Lesser General Public |
|||
* License as published by the Free Software Foundation; either |
|||
* version 2.1 of the License, or (at your option) any later version. |
|||
* |
|||
* This library is distributed in the hope that it will be useful, |
|||
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
|||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
|||
* Lesser General Public License for more details. |
|||
* |
|||
* You should have received a copy of the GNU Lesser General Public |
|||
* License along with this library; if not, write to the Free Software |
|||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA |
|||
* |
|||
* @category PHPExcel |
|||
* @package PHPExcel_Style |
|||
* @copyright Copyright (c) 2006 - 2013 PHPExcel (http://www.codeplex.com/PHPExcel) |
|||
* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL |
|||
* @version 1.7.9, 2013-06-02 |
|||
*/ |
|||
|
|||
|
|||
/** |
|||
* PHPExcel_Style_Fill |
|||
* |
|||
* @category PHPExcel |
|||
* @package PHPExcel_Style |
|||
* @copyright Copyright (c) 2006 - 2013 PHPExcel (http://www.codeplex.com/PHPExcel) |
|||
*/ |
|||
class PHPExcel_Style_Fill extends PHPExcel_Style_Supervisor implements PHPExcel_IComparable |
|||
{ |
|||
/* Fill types */ |
|||
const FILL_NONE = 'none'; |
|||
const FILL_SOLID = 'solid'; |
|||
const FILL_GRADIENT_LINEAR = 'linear'; |
|||
const FILL_GRADIENT_PATH = 'path'; |
|||
const FILL_PATTERN_DARKDOWN = 'darkDown'; |
|||
const FILL_PATTERN_DARKGRAY = 'darkGray'; |
|||
const FILL_PATTERN_DARKGRID = 'darkGrid'; |
|||
const FILL_PATTERN_DARKHORIZONTAL = 'darkHorizontal'; |
|||
const FILL_PATTERN_DARKTRELLIS = 'darkTrellis'; |
|||
const FILL_PATTERN_DARKUP = 'darkUp'; |
|||
const FILL_PATTERN_DARKVERTICAL = 'darkVertical'; |
|||
const FILL_PATTERN_GRAY0625 = 'gray0625'; |
|||
const FILL_PATTERN_GRAY125 = 'gray125'; |
|||
const FILL_PATTERN_LIGHTDOWN = 'lightDown'; |
|||
const FILL_PATTERN_LIGHTGRAY = 'lightGray'; |
|||
const FILL_PATTERN_LIGHTGRID = 'lightGrid'; |
|||
const FILL_PATTERN_LIGHTHORIZONTAL = 'lightHorizontal'; |
|||
const FILL_PATTERN_LIGHTTRELLIS = 'lightTrellis'; |
|||
const FILL_PATTERN_LIGHTUP = 'lightUp'; |
|||
const FILL_PATTERN_LIGHTVERTICAL = 'lightVertical'; |
|||
const FILL_PATTERN_MEDIUMGRAY = 'mediumGray'; |
|||
|
|||
/** |
|||
* Fill type |
|||
* |
|||
* @var string |
|||
*/ |
|||
protected $_fillType = PHPExcel_Style_Fill::FILL_NONE; |
|||
|
|||
/** |
|||
* Rotation |
|||
* |
|||
* @var double |
|||
*/ |
|||
protected $_rotation = 0; |
|||
|
|||
/** |
|||
* Start color |
|||
* |
|||
* @var PHPExcel_Style_Color |
|||
*/ |
|||
protected $_startColor; |
|||
|
|||
/** |
|||
* End color |
|||
* |
|||
* @var PHPExcel_Style_Color |
|||
*/ |
|||
protected $_endColor; |
|||
|
|||
/** |
|||
* Create a new PHPExcel_Style_Fill |
|||
* |
|||
* @param boolean $isSupervisor Flag indicating if this is a supervisor or not |
|||
* Leave this value at default unless you understand exactly what |
|||
* its ramifications are |
|||
* @param boolean $isConditional Flag indicating if this is a conditional style or not |
|||
* Leave this value at default unless you understand exactly what |
|||
* its ramifications are |
|||
*/ |
|||
public function __construct($isSupervisor = FALSE, $isConditional = FALSE) |
|||
{ |
|||
// Supervisor? |
|||
parent::__construct($isSupervisor); |
|||
|
|||
// Initialise values |
|||
if ($isConditional) { |
|||
$this->_fillType = NULL; |
|||
} |
|||
$this->_startColor = new PHPExcel_Style_Color(PHPExcel_Style_Color::COLOR_WHITE, $isSupervisor, $isConditional); |
|||
$this->_endColor = new PHPExcel_Style_Color(PHPExcel_Style_Color::COLOR_BLACK, $isSupervisor, $isConditional); |
|||
|
|||
// bind parent if we are a supervisor |
|||
if ($isSupervisor) { |
|||
$this->_startColor->bindParent($this, '_startColor'); |
|||
$this->_endColor->bindParent($this, '_endColor'); |
|||
} |
|||
} |
|||
|
|||
/** |
|||
* Get the shared style component for the currently active cell in currently active sheet. |
|||
* Only used for style supervisor |
|||
* |
|||
* @return PHPExcel_Style_Fill |
|||
*/ |
|||
public function getSharedComponent() |
|||
{ |
|||
return $this->_parent->getSharedComponent()->getFill(); |
|||
} |
|||
|
|||
/** |
|||
* Build style array from subcomponents |
|||
* |
|||
* @param array $array |
|||
* @return array |
|||
*/ |
|||
public function getStyleArray($array) |
|||
{ |
|||
return array('fill' => $array); |
|||
} |
|||
|
|||
/** |
|||
* Apply styles from array |
|||
* |
|||
* <code> |
|||
* $objPHPExcel->getActiveSheet()->getStyle('B2')->getFill()->applyFromArray( |
|||
* array( |
|||
* 'type' => PHPExcel_Style_Fill::FILL_GRADIENT_LINEAR, |
|||
* 'rotation' => 0, |
|||
* 'startcolor' => array( |
|||
* 'rgb' => '000000' |
|||
* ), |
|||
* 'endcolor' => array( |
|||
* 'argb' => 'FFFFFFFF' |
|||
* ) |
|||
* ) |
|||
* ); |
|||
* </code> |
|||
* |
|||
* @param array $pStyles Array containing style information |
|||
* @throws PHPExcel_Exception |
|||
* @return PHPExcel_Style_Fill |
|||
*/ |
|||
public function applyFromArray($pStyles = null) { |
|||
if (is_array($pStyles)) { |
|||
if ($this->_isSupervisor) { |
|||
$this->getActiveSheet()->getStyle($this->getSelectedCells())->applyFromArray($this->getStyleArray($pStyles)); |
|||
} else { |
|||
if (array_key_exists('type', $pStyles)) { |
|||
$this->setFillType($pStyles['type']); |
|||
} |
|||
if (array_key_exists('rotation', $pStyles)) { |
|||
$this->setRotation($pStyles['rotation']); |
|||
} |
|||
if (array_key_exists('startcolor', $pStyles)) { |
|||
$this->getStartColor()->applyFromArray($pStyles['startcolor']); |
|||
} |
|||
if (array_key_exists('endcolor', $pStyles)) { |
|||
$this->getEndColor()->applyFromArray($pStyles['endcolor']); |
|||
} |
|||
if (array_key_exists('color', $pStyles)) { |
|||
$this->getStartColor()->applyFromArray($pStyles['color']); |
|||
} |
|||
} |
|||
} else { |
|||
throw new PHPExcel_Exception("Invalid style array passed."); |
|||
} |
|||
return $this; |
|||
} |
|||
|
|||
/** |
|||
* Get Fill Type |
|||
* |
|||
* @return string |
|||
*/ |
|||
public function getFillType() { |
|||
if ($this->_isSupervisor) { |
|||
return $this->getSharedComponent()->getFillType(); |
|||
} |
|||
return $this->_fillType; |
|||
} |
|||
|
|||
/** |
|||
* Set Fill Type |
|||
* |
|||
* @param string $pValue PHPExcel_Style_Fill fill type |
|||
* @return PHPExcel_Style_Fill |
|||
*/ |
|||
public function setFillType($pValue = PHPExcel_Style_Fill::FILL_NONE) { |
|||
if ($this->_isSupervisor) { |
|||
$styleArray = $this->getStyleArray(array('type' => $pValue)); |
|||
$this->getActiveSheet()->getStyle($this->getSelectedCells())->applyFromArray($styleArray); |
|||
} else { |
|||
$this->_fillType = $pValue; |
|||
} |
|||
return $this; |
|||
} |
|||
|
|||
/** |
|||
* Get Rotation |
|||
* |
|||
* @return double |
|||
*/ |
|||
public function getRotation() { |
|||
if ($this->_isSupervisor) { |
|||
return $this->getSharedComponent()->getRotation(); |
|||
} |
|||
return $this->_rotation; |
|||
} |
|||
|
|||
/** |
|||
* Set Rotation |
|||
* |
|||
* @param double $pValue |
|||
* @return PHPExcel_Style_Fill |
|||
*/ |
|||
public function setRotation($pValue = 0) { |
|||
if ($this->_isSupervisor) { |
|||
$styleArray = $this->getStyleArray(array('rotation' => $pValue)); |
|||
$this->getActiveSheet()->getStyle($this->getSelectedCells())->applyFromArray($styleArray); |
|||
} else { |
|||
$this->_rotation = $pValue; |
|||
} |
|||
return $this; |
|||
} |
|||
|
|||
/** |
|||
* Get Start Color |
|||
* |
|||
* @return PHPExcel_Style_Color |
|||
*/ |
|||
public function getStartColor() { |
|||
return $this->_startColor; |
|||
} |
|||
|
|||
/** |
|||
* Set Start Color |
|||
* |
|||
* @param PHPExcel_Style_Color $pValue |
|||
* @throws PHPExcel_Exception |
|||
* @return PHPExcel_Style_Fill |
|||
*/ |
|||
public function setStartColor(PHPExcel_Style_Color $pValue = null) { |
|||
// make sure parameter is a real color and not a supervisor |
|||
$color = $pValue->getIsSupervisor() ? $pValue->getSharedComponent() : $pValue; |
|||
|
|||
if ($this->_isSupervisor) { |
|||
$styleArray = $this->getStartColor()->getStyleArray(array('argb' => $color->getARGB())); |
|||
$this->getActiveSheet()->getStyle($this->getSelectedCells())->applyFromArray($styleArray); |
|||
} else { |
|||
$this->_startColor = $color; |
|||
} |
|||
return $this; |
|||
} |
|||
|
|||
/** |
|||
* Get End Color |
|||
* |
|||
* @return PHPExcel_Style_Color |
|||
*/ |
|||
public function getEndColor() { |
|||
return $this->_endColor; |
|||
} |
|||
|
|||
/** |
|||
* Set End Color |
|||
* |
|||
* @param PHPExcel_Style_Color $pValue |
|||
* @throws PHPExcel_Exception |
|||
* @return PHPExcel_Style_Fill |
|||
*/ |
|||
public function setEndColor(PHPExcel_Style_Color $pValue = null) { |
|||
// make sure parameter is a real color and not a supervisor |
|||
$color = $pValue->getIsSupervisor() ? $pValue->getSharedComponent() : $pValue; |
|||
|
|||
if ($this->_isSupervisor) { |
|||
$styleArray = $this->getEndColor()->getStyleArray(array('argb' => $color->getARGB())); |
|||
$this->getActiveSheet()->getStyle($this->getSelectedCells())->applyFromArray($styleArray); |
|||
} else { |
|||
$this->_endColor = $color; |
|||
} |
|||
return $this; |
|||
} |
|||
|
|||
/** |
|||
* Get hash code |
|||
* |
|||
* @return string Hash code |
|||
*/ |
|||
public function getHashCode() { |
|||
if ($this->_isSupervisor) { |
|||
return $this->getSharedComponent()->getHashCode(); |
|||
} |
|||
return md5( |
|||
$this->getFillType() |
|||
. $this->getRotation() |
|||
. $this->getStartColor()->getHashCode() |
|||
. $this->getEndColor()->getHashCode() |
|||
. __CLASS__ |
|||
); |
|||
} |
|||
|
|||
} |
|||
@ -0,0 +1,532 @@ |
|||
<?php |
|||
/** |
|||
* PHPExcel |
|||
* |
|||
* Copyright (c) 2006 - 2013 PHPExcel |
|||
* |
|||
* This library is free software; you can redistribute it and/or |
|||
* modify it under the terms of the GNU Lesser General Public |
|||
* License as published by the Free Software Foundation; either |
|||
* version 2.1 of the License, or (at your option) any later version. |
|||
* |
|||
* This library is distributed in the hope that it will be useful, |
|||
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
|||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
|||
* Lesser General Public License for more details. |
|||
* |
|||
* You should have received a copy of the GNU Lesser General Public |
|||
* License along with this library; if not, write to the Free Software |
|||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA |
|||
* |
|||
* @category PHPExcel |
|||
* @package PHPExcel_Style |
|||
* @copyright Copyright (c) 2006 - 2013 PHPExcel (http://www.codeplex.com/PHPExcel) |
|||
* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL |
|||
* @version 1.7.9, 2013-06-02 |
|||
*/ |
|||
|
|||
|
|||
/** |
|||
* PHPExcel_Style_Font |
|||
* |
|||
* @category PHPExcel |
|||
* @package PHPExcel_Style |
|||
* @copyright Copyright (c) 2006 - 2013 PHPExcel (http://www.codeplex.com/PHPExcel) |
|||
*/ |
|||
class PHPExcel_Style_Font extends PHPExcel_Style_Supervisor implements PHPExcel_IComparable |
|||
{ |
|||
/* Underline types */ |
|||
const UNDERLINE_NONE = 'none'; |
|||
const UNDERLINE_DOUBLE = 'double'; |
|||
const UNDERLINE_DOUBLEACCOUNTING = 'doubleAccounting'; |
|||
const UNDERLINE_SINGLE = 'single'; |
|||
const UNDERLINE_SINGLEACCOUNTING = 'singleAccounting'; |
|||
|
|||
/** |
|||
* Font Name |
|||
* |
|||
* @var string |
|||
*/ |
|||
protected $_name = 'Calibri'; |
|||
|
|||
/** |
|||
* Font Size |
|||
* |
|||
* @var float |
|||
*/ |
|||
protected $_size = 11; |
|||
|
|||
/** |
|||
* Bold |
|||
* |
|||
* @var boolean |
|||
*/ |
|||
protected $_bold = FALSE; |
|||
|
|||
/** |
|||
* Italic |
|||
* |
|||
* @var boolean |
|||
*/ |
|||
protected $_italic = FALSE; |
|||
|
|||
/** |
|||
* Superscript |
|||
* |
|||
* @var boolean |
|||
*/ |
|||
protected $_superScript = FALSE; |
|||
|
|||
/** |
|||
* Subscript |
|||
* |
|||
* @var boolean |
|||
*/ |
|||
protected $_subScript = FALSE; |
|||
|
|||
/** |
|||
* Underline |
|||
* |
|||
* @var string |
|||
*/ |
|||
protected $_underline = self::UNDERLINE_NONE; |
|||
|
|||
/** |
|||
* Strikethrough |
|||
* |
|||
* @var boolean |
|||
*/ |
|||
protected $_strikethrough = FALSE; |
|||
|
|||
/** |
|||
* Foreground color |
|||
* |
|||
* @var PHPExcel_Style_Color |
|||
*/ |
|||
protected $_color; |
|||
|
|||
/** |
|||
* Create a new PHPExcel_Style_Font |
|||
* |
|||
* @param boolean $isSupervisor Flag indicating if this is a supervisor or not |
|||
* Leave this value at default unless you understand exactly what |
|||
* its ramifications are |
|||
* @param boolean $isConditional Flag indicating if this is a conditional style or not |
|||
* Leave this value at default unless you understand exactly what |
|||
* its ramifications are |
|||
*/ |
|||
public function __construct($isSupervisor = FALSE, $isConditional = FALSE) |
|||
{ |
|||
// Supervisor? |
|||
parent::__construct($isSupervisor); |
|||
|
|||
// Initialise values |
|||
if ($isConditional) { |
|||
$this->_name = NULL; |
|||
$this->_size = NULL; |
|||
$this->_bold = NULL; |
|||
$this->_italic = NULL; |
|||
$this->_superScript = NULL; |
|||
$this->_subScript = NULL; |
|||
$this->_underline = NULL; |
|||
$this->_strikethrough = NULL; |
|||
$this->_color = new PHPExcel_Style_Color(PHPExcel_Style_Color::COLOR_BLACK, $isSupervisor, $isConditional); |
|||
} else { |
|||
$this->_color = new PHPExcel_Style_Color(PHPExcel_Style_Color::COLOR_BLACK, $isSupervisor); |
|||
} |
|||
// bind parent if we are a supervisor |
|||
if ($isSupervisor) { |
|||
$this->_color->bindParent($this, '_color'); |
|||
} |
|||
} |
|||
|
|||
/** |
|||
* Get the shared style component for the currently active cell in currently active sheet. |
|||
* Only used for style supervisor |
|||
* |
|||
* @return PHPExcel_Style_Font |
|||
*/ |
|||
public function getSharedComponent() |
|||
{ |
|||
return $this->_parent->getSharedComponent()->getFont(); |
|||
} |
|||
|
|||
/** |
|||
* Build style array from subcomponents |
|||
* |
|||
* @param array $array |
|||
* @return array |
|||
*/ |
|||
public function getStyleArray($array) |
|||
{ |
|||
return array('font' => $array); |
|||
} |
|||
|
|||
/** |
|||
* Apply styles from array |
|||
* |
|||
* <code> |
|||
* $objPHPExcel->getActiveSheet()->getStyle('B2')->getFont()->applyFromArray( |
|||
* array( |
|||
* 'name' => 'Arial', |
|||
* 'bold' => TRUE, |
|||
* 'italic' => FALSE, |
|||
* 'underline' => PHPExcel_Style_Font::UNDERLINE_DOUBLE, |
|||
* 'strike' => FALSE, |
|||
* 'color' => array( |
|||
* 'rgb' => '808080' |
|||
* ) |
|||
* ) |
|||
* ); |
|||
* </code> |
|||
* |
|||
* @param array $pStyles Array containing style information |
|||
* @throws PHPExcel_Exception |
|||
* @return PHPExcel_Style_Font |
|||
*/ |
|||
public function applyFromArray($pStyles = null) { |
|||
if (is_array($pStyles)) { |
|||
if ($this->_isSupervisor) { |
|||
$this->getActiveSheet()->getStyle($this->getSelectedCells())->applyFromArray($this->getStyleArray($pStyles)); |
|||
} else { |
|||
if (array_key_exists('name', $pStyles)) { |
|||
$this->setName($pStyles['name']); |
|||
} |
|||
if (array_key_exists('bold', $pStyles)) { |
|||
$this->setBold($pStyles['bold']); |
|||
} |
|||
if (array_key_exists('italic', $pStyles)) { |
|||
$this->setItalic($pStyles['italic']); |
|||
} |
|||
if (array_key_exists('superScript', $pStyles)) { |
|||
$this->setSuperScript($pStyles['superScript']); |
|||
} |
|||
if (array_key_exists('subScript', $pStyles)) { |
|||
$this->setSubScript($pStyles['subScript']); |
|||
} |
|||
if (array_key_exists('underline', $pStyles)) { |
|||
$this->setUnderline($pStyles['underline']); |
|||
} |
|||
if (array_key_exists('strike', $pStyles)) { |
|||
$this->setStrikethrough($pStyles['strike']); |
|||
} |
|||
if (array_key_exists('color', $pStyles)) { |
|||
$this->getColor()->applyFromArray($pStyles['color']); |
|||
} |
|||
if (array_key_exists('size', $pStyles)) { |
|||
$this->setSize($pStyles['size']); |
|||
} |
|||
} |
|||
} else { |
|||
throw new PHPExcel_Exception("Invalid style array passed."); |
|||
} |
|||
return $this; |
|||
} |
|||
|
|||
/** |
|||
* Get Name |
|||
* |
|||
* @return string |
|||
*/ |
|||
public function getName() { |
|||
if ($this->_isSupervisor) { |
|||
return $this->getSharedComponent()->getName(); |
|||
} |
|||
return $this->_name; |
|||
} |
|||
|
|||
/** |
|||
* Set Name |
|||
* |
|||
* @param string $pValue |
|||
* @return PHPExcel_Style_Font |
|||
*/ |
|||
public function setName($pValue = 'Calibri') { |
|||
if ($pValue == '') { |
|||
$pValue = 'Calibri'; |
|||
} |
|||
if ($this->_isSupervisor) { |
|||
$styleArray = $this->getStyleArray(array('name' => $pValue)); |
|||
$this->getActiveSheet()->getStyle($this->getSelectedCells())->applyFromArray($styleArray); |
|||
} else { |
|||
$this->_name = $pValue; |
|||
} |
|||
return $this; |
|||
} |
|||
|
|||
/** |
|||
* Get Size |
|||
* |
|||
* @return double |
|||
*/ |
|||
public function getSize() { |
|||
if ($this->_isSupervisor) { |
|||
return $this->getSharedComponent()->getSize(); |
|||
} |
|||
return $this->_size; |
|||
} |
|||
|
|||
/** |
|||
* Set Size |
|||
* |
|||
* @param double $pValue |
|||
* @return PHPExcel_Style_Font |
|||
*/ |
|||
public function setSize($pValue = 10) { |
|||
if ($pValue == '') { |
|||
$pValue = 10; |
|||
} |
|||
if ($this->_isSupervisor) { |
|||
$styleArray = $this->getStyleArray(array('size' => $pValue)); |
|||
$this->getActiveSheet()->getStyle($this->getSelectedCells())->applyFromArray($styleArray); |
|||
} else { |
|||
$this->_size = $pValue; |
|||
} |
|||
return $this; |
|||
} |
|||
|
|||
/** |
|||
* Get Bold |
|||
* |
|||
* @return boolean |
|||
*/ |
|||
public function getBold() { |
|||
if ($this->_isSupervisor) { |
|||
return $this->getSharedComponent()->getBold(); |
|||
} |
|||
return $this->_bold; |
|||
} |
|||
|
|||
/** |
|||
* Set Bold |
|||
* |
|||
* @param boolean $pValue |
|||
* @return PHPExcel_Style_Font |
|||
*/ |
|||
public function setBold($pValue = false) { |
|||
if ($pValue == '') { |
|||
$pValue = false; |
|||
} |
|||
if ($this->_isSupervisor) { |
|||
$styleArray = $this->getStyleArray(array('bold' => $pValue)); |
|||
$this->getActiveSheet()->getStyle($this->getSelectedCells())->applyFromArray($styleArray); |
|||
} else { |
|||
$this->_bold = $pValue; |
|||
} |
|||
return $this; |
|||
} |
|||
|
|||
/** |
|||
* Get Italic |
|||
* |
|||
* @return boolean |
|||
*/ |
|||
public function getItalic() { |
|||
if ($this->_isSupervisor) { |
|||
return $this->getSharedComponent()->getItalic(); |
|||
} |
|||
return $this->_italic; |
|||
} |
|||
|
|||
/** |
|||
* Set Italic |
|||
* |
|||
* @param boolean $pValue |
|||
* @return PHPExcel_Style_Font |
|||
*/ |
|||
public function setItalic($pValue = false) { |
|||
if ($pValue == '') { |
|||
$pValue = false; |
|||
} |
|||
if ($this->_isSupervisor) { |
|||
$styleArray = $this->getStyleArray(array('italic' => $pValue)); |
|||
$this->getActiveSheet()->getStyle($this->getSelectedCells())->applyFromArray($styleArray); |
|||
} else { |
|||
$this->_italic = $pValue; |
|||
} |
|||
return $this; |
|||
} |
|||
|
|||
/** |
|||
* Get SuperScript |
|||
* |
|||
* @return boolean |
|||
*/ |
|||
public function getSuperScript() { |
|||
if ($this->_isSupervisor) { |
|||
return $this->getSharedComponent()->getSuperScript(); |
|||
} |
|||
return $this->_superScript; |
|||
} |
|||
|
|||
/** |
|||
* Set SuperScript |
|||
* |
|||
* @param boolean $pValue |
|||
* @return PHPExcel_Style_Font |
|||
*/ |
|||
public function setSuperScript($pValue = false) { |
|||
if ($pValue == '') { |
|||
$pValue = false; |
|||
} |
|||
if ($this->_isSupervisor) { |
|||
$styleArray = $this->getStyleArray(array('superScript' => $pValue)); |
|||
$this->getActiveSheet()->getStyle($this->getSelectedCells())->applyFromArray($styleArray); |
|||
} else { |
|||
$this->_superScript = $pValue; |
|||
$this->_subScript = !$pValue; |
|||
} |
|||
return $this; |
|||
} |
|||
|
|||
/** |
|||
* Get SubScript |
|||
* |
|||
* @return boolean |
|||
*/ |
|||
public function getSubScript() { |
|||
if ($this->_isSupervisor) { |
|||
return $this->getSharedComponent()->getSubScript(); |
|||
} |
|||
return $this->_subScript; |
|||
} |
|||
|
|||
/** |
|||
* Set SubScript |
|||
* |
|||
* @param boolean $pValue |
|||
* @return PHPExcel_Style_Font |
|||
*/ |
|||
public function setSubScript($pValue = false) { |
|||
if ($pValue == '') { |
|||
$pValue = false; |
|||
} |
|||
if ($this->_isSupervisor) { |
|||
$styleArray = $this->getStyleArray(array('subScript' => $pValue)); |
|||
$this->getActiveSheet()->getStyle($this->getSelectedCells())->applyFromArray($styleArray); |
|||
} else { |
|||
$this->_subScript = $pValue; |
|||
$this->_superScript = !$pValue; |
|||
} |
|||
return $this; |
|||
} |
|||
|
|||
/** |
|||
* Get Underline |
|||
* |
|||
* @return string |
|||
*/ |
|||
public function getUnderline() { |
|||
if ($this->_isSupervisor) { |
|||
return $this->getSharedComponent()->getUnderline(); |
|||
} |
|||
return $this->_underline; |
|||
} |
|||
|
|||
/** |
|||
* Set Underline |
|||
* |
|||
* @param string|boolean $pValue PHPExcel_Style_Font underline type |
|||
* If a boolean is passed, then TRUE equates to UNDERLINE_SINGLE, |
|||
* false equates to UNDERLINE_NONE |
|||
* @return PHPExcel_Style_Font |
|||
*/ |
|||
public function setUnderline($pValue = self::UNDERLINE_NONE) { |
|||
if (is_bool($pValue)) { |
|||
$pValue = ($pValue) ? self::UNDERLINE_SINGLE : self::UNDERLINE_NONE; |
|||
} elseif ($pValue == '') { |
|||
$pValue = self::UNDERLINE_NONE; |
|||
} |
|||
if ($this->_isSupervisor) { |
|||
$styleArray = $this->getStyleArray(array('underline' => $pValue)); |
|||
$this->getActiveSheet()->getStyle($this->getSelectedCells())->applyFromArray($styleArray); |
|||
} else { |
|||
$this->_underline = $pValue; |
|||
} |
|||
return $this; |
|||
} |
|||
|
|||
/** |
|||
* Get Strikethrough |
|||
* |
|||
* @return boolean |
|||
*/ |
|||
public function getStrikethrough() { |
|||
if ($this->_isSupervisor) { |
|||
return $this->getSharedComponent()->getStrikethrough(); |
|||
} |
|||
return $this->_strikethrough; |
|||
} |
|||
|
|||
/** |
|||
* Set Strikethrough |
|||
* |
|||
* @param boolean $pValue |
|||
* @return PHPExcel_Style_Font |
|||
*/ |
|||
public function setStrikethrough($pValue = false) { |
|||
if ($pValue == '') { |
|||
$pValue = false; |
|||
} |
|||
if ($this->_isSupervisor) { |
|||
$styleArray = $this->getStyleArray(array('strike' => $pValue)); |
|||
$this->getActiveSheet()->getStyle($this->getSelectedCells())->applyFromArray($styleArray); |
|||
} else { |
|||
$this->_strikethrough = $pValue; |
|||
} |
|||
return $this; |
|||
} |
|||
|
|||
/** |
|||
* Get Color |
|||
* |
|||
* @return PHPExcel_Style_Color |
|||
*/ |
|||
public function getColor() { |
|||
return $this->_color; |
|||
} |
|||
|
|||
/** |
|||
* Set Color |
|||
* |
|||
* @param PHPExcel_Style_Color $pValue |
|||
* @throws PHPExcel_Exception |
|||
* @return PHPExcel_Style_Font |
|||
*/ |
|||
public function setColor(PHPExcel_Style_Color $pValue = null) { |
|||
// make sure parameter is a real color and not a supervisor |
|||
$color = $pValue->getIsSupervisor() ? $pValue->getSharedComponent() : $pValue; |
|||
|
|||
if ($this->_isSupervisor) { |
|||
$styleArray = $this->getColor()->getStyleArray(array('argb' => $color->getARGB())); |
|||
$this->getActiveSheet()->getStyle($this->getSelectedCells())->applyFromArray($styleArray); |
|||
} else { |
|||
$this->_color = $color; |
|||
} |
|||
return $this; |
|||
} |
|||
|
|||
/** |
|||
* Get hash code |
|||
* |
|||
* @return string Hash code |
|||
*/ |
|||
public function getHashCode() { |
|||
if ($this->_isSupervisor) { |
|||
return $this->getSharedComponent()->getHashCode(); |
|||
} |
|||
return md5( |
|||
$this->_name |
|||
. $this->_size |
|||
. ($this->_bold ? 't' : 'f') |
|||
. ($this->_italic ? 't' : 'f') |
|||
. ($this->_superScript ? 't' : 'f') |
|||
. ($this->_subScript ? 't' : 'f') |
|||
. $this->_underline |
|||
. ($this->_strikethrough ? 't' : 'f') |
|||
. $this->_color->getHashCode() |
|||
. __CLASS__ |
|||
); |
|||
} |
|||
|
|||
} |
|||
@ -0,0 +1,148 @@ |
|||
<?php |
|||
/** |
|||
* PHPExcel |
|||
* |
|||
* Copyright (c) 2006 - 2013 PHPExcel |
|||
* |
|||
* This library is free software; you can redistribute it and/or |
|||
* modify it under the terms of the GNU Lesser General Public |
|||
* License as published by the Free Software Foundation; either |
|||
* version 2.1 of the License, or (at your option) any later version. |
|||
* |
|||
* This library is distributed in the hope that it will be useful, |
|||
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
|||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
|||
* Lesser General Public License for more details. |
|||
* |
|||
* You should have received a copy of the GNU Lesser General Public |
|||
* License along with this library; if not, write to the Free Software |
|||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA |
|||
* |
|||
* @category PHPExcel |
|||
* @package PHPExcel_Worksheet_Drawing |
|||
* @copyright Copyright (c) 2006 - 2013 PHPExcel (http://www.codeplex.com/PHPExcel) |
|||
* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL |
|||
* @version 1.7.9, 2013-06-02 |
|||
*/ |
|||
|
|||
|
|||
/** |
|||
* PHPExcel_Worksheet_Drawing |
|||
* |
|||
* @category PHPExcel |
|||
* @package PHPExcel_Worksheet_Drawing |
|||
* @copyright Copyright (c) 2006 - 2013 PHPExcel (http://www.codeplex.com/PHPExcel) |
|||
*/ |
|||
class PHPExcel_Worksheet_Drawing extends PHPExcel_Worksheet_BaseDrawing implements PHPExcel_IComparable |
|||
{ |
|||
/** |
|||
* Path |
|||
* |
|||
* @var string |
|||
*/ |
|||
private $_path; |
|||
|
|||
/** |
|||
* Create a new PHPExcel_Worksheet_Drawing |
|||
*/ |
|||
public function __construct() |
|||
{ |
|||
// Initialise values |
|||
$this->_path = ''; |
|||
|
|||
// Initialize parent |
|||
parent::__construct(); |
|||
} |
|||
|
|||
/** |
|||
* Get Filename |
|||
* |
|||
* @return string |
|||
*/ |
|||
public function getFilename() { |
|||
return basename($this->_path); |
|||
} |
|||
|
|||
/** |
|||
* Get indexed filename (using image index) |
|||
* |
|||
* @return string |
|||
*/ |
|||
public function getIndexedFilename() { |
|||
$fileName = $this->getFilename(); |
|||
$fileName = str_replace(' ', '_', $fileName); |
|||
return str_replace('.' . $this->getExtension(), '', $fileName) . $this->getImageIndex() . '.' . $this->getExtension(); |
|||
} |
|||
|
|||
/** |
|||
* Get Extension |
|||
* |
|||
* @return string |
|||
*/ |
|||
public function getExtension() { |
|||
$exploded = explode(".", basename($this->_path)); |
|||
return $exploded[count($exploded) - 1]; |
|||
} |
|||
|
|||
/** |
|||
* Get Path |
|||
* |
|||
* @return string |
|||
*/ |
|||
public function getPath() { |
|||
return $this->_path; |
|||
} |
|||
|
|||
/** |
|||
* Set Path |
|||
* |
|||
* @param string $pValue File path |
|||
* @param boolean $pVerifyFile Verify file |
|||
* @throws PHPExcel_Exception |
|||
* @return PHPExcel_Worksheet_Drawing |
|||
*/ |
|||
public function setPath($pValue = '', $pVerifyFile = true) { |
|||
if ($pVerifyFile) { |
|||
if (file_exists($pValue)) { |
|||
$this->_path = $pValue; |
|||
|
|||
if ($this->_width == 0 && $this->_height == 0) { |
|||
// Get width/height |
|||
list($this->_width, $this->_height) = getimagesize($pValue); |
|||
} |
|||
} else { |
|||
throw new PHPExcel_Exception("File $pValue not found!"); |
|||
} |
|||
} else { |
|||
$this->_path = $pValue; |
|||
} |
|||
return $this; |
|||
} |
|||
|
|||
/** |
|||
* Get hash code |
|||
* |
|||
* @return string Hash code |
|||
*/ |
|||
public function getHashCode() { |
|||
return md5( |
|||
$this->_path |
|||
. parent::getHashCode() |
|||
. __CLASS__ |
|||
); |
|||
} |
|||
|
|||
/** |
|||
* Implement PHP __clone to create a deep clone, not just a shallow copy. |
|||
*/ |
|||
public function __clone() { |
|||
$vars = get_object_vars($this); |
|||
foreach ($vars as $key => $value) { |
|||
if (is_object($value)) { |
|||
$this->$key = clone $value; |
|||
} else { |
|||
$this->$key = $value; |
|||
} |
|||
} |
|||
} |
|||
} |
|||
@ -0,0 +1,465 @@ |
|||
<?php |
|||
/** |
|||
* PHPExcel |
|||
* |
|||
* Copyright (c) 2006 - 2013 PHPExcel |
|||
* |
|||
* This library is free software; you can redistribute it and/or |
|||
* modify it under the terms of the GNU Lesser General Public |
|||
* License as published by the Free Software Foundation; either |
|||
* version 2.1 of the License, or (at your option) any later version. |
|||
* |
|||
* This library is distributed in the hope that it will be useful, |
|||
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
|||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
|||
* Lesser General Public License for more details. |
|||
* |
|||
* You should have received a copy of the GNU Lesser General Public |
|||
* License along with this library; if not, write to the Free Software |
|||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA |
|||
* |
|||
* @category PHPExcel |
|||
* @package PHPExcel_Worksheet |
|||
* @copyright Copyright (c) 2006 - 2013 PHPExcel (http://www.codeplex.com/PHPExcel) |
|||
* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL |
|||
* @version 1.7.9, 2013-06-02 |
|||
*/ |
|||
|
|||
|
|||
/** |
|||
* PHPExcel_Worksheet_HeaderFooter |
|||
* |
|||
* <code> |
|||
* Header/Footer Formatting Syntax taken from Office Open XML Part 4 - Markup Language Reference, page 1970: |
|||
* |
|||
* There are a number of formatting codes that can be written inline with the actual header / footer text, which |
|||
* affect the formatting in the header or footer. |
|||
* |
|||
* Example: This example shows the text "Center Bold Header" on the first line (center section), and the date on |
|||
* the second line (center section). |
|||
* &CCenter &"-,Bold"Bold&"-,Regular"Header_x000A_&D |
|||
* |
|||
* General Rules: |
|||
* There is no required order in which these codes must appear. |
|||
* |
|||
* The first occurrence of the following codes turns the formatting ON, the second occurrence turns it OFF again: |
|||
* - strikethrough |
|||
* - superscript |
|||
* - subscript |
|||
* Superscript and subscript cannot both be ON at same time. Whichever comes first wins and the other is ignored, |
|||
* while the first is ON. |
|||
* &L - code for "left section" (there are three header / footer locations, "left", "center", and "right"). When |
|||
* two or more occurrences of this section marker exist, the contents from all markers are concatenated, in the |
|||
* order of appearance, and placed into the left section. |
|||
* &P - code for "current page #" |
|||
* &N - code for "total pages" |
|||
* &font size - code for "text font size", where font size is a font size in points. |
|||
* &K - code for "text font color" |
|||
* RGB Color is specified as RRGGBB |
|||
* Theme Color is specifed as TTSNN where TT is the theme color Id, S is either "+" or "-" of the tint/shade |
|||
* value, NN is the tint/shade value. |
|||
* &S - code for "text strikethrough" on / off |
|||
* &X - code for "text super script" on / off |
|||
* &Y - code for "text subscript" on / off |
|||
* &C - code for "center section". When two or more occurrences of this section marker exist, the contents |
|||
* from all markers are concatenated, in the order of appearance, and placed into the center section. |
|||
* |
|||
* &D - code for "date" |
|||
* &T - code for "time" |
|||
* &G - code for "picture as background" |
|||
* &U - code for "text single underline" |
|||
* &E - code for "double underline" |
|||
* &R - code for "right section". When two or more occurrences of this section marker exist, the contents |
|||
* from all markers are concatenated, in the order of appearance, and placed into the right section. |
|||
* &Z - code for "this workbook's file path" |
|||
* &F - code for "this workbook's file name" |
|||
* &A - code for "sheet tab name" |
|||
* &+ - code for add to page #. |
|||
* &- - code for subtract from page #. |
|||
* &"font name,font type" - code for "text font name" and "text font type", where font name and font type |
|||
* are strings specifying the name and type of the font, separated by a comma. When a hyphen appears in font |
|||
* name, it means "none specified". Both of font name and font type can be localized values. |
|||
* &"-,Bold" - code for "bold font style" |
|||
* &B - also means "bold font style". |
|||
* &"-,Regular" - code for "regular font style" |
|||
* &"-,Italic" - code for "italic font style" |
|||
* &I - also means "italic font style" |
|||
* &"-,Bold Italic" code for "bold italic font style" |
|||
* &O - code for "outline style" |
|||
* &H - code for "shadow style" |
|||
* </code> |
|||
* |
|||
* @category PHPExcel |
|||
* @package PHPExcel_Worksheet |
|||
* @copyright Copyright (c) 2006 - 2013 PHPExcel (http://www.codeplex.com/PHPExcel) |
|||
*/ |
|||
class PHPExcel_Worksheet_HeaderFooter |
|||
{ |
|||
/* Header/footer image location */ |
|||
const IMAGE_HEADER_LEFT = 'LH'; |
|||
const IMAGE_HEADER_CENTER = 'CH'; |
|||
const IMAGE_HEADER_RIGHT = 'RH'; |
|||
const IMAGE_FOOTER_LEFT = 'LF'; |
|||
const IMAGE_FOOTER_CENTER = 'CF'; |
|||
const IMAGE_FOOTER_RIGHT = 'RF'; |
|||
|
|||
/** |
|||
* OddHeader |
|||
* |
|||
* @var string |
|||
*/ |
|||
private $_oddHeader = ''; |
|||
|
|||
/** |
|||
* OddFooter |
|||
* |
|||
* @var string |
|||
*/ |
|||
private $_oddFooter = ''; |
|||
|
|||
/** |
|||
* EvenHeader |
|||
* |
|||
* @var string |
|||
*/ |
|||
private $_evenHeader = ''; |
|||
|
|||
/** |
|||
* EvenFooter |
|||
* |
|||
* @var string |
|||
*/ |
|||
private $_evenFooter = ''; |
|||
|
|||
/** |
|||
* FirstHeader |
|||
* |
|||
* @var string |
|||
*/ |
|||
private $_firstHeader = ''; |
|||
|
|||
/** |
|||
* FirstFooter |
|||
* |
|||
* @var string |
|||
*/ |
|||
private $_firstFooter = ''; |
|||
|
|||
/** |
|||
* Different header for Odd/Even, defaults to false |
|||
* |
|||
* @var boolean |
|||
*/ |
|||
private $_differentOddEven = false; |
|||
|
|||
/** |
|||
* Different header for first page, defaults to false |
|||
* |
|||
* @var boolean |
|||
*/ |
|||
private $_differentFirst = false; |
|||
|
|||
/** |
|||
* Scale with document, defaults to true |
|||
* |
|||
* @var boolean |
|||
*/ |
|||
private $_scaleWithDocument = true; |
|||
|
|||
/** |
|||
* Align with margins, defaults to true |
|||
* |
|||
* @var boolean |
|||
*/ |
|||
private $_alignWithMargins = true; |
|||
|
|||
/** |
|||
* Header/footer images |
|||
* |
|||
* @var PHPExcel_Worksheet_HeaderFooterDrawing[] |
|||
*/ |
|||
private $_headerFooterImages = array(); |
|||
|
|||
/** |
|||
* Create a new PHPExcel_Worksheet_HeaderFooter |
|||
*/ |
|||
public function __construct() |
|||
{ |
|||
} |
|||
|
|||
/** |
|||
* Get OddHeader |
|||
* |
|||
* @return string |
|||
*/ |
|||
public function getOddHeader() { |
|||
return $this->_oddHeader; |
|||
} |
|||
|
|||
/** |
|||
* Set OddHeader |
|||
* |
|||
* @param string $pValue |
|||
* @return PHPExcel_Worksheet_HeaderFooter |
|||
*/ |
|||
public function setOddHeader($pValue) { |
|||
$this->_oddHeader = $pValue; |
|||
return $this; |
|||
} |
|||
|
|||
/** |
|||
* Get OddFooter |
|||
* |
|||
* @return string |
|||
*/ |
|||
public function getOddFooter() { |
|||
return $this->_oddFooter; |
|||
} |
|||
|
|||
/** |
|||
* Set OddFooter |
|||
* |
|||
* @param string $pValue |
|||
* @return PHPExcel_Worksheet_HeaderFooter |
|||
*/ |
|||
public function setOddFooter($pValue) { |
|||
$this->_oddFooter = $pValue; |
|||
return $this; |
|||
} |
|||
|
|||
/** |
|||
* Get EvenHeader |
|||
* |
|||
* @return string |
|||
*/ |
|||
public function getEvenHeader() { |
|||
return $this->_evenHeader; |
|||
} |
|||
|
|||
/** |
|||
* Set EvenHeader |
|||
* |
|||
* @param string $pValue |
|||
* @return PHPExcel_Worksheet_HeaderFooter |
|||
*/ |
|||
public function setEvenHeader($pValue) { |
|||
$this->_evenHeader = $pValue; |
|||
return $this; |
|||
} |
|||
|
|||
/** |
|||
* Get EvenFooter |
|||
* |
|||
* @return string |
|||
*/ |
|||
public function getEvenFooter() { |
|||
return $this->_evenFooter; |
|||
} |
|||
|
|||
/** |
|||
* Set EvenFooter |
|||
* |
|||
* @param string $pValue |
|||
* @return PHPExcel_Worksheet_HeaderFooter |
|||
*/ |
|||
public function setEvenFooter($pValue) { |
|||
$this->_evenFooter = $pValue; |
|||
return $this; |
|||
} |
|||
|
|||
/** |
|||
* Get FirstHeader |
|||
* |
|||
* @return string |
|||
*/ |
|||
public function getFirstHeader() { |
|||
return $this->_firstHeader; |
|||
} |
|||
|
|||
/** |
|||
* Set FirstHeader |
|||
* |
|||
* @param string $pValue |
|||
* @return PHPExcel_Worksheet_HeaderFooter |
|||
*/ |
|||
public function setFirstHeader($pValue) { |
|||
$this->_firstHeader = $pValue; |
|||
return $this; |
|||
} |
|||
|
|||
/** |
|||
* Get FirstFooter |
|||
* |
|||
* @return string |
|||
*/ |
|||
public function getFirstFooter() { |
|||
return $this->_firstFooter; |
|||
} |
|||
|
|||
/** |
|||
* Set FirstFooter |
|||
* |
|||
* @param string $pValue |
|||
* @return PHPExcel_Worksheet_HeaderFooter |
|||
*/ |
|||
public function setFirstFooter($pValue) { |
|||
$this->_firstFooter = $pValue; |
|||
return $this; |
|||
} |
|||
|
|||
/** |
|||
* Get DifferentOddEven |
|||
* |
|||
* @return boolean |
|||
*/ |
|||
public function getDifferentOddEven() { |
|||
return $this->_differentOddEven; |
|||
} |
|||
|
|||
/** |
|||
* Set DifferentOddEven |
|||
* |
|||
* @param boolean $pValue |
|||
* @return PHPExcel_Worksheet_HeaderFooter |
|||
*/ |
|||
public function setDifferentOddEven($pValue = false) { |
|||
$this->_differentOddEven = $pValue; |
|||
return $this; |
|||
} |
|||
|
|||
/** |
|||
* Get DifferentFirst |
|||
* |
|||
* @return boolean |
|||
*/ |
|||
public function getDifferentFirst() { |
|||
return $this->_differentFirst; |
|||
} |
|||
|
|||
/** |
|||
* Set DifferentFirst |
|||
* |
|||
* @param boolean $pValue |
|||
* @return PHPExcel_Worksheet_HeaderFooter |
|||
*/ |
|||
public function setDifferentFirst($pValue = false) { |
|||
$this->_differentFirst = $pValue; |
|||
return $this; |
|||
} |
|||
|
|||
/** |
|||
* Get ScaleWithDocument |
|||
* |
|||
* @return boolean |
|||
*/ |
|||
public function getScaleWithDocument() { |
|||
return $this->_scaleWithDocument; |
|||
} |
|||
|
|||
/** |
|||
* Set ScaleWithDocument |
|||
* |
|||
* @param boolean $pValue |
|||
* @return PHPExcel_Worksheet_HeaderFooter |
|||
*/ |
|||
public function setScaleWithDocument($pValue = true) { |
|||
$this->_scaleWithDocument = $pValue; |
|||
return $this; |
|||
} |
|||
|
|||
/** |
|||
* Get AlignWithMargins |
|||
* |
|||
* @return boolean |
|||
*/ |
|||
public function getAlignWithMargins() { |
|||
return $this->_alignWithMargins; |
|||
} |
|||
|
|||
/** |
|||
* Set AlignWithMargins |
|||
* |
|||
* @param boolean $pValue |
|||
* @return PHPExcel_Worksheet_HeaderFooter |
|||
*/ |
|||
public function setAlignWithMargins($pValue = true) { |
|||
$this->_alignWithMargins = $pValue; |
|||
return $this; |
|||
} |
|||
|
|||
/** |
|||
* Add header/footer image |
|||
* |
|||
* @param PHPExcel_Worksheet_HeaderFooterDrawing $image |
|||
* @param string $location |
|||
* @throws PHPExcel_Exception |
|||
* @return PHPExcel_Worksheet_HeaderFooter |
|||
*/ |
|||
public function addImage(PHPExcel_Worksheet_HeaderFooterDrawing $image = null, $location = self::IMAGE_HEADER_LEFT) { |
|||
$this->_headerFooterImages[$location] = $image; |
|||
return $this; |
|||
} |
|||
|
|||
/** |
|||
* Remove header/footer image |
|||
* |
|||
* @param string $location |
|||
* @throws PHPExcel_Exception |
|||
* @return PHPExcel_Worksheet_HeaderFooter |
|||
*/ |
|||
public function removeImage($location = self::IMAGE_HEADER_LEFT) { |
|||
if (isset($this->_headerFooterImages[$location])) { |
|||
unset($this->_headerFooterImages[$location]); |
|||
} |
|||
return $this; |
|||
} |
|||
|
|||
/** |
|||
* Set header/footer images |
|||
* |
|||
* @param PHPExcel_Worksheet_HeaderFooterDrawing[] $images |
|||
* @throws PHPExcel_Exception |
|||
* @return PHPExcel_Worksheet_HeaderFooter |
|||
*/ |
|||
public function setImages($images) { |
|||
if (!is_array($images)) { |
|||
throw new PHPExcel_Exception('Invalid parameter!'); |
|||
} |
|||
|
|||
$this->_headerFooterImages = $images; |
|||
return $this; |
|||
} |
|||
|
|||
/** |
|||
* Get header/footer images |
|||
* |
|||
* @return PHPExcel_Worksheet_HeaderFooterDrawing[] |
|||
*/ |
|||
public function getImages() { |
|||
// Sort array |
|||
$images = array(); |
|||
if (isset($this->_headerFooterImages[self::IMAGE_HEADER_LEFT])) $images[self::IMAGE_HEADER_LEFT] = $this->_headerFooterImages[self::IMAGE_HEADER_LEFT]; |
|||
if (isset($this->_headerFooterImages[self::IMAGE_HEADER_CENTER])) $images[self::IMAGE_HEADER_CENTER] = $this->_headerFooterImages[self::IMAGE_HEADER_CENTER]; |
|||
if (isset($this->_headerFooterImages[self::IMAGE_HEADER_RIGHT])) $images[self::IMAGE_HEADER_RIGHT] = $this->_headerFooterImages[self::IMAGE_HEADER_RIGHT]; |
|||
if (isset($this->_headerFooterImages[self::IMAGE_FOOTER_LEFT])) $images[self::IMAGE_FOOTER_LEFT] = $this->_headerFooterImages[self::IMAGE_FOOTER_LEFT]; |
|||
if (isset($this->_headerFooterImages[self::IMAGE_FOOTER_CENTER])) $images[self::IMAGE_FOOTER_CENTER] = $this->_headerFooterImages[self::IMAGE_FOOTER_CENTER]; |
|||
if (isset($this->_headerFooterImages[self::IMAGE_FOOTER_RIGHT])) $images[self::IMAGE_FOOTER_RIGHT] = $this->_headerFooterImages[self::IMAGE_FOOTER_RIGHT]; |
|||
$this->_headerFooterImages = $images; |
|||
|
|||
return $this->_headerFooterImages; |
|||
} |
|||
|
|||
/** |
|||
* Implement PHP __clone to create a deep clone, not just a shallow copy. |
|||
*/ |
|||
public function __clone() { |
|||
$vars = get_object_vars($this); |
|||
foreach ($vars as $key => $value) { |
|||
if (is_object($value)) { |
|||
$this->$key = clone $value; |
|||
} else { |
|||
$this->$key = $value; |
|||
} |
|||
} |
|||
} |
|||
} |
|||
@ -0,0 +1,350 @@ |
|||
<?php |
|||
/** |
|||
* PHPExcel |
|||
* |
|||
* Copyright (c) 2006 - 2013 PHPExcel |
|||
* |
|||
* This library is free software; you can redistribute it and/or |
|||
* modify it under the terms of the GNU Lesser General Public |
|||
* License as published by the Free Software Foundation; either |
|||
* version 2.1 of the License, or (at your option) any later version. |
|||
* |
|||
* This library is distributed in the hope that it will be useful, |
|||
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
|||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
|||
* Lesser General Public License for more details. |
|||
* |
|||
* You should have received a copy of the GNU Lesser General Public |
|||
* License along with this library; if not, write to the Free Software |
|||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA |
|||
* |
|||
* @category PHPExcel |
|||
* @package PHPExcel_Worksheet |
|||
* @copyright Copyright (c) 2006 - 2013 PHPExcel (http://www.codeplex.com/PHPExcel) |
|||
* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL |
|||
* @version 1.7.9, 2013-06-02 |
|||
*/ |
|||
|
|||
|
|||
/** |
|||
* PHPExcel_Worksheet_HeaderFooterDrawing |
|||
* |
|||
* @category PHPExcel |
|||
* @package PHPExcel_Worksheet |
|||
* @copyright Copyright (c) 2006 - 2013 PHPExcel (http://www.codeplex.com/PHPExcel) |
|||
*/ |
|||
class PHPExcel_Worksheet_HeaderFooterDrawing extends PHPExcel_Worksheet_Drawing implements PHPExcel_IComparable |
|||
{ |
|||
/** |
|||
* Path |
|||
* |
|||
* @var string |
|||
*/ |
|||
private $_path; |
|||
|
|||
/** |
|||
* Name |
|||
* |
|||
* @var string |
|||
*/ |
|||
protected $_name; |
|||
|
|||
/** |
|||
* Offset X |
|||
* |
|||
* @var int |
|||
*/ |
|||
protected $_offsetX; |
|||
|
|||
/** |
|||
* Offset Y |
|||
* |
|||
* @var int |
|||
*/ |
|||
protected $_offsetY; |
|||
|
|||
/** |
|||
* Width |
|||
* |
|||
* @var int |
|||
*/ |
|||
protected $_width; |
|||
|
|||
/** |
|||
* Height |
|||
* |
|||
* @var int |
|||
*/ |
|||
protected $_height; |
|||
|
|||
/** |
|||
* Proportional resize |
|||
* |
|||
* @var boolean |
|||
*/ |
|||
protected $_resizeProportional; |
|||
|
|||
/** |
|||
* Create a new PHPExcel_Worksheet_HeaderFooterDrawing |
|||
*/ |
|||
public function __construct() |
|||
{ |
|||
// Initialise values |
|||
$this->_path = ''; |
|||
$this->_name = ''; |
|||
$this->_offsetX = 0; |
|||
$this->_offsetY = 0; |
|||
$this->_width = 0; |
|||
$this->_height = 0; |
|||
$this->_resizeProportional = true; |
|||
} |
|||
|
|||
/** |
|||
* Get Name |
|||
* |
|||
* @return string |
|||
*/ |
|||
public function getName() { |
|||
return $this->_name; |
|||
} |
|||
|
|||
/** |
|||
* Set Name |
|||
* |
|||
* @param string $pValue |
|||
* @return PHPExcel_Worksheet_HeaderFooterDrawing |
|||
*/ |
|||
public function setName($pValue = '') { |
|||
$this->_name = $pValue; |
|||
return $this; |
|||
} |
|||
|
|||
/** |
|||
* Get OffsetX |
|||
* |
|||
* @return int |
|||
*/ |
|||
public function getOffsetX() { |
|||
return $this->_offsetX; |
|||
} |
|||
|
|||
/** |
|||
* Set OffsetX |
|||
* |
|||
* @param int $pValue |
|||
* @return PHPExcel_Worksheet_HeaderFooterDrawing |
|||
*/ |
|||
public function setOffsetX($pValue = 0) { |
|||
$this->_offsetX = $pValue; |
|||
return $this; |
|||
} |
|||
|
|||
/** |
|||
* Get OffsetY |
|||
* |
|||
* @return int |
|||
*/ |
|||
public function getOffsetY() { |
|||
return $this->_offsetY; |
|||
} |
|||
|
|||
/** |
|||
* Set OffsetY |
|||
* |
|||
* @param int $pValue |
|||
* @return PHPExcel_Worksheet_HeaderFooterDrawing |
|||
*/ |
|||
public function setOffsetY($pValue = 0) { |
|||
$this->_offsetY = $pValue; |
|||
return $this; |
|||
} |
|||
|
|||
/** |
|||
* Get Width |
|||
* |
|||
* @return int |
|||
*/ |
|||
public function getWidth() { |
|||
return $this->_width; |
|||
} |
|||
|
|||
/** |
|||
* Set Width |
|||
* |
|||
* @param int $pValue |
|||
* @return PHPExcel_Worksheet_HeaderFooterDrawing |
|||
*/ |
|||
public function setWidth($pValue = 0) { |
|||
// Resize proportional? |
|||
if ($this->_resizeProportional && $pValue != 0) { |
|||
$ratio = $this->_width / $this->_height; |
|||
$this->_height = round($ratio * $pValue); |
|||
} |
|||
|
|||
// Set width |
|||
$this->_width = $pValue; |
|||
|
|||
return $this; |
|||
} |
|||
|
|||
/** |
|||
* Get Height |
|||
* |
|||
* @return int |
|||
*/ |
|||
public function getHeight() { |
|||
return $this->_height; |
|||
} |
|||
|
|||
/** |
|||
* Set Height |
|||
* |
|||
* @param int $pValue |
|||
* @return PHPExcel_Worksheet_HeaderFooterDrawing |
|||
*/ |
|||
public function setHeight($pValue = 0) { |
|||
// Resize proportional? |
|||
if ($this->_resizeProportional && $pValue != 0) { |
|||
$ratio = $this->_width / $this->_height; |
|||
$this->_width = round($ratio * $pValue); |
|||
} |
|||
|
|||
// Set height |
|||
$this->_height = $pValue; |
|||
|
|||
return $this; |
|||
} |
|||
|
|||
/** |
|||
* Set width and height with proportional resize |
|||
* Example: |
|||
* <code> |
|||
* $objDrawing->setResizeProportional(true); |
|||
* $objDrawing->setWidthAndHeight(160,120); |
|||
* </code> |
|||
* |
|||
* @author Vincent@luo MSN:kele_100@hotmail.com |
|||
* @param int $width |
|||
* @param int $height |
|||
* @return PHPExcel_Worksheet_HeaderFooterDrawing |
|||
*/ |
|||
public function setWidthAndHeight($width = 0, $height = 0) { |
|||
$xratio = $width / $this->_width; |
|||
$yratio = $height / $this->_height; |
|||
if ($this->_resizeProportional && !($width == 0 || $height == 0)) { |
|||
if (($xratio * $this->_height) < $height) { |
|||
$this->_height = ceil($xratio * $this->_height); |
|||
$this->_width = $width; |
|||
} else { |
|||
$this->_width = ceil($yratio * $this->_width); |
|||
$this->_height = $height; |
|||
} |
|||
} |
|||
return $this; |
|||
} |
|||
|
|||
/** |
|||
* Get ResizeProportional |
|||
* |
|||
* @return boolean |
|||
*/ |
|||
public function getResizeProportional() { |
|||
return $this->_resizeProportional; |
|||
} |
|||
|
|||
/** |
|||
* Set ResizeProportional |
|||
* |
|||
* @param boolean $pValue |
|||
* @return PHPExcel_Worksheet_HeaderFooterDrawing |
|||
*/ |
|||
public function setResizeProportional($pValue = true) { |
|||
$this->_resizeProportional = $pValue; |
|||
return $this; |
|||
} |
|||
|
|||
/** |
|||
* Get Filename |
|||
* |
|||
* @return string |
|||
*/ |
|||
public function getFilename() { |
|||
return basename($this->_path); |
|||
} |
|||
|
|||
/** |
|||
* Get Extension |
|||
* |
|||
* @return string |
|||
*/ |
|||
public function getExtension() { |
|||
$parts = explode(".", basename($this->_path)); |
|||
return end($parts); |
|||
} |
|||
|
|||
/** |
|||
* Get Path |
|||
* |
|||
* @return string |
|||
*/ |
|||
public function getPath() { |
|||
return $this->_path; |
|||
} |
|||
|
|||
/** |
|||
* Set Path |
|||
* |
|||
* @param string $pValue File path |
|||
* @param boolean $pVerifyFile Verify file |
|||
* @throws PHPExcel_Exception |
|||
* @return PHPExcel_Worksheet_HeaderFooterDrawing |
|||
*/ |
|||
public function setPath($pValue = '', $pVerifyFile = true) { |
|||
if ($pVerifyFile) { |
|||
if (file_exists($pValue)) { |
|||
$this->_path = $pValue; |
|||
|
|||
if ($this->_width == 0 && $this->_height == 0) { |
|||
// Get width/height |
|||
list($this->_width, $this->_height) = getimagesize($pValue); |
|||
} |
|||
} else { |
|||
throw new PHPExcel_Exception("File $pValue not found!"); |
|||
} |
|||
} else { |
|||
$this->_path = $pValue; |
|||
} |
|||
return $this; |
|||
} |
|||
|
|||
/** |
|||
* Get hash code |
|||
* |
|||
* @return string Hash code |
|||
*/ |
|||
public function getHashCode() { |
|||
return md5( |
|||
$this->_path |
|||
. $this->_name |
|||
. $this->_offsetX |
|||
. $this->_offsetY |
|||
. $this->_width |
|||
. $this->_height |
|||
. __CLASS__ |
|||
); |
|||
} |
|||
|
|||
/** |
|||
* Implement PHP __clone to create a deep clone, not just a shallow copy. |
|||
*/ |
|||
public function __clone() { |
|||
$vars = get_object_vars($this); |
|||
foreach ($vars as $key => $value) { |
|||
if (is_object($value)) { |
|||
$this->$key = clone $value; |
|||
} else { |
|||
$this->$key = $value; |
|||
} |
|||
} |
|||
} |
|||
} |
|||
@ -0,0 +1,472 @@ |
|||
<?php |
|||
/** |
|||
* PHPExcel |
|||
* |
|||
* Copyright (c) 2006 - 2013 PHPExcel |
|||
* |
|||
* This library is free software; you can redistribute it and/or |
|||
* modify it under the terms of the GNU Lesser General Public |
|||
* License as published by the Free Software Foundation; either |
|||
* version 2.1 of the License, or (at your option) any later version. |
|||
* |
|||
* This library is distributed in the hope that it will be useful, |
|||
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
|||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
|||
* Lesser General Public License for more details. |
|||
* |
|||
* You should have received a copy of the GNU Lesser General Public |
|||
* License along with this library; if not, write to the Free Software |
|||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA |
|||
* |
|||
* @category PHPExcel |
|||
* @package PHPExcel_Writer_Excel2007 |
|||
* @copyright Copyright (c) 2006 - 2013 PHPExcel (http://www.codeplex.com/PHPExcel) |
|||
* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL |
|||
* @version 1.7.9, 2013-06-02 |
|||
*/ |
|||
|
|||
|
|||
/** |
|||
* PHPExcel_Writer_Excel2007 |
|||
* |
|||
* @category PHPExcel |
|||
* @package PHPExcel_Writer_2007 |
|||
* @copyright Copyright (c) 2006 - 2013 PHPExcel (http://www.codeplex.com/PHPExcel) |
|||
*/ |
|||
class PHPExcel_Writer_Excel2007 extends PHPExcel_Writer_Abstract implements PHPExcel_Writer_IWriter |
|||
{ |
|||
/** |
|||
* Office2003 compatibility |
|||
* |
|||
* @var boolean |
|||
*/ |
|||
private $_office2003compatibility = false; |
|||
|
|||
/** |
|||
* Private writer parts |
|||
* |
|||
* @var PHPExcel_Writer_Excel2007_WriterPart[] |
|||
*/ |
|||
private $_writerParts = array(); |
|||
|
|||
/** |
|||
* Private PHPExcel |
|||
* |
|||
* @var PHPExcel |
|||
*/ |
|||
private $_spreadSheet; |
|||
|
|||
/** |
|||
* Private string table |
|||
* |
|||
* @var string[] |
|||
*/ |
|||
private $_stringTable = array(); |
|||
|
|||
/** |
|||
* Private unique PHPExcel_Style_Conditional HashTable |
|||
* |
|||
* @var PHPExcel_HashTable |
|||
*/ |
|||
private $_stylesConditionalHashTable; |
|||
|
|||
/** |
|||
* Private unique PHPExcel_Style_Fill HashTable |
|||
* |
|||
* @var PHPExcel_HashTable |
|||
*/ |
|||
private $_fillHashTable; |
|||
|
|||
/** |
|||
* Private unique PHPExcel_Style_Font HashTable |
|||
* |
|||
* @var PHPExcel_HashTable |
|||
*/ |
|||
private $_fontHashTable; |
|||
|
|||
/** |
|||
* Private unique PHPExcel_Style_Borders HashTable |
|||
* |
|||
* @var PHPExcel_HashTable |
|||
*/ |
|||
private $_bordersHashTable ; |
|||
|
|||
/** |
|||
* Private unique PHPExcel_Style_NumberFormat HashTable |
|||
* |
|||
* @var PHPExcel_HashTable |
|||
*/ |
|||
private $_numFmtHashTable; |
|||
|
|||
/** |
|||
* Private unique PHPExcel_Worksheet_BaseDrawing HashTable |
|||
* |
|||
* @var PHPExcel_HashTable |
|||
*/ |
|||
private $_drawingHashTable; |
|||
|
|||
/** |
|||
* Create a new PHPExcel_Writer_Excel2007 |
|||
* |
|||
* @param PHPExcel $pPHPExcel |
|||
*/ |
|||
public function __construct(PHPExcel $pPHPExcel = null) |
|||
{ |
|||
// Assign PHPExcel |
|||
$this->setPHPExcel($pPHPExcel); |
|||
|
|||
$writerPartsArray = array( 'stringtable' => 'PHPExcel_Writer_Excel2007_StringTable', |
|||
'contenttypes' => 'PHPExcel_Writer_Excel2007_ContentTypes', |
|||
'docprops' => 'PHPExcel_Writer_Excel2007_DocProps', |
|||
'rels' => 'PHPExcel_Writer_Excel2007_Rels', |
|||
'theme' => 'PHPExcel_Writer_Excel2007_Theme', |
|||
'style' => 'PHPExcel_Writer_Excel2007_Style', |
|||
'workbook' => 'PHPExcel_Writer_Excel2007_Workbook', |
|||
'worksheet' => 'PHPExcel_Writer_Excel2007_Worksheet', |
|||
'drawing' => 'PHPExcel_Writer_Excel2007_Drawing', |
|||
'comments' => 'PHPExcel_Writer_Excel2007_Comments', |
|||
'chart' => 'PHPExcel_Writer_Excel2007_Chart', |
|||
); |
|||
|
|||
// Initialise writer parts |
|||
// and Assign their parent IWriters |
|||
foreach ($writerPartsArray as $writer => $class) { |
|||
$this->_writerParts[$writer] = new $class($this); |
|||
} |
|||
|
|||
$hashTablesArray = array( '_stylesConditionalHashTable', '_fillHashTable', '_fontHashTable', |
|||
'_bordersHashTable', '_numFmtHashTable', '_drawingHashTable' |
|||
); |
|||
|
|||
// Set HashTable variables |
|||
foreach ($hashTablesArray as $tableName) { |
|||
$this->$tableName = new PHPExcel_HashTable(); |
|||
} |
|||
} |
|||
|
|||
/** |
|||
* Get writer part |
|||
* |
|||
* @param string $pPartName Writer part name |
|||
* @return PHPExcel_Writer_Excel2007_WriterPart |
|||
*/ |
|||
public function getWriterPart($pPartName = '') { |
|||
if ($pPartName != '' && isset($this->_writerParts[strtolower($pPartName)])) { |
|||
return $this->_writerParts[strtolower($pPartName)]; |
|||
} else { |
|||
return null; |
|||
} |
|||
} |
|||
|
|||
/** |
|||
* Save PHPExcel to file |
|||
* |
|||
* @param string $pFilename |
|||
* @throws PHPExcel_Writer_Exception |
|||
*/ |
|||
public function save($pFilename = null) |
|||
{ |
|||
if ($this->_spreadSheet !== NULL) { |
|||
// garbage collect |
|||
$this->_spreadSheet->garbageCollect(); |
|||
|
|||
// If $pFilename is php://output or php://stdout, make it a temporary file... |
|||
$originalFilename = $pFilename; |
|||
if (strtolower($pFilename) == 'php://output' || strtolower($pFilename) == 'php://stdout') { |
|||
$pFilename = @tempnam(PHPExcel_Shared_File::sys_get_temp_dir(), 'phpxltmp'); |
|||
if ($pFilename == '') { |
|||
$pFilename = $originalFilename; |
|||
} |
|||
} |
|||
|
|||
$saveDebugLog = PHPExcel_Calculation::getInstance($this->_spreadSheet)->getDebugLog()->getWriteDebugLog(); |
|||
PHPExcel_Calculation::getInstance($this->_spreadSheet)->getDebugLog()->setWriteDebugLog(FALSE); |
|||
$saveDateReturnType = PHPExcel_Calculation_Functions::getReturnDateType(); |
|||
PHPExcel_Calculation_Functions::setReturnDateType(PHPExcel_Calculation_Functions::RETURNDATE_EXCEL); |
|||
|
|||
// Create string lookup table |
|||
$this->_stringTable = array(); |
|||
for ($i = 0; $i < $this->_spreadSheet->getSheetCount(); ++$i) { |
|||
$this->_stringTable = $this->getWriterPart('StringTable')->createStringTable($this->_spreadSheet->getSheet($i), $this->_stringTable); |
|||
} |
|||
|
|||
// Create styles dictionaries |
|||
$this->_stylesConditionalHashTable->addFromSource( $this->getWriterPart('Style')->allConditionalStyles($this->_spreadSheet) ); |
|||
$this->_fillHashTable->addFromSource( $this->getWriterPart('Style')->allFills($this->_spreadSheet) ); |
|||
$this->_fontHashTable->addFromSource( $this->getWriterPart('Style')->allFonts($this->_spreadSheet) ); |
|||
$this->_bordersHashTable->addFromSource( $this->getWriterPart('Style')->allBorders($this->_spreadSheet) ); |
|||
$this->_numFmtHashTable->addFromSource( $this->getWriterPart('Style')->allNumberFormats($this->_spreadSheet) ); |
|||
|
|||
// Create drawing dictionary |
|||
$this->_drawingHashTable->addFromSource( $this->getWriterPart('Drawing')->allDrawings($this->_spreadSheet) ); |
|||
|
|||
// Create new ZIP file and open it for writing |
|||
$zipClass = PHPExcel_Settings::getZipClass(); |
|||
$objZip = new $zipClass(); |
|||
|
|||
// Retrieve OVERWRITE and CREATE constants from the instantiated zip class |
|||
// This method of accessing constant values from a dynamic class should work with all appropriate versions of PHP |
|||
$ro = new ReflectionObject($objZip); |
|||
$zipOverWrite = $ro->getConstant('OVERWRITE'); |
|||
$zipCreate = $ro->getConstant('CREATE'); |
|||
|
|||
if (file_exists($pFilename)) { |
|||
unlink($pFilename); |
|||
} |
|||
// Try opening the ZIP file |
|||
if ($objZip->open($pFilename, $zipOverWrite) !== true) { |
|||
if ($objZip->open($pFilename, $zipCreate) !== true) { |
|||
throw new PHPExcel_Writer_Exception("Could not open " . $pFilename . " for writing."); |
|||
} |
|||
} |
|||
|
|||
// Add [Content_Types].xml to ZIP file |
|||
$objZip->addFromString('[Content_Types].xml', $this->getWriterPart('ContentTypes')->writeContentTypes($this->_spreadSheet, $this->_includeCharts)); |
|||
|
|||
// Add relationships to ZIP file |
|||
$objZip->addFromString('_rels/.rels', $this->getWriterPart('Rels')->writeRelationships($this->_spreadSheet)); |
|||
$objZip->addFromString('xl/_rels/workbook.xml.rels', $this->getWriterPart('Rels')->writeWorkbookRelationships($this->_spreadSheet)); |
|||
|
|||
// Add document properties to ZIP file |
|||
$objZip->addFromString('docProps/app.xml', $this->getWriterPart('DocProps')->writeDocPropsApp($this->_spreadSheet)); |
|||
$objZip->addFromString('docProps/core.xml', $this->getWriterPart('DocProps')->writeDocPropsCore($this->_spreadSheet)); |
|||
$customPropertiesPart = $this->getWriterPart('DocProps')->writeDocPropsCustom($this->_spreadSheet); |
|||
if ($customPropertiesPart !== NULL) { |
|||
$objZip->addFromString('docProps/custom.xml', $customPropertiesPart); |
|||
} |
|||
|
|||
// Add theme to ZIP file |
|||
$objZip->addFromString('xl/theme/theme1.xml', $this->getWriterPart('Theme')->writeTheme($this->_spreadSheet)); |
|||
|
|||
// Add string table to ZIP file |
|||
$objZip->addFromString('xl/sharedStrings.xml', $this->getWriterPart('StringTable')->writeStringTable($this->_stringTable)); |
|||
|
|||
// Add styles to ZIP file |
|||
$objZip->addFromString('xl/styles.xml', $this->getWriterPart('Style')->writeStyles($this->_spreadSheet)); |
|||
|
|||
// Add workbook to ZIP file |
|||
$objZip->addFromString('xl/workbook.xml', $this->getWriterPart('Workbook')->writeWorkbook($this->_spreadSheet, $this->_preCalculateFormulas)); |
|||
|
|||
$chartCount = 0; |
|||
// Add worksheets |
|||
for ($i = 0; $i < $this->_spreadSheet->getSheetCount(); ++$i) { |
|||
$objZip->addFromString('xl/worksheets/sheet' . ($i + 1) . '.xml', $this->getWriterPart('Worksheet')->writeWorksheet($this->_spreadSheet->getSheet($i), $this->_stringTable, $this->_includeCharts)); |
|||
if ($this->_includeCharts) { |
|||
$charts = $this->_spreadSheet->getSheet($i)->getChartCollection(); |
|||
if (count($charts) > 0) { |
|||
foreach($charts as $chart) { |
|||
$objZip->addFromString('xl/charts/chart' . ($chartCount + 1) . '.xml', $this->getWriterPart('Chart')->writeChart($chart)); |
|||
$chartCount++; |
|||
} |
|||
} |
|||
} |
|||
} |
|||
|
|||
$chartRef1 = $chartRef2 = 0; |
|||
// Add worksheet relationships (drawings, ...) |
|||
for ($i = 0; $i < $this->_spreadSheet->getSheetCount(); ++$i) { |
|||
|
|||
// Add relationships |
|||
$objZip->addFromString('xl/worksheets/_rels/sheet' . ($i + 1) . '.xml.rels', $this->getWriterPart('Rels')->writeWorksheetRelationships($this->_spreadSheet->getSheet($i), ($i + 1), $this->_includeCharts)); |
|||
|
|||
$drawings = $this->_spreadSheet->getSheet($i)->getDrawingCollection(); |
|||
$drawingCount = count($drawings); |
|||
if ($this->_includeCharts) { |
|||
$chartCount = $this->_spreadSheet->getSheet($i)->getChartCount(); |
|||
} |
|||
|
|||
// Add drawing and image relationship parts |
|||
if (($drawingCount > 0) || ($chartCount > 0)) { |
|||
// Drawing relationships |
|||
$objZip->addFromString('xl/drawings/_rels/drawing' . ($i + 1) . '.xml.rels', $this->getWriterPart('Rels')->writeDrawingRelationships($this->_spreadSheet->getSheet($i),$chartRef1, $this->_includeCharts)); |
|||
|
|||
// Drawings |
|||
$objZip->addFromString('xl/drawings/drawing' . ($i + 1) . '.xml', $this->getWriterPart('Drawing')->writeDrawings($this->_spreadSheet->getSheet($i),$chartRef2,$this->_includeCharts)); |
|||
} |
|||
|
|||
// Add comment relationship parts |
|||
if (count($this->_spreadSheet->getSheet($i)->getComments()) > 0) { |
|||
// VML Comments |
|||
$objZip->addFromString('xl/drawings/vmlDrawing' . ($i + 1) . '.vml', $this->getWriterPart('Comments')->writeVMLComments($this->_spreadSheet->getSheet($i))); |
|||
|
|||
// Comments |
|||
$objZip->addFromString('xl/comments' . ($i + 1) . '.xml', $this->getWriterPart('Comments')->writeComments($this->_spreadSheet->getSheet($i))); |
|||
} |
|||
|
|||
// Add header/footer relationship parts |
|||
if (count($this->_spreadSheet->getSheet($i)->getHeaderFooter()->getImages()) > 0) { |
|||
// VML Drawings |
|||
$objZip->addFromString('xl/drawings/vmlDrawingHF' . ($i + 1) . '.vml', $this->getWriterPart('Drawing')->writeVMLHeaderFooterImages($this->_spreadSheet->getSheet($i))); |
|||
|
|||
// VML Drawing relationships |
|||
$objZip->addFromString('xl/drawings/_rels/vmlDrawingHF' . ($i + 1) . '.vml.rels', $this->getWriterPart('Rels')->writeHeaderFooterDrawingRelationships($this->_spreadSheet->getSheet($i))); |
|||
|
|||
// Media |
|||
foreach ($this->_spreadSheet->getSheet($i)->getHeaderFooter()->getImages() as $image) { |
|||
$objZip->addFromString('xl/media/' . $image->getIndexedFilename(), file_get_contents($image->getPath())); |
|||
} |
|||
} |
|||
} |
|||
|
|||
// Add media |
|||
for ($i = 0; $i < $this->getDrawingHashTable()->count(); ++$i) { |
|||
if ($this->getDrawingHashTable()->getByIndex($i) instanceof PHPExcel_Worksheet_Drawing) { |
|||
$imageContents = null; |
|||
$imagePath = $this->getDrawingHashTable()->getByIndex($i)->getPath(); |
|||
if (strpos($imagePath, 'zip://') !== false) { |
|||
$imagePath = substr($imagePath, 6); |
|||
$imagePathSplitted = explode('#', $imagePath); |
|||
|
|||
$imageZip = new ZipArchive(); |
|||
$imageZip->open($imagePathSplitted[0]); |
|||
$imageContents = $imageZip->getFromName($imagePathSplitted[1]); |
|||
$imageZip->close(); |
|||
unset($imageZip); |
|||
} else { |
|||
$imageContents = file_get_contents($imagePath); |
|||
} |
|||
|
|||
$objZip->addFromString('xl/media/' . str_replace(' ', '_', $this->getDrawingHashTable()->getByIndex($i)->getIndexedFilename()), $imageContents); |
|||
} else if ($this->getDrawingHashTable()->getByIndex($i) instanceof PHPExcel_Worksheet_MemoryDrawing) { |
|||
ob_start(); |
|||
call_user_func( |
|||
$this->getDrawingHashTable()->getByIndex($i)->getRenderingFunction(), |
|||
$this->getDrawingHashTable()->getByIndex($i)->getImageResource() |
|||
); |
|||
$imageContents = ob_get_contents(); |
|||
ob_end_clean(); |
|||
|
|||
$objZip->addFromString('xl/media/' . str_replace(' ', '_', $this->getDrawingHashTable()->getByIndex($i)->getIndexedFilename()), $imageContents); |
|||
} |
|||
} |
|||
|
|||
PHPExcel_Calculation_Functions::setReturnDateType($saveDateReturnType); |
|||
PHPExcel_Calculation::getInstance($this->_spreadSheet)->getDebugLog()->setWriteDebugLog($saveDebugLog); |
|||
|
|||
// Close file |
|||
if ($objZip->close() === false) { |
|||
throw new PHPExcel_Writer_Exception("Could not close zip file $pFilename."); |
|||
} |
|||
|
|||
// If a temporary file was used, copy it to the correct file stream |
|||
if ($originalFilename != $pFilename) { |
|||
if (copy($pFilename, $originalFilename) === false) { |
|||
throw new PHPExcel_Writer_Exception("Could not copy temporary zip file $pFilename to $originalFilename."); |
|||
} |
|||
@unlink($pFilename); |
|||
} |
|||
} else { |
|||
throw new PHPExcel_Writer_Exception("PHPExcel object unassigned."); |
|||
} |
|||
} |
|||
|
|||
/** |
|||
* Get PHPExcel object |
|||
* |
|||
* @return PHPExcel |
|||
* @throws PHPExcel_Writer_Exception |
|||
*/ |
|||
public function getPHPExcel() { |
|||
if ($this->_spreadSheet !== null) { |
|||
return $this->_spreadSheet; |
|||
} else { |
|||
throw new PHPExcel_Writer_Exception("No PHPExcel assigned."); |
|||
} |
|||
} |
|||
|
|||
/** |
|||
* Set PHPExcel object |
|||
* |
|||
* @param PHPExcel $pPHPExcel PHPExcel object |
|||
* @throws PHPExcel_Writer_Exception |
|||
* @return PHPExcel_Writer_Excel2007 |
|||
*/ |
|||
public function setPHPExcel(PHPExcel $pPHPExcel = null) { |
|||
$this->_spreadSheet = $pPHPExcel; |
|||
return $this; |
|||
} |
|||
|
|||
/** |
|||
* Get string table |
|||
* |
|||
* @return string[] |
|||
*/ |
|||
public function getStringTable() { |
|||
return $this->_stringTable; |
|||
} |
|||
|
|||
/** |
|||
* Get PHPExcel_Style_Conditional HashTable |
|||
* |
|||
* @return PHPExcel_HashTable |
|||
*/ |
|||
public function getStylesConditionalHashTable() { |
|||
return $this->_stylesConditionalHashTable; |
|||
} |
|||
|
|||
/** |
|||
* Get PHPExcel_Style_Fill HashTable |
|||
* |
|||
* @return PHPExcel_HashTable |
|||
*/ |
|||
public function getFillHashTable() { |
|||
return $this->_fillHashTable; |
|||
} |
|||
|
|||
/** |
|||
* Get PHPExcel_Style_Font HashTable |
|||
* |
|||
* @return PHPExcel_HashTable |
|||
*/ |
|||
public function getFontHashTable() { |
|||
return $this->_fontHashTable; |
|||
} |
|||
|
|||
/** |
|||
* Get PHPExcel_Style_Borders HashTable |
|||
* |
|||
* @return PHPExcel_HashTable |
|||
*/ |
|||
public function getBordersHashTable() { |
|||
return $this->_bordersHashTable; |
|||
} |
|||
|
|||
/** |
|||
* Get PHPExcel_Style_NumberFormat HashTable |
|||
* |
|||
* @return PHPExcel_HashTable |
|||
*/ |
|||
public function getNumFmtHashTable() { |
|||
return $this->_numFmtHashTable; |
|||
} |
|||
|
|||
/** |
|||
* Get PHPExcel_Worksheet_BaseDrawing HashTable |
|||
* |
|||
* @return PHPExcel_HashTable |
|||
*/ |
|||
public function getDrawingHashTable() { |
|||
return $this->_drawingHashTable; |
|||
} |
|||
|
|||
/** |
|||
* Get Office2003 compatibility |
|||
* |
|||
* @return boolean |
|||
*/ |
|||
public function getOffice2003Compatibility() { |
|||
return $this->_office2003compatibility; |
|||
} |
|||
|
|||
/** |
|||
* Set Office2003 compatibility |
|||
* |
|||
* @param boolean $pValue Office2003 compatibility? |
|||
* @return PHPExcel_Writer_Excel2007 |
|||
*/ |
|||
public function setOffice2003Compatibility($pValue = false) { |
|||
$this->_office2003compatibility = $pValue; |
|||
return $this; |
|||
} |
|||
|
|||
} |
|||
@ -0,0 +1,272 @@ |
|||
<?php |
|||
/** |
|||
* PHPExcel |
|||
* |
|||
* Copyright (c) 2006 - 2013 PHPExcel |
|||
* |
|||
* This library is free software; you can redistribute it and/or |
|||
* modify it under the terms of the GNU Lesser General Public |
|||
* License as published by the Free Software Foundation; either |
|||
* version 2.1 of the License, or (at your option) any later version. |
|||
* |
|||
* This library is distributed in the hope that it will be useful, |
|||
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
|||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
|||
* Lesser General Public License for more details. |
|||
* |
|||
* You should have received a copy of the GNU Lesser General Public |
|||
* License along with this library; if not, write to the Free Software |
|||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA |
|||
* |
|||
* @category PHPExcel |
|||
* @package PHPExcel_Writer_Excel2007 |
|||
* @copyright Copyright (c) 2006 - 2013 PHPExcel (http://www.codeplex.com/PHPExcel) |
|||
* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL |
|||
* @version 1.7.9, 2013-06-02 |
|||
*/ |
|||
|
|||
|
|||
/** |
|||
* PHPExcel_Writer_Excel2007_DocProps |
|||
* |
|||
* @category PHPExcel |
|||
* @package PHPExcel_Writer_Excel2007 |
|||
* @copyright Copyright (c) 2006 - 2013 PHPExcel (http://www.codeplex.com/PHPExcel) |
|||
*/ |
|||
class PHPExcel_Writer_Excel2007_DocProps extends PHPExcel_Writer_Excel2007_WriterPart |
|||
{ |
|||
/** |
|||
* Write docProps/app.xml to XML format |
|||
* |
|||
* @param PHPExcel $pPHPExcel |
|||
* @return string XML Output |
|||
* @throws PHPExcel_Writer_Exception |
|||
*/ |
|||
public function writeDocPropsApp(PHPExcel $pPHPExcel = null) |
|||
{ |
|||
// Create XML writer |
|||
$objWriter = null; |
|||
if ($this->getParentWriter()->getUseDiskCaching()) { |
|||
$objWriter = new PHPExcel_Shared_XMLWriter(PHPExcel_Shared_XMLWriter::STORAGE_DISK, $this->getParentWriter()->getDiskCachingDirectory()); |
|||
} else { |
|||
$objWriter = new PHPExcel_Shared_XMLWriter(PHPExcel_Shared_XMLWriter::STORAGE_MEMORY); |
|||
} |
|||
|
|||
// XML header |
|||
$objWriter->startDocument('1.0','UTF-8','yes'); |
|||
|
|||
// Properties |
|||
$objWriter->startElement('Properties'); |
|||
$objWriter->writeAttribute('xmlns', 'http://schemas.openxmlformats.org/officeDocument/2006/extended-properties'); |
|||
$objWriter->writeAttribute('xmlns:vt', 'http://schemas.openxmlformats.org/officeDocument/2006/docPropsVTypes'); |
|||
|
|||
// Application |
|||
$objWriter->writeElement('Application', 'Microsoft Excel'); |
|||
|
|||
// DocSecurity |
|||
$objWriter->writeElement('DocSecurity', '0'); |
|||
|
|||
// ScaleCrop |
|||
$objWriter->writeElement('ScaleCrop', 'false'); |
|||
|
|||
// HeadingPairs |
|||
$objWriter->startElement('HeadingPairs'); |
|||
|
|||
// Vector |
|||
$objWriter->startElement('vt:vector'); |
|||
$objWriter->writeAttribute('size', '2'); |
|||
$objWriter->writeAttribute('baseType', 'variant'); |
|||
|
|||
// Variant |
|||
$objWriter->startElement('vt:variant'); |
|||
$objWriter->writeElement('vt:lpstr', 'Worksheets'); |
|||
$objWriter->endElement(); |
|||
|
|||
// Variant |
|||
$objWriter->startElement('vt:variant'); |
|||
$objWriter->writeElement('vt:i4', $pPHPExcel->getSheetCount()); |
|||
$objWriter->endElement(); |
|||
|
|||
$objWriter->endElement(); |
|||
|
|||
$objWriter->endElement(); |
|||
|
|||
// TitlesOfParts |
|||
$objWriter->startElement('TitlesOfParts'); |
|||
|
|||
// Vector |
|||
$objWriter->startElement('vt:vector'); |
|||
$objWriter->writeAttribute('size', $pPHPExcel->getSheetCount()); |
|||
$objWriter->writeAttribute('baseType', 'lpstr'); |
|||
|
|||
$sheetCount = $pPHPExcel->getSheetCount(); |
|||
for ($i = 0; $i < $sheetCount; ++$i) { |
|||
$objWriter->writeElement('vt:lpstr', $pPHPExcel->getSheet($i)->getTitle()); |
|||
} |
|||
|
|||
$objWriter->endElement(); |
|||
|
|||
$objWriter->endElement(); |
|||
|
|||
// Company |
|||
$objWriter->writeElement('Company', $pPHPExcel->getProperties()->getCompany()); |
|||
|
|||
// Company |
|||
$objWriter->writeElement('Manager', $pPHPExcel->getProperties()->getManager()); |
|||
|
|||
// LinksUpToDate |
|||
$objWriter->writeElement('LinksUpToDate', 'false'); |
|||
|
|||
// SharedDoc |
|||
$objWriter->writeElement('SharedDoc', 'false'); |
|||
|
|||
// HyperlinksChanged |
|||
$objWriter->writeElement('HyperlinksChanged', 'false'); |
|||
|
|||
// AppVersion |
|||
$objWriter->writeElement('AppVersion', '12.0000'); |
|||
|
|||
$objWriter->endElement(); |
|||
|
|||
// Return |
|||
return $objWriter->getData(); |
|||
} |
|||
|
|||
/** |
|||
* Write docProps/core.xml to XML format |
|||
* |
|||
* @param PHPExcel $pPHPExcel |
|||
* @return string XML Output |
|||
* @throws PHPExcel_Writer_Exception |
|||
*/ |
|||
public function writeDocPropsCore(PHPExcel $pPHPExcel = null) |
|||
{ |
|||
// Create XML writer |
|||
$objWriter = null; |
|||
if ($this->getParentWriter()->getUseDiskCaching()) { |
|||
$objWriter = new PHPExcel_Shared_XMLWriter(PHPExcel_Shared_XMLWriter::STORAGE_DISK, $this->getParentWriter()->getDiskCachingDirectory()); |
|||
} else { |
|||
$objWriter = new PHPExcel_Shared_XMLWriter(PHPExcel_Shared_XMLWriter::STORAGE_MEMORY); |
|||
} |
|||
|
|||
// XML header |
|||
$objWriter->startDocument('1.0','UTF-8','yes'); |
|||
|
|||
// cp:coreProperties |
|||
$objWriter->startElement('cp:coreProperties'); |
|||
$objWriter->writeAttribute('xmlns:cp', 'http://schemas.openxmlformats.org/package/2006/metadata/core-properties'); |
|||
$objWriter->writeAttribute('xmlns:dc', 'http://purl.org/dc/elements/1.1/'); |
|||
$objWriter->writeAttribute('xmlns:dcterms', 'http://purl.org/dc/terms/'); |
|||
$objWriter->writeAttribute('xmlns:dcmitype', 'http://purl.org/dc/dcmitype/'); |
|||
$objWriter->writeAttribute('xmlns:xsi', 'http://www.w3.org/2001/XMLSchema-instance'); |
|||
|
|||
// dc:creator |
|||
$objWriter->writeElement('dc:creator', $pPHPExcel->getProperties()->getCreator()); |
|||
|
|||
// cp:lastModifiedBy |
|||
$objWriter->writeElement('cp:lastModifiedBy', $pPHPExcel->getProperties()->getLastModifiedBy()); |
|||
|
|||
// dcterms:created |
|||
$objWriter->startElement('dcterms:created'); |
|||
$objWriter->writeAttribute('xsi:type', 'dcterms:W3CDTF'); |
|||
$objWriter->writeRawData(date(DATE_W3C, $pPHPExcel->getProperties()->getCreated())); |
|||
$objWriter->endElement(); |
|||
|
|||
// dcterms:modified |
|||
$objWriter->startElement('dcterms:modified'); |
|||
$objWriter->writeAttribute('xsi:type', 'dcterms:W3CDTF'); |
|||
$objWriter->writeRawData(date(DATE_W3C, $pPHPExcel->getProperties()->getModified())); |
|||
$objWriter->endElement(); |
|||
|
|||
// dc:title |
|||
$objWriter->writeElement('dc:title', $pPHPExcel->getProperties()->getTitle()); |
|||
|
|||
// dc:description |
|||
$objWriter->writeElement('dc:description', $pPHPExcel->getProperties()->getDescription()); |
|||
|
|||
// dc:subject |
|||
$objWriter->writeElement('dc:subject', $pPHPExcel->getProperties()->getSubject()); |
|||
|
|||
// cp:keywords |
|||
$objWriter->writeElement('cp:keywords', $pPHPExcel->getProperties()->getKeywords()); |
|||
|
|||
// cp:category |
|||
$objWriter->writeElement('cp:category', $pPHPExcel->getProperties()->getCategory()); |
|||
|
|||
$objWriter->endElement(); |
|||
|
|||
// Return |
|||
return $objWriter->getData(); |
|||
} |
|||
|
|||
/** |
|||
* Write docProps/custom.xml to XML format |
|||
* |
|||
* @param PHPExcel $pPHPExcel |
|||
* @return string XML Output |
|||
* @throws PHPExcel_Writer_Exception |
|||
*/ |
|||
public function writeDocPropsCustom(PHPExcel $pPHPExcel = null) |
|||
{ |
|||
$customPropertyList = $pPHPExcel->getProperties()->getCustomProperties(); |
|||
if (empty($customPropertyList)) { |
|||
return; |
|||
} |
|||
|
|||
// Create XML writer |
|||
$objWriter = null; |
|||
if ($this->getParentWriter()->getUseDiskCaching()) { |
|||
$objWriter = new PHPExcel_Shared_XMLWriter(PHPExcel_Shared_XMLWriter::STORAGE_DISK, $this->getParentWriter()->getDiskCachingDirectory()); |
|||
} else { |
|||
$objWriter = new PHPExcel_Shared_XMLWriter(PHPExcel_Shared_XMLWriter::STORAGE_MEMORY); |
|||
} |
|||
|
|||
// XML header |
|||
$objWriter->startDocument('1.0','UTF-8','yes'); |
|||
|
|||
// cp:coreProperties |
|||
$objWriter->startElement('Properties'); |
|||
$objWriter->writeAttribute('xmlns', 'http://schemas.openxmlformats.org/officeDocument/2006/custom-properties'); |
|||
$objWriter->writeAttribute('xmlns:vt', 'http://schemas.openxmlformats.org/officeDocument/2006/docPropsVTypes'); |
|||
|
|||
|
|||
foreach($customPropertyList as $key => $customProperty) { |
|||
$propertyValue = $pPHPExcel->getProperties()->getCustomPropertyValue($customProperty); |
|||
$propertyType = $pPHPExcel->getProperties()->getCustomPropertyType($customProperty); |
|||
|
|||
$objWriter->startElement('property'); |
|||
$objWriter->writeAttribute('fmtid', '{D5CDD505-2E9C-101B-9397-08002B2CF9AE}'); |
|||
$objWriter->writeAttribute('pid', $key+2); |
|||
$objWriter->writeAttribute('name', $customProperty); |
|||
|
|||
switch($propertyType) { |
|||
case 'i' : |
|||
$objWriter->writeElement('vt:i4', $propertyValue); |
|||
break; |
|||
case 'f' : |
|||
$objWriter->writeElement('vt:r8', $propertyValue); |
|||
break; |
|||
case 'b' : |
|||
$objWriter->writeElement('vt:bool', ($propertyValue) ? 'true' : 'false'); |
|||
break; |
|||
case 'd' : |
|||
$objWriter->startElement('vt:filetime'); |
|||
$objWriter->writeRawData(date(DATE_W3C, $propertyValue)); |
|||
$objWriter->endElement(); |
|||
break; |
|||
default : |
|||
$objWriter->writeElement('vt:lpwstr', $propertyValue); |
|||
break; |
|||
} |
|||
|
|||
$objWriter->endElement(); |
|||
} |
|||
|
|||
|
|||
$objWriter->endElement(); |
|||
|
|||
// Return |
|||
return $objWriter->getData(); |
|||
} |
|||
|
|||
} |
|||
@ -0,0 +1,598 @@ |
|||
<?php |
|||
/** |
|||
* PHPExcel |
|||
* |
|||
* Copyright (c) 2006 - 2013 PHPExcel |
|||
* |
|||
* This library is free software; you can redistribute it and/or |
|||
* modify it under the terms of the GNU Lesser General Public |
|||
* License as published by the Free Software Foundation; either |
|||
* version 2.1 of the License, or (at your option) any later version. |
|||
* |
|||
* This library is distributed in the hope that it will be useful, |
|||
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
|||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
|||
* Lesser General Public License for more details. |
|||
* |
|||
* You should have received a copy of the GNU Lesser General Public |
|||
* License along with this library; if not, write to the Free Software |
|||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA |
|||
* |
|||
* @category PHPExcel |
|||
* @package PHPExcel_Writer_Excel2007 |
|||
* @copyright Copyright (c) 2006 - 2013 PHPExcel (http://www.codeplex.com/PHPExcel) |
|||
* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL |
|||
* @version 1.7.9, 2013-06-02 |
|||
*/ |
|||
|
|||
|
|||
/** |
|||
* PHPExcel_Writer_Excel2007_Drawing |
|||
* |
|||
* @category PHPExcel |
|||
* @package PHPExcel_Writer_Excel2007 |
|||
* @copyright Copyright (c) 2006 - 2013 PHPExcel (http://www.codeplex.com/PHPExcel) |
|||
*/ |
|||
class PHPExcel_Writer_Excel2007_Drawing extends PHPExcel_Writer_Excel2007_WriterPart |
|||
{ |
|||
/** |
|||
* Write drawings to XML format |
|||
* |
|||
* @param PHPExcel_Worksheet $pWorksheet |
|||
* @param int &$chartRef Chart ID |
|||
* @param boolean $includeCharts Flag indicating if we should include drawing details for charts |
|||
* @return string XML Output |
|||
* @throws PHPExcel_Writer_Exception |
|||
*/ |
|||
public function writeDrawings(PHPExcel_Worksheet $pWorksheet = null, &$chartRef, $includeCharts = FALSE) |
|||
{ |
|||
// Create XML writer |
|||
$objWriter = null; |
|||
if ($this->getParentWriter()->getUseDiskCaching()) { |
|||
$objWriter = new PHPExcel_Shared_XMLWriter(PHPExcel_Shared_XMLWriter::STORAGE_DISK, $this->getParentWriter()->getDiskCachingDirectory()); |
|||
} else { |
|||
$objWriter = new PHPExcel_Shared_XMLWriter(PHPExcel_Shared_XMLWriter::STORAGE_MEMORY); |
|||
} |
|||
|
|||
// XML header |
|||
$objWriter->startDocument('1.0','UTF-8','yes'); |
|||
|
|||
// xdr:wsDr |
|||
$objWriter->startElement('xdr:wsDr'); |
|||
$objWriter->writeAttribute('xmlns:xdr', 'http://schemas.openxmlformats.org/drawingml/2006/spreadsheetDrawing'); |
|||
$objWriter->writeAttribute('xmlns:a', 'http://schemas.openxmlformats.org/drawingml/2006/main'); |
|||
|
|||
// Loop through images and write drawings |
|||
$i = 1; |
|||
$iterator = $pWorksheet->getDrawingCollection()->getIterator(); |
|||
while ($iterator->valid()) { |
|||
$this->_writeDrawing($objWriter, $iterator->current(), $i); |
|||
|
|||
$iterator->next(); |
|||
++$i; |
|||
} |
|||
|
|||
if ($includeCharts) { |
|||
$chartCount = $pWorksheet->getChartCount(); |
|||
// Loop through charts and write the chart position |
|||
if ($chartCount > 0) { |
|||
for ($c = 0; $c < $chartCount; ++$c) { |
|||
$this->_writeChart($objWriter, $pWorksheet->getChartByIndex($c), $c+$i); |
|||
} |
|||
} |
|||
} |
|||
|
|||
|
|||
$objWriter->endElement(); |
|||
|
|||
// Return |
|||
return $objWriter->getData(); |
|||
} |
|||
|
|||
/** |
|||
* Write drawings to XML format |
|||
* |
|||
* @param PHPExcel_Shared_XMLWriter $objWriter XML Writer |
|||
* @param PHPExcel_Chart $pChart |
|||
* @param int $pRelationId |
|||
* @throws PHPExcel_Writer_Exception |
|||
*/ |
|||
public function _writeChart(PHPExcel_Shared_XMLWriter $objWriter = null, PHPExcel_Chart $pChart = null, $pRelationId = -1) |
|||
{ |
|||
$tl = $pChart->getTopLeftPosition(); |
|||
$tl['colRow'] = PHPExcel_Cell::coordinateFromString($tl['cell']); |
|||
$br = $pChart->getBottomRightPosition(); |
|||
$br['colRow'] = PHPExcel_Cell::coordinateFromString($br['cell']); |
|||
|
|||
$objWriter->startElement('xdr:twoCellAnchor'); |
|||
|
|||
$objWriter->startElement('xdr:from'); |
|||
$objWriter->writeElement('xdr:col', PHPExcel_Cell::columnIndexFromString($tl['colRow'][0]) - 1); |
|||
$objWriter->writeElement('xdr:colOff', PHPExcel_Shared_Drawing::pixelsToEMU($tl['xOffset'])); |
|||
$objWriter->writeElement('xdr:row', $tl['colRow'][1] - 1); |
|||
$objWriter->writeElement('xdr:rowOff', PHPExcel_Shared_Drawing::pixelsToEMU($tl['yOffset'])); |
|||
$objWriter->endElement(); |
|||
$objWriter->startElement('xdr:to'); |
|||
$objWriter->writeElement('xdr:col', PHPExcel_Cell::columnIndexFromString($br['colRow'][0]) - 1); |
|||
$objWriter->writeElement('xdr:colOff', PHPExcel_Shared_Drawing::pixelsToEMU($br['xOffset'])); |
|||
$objWriter->writeElement('xdr:row', $br['colRow'][1] - 1); |
|||
$objWriter->writeElement('xdr:rowOff', PHPExcel_Shared_Drawing::pixelsToEMU($br['yOffset'])); |
|||
$objWriter->endElement(); |
|||
|
|||
$objWriter->startElement('xdr:graphicFrame'); |
|||
$objWriter->writeAttribute('macro', ''); |
|||
$objWriter->startElement('xdr:nvGraphicFramePr'); |
|||
$objWriter->startElement('xdr:cNvPr'); |
|||
$objWriter->writeAttribute('name', 'Chart '.$pRelationId); |
|||
$objWriter->writeAttribute('id', 1025 * $pRelationId); |
|||
$objWriter->endElement(); |
|||
$objWriter->startElement('xdr:cNvGraphicFramePr'); |
|||
$objWriter->startElement('a:graphicFrameLocks'); |
|||
$objWriter->endElement(); |
|||
$objWriter->endElement(); |
|||
$objWriter->endElement(); |
|||
|
|||
$objWriter->startElement('xdr:xfrm'); |
|||
$objWriter->startElement('a:off'); |
|||
$objWriter->writeAttribute('x', '0'); |
|||
$objWriter->writeAttribute('y', '0'); |
|||
$objWriter->endElement(); |
|||
$objWriter->startElement('a:ext'); |
|||
$objWriter->writeAttribute('cx', '0'); |
|||
$objWriter->writeAttribute('cy', '0'); |
|||
$objWriter->endElement(); |
|||
$objWriter->endElement(); |
|||
|
|||
$objWriter->startElement('a:graphic'); |
|||
$objWriter->startElement('a:graphicData'); |
|||
$objWriter->writeAttribute('uri', 'http://schemas.openxmlformats.org/drawingml/2006/chart'); |
|||
$objWriter->startElement('c:chart'); |
|||
$objWriter->writeAttribute('xmlns:c', 'http://schemas.openxmlformats.org/drawingml/2006/chart'); |
|||
$objWriter->writeAttribute('xmlns:r', 'http://schemas.openxmlformats.org/officeDocument/2006/relationships'); |
|||
$objWriter->writeAttribute('r:id', 'rId'.$pRelationId); |
|||
$objWriter->endElement(); |
|||
$objWriter->endElement(); |
|||
$objWriter->endElement(); |
|||
$objWriter->endElement(); |
|||
|
|||
$objWriter->startElement('xdr:clientData'); |
|||
$objWriter->endElement(); |
|||
|
|||
$objWriter->endElement(); |
|||
} |
|||
|
|||
/** |
|||
* Write drawings to XML format |
|||
* |
|||
* @param PHPExcel_Shared_XMLWriter $objWriter XML Writer |
|||
* @param PHPExcel_Worksheet_BaseDrawing $pDrawing |
|||
* @param int $pRelationId |
|||
* @throws PHPExcel_Writer_Exception |
|||
*/ |
|||
public function _writeDrawing(PHPExcel_Shared_XMLWriter $objWriter = null, PHPExcel_Worksheet_BaseDrawing $pDrawing = null, $pRelationId = -1) |
|||
{ |
|||
if ($pRelationId >= 0) { |
|||
// xdr:oneCellAnchor |
|||
$objWriter->startElement('xdr:oneCellAnchor'); |
|||
// Image location |
|||
$aCoordinates = PHPExcel_Cell::coordinateFromString($pDrawing->getCoordinates()); |
|||
$aCoordinates[0] = PHPExcel_Cell::columnIndexFromString($aCoordinates[0]); |
|||
|
|||
// xdr:from |
|||
$objWriter->startElement('xdr:from'); |
|||
$objWriter->writeElement('xdr:col', $aCoordinates[0] - 1); |
|||
$objWriter->writeElement('xdr:colOff', PHPExcel_Shared_Drawing::pixelsToEMU($pDrawing->getOffsetX())); |
|||
$objWriter->writeElement('xdr:row', $aCoordinates[1] - 1); |
|||
$objWriter->writeElement('xdr:rowOff', PHPExcel_Shared_Drawing::pixelsToEMU($pDrawing->getOffsetY())); |
|||
$objWriter->endElement(); |
|||
|
|||
// xdr:ext |
|||
$objWriter->startElement('xdr:ext'); |
|||
$objWriter->writeAttribute('cx', PHPExcel_Shared_Drawing::pixelsToEMU($pDrawing->getWidth())); |
|||
$objWriter->writeAttribute('cy', PHPExcel_Shared_Drawing::pixelsToEMU($pDrawing->getHeight())); |
|||
$objWriter->endElement(); |
|||
|
|||
// xdr:pic |
|||
$objWriter->startElement('xdr:pic'); |
|||
|
|||
// xdr:nvPicPr |
|||
$objWriter->startElement('xdr:nvPicPr'); |
|||
|
|||
// xdr:cNvPr |
|||
$objWriter->startElement('xdr:cNvPr'); |
|||
$objWriter->writeAttribute('id', $pRelationId); |
|||
$objWriter->writeAttribute('name', $pDrawing->getName()); |
|||
$objWriter->writeAttribute('descr', $pDrawing->getDescription()); |
|||
$objWriter->endElement(); |
|||
|
|||
// xdr:cNvPicPr |
|||
$objWriter->startElement('xdr:cNvPicPr'); |
|||
|
|||
// a:picLocks |
|||
$objWriter->startElement('a:picLocks'); |
|||
$objWriter->writeAttribute('noChangeAspect', '1'); |
|||
$objWriter->endElement(); |
|||
|
|||
$objWriter->endElement(); |
|||
|
|||
$objWriter->endElement(); |
|||
|
|||
// xdr:blipFill |
|||
$objWriter->startElement('xdr:blipFill'); |
|||
|
|||
// a:blip |
|||
$objWriter->startElement('a:blip'); |
|||
$objWriter->writeAttribute('xmlns:r', 'http://schemas.openxmlformats.org/officeDocument/2006/relationships'); |
|||
$objWriter->writeAttribute('r:embed', 'rId' . $pRelationId); |
|||
$objWriter->endElement(); |
|||
|
|||
// a:stretch |
|||
$objWriter->startElement('a:stretch'); |
|||
$objWriter->writeElement('a:fillRect', null); |
|||
$objWriter->endElement(); |
|||
|
|||
$objWriter->endElement(); |
|||
|
|||
// xdr:spPr |
|||
$objWriter->startElement('xdr:spPr'); |
|||
|
|||
// a:xfrm |
|||
$objWriter->startElement('a:xfrm'); |
|||
$objWriter->writeAttribute('rot', PHPExcel_Shared_Drawing::degreesToAngle($pDrawing->getRotation())); |
|||
$objWriter->endElement(); |
|||
|
|||
// a:prstGeom |
|||
$objWriter->startElement('a:prstGeom'); |
|||
$objWriter->writeAttribute('prst', 'rect'); |
|||
|
|||
// a:avLst |
|||
$objWriter->writeElement('a:avLst', null); |
|||
|
|||
$objWriter->endElement(); |
|||
|
|||
// // a:solidFill |
|||
// $objWriter->startElement('a:solidFill'); |
|||
|
|||
// // a:srgbClr |
|||
// $objWriter->startElement('a:srgbClr'); |
|||
// $objWriter->writeAttribute('val', 'FFFFFF'); |
|||
|
|||
///* SHADE |
|||
// // a:shade |
|||
// $objWriter->startElement('a:shade'); |
|||
// $objWriter->writeAttribute('val', '85000'); |
|||
// $objWriter->endElement(); |
|||
//*/ |
|||
|
|||
// $objWriter->endElement(); |
|||
|
|||
// $objWriter->endElement(); |
|||
/* |
|||
// a:ln |
|||
$objWriter->startElement('a:ln'); |
|||
$objWriter->writeAttribute('w', '88900'); |
|||
$objWriter->writeAttribute('cap', 'sq'); |
|||
|
|||
// a:solidFill |
|||
$objWriter->startElement('a:solidFill'); |
|||
|
|||
// a:srgbClr |
|||
$objWriter->startElement('a:srgbClr'); |
|||
$objWriter->writeAttribute('val', 'FFFFFF'); |
|||
$objWriter->endElement(); |
|||
|
|||
$objWriter->endElement(); |
|||
|
|||
// a:miter |
|||
$objWriter->startElement('a:miter'); |
|||
$objWriter->writeAttribute('lim', '800000'); |
|||
$objWriter->endElement(); |
|||
|
|||
$objWriter->endElement(); |
|||
*/ |
|||
|
|||
if ($pDrawing->getShadow()->getVisible()) { |
|||
// a:effectLst |
|||
$objWriter->startElement('a:effectLst'); |
|||
|
|||
// a:outerShdw |
|||
$objWriter->startElement('a:outerShdw'); |
|||
$objWriter->writeAttribute('blurRad', PHPExcel_Shared_Drawing::pixelsToEMU($pDrawing->getShadow()->getBlurRadius())); |
|||
$objWriter->writeAttribute('dist', PHPExcel_Shared_Drawing::pixelsToEMU($pDrawing->getShadow()->getDistance())); |
|||
$objWriter->writeAttribute('dir', PHPExcel_Shared_Drawing::degreesToAngle($pDrawing->getShadow()->getDirection())); |
|||
$objWriter->writeAttribute('algn', $pDrawing->getShadow()->getAlignment()); |
|||
$objWriter->writeAttribute('rotWithShape', '0'); |
|||
|
|||
// a:srgbClr |
|||
$objWriter->startElement('a:srgbClr'); |
|||
$objWriter->writeAttribute('val', $pDrawing->getShadow()->getColor()->getRGB()); |
|||
|
|||
// a:alpha |
|||
$objWriter->startElement('a:alpha'); |
|||
$objWriter->writeAttribute('val', $pDrawing->getShadow()->getAlpha() * 1000); |
|||
$objWriter->endElement(); |
|||
|
|||
$objWriter->endElement(); |
|||
|
|||
$objWriter->endElement(); |
|||
|
|||
$objWriter->endElement(); |
|||
} |
|||
/* |
|||
|
|||
// a:scene3d |
|||
$objWriter->startElement('a:scene3d'); |
|||
|
|||
// a:camera |
|||
$objWriter->startElement('a:camera'); |
|||
$objWriter->writeAttribute('prst', 'orthographicFront'); |
|||
$objWriter->endElement(); |
|||
|
|||
// a:lightRig |
|||
$objWriter->startElement('a:lightRig'); |
|||
$objWriter->writeAttribute('rig', 'twoPt'); |
|||
$objWriter->writeAttribute('dir', 't'); |
|||
|
|||
// a:rot |
|||
$objWriter->startElement('a:rot'); |
|||
$objWriter->writeAttribute('lat', '0'); |
|||
$objWriter->writeAttribute('lon', '0'); |
|||
$objWriter->writeAttribute('rev', '0'); |
|||
$objWriter->endElement(); |
|||
|
|||
$objWriter->endElement(); |
|||
|
|||
$objWriter->endElement(); |
|||
*/ |
|||
/* |
|||
// a:sp3d |
|||
$objWriter->startElement('a:sp3d'); |
|||
|
|||
// a:bevelT |
|||
$objWriter->startElement('a:bevelT'); |
|||
$objWriter->writeAttribute('w', '25400'); |
|||
$objWriter->writeAttribute('h', '19050'); |
|||
$objWriter->endElement(); |
|||
|
|||
// a:contourClr |
|||
$objWriter->startElement('a:contourClr'); |
|||
|
|||
// a:srgbClr |
|||
$objWriter->startElement('a:srgbClr'); |
|||
$objWriter->writeAttribute('val', 'FFFFFF'); |
|||
$objWriter->endElement(); |
|||
|
|||
$objWriter->endElement(); |
|||
|
|||
$objWriter->endElement(); |
|||
*/ |
|||
$objWriter->endElement(); |
|||
|
|||
$objWriter->endElement(); |
|||
|
|||
// xdr:clientData |
|||
$objWriter->writeElement('xdr:clientData', null); |
|||
|
|||
$objWriter->endElement(); |
|||
} else { |
|||
throw new PHPExcel_Writer_Exception("Invalid parameters passed."); |
|||
} |
|||
} |
|||
|
|||
/** |
|||
* Write VML header/footer images to XML format |
|||
* |
|||
* @param PHPExcel_Worksheet $pWorksheet |
|||
* @return string XML Output |
|||
* @throws PHPExcel_Writer_Exception |
|||
*/ |
|||
public function writeVMLHeaderFooterImages(PHPExcel_Worksheet $pWorksheet = null) |
|||
{ |
|||
// Create XML writer |
|||
$objWriter = null; |
|||
if ($this->getParentWriter()->getUseDiskCaching()) { |
|||
$objWriter = new PHPExcel_Shared_XMLWriter(PHPExcel_Shared_XMLWriter::STORAGE_DISK, $this->getParentWriter()->getDiskCachingDirectory()); |
|||
} else { |
|||
$objWriter = new PHPExcel_Shared_XMLWriter(PHPExcel_Shared_XMLWriter::STORAGE_MEMORY); |
|||
} |
|||
|
|||
// XML header |
|||
$objWriter->startDocument('1.0','UTF-8','yes'); |
|||
|
|||
// Header/footer images |
|||
$images = $pWorksheet->getHeaderFooter()->getImages(); |
|||
|
|||
// xml |
|||
$objWriter->startElement('xml'); |
|||
$objWriter->writeAttribute('xmlns:v', 'urn:schemas-microsoft-com:vml'); |
|||
$objWriter->writeAttribute('xmlns:o', 'urn:schemas-microsoft-com:office:office'); |
|||
$objWriter->writeAttribute('xmlns:x', 'urn:schemas-microsoft-com:office:excel'); |
|||
|
|||
// o:shapelayout |
|||
$objWriter->startElement('o:shapelayout'); |
|||
$objWriter->writeAttribute('v:ext', 'edit'); |
|||
|
|||
// o:idmap |
|||
$objWriter->startElement('o:idmap'); |
|||
$objWriter->writeAttribute('v:ext', 'edit'); |
|||
$objWriter->writeAttribute('data', '1'); |
|||
$objWriter->endElement(); |
|||
|
|||
$objWriter->endElement(); |
|||
|
|||
// v:shapetype |
|||
$objWriter->startElement('v:shapetype'); |
|||
$objWriter->writeAttribute('id', '_x0000_t75'); |
|||
$objWriter->writeAttribute('coordsize', '21600,21600'); |
|||
$objWriter->writeAttribute('o:spt', '75'); |
|||
$objWriter->writeAttribute('o:preferrelative', 't'); |
|||
$objWriter->writeAttribute('path', 'm@4@5l@4@11@9@11@9@5xe'); |
|||
$objWriter->writeAttribute('filled', 'f'); |
|||
$objWriter->writeAttribute('stroked', 'f'); |
|||
|
|||
// v:stroke |
|||
$objWriter->startElement('v:stroke'); |
|||
$objWriter->writeAttribute('joinstyle', 'miter'); |
|||
$objWriter->endElement(); |
|||
|
|||
// v:formulas |
|||
$objWriter->startElement('v:formulas'); |
|||
|
|||
// v:f |
|||
$objWriter->startElement('v:f'); |
|||
$objWriter->writeAttribute('eqn', 'if lineDrawn pixelLineWidth 0'); |
|||
$objWriter->endElement(); |
|||
|
|||
// v:f |
|||
$objWriter->startElement('v:f'); |
|||
$objWriter->writeAttribute('eqn', 'sum @0 1 0'); |
|||
$objWriter->endElement(); |
|||
|
|||
// v:f |
|||
$objWriter->startElement('v:f'); |
|||
$objWriter->writeAttribute('eqn', 'sum 0 0 @1'); |
|||
$objWriter->endElement(); |
|||
|
|||
// v:f |
|||
$objWriter->startElement('v:f'); |
|||
$objWriter->writeAttribute('eqn', 'prod @2 1 2'); |
|||
$objWriter->endElement(); |
|||
|
|||
// v:f |
|||
$objWriter->startElement('v:f'); |
|||
$objWriter->writeAttribute('eqn', 'prod @3 21600 pixelWidth'); |
|||
$objWriter->endElement(); |
|||
|
|||
// v:f |
|||
$objWriter->startElement('v:f'); |
|||
$objWriter->writeAttribute('eqn', 'prod @3 21600 pixelHeight'); |
|||
$objWriter->endElement(); |
|||
|
|||
// v:f |
|||
$objWriter->startElement('v:f'); |
|||
$objWriter->writeAttribute('eqn', 'sum @0 0 1'); |
|||
$objWriter->endElement(); |
|||
|
|||
// v:f |
|||
$objWriter->startElement('v:f'); |
|||
$objWriter->writeAttribute('eqn', 'prod @6 1 2'); |
|||
$objWriter->endElement(); |
|||
|
|||
// v:f |
|||
$objWriter->startElement('v:f'); |
|||
$objWriter->writeAttribute('eqn', 'prod @7 21600 pixelWidth'); |
|||
$objWriter->endElement(); |
|||
|
|||
// v:f |
|||
$objWriter->startElement('v:f'); |
|||
$objWriter->writeAttribute('eqn', 'sum @8 21600 0'); |
|||
$objWriter->endElement(); |
|||
|
|||
// v:f |
|||
$objWriter->startElement('v:f'); |
|||
$objWriter->writeAttribute('eqn', 'prod @7 21600 pixelHeight'); |
|||
$objWriter->endElement(); |
|||
|
|||
// v:f |
|||
$objWriter->startElement('v:f'); |
|||
$objWriter->writeAttribute('eqn', 'sum @10 21600 0'); |
|||
$objWriter->endElement(); |
|||
|
|||
$objWriter->endElement(); |
|||
|
|||
// v:path |
|||
$objWriter->startElement('v:path'); |
|||
$objWriter->writeAttribute('o:extrusionok', 'f'); |
|||
$objWriter->writeAttribute('gradientshapeok', 't'); |
|||
$objWriter->writeAttribute('o:connecttype', 'rect'); |
|||
$objWriter->endElement(); |
|||
|
|||
// o:lock |
|||
$objWriter->startElement('o:lock'); |
|||
$objWriter->writeAttribute('v:ext', 'edit'); |
|||
$objWriter->writeAttribute('aspectratio', 't'); |
|||
$objWriter->endElement(); |
|||
|
|||
$objWriter->endElement(); |
|||
|
|||
// Loop through images |
|||
foreach ($images as $key => $value) { |
|||
$this->_writeVMLHeaderFooterImage($objWriter, $key, $value); |
|||
} |
|||
|
|||
$objWriter->endElement(); |
|||
|
|||
// Return |
|||
return $objWriter->getData(); |
|||
} |
|||
|
|||
/** |
|||
* Write VML comment to XML format |
|||
* |
|||
* @param PHPExcel_Shared_XMLWriter $objWriter XML Writer |
|||
* @param string $pReference Reference |
|||
* @param PHPExcel_Worksheet_HeaderFooterDrawing $pImage Image |
|||
* @throws PHPExcel_Writer_Exception |
|||
*/ |
|||
public function _writeVMLHeaderFooterImage(PHPExcel_Shared_XMLWriter $objWriter = null, $pReference = '', PHPExcel_Worksheet_HeaderFooterDrawing $pImage = null) |
|||
{ |
|||
// Calculate object id |
|||
preg_match('{(\d+)}', md5($pReference), $m); |
|||
$id = 1500 + (substr($m[1], 0, 2) * 1); |
|||
|
|||
// Calculate offset |
|||
$width = $pImage->getWidth(); |
|||
$height = $pImage->getHeight(); |
|||
$marginLeft = $pImage->getOffsetX(); |
|||
$marginTop = $pImage->getOffsetY(); |
|||
|
|||
// v:shape |
|||
$objWriter->startElement('v:shape'); |
|||
$objWriter->writeAttribute('id', $pReference); |
|||
$objWriter->writeAttribute('o:spid', '_x0000_s' . $id); |
|||
$objWriter->writeAttribute('type', '#_x0000_t75'); |
|||
$objWriter->writeAttribute('style', "position:absolute;margin-left:{$marginLeft}px;margin-top:{$marginTop}px;width:{$width}px;height:{$height}px;z-index:1"); |
|||
|
|||
// v:imagedata |
|||
$objWriter->startElement('v:imagedata'); |
|||
$objWriter->writeAttribute('o:relid', 'rId' . $pReference); |
|||
$objWriter->writeAttribute('o:title', $pImage->getName()); |
|||
$objWriter->endElement(); |
|||
|
|||
// o:lock |
|||
$objWriter->startElement('o:lock'); |
|||
$objWriter->writeAttribute('v:ext', 'edit'); |
|||
$objWriter->writeAttribute('rotation', 't'); |
|||
$objWriter->endElement(); |
|||
|
|||
$objWriter->endElement(); |
|||
} |
|||
|
|||
|
|||
/** |
|||
* Get an array of all drawings |
|||
* |
|||
* @param PHPExcel $pPHPExcel |
|||
* @return PHPExcel_Worksheet_Drawing[] All drawings in PHPExcel |
|||
* @throws PHPExcel_Writer_Exception |
|||
*/ |
|||
public function allDrawings(PHPExcel $pPHPExcel = null) |
|||
{ |
|||
// Get an array of all drawings |
|||
$aDrawings = array(); |
|||
|
|||
// Loop through PHPExcel |
|||
$sheetCount = $pPHPExcel->getSheetCount(); |
|||
for ($i = 0; $i < $sheetCount; ++$i) { |
|||
// Loop through images and add to array |
|||
$iterator = $pPHPExcel->getSheet($i)->getDrawingCollection()->getIterator(); |
|||
while ($iterator->valid()) { |
|||
$aDrawings[] = $iterator->current(); |
|||
|
|||
$iterator->next(); |
|||
} |
|||
} |
|||
|
|||
return $aDrawings; |
|||
} |
|||
} |
|||
@ -0,0 +1,935 @@ |
|||
<?php |
|||
/** |
|||
* PHPExcel |
|||
* |
|||
* Copyright (c) 2006 - 2013 PHPExcel |
|||
* |
|||
* This library is free software; you can redistribute it and/or |
|||
* modify it under the terms of the GNU Lesser General Public |
|||
* License as published by the Free Software Foundation; either |
|||
* version 2.1 of the License, or (at your option) any later version. |
|||
* |
|||
* This library is distributed in the hope that it will be useful, |
|||
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
|||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
|||
* Lesser General Public License for more details. |
|||
* |
|||
* You should have received a copy of the GNU Lesser General Public |
|||
* License along with this library; if not, write to the Free Software |
|||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA |
|||
* |
|||
* @category PHPExcel |
|||
* @package PHPExcel_Writer_Excel5 |
|||
* @copyright Copyright (c) 2006 - 2013 PHPExcel (http://www.codeplex.com/PHPExcel) |
|||
* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL |
|||
* @version 1.7.9, 2013-06-02 |
|||
*/ |
|||
|
|||
|
|||
/** |
|||
* PHPExcel_Writer_Excel5 |
|||
* |
|||
* @category PHPExcel |
|||
* @package PHPExcel_Writer_Excel5 |
|||
* @copyright Copyright (c) 2006 - 2013 PHPExcel (http://www.codeplex.com/PHPExcel) |
|||
*/ |
|||
class PHPExcel_Writer_Excel5 extends PHPExcel_Writer_Abstract implements PHPExcel_Writer_IWriter |
|||
{ |
|||
/** |
|||
* PHPExcel object |
|||
* |
|||
* @var PHPExcel |
|||
*/ |
|||
private $_phpExcel; |
|||
|
|||
/** |
|||
* Total number of shared strings in workbook |
|||
* |
|||
* @var int |
|||
*/ |
|||
private $_str_total = 0; |
|||
|
|||
/** |
|||
* Number of unique shared strings in workbook |
|||
* |
|||
* @var int |
|||
*/ |
|||
private $_str_unique = 0; |
|||
|
|||
/** |
|||
* Array of unique shared strings in workbook |
|||
* |
|||
* @var array |
|||
*/ |
|||
private $_str_table = array(); |
|||
|
|||
/** |
|||
* Color cache. Mapping between RGB value and color index. |
|||
* |
|||
* @var array |
|||
*/ |
|||
private $_colors; |
|||
|
|||
/** |
|||
* Formula parser |
|||
* |
|||
* @var PHPExcel_Writer_Excel5_Parser |
|||
*/ |
|||
private $_parser; |
|||
|
|||
/** |
|||
* Identifier clusters for drawings. Used in MSODRAWINGGROUP record. |
|||
* |
|||
* @var array |
|||
*/ |
|||
private $_IDCLs; |
|||
|
|||
/** |
|||
* Basic OLE object summary information |
|||
* |
|||
* @var array |
|||
*/ |
|||
private $_summaryInformation; |
|||
|
|||
/** |
|||
* Extended OLE object document summary information |
|||
* |
|||
* @var array |
|||
*/ |
|||
private $_documentSummaryInformation; |
|||
|
|||
/** |
|||
* Create a new PHPExcel_Writer_Excel5 |
|||
* |
|||
* @param PHPExcel $phpExcel PHPExcel object |
|||
*/ |
|||
public function __construct(PHPExcel $phpExcel) { |
|||
$this->_phpExcel = $phpExcel; |
|||
|
|||
$this->_parser = new PHPExcel_Writer_Excel5_Parser(); |
|||
} |
|||
|
|||
/** |
|||
* Save PHPExcel to file |
|||
* |
|||
* @param string $pFilename |
|||
* @throws PHPExcel_Writer_Exception |
|||
*/ |
|||
public function save($pFilename = null) { |
|||
|
|||
// garbage collect |
|||
$this->_phpExcel->garbageCollect(); |
|||
|
|||
$saveDebugLog = PHPExcel_Calculation::getInstance($this->_phpExcel)->getDebugLog()->getWriteDebugLog(); |
|||
PHPExcel_Calculation::getInstance($this->_phpExcel)->getDebugLog()->setWriteDebugLog(FALSE); |
|||
$saveDateReturnType = PHPExcel_Calculation_Functions::getReturnDateType(); |
|||
PHPExcel_Calculation_Functions::setReturnDateType(PHPExcel_Calculation_Functions::RETURNDATE_EXCEL); |
|||
|
|||
// initialize colors array |
|||
$this->_colors = array(); |
|||
|
|||
// Initialise workbook writer |
|||
$this->_writerWorkbook = new PHPExcel_Writer_Excel5_Workbook($this->_phpExcel, |
|||
$this->_str_total, $this->_str_unique, $this->_str_table, |
|||
$this->_colors, $this->_parser); |
|||
|
|||
// Initialise worksheet writers |
|||
$countSheets = $this->_phpExcel->getSheetCount(); |
|||
for ($i = 0; $i < $countSheets; ++$i) { |
|||
$this->_writerWorksheets[$i] = new PHPExcel_Writer_Excel5_Worksheet($this->_str_total, $this->_str_unique, |
|||
$this->_str_table, $this->_colors, |
|||
$this->_parser, |
|||
$this->_preCalculateFormulas, |
|||
$this->_phpExcel->getSheet($i)); |
|||
} |
|||
|
|||
// build Escher objects. Escher objects for workbooks needs to be build before Escher object for workbook. |
|||
$this->_buildWorksheetEschers(); |
|||
$this->_buildWorkbookEscher(); |
|||
|
|||
// add 15 identical cell style Xfs |
|||
// for now, we use the first cellXf instead of cellStyleXf |
|||
$cellXfCollection = $this->_phpExcel->getCellXfCollection(); |
|||
for ($i = 0; $i < 15; ++$i) { |
|||
$this->_writerWorkbook->addXfWriter($cellXfCollection[0], true); |
|||
} |
|||
|
|||
// add all the cell Xfs |
|||
foreach ($this->_phpExcel->getCellXfCollection() as $style) { |
|||
$this->_writerWorkbook->addXfWriter($style, false); |
|||
} |
|||
|
|||
// add font from rich text eleemnts |
|||
for ($i = 0; $i < $countSheets; ++$i) { |
|||
foreach ($this->_writerWorksheets[$i]->_phpSheet->getCellCollection() as $cellID) { |
|||
$cell = $this->_writerWorksheets[$i]->_phpSheet->getCell($cellID); |
|||
$cVal = $cell->getValue(); |
|||
if ($cVal instanceof PHPExcel_RichText) { |
|||
$elements = $cVal->getRichTextElements(); |
|||
foreach ($elements as $element) { |
|||
if ($element instanceof PHPExcel_RichText_Run) { |
|||
$font = $element->getFont(); |
|||
$this->_writerWorksheets[$i]->_fntHashIndex[$font->getHashCode()] = $this->_writerWorkbook->_addFont($font); |
|||
} |
|||
} |
|||
} |
|||
} |
|||
} |
|||
|
|||
// initialize OLE file |
|||
$workbookStreamName = 'Workbook'; |
|||
$OLE = new PHPExcel_Shared_OLE_PPS_File(PHPExcel_Shared_OLE::Asc2Ucs($workbookStreamName)); |
|||
|
|||
// Write the worksheet streams before the global workbook stream, |
|||
// because the byte sizes of these are needed in the global workbook stream |
|||
$worksheetSizes = array(); |
|||
for ($i = 0; $i < $countSheets; ++$i) { |
|||
$this->_writerWorksheets[$i]->close(); |
|||
$worksheetSizes[] = $this->_writerWorksheets[$i]->_datasize; |
|||
} |
|||
|
|||
// add binary data for global workbook stream |
|||
$OLE->append($this->_writerWorkbook->writeWorkbook($worksheetSizes)); |
|||
|
|||
// add binary data for sheet streams |
|||
for ($i = 0; $i < $countSheets; ++$i) { |
|||
$OLE->append($this->_writerWorksheets[$i]->getData()); |
|||
} |
|||
|
|||
$this->_documentSummaryInformation = $this->_writeDocumentSummaryInformation(); |
|||
// initialize OLE Document Summary Information |
|||
if(isset($this->_documentSummaryInformation) && !empty($this->_documentSummaryInformation)){ |
|||
$OLE_DocumentSummaryInformation = new PHPExcel_Shared_OLE_PPS_File(PHPExcel_Shared_OLE::Asc2Ucs(chr(5) . 'DocumentSummaryInformation')); |
|||
$OLE_DocumentSummaryInformation->append($this->_documentSummaryInformation); |
|||
} |
|||
|
|||
$this->_summaryInformation = $this->_writeSummaryInformation(); |
|||
// initialize OLE Summary Information |
|||
if(isset($this->_summaryInformation) && !empty($this->_summaryInformation)){ |
|||
$OLE_SummaryInformation = new PHPExcel_Shared_OLE_PPS_File(PHPExcel_Shared_OLE::Asc2Ucs(chr(5) . 'SummaryInformation')); |
|||
$OLE_SummaryInformation->append($this->_summaryInformation); |
|||
} |
|||
|
|||
// define OLE Parts |
|||
$arrRootData = array($OLE); |
|||
// initialize OLE Properties file |
|||
if(isset($OLE_SummaryInformation)){ |
|||
$arrRootData[] = $OLE_SummaryInformation; |
|||
} |
|||
// initialize OLE Extended Properties file |
|||
if(isset($OLE_DocumentSummaryInformation)){ |
|||
$arrRootData[] = $OLE_DocumentSummaryInformation; |
|||
} |
|||
|
|||
$root = new PHPExcel_Shared_OLE_PPS_Root(time(), time(), $arrRootData); |
|||
// save the OLE file |
|||
$res = $root->save($pFilename); |
|||
|
|||
PHPExcel_Calculation_Functions::setReturnDateType($saveDateReturnType); |
|||
PHPExcel_Calculation::getInstance($this->_phpExcel)->getDebugLog()->setWriteDebugLog($saveDebugLog); |
|||
} |
|||
|
|||
/** |
|||
* Set temporary storage directory |
|||
* |
|||
* @deprecated |
|||
* @param string $pValue Temporary storage directory |
|||
* @throws PHPExcel_Writer_Exception when directory does not exist |
|||
* @return PHPExcel_Writer_Excel5 |
|||
*/ |
|||
public function setTempDir($pValue = '') { |
|||
return $this; |
|||
} |
|||
|
|||
/** |
|||
* Build the Worksheet Escher objects |
|||
* |
|||
*/ |
|||
private function _buildWorksheetEschers() |
|||
{ |
|||
// 1-based index to BstoreContainer |
|||
$blipIndex = 0; |
|||
$lastReducedSpId = 0; |
|||
$lastSpId = 0; |
|||
|
|||
foreach ($this->_phpExcel->getAllsheets() as $sheet) { |
|||
// sheet index |
|||
$sheetIndex = $sheet->getParent()->getIndex($sheet); |
|||
|
|||
$escher = null; |
|||
|
|||
// check if there are any shapes for this sheet |
|||
$filterRange = $sheet->getAutoFilter()->getRange(); |
|||
if (count($sheet->getDrawingCollection()) == 0 && empty($filterRange)) { |
|||
continue; |
|||
} |
|||
|
|||
// create intermediate Escher object |
|||
$escher = new PHPExcel_Shared_Escher(); |
|||
|
|||
// dgContainer |
|||
$dgContainer = new PHPExcel_Shared_Escher_DgContainer(); |
|||
|
|||
// set the drawing index (we use sheet index + 1) |
|||
$dgId = $sheet->getParent()->getIndex($sheet) + 1; |
|||
$dgContainer->setDgId($dgId); |
|||
$escher->setDgContainer($dgContainer); |
|||
|
|||
// spgrContainer |
|||
$spgrContainer = new PHPExcel_Shared_Escher_DgContainer_SpgrContainer(); |
|||
$dgContainer->setSpgrContainer($spgrContainer); |
|||
|
|||
// add one shape which is the group shape |
|||
$spContainer = new PHPExcel_Shared_Escher_DgContainer_SpgrContainer_SpContainer(); |
|||
$spContainer->setSpgr(true); |
|||
$spContainer->setSpType(0); |
|||
$spContainer->setSpId(($sheet->getParent()->getIndex($sheet) + 1) << 10); |
|||
$spgrContainer->addChild($spContainer); |
|||
|
|||
// add the shapes |
|||
|
|||
$countShapes[$sheetIndex] = 0; // count number of shapes (minus group shape), in sheet |
|||
|
|||
foreach ($sheet->getDrawingCollection() as $drawing) { |
|||
++$blipIndex; |
|||
|
|||
++$countShapes[$sheetIndex]; |
|||
|
|||
// add the shape |
|||
$spContainer = new PHPExcel_Shared_Escher_DgContainer_SpgrContainer_SpContainer(); |
|||
|
|||
// set the shape type |
|||
$spContainer->setSpType(0x004B); |
|||
// set the shape flag |
|||
$spContainer->setSpFlag(0x02); |
|||
|
|||
// set the shape index (we combine 1-based sheet index and $countShapes to create unique shape index) |
|||
$reducedSpId = $countShapes[$sheetIndex]; |
|||
$spId = $reducedSpId |
|||
| ($sheet->getParent()->getIndex($sheet) + 1) << 10; |
|||
$spContainer->setSpId($spId); |
|||
|
|||
// keep track of last reducedSpId |
|||
$lastReducedSpId = $reducedSpId; |
|||
|
|||
// keep track of last spId |
|||
$lastSpId = $spId; |
|||
|
|||
// set the BLIP index |
|||
$spContainer->setOPT(0x4104, $blipIndex); |
|||
|
|||
// set coordinates and offsets, client anchor |
|||
$coordinates = $drawing->getCoordinates(); |
|||
$offsetX = $drawing->getOffsetX(); |
|||
$offsetY = $drawing->getOffsetY(); |
|||
$width = $drawing->getWidth(); |
|||
$height = $drawing->getHeight(); |
|||
|
|||
$twoAnchor = PHPExcel_Shared_Excel5::oneAnchor2twoAnchor($sheet, $coordinates, $offsetX, $offsetY, $width, $height); |
|||
|
|||
$spContainer->setStartCoordinates($twoAnchor['startCoordinates']); |
|||
$spContainer->setStartOffsetX($twoAnchor['startOffsetX']); |
|||
$spContainer->setStartOffsetY($twoAnchor['startOffsetY']); |
|||
$spContainer->setEndCoordinates($twoAnchor['endCoordinates']); |
|||
$spContainer->setEndOffsetX($twoAnchor['endOffsetX']); |
|||
$spContainer->setEndOffsetY($twoAnchor['endOffsetY']); |
|||
|
|||
$spgrContainer->addChild($spContainer); |
|||
} |
|||
|
|||
// AutoFilters |
|||
if(!empty($filterRange)){ |
|||
$rangeBounds = PHPExcel_Cell::rangeBoundaries($filterRange); |
|||
$iNumColStart = $rangeBounds[0][0]; |
|||
$iNumColEnd = $rangeBounds[1][0]; |
|||
|
|||
$iInc = $iNumColStart; |
|||
while($iInc <= $iNumColEnd){ |
|||
++$countShapes[$sheetIndex]; |
|||
|
|||
// create an Drawing Object for the dropdown |
|||
$oDrawing = new PHPExcel_Worksheet_BaseDrawing(); |
|||
// get the coordinates of drawing |
|||
$cDrawing = PHPExcel_Cell::stringFromColumnIndex($iInc - 1) . $rangeBounds[0][1]; |
|||
$oDrawing->setCoordinates($cDrawing); |
|||
$oDrawing->setWorksheet($sheet); |
|||
|
|||
// add the shape |
|||
$spContainer = new PHPExcel_Shared_Escher_DgContainer_SpgrContainer_SpContainer(); |
|||
// set the shape type |
|||
$spContainer->setSpType(0x00C9); |
|||
// set the shape flag |
|||
$spContainer->setSpFlag(0x01); |
|||
|
|||
// set the shape index (we combine 1-based sheet index and $countShapes to create unique shape index) |
|||
$reducedSpId = $countShapes[$sheetIndex]; |
|||
$spId = $reducedSpId |
|||
| ($sheet->getParent()->getIndex($sheet) + 1) << 10; |
|||
$spContainer->setSpId($spId); |
|||
|
|||
// keep track of last reducedSpId |
|||
$lastReducedSpId = $reducedSpId; |
|||
|
|||
// keep track of last spId |
|||
$lastSpId = $spId; |
|||
|
|||
$spContainer->setOPT(0x007F, 0x01040104); // Protection -> fLockAgainstGrouping |
|||
$spContainer->setOPT(0x00BF, 0x00080008); // Text -> fFitTextToShape |
|||
$spContainer->setOPT(0x01BF, 0x00010000); // Fill Style -> fNoFillHitTest |
|||
$spContainer->setOPT(0x01FF, 0x00080000); // Line Style -> fNoLineDrawDash |
|||
$spContainer->setOPT(0x03BF, 0x000A0000); // Group Shape -> fPrint |
|||
|
|||
// set coordinates and offsets, client anchor |
|||
$endCoordinates = PHPExcel_Cell::stringFromColumnIndex(PHPExcel_Cell::stringFromColumnIndex($iInc - 1)); |
|||
$endCoordinates .= $rangeBounds[0][1] + 1; |
|||
|
|||
$spContainer->setStartCoordinates($cDrawing); |
|||
$spContainer->setStartOffsetX(0); |
|||
$spContainer->setStartOffsetY(0); |
|||
$spContainer->setEndCoordinates($endCoordinates); |
|||
$spContainer->setEndOffsetX(0); |
|||
$spContainer->setEndOffsetY(0); |
|||
|
|||
$spgrContainer->addChild($spContainer); |
|||
$iInc++; |
|||
} |
|||
} |
|||
|
|||
// identifier clusters, used for workbook Escher object |
|||
$this->_IDCLs[$dgId] = $lastReducedSpId; |
|||
|
|||
// set last shape index |
|||
$dgContainer->setLastSpId($lastSpId); |
|||
|
|||
// set the Escher object |
|||
$this->_writerWorksheets[$sheetIndex]->setEscher($escher); |
|||
} |
|||
} |
|||
|
|||
/** |
|||
* Build the Escher object corresponding to the MSODRAWINGGROUP record |
|||
*/ |
|||
private function _buildWorkbookEscher() |
|||
{ |
|||
$escher = null; |
|||
|
|||
// any drawings in this workbook? |
|||
$found = false; |
|||
foreach ($this->_phpExcel->getAllSheets() as $sheet) { |
|||
if (count($sheet->getDrawingCollection()) > 0) { |
|||
$found = true; |
|||
break; |
|||
} |
|||
} |
|||
|
|||
// nothing to do if there are no drawings |
|||
if (!$found) { |
|||
return; |
|||
} |
|||
|
|||
// if we reach here, then there are drawings in the workbook |
|||
$escher = new PHPExcel_Shared_Escher(); |
|||
|
|||
// dggContainer |
|||
$dggContainer = new PHPExcel_Shared_Escher_DggContainer(); |
|||
$escher->setDggContainer($dggContainer); |
|||
|
|||
// set IDCLs (identifier clusters) |
|||
$dggContainer->setIDCLs($this->_IDCLs); |
|||
|
|||
// this loop is for determining maximum shape identifier of all drawing |
|||
$spIdMax = 0; |
|||
$totalCountShapes = 0; |
|||
$countDrawings = 0; |
|||
|
|||
foreach ($this->_phpExcel->getAllsheets() as $sheet) { |
|||
$sheetCountShapes = 0; // count number of shapes (minus group shape), in sheet |
|||
|
|||
if (count($sheet->getDrawingCollection()) > 0) { |
|||
++$countDrawings; |
|||
|
|||
foreach ($sheet->getDrawingCollection() as $drawing) { |
|||
++$sheetCountShapes; |
|||
++$totalCountShapes; |
|||
|
|||
$spId = $sheetCountShapes |
|||
| ($this->_phpExcel->getIndex($sheet) + 1) << 10; |
|||
$spIdMax = max($spId, $spIdMax); |
|||
} |
|||
} |
|||
} |
|||
|
|||
$dggContainer->setSpIdMax($spIdMax + 1); |
|||
$dggContainer->setCDgSaved($countDrawings); |
|||
$dggContainer->setCSpSaved($totalCountShapes + $countDrawings); // total number of shapes incl. one group shapes per drawing |
|||
|
|||
// bstoreContainer |
|||
$bstoreContainer = new PHPExcel_Shared_Escher_DggContainer_BstoreContainer(); |
|||
$dggContainer->setBstoreContainer($bstoreContainer); |
|||
|
|||
// the BSE's (all the images) |
|||
foreach ($this->_phpExcel->getAllsheets() as $sheet) { |
|||
foreach ($sheet->getDrawingCollection() as $drawing) { |
|||
if ($drawing instanceof PHPExcel_Worksheet_Drawing) { |
|||
|
|||
$filename = $drawing->getPath(); |
|||
|
|||
list($imagesx, $imagesy, $imageFormat) = getimagesize($filename); |
|||
|
|||
switch ($imageFormat) { |
|||
|
|||
case 1: // GIF, not supported by BIFF8, we convert to PNG |
|||
$blipType = PHPExcel_Shared_Escher_DggContainer_BstoreContainer_BSE::BLIPTYPE_PNG; |
|||
ob_start(); |
|||
imagepng(imagecreatefromgif($filename)); |
|||
$blipData = ob_get_contents(); |
|||
ob_end_clean(); |
|||
break; |
|||
|
|||
case 2: // JPEG |
|||
$blipType = PHPExcel_Shared_Escher_DggContainer_BstoreContainer_BSE::BLIPTYPE_JPEG; |
|||
$blipData = file_get_contents($filename); |
|||
break; |
|||
|
|||
case 3: // PNG |
|||
$blipType = PHPExcel_Shared_Escher_DggContainer_BstoreContainer_BSE::BLIPTYPE_PNG; |
|||
$blipData = file_get_contents($filename); |
|||
break; |
|||
|
|||
case 6: // Windows DIB (BMP), we convert to PNG |
|||
$blipType = PHPExcel_Shared_Escher_DggContainer_BstoreContainer_BSE::BLIPTYPE_PNG; |
|||
ob_start(); |
|||
imagepng(PHPExcel_Shared_Drawing::imagecreatefrombmp($filename)); |
|||
$blipData = ob_get_contents(); |
|||
ob_end_clean(); |
|||
break; |
|||
|
|||
default: continue 2; |
|||
|
|||
} |
|||
|
|||
$blip = new PHPExcel_Shared_Escher_DggContainer_BstoreContainer_BSE_Blip(); |
|||
$blip->setData($blipData); |
|||
|
|||
$BSE = new PHPExcel_Shared_Escher_DggContainer_BstoreContainer_BSE(); |
|||
$BSE->setBlipType($blipType); |
|||
$BSE->setBlip($blip); |
|||
|
|||
$bstoreContainer->addBSE($BSE); |
|||
|
|||
} else if ($drawing instanceof PHPExcel_Worksheet_MemoryDrawing) { |
|||
|
|||
switch ($drawing->getRenderingFunction()) { |
|||
|
|||
case PHPExcel_Worksheet_MemoryDrawing::RENDERING_JPEG: |
|||
$blipType = PHPExcel_Shared_Escher_DggContainer_BstoreContainer_BSE::BLIPTYPE_JPEG; |
|||
$renderingFunction = 'imagejpeg'; |
|||
break; |
|||
|
|||
case PHPExcel_Worksheet_MemoryDrawing::RENDERING_GIF: |
|||
case PHPExcel_Worksheet_MemoryDrawing::RENDERING_PNG: |
|||
case PHPExcel_Worksheet_MemoryDrawing::RENDERING_DEFAULT: |
|||
$blipType = PHPExcel_Shared_Escher_DggContainer_BstoreContainer_BSE::BLIPTYPE_PNG; |
|||
$renderingFunction = 'imagepng'; |
|||
break; |
|||
|
|||
} |
|||
|
|||
ob_start(); |
|||
call_user_func($renderingFunction, $drawing->getImageResource()); |
|||
$blipData = ob_get_contents(); |
|||
ob_end_clean(); |
|||
|
|||
$blip = new PHPExcel_Shared_Escher_DggContainer_BstoreContainer_BSE_Blip(); |
|||
$blip->setData($blipData); |
|||
|
|||
$BSE = new PHPExcel_Shared_Escher_DggContainer_BstoreContainer_BSE(); |
|||
$BSE->setBlipType($blipType); |
|||
$BSE->setBlip($blip); |
|||
|
|||
$bstoreContainer->addBSE($BSE); |
|||
} |
|||
} |
|||
} |
|||
|
|||
// Set the Escher object |
|||
$this->_writerWorkbook->setEscher($escher); |
|||
} |
|||
|
|||
/** |
|||
* Build the OLE Part for DocumentSummary Information |
|||
* @return string |
|||
*/ |
|||
private function _writeDocumentSummaryInformation(){ |
|||
|
|||
// offset: 0; size: 2; must be 0xFE 0xFF (UTF-16 LE byte order mark) |
|||
$data = pack('v', 0xFFFE); |
|||
// offset: 2; size: 2; |
|||
$data .= pack('v', 0x0000); |
|||
// offset: 4; size: 2; OS version |
|||
$data .= pack('v', 0x0106); |
|||
// offset: 6; size: 2; OS indicator |
|||
$data .= pack('v', 0x0002); |
|||
// offset: 8; size: 16 |
|||
$data .= pack('VVVV', 0x00, 0x00, 0x00, 0x00); |
|||
// offset: 24; size: 4; section count |
|||
$data .= pack('V', 0x0001); |
|||
|
|||
// offset: 28; size: 16; first section's class id: 02 d5 cd d5 9c 2e 1b 10 93 97 08 00 2b 2c f9 ae |
|||
$data .= pack('vvvvvvvv', 0xD502, 0xD5CD, 0x2E9C, 0x101B, 0x9793, 0x0008, 0x2C2B, 0xAEF9); |
|||
// offset: 44; size: 4; offset of the start |
|||
$data .= pack('V', 0x30); |
|||
|
|||
// SECTION |
|||
$dataSection = array(); |
|||
$dataSection_NumProps = 0; |
|||
$dataSection_Summary = ''; |
|||
$dataSection_Content = ''; |
|||
|
|||
// GKPIDDSI_CODEPAGE: CodePage |
|||
$dataSection[] = array('summary'=> array('pack' => 'V', 'data' => 0x01), |
|||
'offset' => array('pack' => 'V'), |
|||
'type' => array('pack' => 'V', 'data' => 0x02), // 2 byte signed integer |
|||
'data' => array('data' => 1252)); |
|||
$dataSection_NumProps++; |
|||
|
|||
// GKPIDDSI_CATEGORY : Category |
|||
if($this->_phpExcel->getProperties()->getCategory()){ |
|||
$dataProp = $this->_phpExcel->getProperties()->getCategory(); |
|||
$dataSection[] = array('summary'=> array('pack' => 'V', 'data' => 0x02), |
|||
'offset' => array('pack' => 'V'), |
|||
'type' => array('pack' => 'V', 'data' => 0x1E), |
|||
'data' => array('data' => $dataProp, 'length' => strlen($dataProp))); |
|||
$dataSection_NumProps++; |
|||
} |
|||
// GKPIDDSI_VERSION :Version of the application that wrote the property storage |
|||
$dataSection[] = array('summary'=> array('pack' => 'V', 'data' => 0x17), |
|||
'offset' => array('pack' => 'V'), |
|||
'type' => array('pack' => 'V', 'data' => 0x03), |
|||
'data' => array('pack' => 'V', 'data' => 0x000C0000)); |
|||
$dataSection_NumProps++; |
|||
// GKPIDDSI_SCALE : FALSE |
|||
$dataSection[] = array('summary'=> array('pack' => 'V', 'data' => 0x0B), |
|||
'offset' => array('pack' => 'V'), |
|||
'type' => array('pack' => 'V', 'data' => 0x0B), |
|||
'data' => array('data' => false)); |
|||
$dataSection_NumProps++; |
|||
// GKPIDDSI_LINKSDIRTY : True if any of the values for the linked properties have changed outside of the application |
|||
$dataSection[] = array('summary'=> array('pack' => 'V', 'data' => 0x10), |
|||
'offset' => array('pack' => 'V'), |
|||
'type' => array('pack' => 'V', 'data' => 0x0B), |
|||
'data' => array('data' => false)); |
|||
$dataSection_NumProps++; |
|||
// GKPIDDSI_SHAREDOC : FALSE |
|||
$dataSection[] = array('summary'=> array('pack' => 'V', 'data' => 0x13), |
|||
'offset' => array('pack' => 'V'), |
|||
'type' => array('pack' => 'V', 'data' => 0x0B), |
|||
'data' => array('data' => false)); |
|||
$dataSection_NumProps++; |
|||
// GKPIDDSI_HYPERLINKSCHANGED : True if any of the values for the _PID_LINKS (hyperlink text) have changed outside of the application |
|||
$dataSection[] = array('summary'=> array('pack' => 'V', 'data' => 0x16), |
|||
'offset' => array('pack' => 'V'), |
|||
'type' => array('pack' => 'V', 'data' => 0x0B), |
|||
'data' => array('data' => false)); |
|||
$dataSection_NumProps++; |
|||
|
|||
// GKPIDDSI_DOCSPARTS |
|||
// MS-OSHARED p75 (2.3.3.2.2.1) |
|||
// Structure is VtVecUnalignedLpstrValue (2.3.3.1.9) |
|||
// cElements |
|||
$dataProp = pack('v', 0x0001); |
|||
$dataProp .= pack('v', 0x0000); |
|||
// array of UnalignedLpstr |
|||
// cch |
|||
$dataProp .= pack('v', 0x000A); |
|||
$dataProp .= pack('v', 0x0000); |
|||
// value |
|||
$dataProp .= 'Worksheet'.chr(0); |
|||
|
|||
$dataSection[] = array('summary'=> array('pack' => 'V', 'data' => 0x0D), |
|||
'offset' => array('pack' => 'V'), |
|||
'type' => array('pack' => 'V', 'data' => 0x101E), |
|||
'data' => array('data' => $dataProp, 'length' => strlen($dataProp))); |
|||
$dataSection_NumProps++; |
|||
|
|||
// GKPIDDSI_HEADINGPAIR |
|||
// VtVecHeadingPairValue |
|||
// cElements |
|||
$dataProp = pack('v', 0x0002); |
|||
$dataProp .= pack('v', 0x0000); |
|||
// Array of vtHeadingPair |
|||
// vtUnalignedString - headingString |
|||
// stringType |
|||
$dataProp .= pack('v', 0x001E); |
|||
// padding |
|||
$dataProp .= pack('v', 0x0000); |
|||
// UnalignedLpstr |
|||
// cch |
|||
$dataProp .= pack('v', 0x0013); |
|||
$dataProp .= pack('v', 0x0000); |
|||
// value |
|||
$dataProp .= 'Feuilles de calcul'; |
|||
// vtUnalignedString - headingParts |
|||
// wType : 0x0003 = 32 bit signed integer |
|||
$dataProp .= pack('v', 0x0300); |
|||
// padding |
|||
$dataProp .= pack('v', 0x0000); |
|||
// value |
|||
$dataProp .= pack('v', 0x0100); |
|||
$dataProp .= pack('v', 0x0000); |
|||
$dataProp .= pack('v', 0x0000); |
|||
$dataProp .= pack('v', 0x0000); |
|||
|
|||
$dataSection[] = array('summary'=> array('pack' => 'V', 'data' => 0x0C), |
|||
'offset' => array('pack' => 'V'), |
|||
'type' => array('pack' => 'V', 'data' => 0x100C), |
|||
'data' => array('data' => $dataProp, 'length' => strlen($dataProp))); |
|||
$dataSection_NumProps++; |
|||
|
|||
// 4 Section Length |
|||
// 4 Property count |
|||
// 8 * $dataSection_NumProps (8 = ID (4) + OffSet(4)) |
|||
$dataSection_Content_Offset = 8 + $dataSection_NumProps * 8; |
|||
foreach ($dataSection as $dataProp){ |
|||
// Summary |
|||
$dataSection_Summary .= pack($dataProp['summary']['pack'], $dataProp['summary']['data']); |
|||
// Offset |
|||
$dataSection_Summary .= pack($dataProp['offset']['pack'], $dataSection_Content_Offset); |
|||
// DataType |
|||
$dataSection_Content .= pack($dataProp['type']['pack'], $dataProp['type']['data']); |
|||
// Data |
|||
if($dataProp['type']['data'] == 0x02){ // 2 byte signed integer |
|||
$dataSection_Content .= pack('V', $dataProp['data']['data']); |
|||
|
|||
$dataSection_Content_Offset += 4 + 4; |
|||
} |
|||
elseif($dataProp['type']['data'] == 0x03){ // 4 byte signed integer |
|||
$dataSection_Content .= pack('V', $dataProp['data']['data']); |
|||
|
|||
$dataSection_Content_Offset += 4 + 4; |
|||
} |
|||
elseif($dataProp['type']['data'] == 0x0B){ // Boolean |
|||
if($dataProp['data']['data'] == false){ |
|||
$dataSection_Content .= pack('V', 0x0000); |
|||
} else { |
|||
$dataSection_Content .= pack('V', 0x0001); |
|||
} |
|||
$dataSection_Content_Offset += 4 + 4; |
|||
} |
|||
elseif($dataProp['type']['data'] == 0x1E){ // null-terminated string prepended by dword string length |
|||
// Null-terminated string |
|||
$dataProp['data']['data'] .= chr(0); |
|||
$dataProp['data']['length'] += 1; |
|||
// Complete the string with null string for being a %4 |
|||
$dataProp['data']['length'] = $dataProp['data']['length'] + ((4 - $dataProp['data']['length'] % 4)==4 ? 0 : (4 - $dataProp['data']['length'] % 4)); |
|||
$dataProp['data']['data'] = str_pad($dataProp['data']['data'], $dataProp['data']['length'], chr(0), STR_PAD_RIGHT); |
|||
|
|||
$dataSection_Content .= pack('V', $dataProp['data']['length']); |
|||
$dataSection_Content .= $dataProp['data']['data']; |
|||
|
|||
$dataSection_Content_Offset += 4 + 4 + strlen($dataProp['data']['data']); |
|||
} |
|||
elseif($dataProp['type']['data'] == 0x40){ // Filetime (64-bit value representing the number of 100-nanosecond intervals since January 1, 1601) |
|||
$dataSection_Content .= $dataProp['data']['data']; |
|||
|
|||
$dataSection_Content_Offset += 4 + 8; |
|||
} |
|||
else { |
|||
// Data Type Not Used at the moment |
|||
$dataSection_Content .= $dataProp['data']['data']; |
|||
|
|||
$dataSection_Content_Offset += 4 + $dataProp['data']['length']; |
|||
} |
|||
} |
|||
// Now $dataSection_Content_Offset contains the size of the content |
|||
|
|||
// section header |
|||
// offset: $secOffset; size: 4; section length |
|||
// + x Size of the content (summary + content) |
|||
$data .= pack('V', $dataSection_Content_Offset); |
|||
// offset: $secOffset+4; size: 4; property count |
|||
$data .= pack('V', $dataSection_NumProps); |
|||
// Section Summary |
|||
$data .= $dataSection_Summary; |
|||
// Section Content |
|||
$data .= $dataSection_Content; |
|||
|
|||
return $data; |
|||
} |
|||
|
|||
/** |
|||
* Build the OLE Part for Summary Information |
|||
* @return string |
|||
*/ |
|||
private function _writeSummaryInformation(){ |
|||
// offset: 0; size: 2; must be 0xFE 0xFF (UTF-16 LE byte order mark) |
|||
$data = pack('v', 0xFFFE); |
|||
// offset: 2; size: 2; |
|||
$data .= pack('v', 0x0000); |
|||
// offset: 4; size: 2; OS version |
|||
$data .= pack('v', 0x0106); |
|||
// offset: 6; size: 2; OS indicator |
|||
$data .= pack('v', 0x0002); |
|||
// offset: 8; size: 16 |
|||
$data .= pack('VVVV', 0x00, 0x00, 0x00, 0x00); |
|||
// offset: 24; size: 4; section count |
|||
$data .= pack('V', 0x0001); |
|||
|
|||
// offset: 28; size: 16; first section's class id: e0 85 9f f2 f9 4f 68 10 ab 91 08 00 2b 27 b3 d9 |
|||
$data .= pack('vvvvvvvv', 0x85E0, 0xF29F, 0x4FF9, 0x1068, 0x91AB, 0x0008, 0x272B, 0xD9B3); |
|||
// offset: 44; size: 4; offset of the start |
|||
$data .= pack('V', 0x30); |
|||
|
|||
// SECTION |
|||
$dataSection = array(); |
|||
$dataSection_NumProps = 0; |
|||
$dataSection_Summary = ''; |
|||
$dataSection_Content = ''; |
|||
|
|||
// CodePage : CP-1252 |
|||
$dataSection[] = array('summary'=> array('pack' => 'V', 'data' => 0x01), |
|||
'offset' => array('pack' => 'V'), |
|||
'type' => array('pack' => 'V', 'data' => 0x02), // 2 byte signed integer |
|||
'data' => array('data' => 1252)); |
|||
$dataSection_NumProps++; |
|||
|
|||
// Title |
|||
if($this->_phpExcel->getProperties()->getTitle()){ |
|||
$dataProp = $this->_phpExcel->getProperties()->getTitle(); |
|||
$dataSection[] = array('summary'=> array('pack' => 'V', 'data' => 0x02), |
|||
'offset' => array('pack' => 'V'), |
|||
'type' => array('pack' => 'V', 'data' => 0x1E), // null-terminated string prepended by dword string length |
|||
'data' => array('data' => $dataProp, 'length' => strlen($dataProp))); |
|||
$dataSection_NumProps++; |
|||
} |
|||
// Subject |
|||
if($this->_phpExcel->getProperties()->getSubject()){ |
|||
$dataProp = $this->_phpExcel->getProperties()->getSubject(); |
|||
$dataSection[] = array('summary'=> array('pack' => 'V', 'data' => 0x03), |
|||
'offset' => array('pack' => 'V'), |
|||
'type' => array('pack' => 'V', 'data' => 0x1E), // null-terminated string prepended by dword string length |
|||
'data' => array('data' => $dataProp, 'length' => strlen($dataProp))); |
|||
$dataSection_NumProps++; |
|||
} |
|||
// Author (Creator) |
|||
if($this->_phpExcel->getProperties()->getCreator()){ |
|||
$dataProp = $this->_phpExcel->getProperties()->getCreator(); |
|||
$dataSection[] = array('summary'=> array('pack' => 'V', 'data' => 0x04), |
|||
'offset' => array('pack' => 'V'), |
|||
'type' => array('pack' => 'V', 'data' => 0x1E), // null-terminated string prepended by dword string length |
|||
'data' => array('data' => $dataProp, 'length' => strlen($dataProp))); |
|||
$dataSection_NumProps++; |
|||
} |
|||
// Keywords |
|||
if($this->_phpExcel->getProperties()->getKeywords()){ |
|||
$dataProp = $this->_phpExcel->getProperties()->getKeywords(); |
|||
$dataSection[] = array('summary'=> array('pack' => 'V', 'data' => 0x05), |
|||
'offset' => array('pack' => 'V'), |
|||
'type' => array('pack' => 'V', 'data' => 0x1E), // null-terminated string prepended by dword string length |
|||
'data' => array('data' => $dataProp, 'length' => strlen($dataProp))); |
|||
$dataSection_NumProps++; |
|||
} |
|||
// Comments (Description) |
|||
if($this->_phpExcel->getProperties()->getDescription()){ |
|||
$dataProp = $this->_phpExcel->getProperties()->getDescription(); |
|||
$dataSection[] = array('summary'=> array('pack' => 'V', 'data' => 0x06), |
|||
'offset' => array('pack' => 'V'), |
|||
'type' => array('pack' => 'V', 'data' => 0x1E), // null-terminated string prepended by dword string length |
|||
'data' => array('data' => $dataProp, 'length' => strlen($dataProp))); |
|||
$dataSection_NumProps++; |
|||
} |
|||
// Last Saved By (LastModifiedBy) |
|||
if($this->_phpExcel->getProperties()->getLastModifiedBy()){ |
|||
$dataProp = $this->_phpExcel->getProperties()->getLastModifiedBy(); |
|||
$dataSection[] = array('summary'=> array('pack' => 'V', 'data' => 0x08), |
|||
'offset' => array('pack' => 'V'), |
|||
'type' => array('pack' => 'V', 'data' => 0x1E), // null-terminated string prepended by dword string length |
|||
'data' => array('data' => $dataProp, 'length' => strlen($dataProp))); |
|||
$dataSection_NumProps++; |
|||
} |
|||
// Created Date/Time |
|||
if($this->_phpExcel->getProperties()->getCreated()){ |
|||
$dataProp = $this->_phpExcel->getProperties()->getCreated(); |
|||
$dataSection[] = array('summary'=> array('pack' => 'V', 'data' => 0x0C), |
|||
'offset' => array('pack' => 'V'), |
|||
'type' => array('pack' => 'V', 'data' => 0x40), // Filetime (64-bit value representing the number of 100-nanosecond intervals since January 1, 1601) |
|||
'data' => array('data' => PHPExcel_Shared_OLE::LocalDate2OLE($dataProp))); |
|||
$dataSection_NumProps++; |
|||
} |
|||
// Modified Date/Time |
|||
if($this->_phpExcel->getProperties()->getModified()){ |
|||
$dataProp = $this->_phpExcel->getProperties()->getModified(); |
|||
$dataSection[] = array('summary'=> array('pack' => 'V', 'data' => 0x0D), |
|||
'offset' => array('pack' => 'V'), |
|||
'type' => array('pack' => 'V', 'data' => 0x40), // Filetime (64-bit value representing the number of 100-nanosecond intervals since January 1, 1601) |
|||
'data' => array('data' => PHPExcel_Shared_OLE::LocalDate2OLE($dataProp))); |
|||
$dataSection_NumProps++; |
|||
} |
|||
// Security |
|||
$dataSection[] = array('summary'=> array('pack' => 'V', 'data' => 0x13), |
|||
'offset' => array('pack' => 'V'), |
|||
'type' => array('pack' => 'V', 'data' => 0x03), // 4 byte signed integer |
|||
'data' => array('data' => 0x00)); |
|||
$dataSection_NumProps++; |
|||
|
|||
|
|||
// 4 Section Length |
|||
// 4 Property count |
|||
// 8 * $dataSection_NumProps (8 = ID (4) + OffSet(4)) |
|||
$dataSection_Content_Offset = 8 + $dataSection_NumProps * 8; |
|||
foreach ($dataSection as $dataProp){ |
|||
// Summary |
|||
$dataSection_Summary .= pack($dataProp['summary']['pack'], $dataProp['summary']['data']); |
|||
// Offset |
|||
$dataSection_Summary .= pack($dataProp['offset']['pack'], $dataSection_Content_Offset); |
|||
// DataType |
|||
$dataSection_Content .= pack($dataProp['type']['pack'], $dataProp['type']['data']); |
|||
// Data |
|||
if($dataProp['type']['data'] == 0x02){ // 2 byte signed integer |
|||
$dataSection_Content .= pack('V', $dataProp['data']['data']); |
|||
|
|||
$dataSection_Content_Offset += 4 + 4; |
|||
} |
|||
elseif($dataProp['type']['data'] == 0x03){ // 4 byte signed integer |
|||
$dataSection_Content .= pack('V', $dataProp['data']['data']); |
|||
|
|||
$dataSection_Content_Offset += 4 + 4; |
|||
} |
|||
elseif($dataProp['type']['data'] == 0x1E){ // null-terminated string prepended by dword string length |
|||
// Null-terminated string |
|||
$dataProp['data']['data'] .= chr(0); |
|||
$dataProp['data']['length'] += 1; |
|||
// Complete the string with null string for being a %4 |
|||
$dataProp['data']['length'] = $dataProp['data']['length'] + ((4 - $dataProp['data']['length'] % 4)==4 ? 0 : (4 - $dataProp['data']['length'] % 4)); |
|||
$dataProp['data']['data'] = str_pad($dataProp['data']['data'], $dataProp['data']['length'], chr(0), STR_PAD_RIGHT); |
|||
|
|||
$dataSection_Content .= pack('V', $dataProp['data']['length']); |
|||
$dataSection_Content .= $dataProp['data']['data']; |
|||
|
|||
$dataSection_Content_Offset += 4 + 4 + strlen($dataProp['data']['data']); |
|||
} |
|||
elseif($dataProp['type']['data'] == 0x40){ // Filetime (64-bit value representing the number of 100-nanosecond intervals since January 1, 1601) |
|||
$dataSection_Content .= $dataProp['data']['data']; |
|||
|
|||
$dataSection_Content_Offset += 4 + 8; |
|||
} |
|||
else { |
|||
// Data Type Not Used at the moment |
|||
} |
|||
} |
|||
// Now $dataSection_Content_Offset contains the size of the content |
|||
|
|||
// section header |
|||
// offset: $secOffset; size: 4; section length |
|||
// + x Size of the content (summary + content) |
|||
$data .= pack('V', $dataSection_Content_Offset); |
|||
// offset: $secOffset+4; size: 4; property count |
|||
$data .= pack('V', $dataSection_NumProps); |
|||
// Section Summary |
|||
$data .= $dataSection_Summary; |
|||
// Section Content |
|||
$data .= $dataSection_Content; |
|||
|
|||
return $data; |
|||
} |
|||
} |
|||
@ -0,0 +1,537 @@ |
|||
<?php |
|||
/** |
|||
* PHPExcel |
|||
* |
|||
* Copyright (c) 2006 - 2013 PHPExcel |
|||
* |
|||
* This library is free software; you can redistribute it and/or |
|||
* modify it under the terms of the GNU Lesser General Public |
|||
* License as published by the Free Software Foundation; either |
|||
* version 2.1 of the License, or (at your option) any later version. |
|||
* |
|||
* This library is distributed in the hope that it will be useful, |
|||
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
|||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
|||
* Lesser General Public License for more details. |
|||
* |
|||
* You should have received a copy of the GNU Lesser General Public |
|||
* License along with this library; if not, write to the Free Software |
|||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA |
|||
* |
|||
* @category PHPExcel |
|||
* @package PHPExcel_Writer_Excel5 |
|||
* @copyright Copyright (c) 2006 - 2013 PHPExcel (http://www.codeplex.com/PHPExcel) |
|||
* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL |
|||
* @version 1.7.9, 2013-06-02 |
|||
*/ |
|||
|
|||
|
|||
/** |
|||
* PHPExcel_Shared_Escher_DggContainer_BstoreContainer |
|||
* |
|||
* @category PHPExcel |
|||
* @package PHPExcel_Writer_Excel5 |
|||
* @copyright Copyright (c) 2006 - 2013 PHPExcel (http://www.codeplex.com/PHPExcel) |
|||
*/ |
|||
class PHPExcel_Writer_Excel5_Escher |
|||
{ |
|||
/** |
|||
* The object we are writing |
|||
*/ |
|||
private $_object; |
|||
|
|||
/** |
|||
* The written binary data |
|||
*/ |
|||
private $_data; |
|||
|
|||
/** |
|||
* Shape offsets. Positions in binary stream where a new shape record begins |
|||
* |
|||
* @var array |
|||
*/ |
|||
private $_spOffsets; |
|||
|
|||
/** |
|||
* Shape types. |
|||
* |
|||
* @var array |
|||
*/ |
|||
private $_spTypes; |
|||
|
|||
/** |
|||
* Constructor |
|||
* |
|||
* @param mixed |
|||
*/ |
|||
public function __construct($object) |
|||
{ |
|||
$this->_object = $object; |
|||
} |
|||
|
|||
/** |
|||
* Process the object to be written |
|||
*/ |
|||
public function close() |
|||
{ |
|||
// initialize |
|||
$this->_data = ''; |
|||
|
|||
switch (get_class($this->_object)) { |
|||
|
|||
case 'PHPExcel_Shared_Escher': |
|||
if ($dggContainer = $this->_object->getDggContainer()) { |
|||
$writer = new PHPExcel_Writer_Excel5_Escher($dggContainer); |
|||
$this->_data = $writer->close(); |
|||
} else if ($dgContainer = $this->_object->getDgContainer()) { |
|||
$writer = new PHPExcel_Writer_Excel5_Escher($dgContainer); |
|||
$this->_data = $writer->close(); |
|||
$this->_spOffsets = $writer->getSpOffsets(); |
|||
$this->_spTypes = $writer->getSpTypes(); |
|||
} |
|||
break; |
|||
|
|||
case 'PHPExcel_Shared_Escher_DggContainer': |
|||
// this is a container record |
|||
|
|||
// initialize |
|||
$innerData = ''; |
|||
|
|||
// write the dgg |
|||
$recVer = 0x0; |
|||
$recInstance = 0x0000; |
|||
$recType = 0xF006; |
|||
|
|||
$recVerInstance = $recVer; |
|||
$recVerInstance |= $recInstance << 4; |
|||
|
|||
// dgg data |
|||
$dggData = |
|||
pack('VVVV' |
|||
, $this->_object->getSpIdMax() // maximum shape identifier increased by one |
|||
, $this->_object->getCDgSaved() + 1 // number of file identifier clusters increased by one |
|||
, $this->_object->getCSpSaved() |
|||
, $this->_object->getCDgSaved() // count total number of drawings saved |
|||
); |
|||
|
|||
// add file identifier clusters (one per drawing) |
|||
$IDCLs = $this->_object->getIDCLs(); |
|||
|
|||
foreach ($IDCLs as $dgId => $maxReducedSpId) { |
|||
$dggData .= pack('VV', $dgId, $maxReducedSpId + 1); |
|||
} |
|||
|
|||
$header = pack('vvV', $recVerInstance, $recType, strlen($dggData)); |
|||
$innerData .= $header . $dggData; |
|||
|
|||
// write the bstoreContainer |
|||
if ($bstoreContainer = $this->_object->getBstoreContainer()) { |
|||
$writer = new PHPExcel_Writer_Excel5_Escher($bstoreContainer); |
|||
$innerData .= $writer->close(); |
|||
} |
|||
|
|||
// write the record |
|||
$recVer = 0xF; |
|||
$recInstance = 0x0000; |
|||
$recType = 0xF000; |
|||
$length = strlen($innerData); |
|||
|
|||
$recVerInstance = $recVer; |
|||
$recVerInstance |= $recInstance << 4; |
|||
|
|||
$header = pack('vvV', $recVerInstance, $recType, $length); |
|||
|
|||
$this->_data = $header . $innerData; |
|||
break; |
|||
|
|||
case 'PHPExcel_Shared_Escher_DggContainer_BstoreContainer': |
|||
// this is a container record |
|||
|
|||
// initialize |
|||
$innerData = ''; |
|||
|
|||
// treat the inner data |
|||
if ($BSECollection = $this->_object->getBSECollection()) { |
|||
foreach ($BSECollection as $BSE) { |
|||
$writer = new PHPExcel_Writer_Excel5_Escher($BSE); |
|||
$innerData .= $writer->close(); |
|||
} |
|||
} |
|||
|
|||
// write the record |
|||
$recVer = 0xF; |
|||
$recInstance = count($this->_object->getBSECollection()); |
|||
$recType = 0xF001; |
|||
$length = strlen($innerData); |
|||
|
|||
$recVerInstance = $recVer; |
|||
$recVerInstance |= $recInstance << 4; |
|||
|
|||
$header = pack('vvV', $recVerInstance, $recType, $length); |
|||
|
|||
$this->_data = $header . $innerData; |
|||
break; |
|||
|
|||
case 'PHPExcel_Shared_Escher_DggContainer_BstoreContainer_BSE': |
|||
// this is a semi-container record |
|||
|
|||
// initialize |
|||
$innerData = ''; |
|||
|
|||
// here we treat the inner data |
|||
if ($blip = $this->_object->getBlip()) { |
|||
$writer = new PHPExcel_Writer_Excel5_Escher($blip); |
|||
$innerData .= $writer->close(); |
|||
} |
|||
|
|||
// initialize |
|||
$data = ''; |
|||
|
|||
$btWin32 = $this->_object->getBlipType(); |
|||
$btMacOS = $this->_object->getBlipType(); |
|||
$data .= pack('CC', $btWin32, $btMacOS); |
|||
|
|||
$rgbUid = pack('VVVV', 0,0,0,0); // todo |
|||
$data .= $rgbUid; |
|||
|
|||
$tag = 0; |
|||
$size = strlen($innerData); |
|||
$cRef = 1; |
|||
$foDelay = 0; //todo |
|||
$unused1 = 0x0; |
|||
$cbName = 0x0; |
|||
$unused2 = 0x0; |
|||
$unused3 = 0x0; |
|||
$data .= pack('vVVVCCCC', $tag, $size, $cRef, $foDelay, $unused1, $cbName, $unused2, $unused3); |
|||
|
|||
$data .= $innerData; |
|||
|
|||
// write the record |
|||
$recVer = 0x2; |
|||
$recInstance = $this->_object->getBlipType(); |
|||
$recType = 0xF007; |
|||
$length = strlen($data); |
|||
|
|||
$recVerInstance = $recVer; |
|||
$recVerInstance |= $recInstance << 4; |
|||
|
|||
$header = pack('vvV', $recVerInstance, $recType, $length); |
|||
|
|||
$this->_data = $header; |
|||
|
|||
$this->_data .= $data; |
|||
break; |
|||
|
|||
case 'PHPExcel_Shared_Escher_DggContainer_BstoreContainer_BSE_Blip': |
|||
// this is an atom record |
|||
|
|||
// write the record |
|||
switch ($this->_object->getParent()->getBlipType()) { |
|||
|
|||
case PHPExcel_Shared_Escher_DggContainer_BstoreContainer_BSE::BLIPTYPE_JPEG: |
|||
// initialize |
|||
$innerData = ''; |
|||
|
|||
$rgbUid1 = pack('VVVV', 0,0,0,0); // todo |
|||
$innerData .= $rgbUid1; |
|||
|
|||
$tag = 0xFF; // todo |
|||
$innerData .= pack('C', $tag); |
|||
|
|||
$innerData .= $this->_object->getData(); |
|||
|
|||
$recVer = 0x0; |
|||
$recInstance = 0x46A; |
|||
$recType = 0xF01D; |
|||
$length = strlen($innerData); |
|||
|
|||
$recVerInstance = $recVer; |
|||
$recVerInstance |= $recInstance << 4; |
|||
|
|||
$header = pack('vvV', $recVerInstance, $recType, $length); |
|||
|
|||
$this->_data = $header; |
|||
|
|||
$this->_data .= $innerData; |
|||
break; |
|||
|
|||
case PHPExcel_Shared_Escher_DggContainer_BstoreContainer_BSE::BLIPTYPE_PNG: |
|||
// initialize |
|||
$innerData = ''; |
|||
|
|||
$rgbUid1 = pack('VVVV', 0,0,0,0); // todo |
|||
$innerData .= $rgbUid1; |
|||
|
|||
$tag = 0xFF; // todo |
|||
$innerData .= pack('C', $tag); |
|||
|
|||
$innerData .= $this->_object->getData(); |
|||
|
|||
$recVer = 0x0; |
|||
$recInstance = 0x6E0; |
|||
$recType = 0xF01E; |
|||
$length = strlen($innerData); |
|||
|
|||
$recVerInstance = $recVer; |
|||
$recVerInstance |= $recInstance << 4; |
|||
|
|||
$header = pack('vvV', $recVerInstance, $recType, $length); |
|||
|
|||
$this->_data = $header; |
|||
|
|||
$this->_data .= $innerData; |
|||
break; |
|||
|
|||
} |
|||
break; |
|||
|
|||
case 'PHPExcel_Shared_Escher_DgContainer': |
|||
// this is a container record |
|||
|
|||
// initialize |
|||
$innerData = ''; |
|||
|
|||
// write the dg |
|||
$recVer = 0x0; |
|||
$recInstance = $this->_object->getDgId(); |
|||
$recType = 0xF008; |
|||
$length = 8; |
|||
|
|||
$recVerInstance = $recVer; |
|||
$recVerInstance |= $recInstance << 4; |
|||
|
|||
$header = pack('vvV', $recVerInstance, $recType, $length); |
|||
|
|||
// number of shapes in this drawing (including group shape) |
|||
$countShapes = count($this->_object->getSpgrContainer()->getChildren()); |
|||
$innerData .= $header . pack('VV', $countShapes, $this->_object->getLastSpId()); |
|||
//$innerData .= $header . pack('VV', 0, 0); |
|||
|
|||
// write the spgrContainer |
|||
if ($spgrContainer = $this->_object->getSpgrContainer()) { |
|||
$writer = new PHPExcel_Writer_Excel5_Escher($spgrContainer); |
|||
$innerData .= $writer->close(); |
|||
|
|||
// get the shape offsets relative to the spgrContainer record |
|||
$spOffsets = $writer->getSpOffsets(); |
|||
$spTypes = $writer->getSpTypes(); |
|||
|
|||
// save the shape offsets relative to dgContainer |
|||
foreach ($spOffsets as & $spOffset) { |
|||
$spOffset += 24; // add length of dgContainer header data (8 bytes) plus dg data (16 bytes) |
|||
} |
|||
|
|||
$this->_spOffsets = $spOffsets; |
|||
$this->_spTypes = $spTypes; |
|||
} |
|||
|
|||
// write the record |
|||
$recVer = 0xF; |
|||
$recInstance = 0x0000; |
|||
$recType = 0xF002; |
|||
$length = strlen($innerData); |
|||
|
|||
$recVerInstance = $recVer; |
|||
$recVerInstance |= $recInstance << 4; |
|||
|
|||
$header = pack('vvV', $recVerInstance, $recType, $length); |
|||
|
|||
$this->_data = $header . $innerData; |
|||
break; |
|||
|
|||
case 'PHPExcel_Shared_Escher_DgContainer_SpgrContainer': |
|||
// this is a container record |
|||
|
|||
// initialize |
|||
$innerData = ''; |
|||
|
|||
// initialize spape offsets |
|||
$totalSize = 8; |
|||
$spOffsets = array(); |
|||
$spTypes = array(); |
|||
|
|||
// treat the inner data |
|||
foreach ($this->_object->getChildren() as $spContainer) { |
|||
$writer = new PHPExcel_Writer_Excel5_Escher($spContainer); |
|||
$spData = $writer->close(); |
|||
$innerData .= $spData; |
|||
|
|||
// save the shape offsets (where new shape records begin) |
|||
$totalSize += strlen($spData); |
|||
$spOffsets[] = $totalSize; |
|||
|
|||
$spTypes = array_merge($spTypes, $writer->getSpTypes()); |
|||
} |
|||
|
|||
// write the record |
|||
$recVer = 0xF; |
|||
$recInstance = 0x0000; |
|||
$recType = 0xF003; |
|||
$length = strlen($innerData); |
|||
|
|||
$recVerInstance = $recVer; |
|||
$recVerInstance |= $recInstance << 4; |
|||
|
|||
$header = pack('vvV', $recVerInstance, $recType, $length); |
|||
|
|||
$this->_data = $header . $innerData; |
|||
$this->_spOffsets = $spOffsets; |
|||
$this->_spTypes = $spTypes; |
|||
break; |
|||
|
|||
case 'PHPExcel_Shared_Escher_DgContainer_SpgrContainer_SpContainer': |
|||
// initialize |
|||
$data = ''; |
|||
|
|||
// build the data |
|||
|
|||
// write group shape record, if necessary? |
|||
if ($this->_object->getSpgr()) { |
|||
$recVer = 0x1; |
|||
$recInstance = 0x0000; |
|||
$recType = 0xF009; |
|||
$length = 0x00000010; |
|||
|
|||
$recVerInstance = $recVer; |
|||
$recVerInstance |= $recInstance << 4; |
|||
|
|||
$header = pack('vvV', $recVerInstance, $recType, $length); |
|||
|
|||
$data .= $header . pack('VVVV', 0,0,0,0); |
|||
} |
|||
$this->_spTypes[] = ($this->_object->getSpType()); |
|||
|
|||
// write the shape record |
|||
$recVer = 0x2; |
|||
$recInstance = $this->_object->getSpType(); // shape type |
|||
$recType = 0xF00A; |
|||
$length = 0x00000008; |
|||
|
|||
$recVerInstance = $recVer; |
|||
$recVerInstance |= $recInstance << 4; |
|||
|
|||
$header = pack('vvV', $recVerInstance, $recType, $length); |
|||
|
|||
$data .= $header . pack('VV', $this->_object->getSpId(), $this->_object->getSpgr() ? 0x0005 : 0x0A00); |
|||
|
|||
|
|||
// the options |
|||
if ($this->_object->getOPTCollection()) { |
|||
$optData = ''; |
|||
|
|||
$recVer = 0x3; |
|||
$recInstance = count($this->_object->getOPTCollection()); |
|||
$recType = 0xF00B; |
|||
foreach ($this->_object->getOPTCollection() as $property => $value) { |
|||
$optData .= pack('vV', $property, $value); |
|||
} |
|||
$length = strlen($optData); |
|||
|
|||
$recVerInstance = $recVer; |
|||
$recVerInstance |= $recInstance << 4; |
|||
|
|||
$header = pack('vvV', $recVerInstance, $recType, $length); |
|||
$data .= $header . $optData; |
|||
} |
|||
|
|||
// the client anchor |
|||
if ($this->_object->getStartCoordinates()) { |
|||
$clientAnchorData = ''; |
|||
|
|||
$recVer = 0x0; |
|||
$recInstance = 0x0; |
|||
$recType = 0xF010; |
|||
|
|||
// start coordinates |
|||
list($column, $row) = PHPExcel_Cell::coordinateFromString($this->_object->getStartCoordinates()); |
|||
$c1 = PHPExcel_Cell::columnIndexFromString($column) - 1; |
|||
$r1 = $row - 1; |
|||
|
|||
// start offsetX |
|||
$startOffsetX = $this->_object->getStartOffsetX(); |
|||
|
|||
// start offsetY |
|||
$startOffsetY = $this->_object->getStartOffsetY(); |
|||
|
|||
// end coordinates |
|||
list($column, $row) = PHPExcel_Cell::coordinateFromString($this->_object->getEndCoordinates()); |
|||
$c2 = PHPExcel_Cell::columnIndexFromString($column) - 1; |
|||
$r2 = $row - 1; |
|||
|
|||
// end offsetX |
|||
$endOffsetX = $this->_object->getEndOffsetX(); |
|||
|
|||
// end offsetY |
|||
$endOffsetY = $this->_object->getEndOffsetY(); |
|||
|
|||
$clientAnchorData = pack('vvvvvvvvv', $this->_object->getSpFlag(), |
|||
$c1, $startOffsetX, $r1, $startOffsetY, |
|||
$c2, $endOffsetX, $r2, $endOffsetY); |
|||
|
|||
$length = strlen($clientAnchorData); |
|||
|
|||
$recVerInstance = $recVer; |
|||
$recVerInstance |= $recInstance << 4; |
|||
|
|||
$header = pack('vvV', $recVerInstance, $recType, $length); |
|||
$data .= $header . $clientAnchorData; |
|||
} |
|||
|
|||
// the client data, just empty for now |
|||
if (!$this->_object->getSpgr()) { |
|||
$clientDataData = ''; |
|||
|
|||
$recVer = 0x0; |
|||
$recInstance = 0x0; |
|||
$recType = 0xF011; |
|||
|
|||
$length = strlen($clientDataData); |
|||
|
|||
$recVerInstance = $recVer; |
|||
$recVerInstance |= $recInstance << 4; |
|||
|
|||
$header = pack('vvV', $recVerInstance, $recType, $length); |
|||
$data .= $header . $clientDataData; |
|||
} |
|||
|
|||
// write the record |
|||
$recVer = 0xF; |
|||
$recInstance = 0x0000; |
|||
$recType = 0xF004; |
|||
$length = strlen($data); |
|||
|
|||
$recVerInstance = $recVer; |
|||
$recVerInstance |= $recInstance << 4; |
|||
|
|||
$header = pack('vvV', $recVerInstance, $recType, $length); |
|||
|
|||
$this->_data = $header . $data; |
|||
break; |
|||
|
|||
} |
|||
|
|||
return $this->_data; |
|||
} |
|||
|
|||
/** |
|||
* Gets the shape offsets |
|||
* |
|||
* @return array |
|||
*/ |
|||
public function getSpOffsets() |
|||
{ |
|||
return $this->_spOffsets; |
|||
} |
|||
|
|||
/** |
|||
* Gets the shape types |
|||
* |
|||
* @return array |
|||
*/ |
|||
public function getSpTypes() |
|||
{ |
|||
return $this->_spTypes; |
|||
} |
|||
|
|||
|
|||
} |
|||
@ -0,0 +1,165 @@ |
|||
<?php |
|||
/** |
|||
* PHPExcel |
|||
* |
|||
* Copyright (c) 2006 - 2013 PHPExcel |
|||
* |
|||
* This library is free software; you can redistribute it and/or |
|||
* modify it under the terms of the GNU Lesser General Public |
|||
* License as published by the Free Software Foundation; either |
|||
* version 2.1 of the License, or (at your option) any later version. |
|||
* |
|||
* This library is distributed in the hope that it will be useful, |
|||
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
|||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
|||
* Lesser General Public License for more details. |
|||
* |
|||
* You should have received a copy of the GNU Lesser General Public |
|||
* License along with this library; if not, write to the Free Software |
|||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA |
|||
* |
|||
* @category PHPExcel |
|||
* @package PHPExcel_Writer_Excel5 |
|||
* @copyright Copyright (c) 2006 - 2013 PHPExcel (http://www.codeplex.com/PHPExcel) |
|||
* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL |
|||
* @version 1.7.9, 2013-06-02 |
|||
*/ |
|||
|
|||
|
|||
/** |
|||
* PHPExcel_Writer_Excel5_Font |
|||
* |
|||
* @category PHPExcel |
|||
* @package PHPExcel_Writer_Excel5 |
|||
* @copyright Copyright (c) 2006 - 2013 PHPExcel (http://www.codeplex.com/PHPExcel) |
|||
*/ |
|||
class PHPExcel_Writer_Excel5_Font |
|||
{ |
|||
/** |
|||
* Color index |
|||
* |
|||
* @var int |
|||
*/ |
|||
private $_colorIndex; |
|||
|
|||
/** |
|||
* Font |
|||
* |
|||
* @var PHPExcel_Style_Font |
|||
*/ |
|||
private $_font; |
|||
|
|||
/** |
|||
* Constructor |
|||
* |
|||
* @param PHPExcel_Style_Font $font |
|||
*/ |
|||
public function __construct(PHPExcel_Style_Font $font = null) |
|||
{ |
|||
$this->_colorIndex = 0x7FFF; |
|||
$this->_font = $font; |
|||
} |
|||
|
|||
/** |
|||
* Set the color index |
|||
* |
|||
* @param int $colorIndex |
|||
*/ |
|||
public function setColorIndex($colorIndex) |
|||
{ |
|||
$this->_colorIndex = $colorIndex; |
|||
} |
|||
|
|||
/** |
|||
* Get font record data |
|||
* |
|||
* @return string |
|||
*/ |
|||
public function writeFont() |
|||
{ |
|||
$font_outline = 0; |
|||
$font_shadow = 0; |
|||
|
|||
$icv = $this->_colorIndex; // Index to color palette |
|||
if ($this->_font->getSuperScript()) { |
|||
$sss = 1; |
|||
} else if ($this->_font->getSubScript()) { |
|||
$sss = 2; |
|||
} else { |
|||
$sss = 0; |
|||
} |
|||
$bFamily = 0; // Font family |
|||
$bCharSet = PHPExcel_Shared_Font::getCharsetFromFontName($this->_font->getName()); // Character set |
|||
|
|||
$record = 0x31; // Record identifier |
|||
$reserved = 0x00; // Reserved |
|||
$grbit = 0x00; // Font attributes |
|||
if ($this->_font->getItalic()) { |
|||
$grbit |= 0x02; |
|||
} |
|||
if ($this->_font->getStrikethrough()) { |
|||
$grbit |= 0x08; |
|||
} |
|||
if ($font_outline) { |
|||
$grbit |= 0x10; |
|||
} |
|||
if ($font_shadow) { |
|||
$grbit |= 0x20; |
|||
} |
|||
|
|||
$data = pack("vvvvvCCCC", |
|||
$this->_font->getSize() * 20, // Fontsize (in twips) |
|||
$grbit, |
|||
$icv, // Colour |
|||
self::_mapBold($this->_font->getBold()), // Font weight |
|||
$sss, // Superscript/Subscript |
|||
self::_mapUnderline($this->_font->getUnderline()), |
|||
$bFamily, |
|||
$bCharSet, |
|||
$reserved |
|||
); |
|||
$data .= PHPExcel_Shared_String::UTF8toBIFF8UnicodeShort($this->_font->getName()); |
|||
|
|||
$length = strlen($data); |
|||
$header = pack("vv", $record, $length); |
|||
|
|||
return($header . $data); |
|||
} |
|||
|
|||
/** |
|||
* Map to BIFF5-BIFF8 codes for bold |
|||
* |
|||
* @param boolean $bold |
|||
* @return int |
|||
*/ |
|||
private static function _mapBold($bold) { |
|||
if ($bold) { |
|||
return 0x2BC; // 700 = Bold font weight |
|||
} |
|||
return 0x190; // 400 = Normal font weight |
|||
} |
|||
|
|||
/** |
|||
* Map of BIFF2-BIFF8 codes for underline styles |
|||
* @static array of int |
|||
* |
|||
*/ |
|||
private static $_mapUnderline = array( PHPExcel_Style_Font::UNDERLINE_NONE => 0x00, |
|||
PHPExcel_Style_Font::UNDERLINE_SINGLE => 0x01, |
|||
PHPExcel_Style_Font::UNDERLINE_DOUBLE => 0x02, |
|||
PHPExcel_Style_Font::UNDERLINE_SINGLEACCOUNTING => 0x21, |
|||
PHPExcel_Style_Font::UNDERLINE_DOUBLEACCOUNTING => 0x22, |
|||
); |
|||
/** |
|||
* Map underline |
|||
* |
|||
* @param string |
|||
* @return int |
|||
*/ |
|||
private static function _mapUnderline($underline) { |
|||
if (isset(self::$_mapUnderline[$underline])) |
|||
return self::$_mapUnderline[$underline]; |
|||
return 0x00; |
|||
} |
|||
|
|||
} |
|||
@ -0,0 +1,52 @@ |
|||
<?php |
|||
/** |
|||
* PHPExcel |
|||
* |
|||
* Copyright (c) 2006 - 2013 PHPExcel |
|||
* |
|||
* This library is free software; you can redistribute it and/or |
|||
* modify it under the terms of the GNU Lesser General Public |
|||
* License as published by the Free Software Foundation; either |
|||
* version 2.1 of the License, or (at your option) any later version. |
|||
* |
|||
* This library is distributed in the hope that it will be useful, |
|||
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
|||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
|||
* Lesser General Public License for more details. |
|||
* |
|||
* You should have received a copy of the GNU Lesser General Public |
|||
* License along with this library; if not, write to the Free Software |
|||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA |
|||
* |
|||
* @category PHPExcel |
|||
* @package PHPExcel_Writer |
|||
* @copyright Copyright (c) 2006 - 2013 PHPExcel (http://www.codeplex.com/PHPExcel) |
|||
* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL |
|||
* @version 1.7.9, 2013-06-02 |
|||
*/ |
|||
|
|||
|
|||
/** |
|||
* PHPExcel_Writer_Exception |
|||
* |
|||
* @category PHPExcel |
|||
* @package PHPExcel_Writer |
|||
* @copyright Copyright (c) 2006 - 2013 PHPExcel (http://www.codeplex.com/PHPExcel) |
|||
*/ |
|||
class PHPExcel_Writer_Exception extends PHPExcel_Exception { |
|||
/** |
|||
* Error handler callback |
|||
* |
|||
* @param mixed $code |
|||
* @param mixed $string |
|||
* @param mixed $file |
|||
* @param mixed $line |
|||
* @param mixed $context |
|||
*/ |
|||
public static function errorHandlerCallback($code, $string, $file, $line, $context) { |
|||
$e = new self($string, $code); |
|||
$e->line = $line; |
|||
$e->file = $file; |
|||
throw $e; |
|||
} |
|||
} |
|||
@ -0,0 +1,120 @@ |
|||
<?php |
|||
/** |
|||
* PHPExcel |
|||
* |
|||
* Copyright (c) 2006 - 2013 PHPExcel |
|||
* |
|||
* This library is free software; you can redistribute it and/or |
|||
* modify it under the terms of the GNU Lesser General Public |
|||
* License as published by the Free Software Foundation; either |
|||
* version 2.1 of the License, or (at your option) any later version. |
|||
* |
|||
* This library is distributed in the hope that it will be useful, |
|||
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
|||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
|||
* Lesser General Public License for more details. |
|||
* |
|||
* You should have received a copy of the GNU Lesser General Public |
|||
* License along with this library; if not, write to the Free Software |
|||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA |
|||
* |
|||
* @category PHPExcel |
|||
* @package PHPExcel_Writer_PDF |
|||
* @copyright Copyright (c) 2006 - 2013 PHPExcel (http://www.codeplex.com/PHPExcel) |
|||
* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL |
|||
* @version 1.7.9, 2013-06-02 |
|||
*/ |
|||
|
|||
|
|||
/** Require DomPDF library */ |
|||
$pdfRendererClassFile = PHPExcel_Settings::getPdfRendererPath() . '/dompdf_config.inc.php'; |
|||
if (file_exists($pdfRendererClassFile)) { |
|||
require_once $pdfRendererClassFile; |
|||
} else { |
|||
throw new PHPExcel_Writer_Exception('Unable to load PDF Rendering library'); |
|||
} |
|||
|
|||
/** |
|||
* PHPExcel_Writer_PDF_DomPDF |
|||
* |
|||
* @category PHPExcel |
|||
* @package PHPExcel_Writer_PDF |
|||
* @copyright Copyright (c) 2006 - 2013 PHPExcel (http://www.codeplex.com/PHPExcel) |
|||
*/ |
|||
class PHPExcel_Writer_PDF_DomPDF extends PHPExcel_Writer_PDF_Core implements PHPExcel_Writer_IWriter |
|||
{ |
|||
/** |
|||
* Create a new PHPExcel_Writer_PDF |
|||
* |
|||
* @param PHPExcel $phpExcel PHPExcel object |
|||
*/ |
|||
public function __construct(PHPExcel $phpExcel) |
|||
{ |
|||
parent::__construct($phpExcel); |
|||
} |
|||
|
|||
/** |
|||
* Save PHPExcel to file |
|||
* |
|||
* @param string $pFilename Name of the file to save as |
|||
* @throws PHPExcel_Writer_Exception |
|||
*/ |
|||
public function save($pFilename = NULL) |
|||
{ |
|||
$fileHandle = parent::prepareForSave($pFilename); |
|||
|
|||
// Default PDF paper size |
|||
$paperSize = 'LETTER'; // Letter (8.5 in. by 11 in.) |
|||
|
|||
// Check for paper size and page orientation |
|||
if (is_null($this->getSheetIndex())) { |
|||
$orientation = ($this->_phpExcel->getSheet(0)->getPageSetup()->getOrientation() |
|||
== PHPExcel_Worksheet_PageSetup::ORIENTATION_LANDSCAPE) |
|||
? 'L' |
|||
: 'P'; |
|||
$printPaperSize = $this->_phpExcel->getSheet(0)->getPageSetup()->getPaperSize(); |
|||
$printMargins = $this->_phpExcel->getSheet(0)->getPageMargins(); |
|||
} else { |
|||
$orientation = ($this->_phpExcel->getSheet($this->getSheetIndex())->getPageSetup()->getOrientation() |
|||
== PHPExcel_Worksheet_PageSetup::ORIENTATION_LANDSCAPE) |
|||
? 'L' |
|||
: 'P'; |
|||
$printPaperSize = $this->_phpExcel->getSheet($this->getSheetIndex())->getPageSetup()->getPaperSize(); |
|||
$printMargins = $this->_phpExcel->getSheet($this->getSheetIndex())->getPageMargins(); |
|||
} |
|||
|
|||
// Override Page Orientation |
|||
if (!is_null($this->getOrientation())) { |
|||
$orientation = ($this->getOrientation() == PHPExcel_Worksheet_PageSetup::ORIENTATION_DEFAULT) |
|||
? PHPExcel_Worksheet_PageSetup::ORIENTATION_PORTRAIT |
|||
: $this->getOrientation(); |
|||
} |
|||
// Override Paper Size |
|||
if (!is_null($this->getPaperSize())) { |
|||
$printPaperSize = $this->getPaperSize(); |
|||
} |
|||
|
|||
if (isset(self::$_paperSizes[$printPaperSize])) { |
|||
$paperSize = self::$_paperSizes[$printPaperSize]; |
|||
} |
|||
|
|||
$orientation = ($orientation == 'L') ? 'landscape' : 'portrait'; |
|||
|
|||
// Create PDF |
|||
$pdf = new DOMPDF(); |
|||
$pdf->set_paper(strtolower($paperSize), $orientation); |
|||
|
|||
$pdf->load_html( |
|||
$this->generateHTMLHeader(FALSE) . |
|||
$this->generateSheetData() . |
|||
$this->generateHTMLFooter() |
|||
); |
|||
$pdf->render(); |
|||
|
|||
// Write to file |
|||
fwrite($fileHandle, $pdf->output()); |
|||
|
|||
parent::restoreStateAfterSave($fileHandle); |
|||
} |
|||
|
|||
} |
|||
@ -0,0 +1,183 @@ |
|||
<?php |
|||
|
|||
defined('IN_IA') or exit('Access Denied'); |
|||
global $_W; |
|||
|
|||
$w7_system_menu = array(); |
|||
|
|||
$w7_system_menu['account_manage'] = array( |
|||
'title' => '平台', |
|||
'icon' => 'wi wi-platform-manage', |
|||
'dimension' => 2, |
|||
'url' => url('account/manage'), |
|||
'section' => array( |
|||
'account_manage' => array( |
|||
'title' => '平台管理', |
|||
'menu' => array( |
|||
'account_manage_display' => array( |
|||
'title' => '平台列表', |
|||
'url' => url('account/manage'), |
|||
'permission_name' => 'account_manage_display', |
|||
'sub_permission' => array( |
|||
array( |
|||
'title' => '帐号停用', |
|||
'permission_name' => 'account_manage_stop', |
|||
), |
|||
), |
|||
), |
|||
), |
|||
), |
|||
), |
|||
'founder' => true, |
|||
); |
|||
|
|||
$w7_system_menu['user_manage'] = array( |
|||
'title' => '用户', |
|||
'icon' => 'wi wi-user-group', |
|||
'dimension' => 2, |
|||
'url' => url('user/display'), |
|||
'section' => array( |
|||
'user_manage' => array( |
|||
'title' => '用户管理', |
|||
'menu' => array( |
|||
'user_manage_display' => array( |
|||
'title' => '普通用户', |
|||
'url' => url('user/display'), |
|||
'permission_name' => 'user_manage_display', |
|||
'sub_permission' => array(), |
|||
), |
|||
'user_manage_recycle' => array( |
|||
'title' => '回收站', |
|||
'url' => url('user/display', array('type' => 'recycle')), |
|||
'permission_name' => 'user_manage_recycle', |
|||
'sub_permission' => array(), |
|||
), |
|||
), |
|||
), |
|||
), |
|||
'founder' => true, |
|||
); |
|||
|
|||
$w7_system_menu['site'] = array( |
|||
'title' => '设置', |
|||
'menu-title' => '系统设置', |
|||
'icon' => 'wi wi-system-info', |
|||
'dimension' => 3, |
|||
'url' => url('system/site'), |
|||
'section' => array( |
|||
'setting' => array( |
|||
'title' => '设置', |
|||
'menu' => array( |
|||
'system_setting_site' => array( |
|||
'title' => '站点设置', |
|||
'url' => url('system/site'), |
|||
'permission_name' => 'system_setting_site', |
|||
), |
|||
'system_setting_attachment' => array( |
|||
'title' => '附件设置', |
|||
'url' => url('system/attachment/remote'), |
|||
'permission_name' => 'system_setting_attachment', |
|||
), |
|||
), |
|||
), |
|||
'utility' => array( |
|||
'title' => '常用工具', |
|||
'menu' => array( |
|||
'system_utility_optimize' => array( |
|||
'title' => '性能优化', |
|||
'url' => url('system/optimize'), |
|||
'permission_name' => 'system_utility_optimize', |
|||
), |
|||
'system_utility_check' => array( |
|||
'title' => '系统检测', |
|||
'url' => url('system/check'), |
|||
'permission_name' => 'system_utility_check', |
|||
), |
|||
), |
|||
), |
|||
), |
|||
'founder' => true, |
|||
); |
|||
|
|||
$w7_system_menu['cloud'] = array( |
|||
'title' => '云服务', |
|||
'menu-title' => '云服务中心', |
|||
'icon' => 'wi wi-system-site', |
|||
'dimension' => 3, |
|||
'url' => url('cloud/auth/info'), |
|||
'section' => array( |
|||
'cloud_auth' => array( |
|||
'title' => '云服务', |
|||
'menu' => array( |
|||
'cloud_auth_info' => array( |
|||
'title' => '系统授权', |
|||
'url' => url('cloud/auth/auth_info'), |
|||
'permission_name' => 'cloud_auth_info', |
|||
), |
|||
'cloud_auth_upgrade' => array( |
|||
'title' => '系统升级', |
|||
'url' => url('cloud/auth/auth_upgrade'), |
|||
'permission_name' => 'cloud_auth_upgrade', |
|||
), |
|||
'cloud_auth_upgrade_log' => array( |
|||
'title' => '更新日志', |
|||
'url' => url('cloud/auth/auth_upgrade_log'), |
|||
'permission_name' => 'cloud_auth_upgrade_log', |
|||
), |
|||
), |
|||
), |
|||
'cloud_app' => array( |
|||
'title' => '应用管理', |
|||
'menu' => array( |
|||
'cloud_app_info' => array( |
|||
'title' => '应用信息', |
|||
'url' => url('cloud/auth/app_info'), |
|||
'permission_name' => 'cloud_app_info', |
|||
), |
|||
'cloud_app_pem' => array( |
|||
'title' => '应用权限', |
|||
'url' => url('cloud/auth/app_pem'), |
|||
'permission_name' => 'cloud_app_pem', |
|||
), |
|||
), |
|||
), |
|||
'cloud_db' => array( |
|||
'title' => '数据管理', |
|||
'menu' => array( |
|||
'cloud_dbm' => array( |
|||
'title' => '数据管理', |
|||
'url' => url('cloud/auth/db_m'), |
|||
'permission_name' => 'cloud_dbm', |
|||
), |
|||
'cloud_db_sql' => array( |
|||
'title' => '运行SQL', |
|||
'url' => url('cloud/auth/db_sql'), |
|||
'permission_name' => 'cloud_db_sql', |
|||
), |
|||
), |
|||
), |
|||
'cloud_set' => array( |
|||
'title' => '系统设置', |
|||
'menu' => array( |
|||
'cloud_set_info' => array( |
|||
'title' => '系统信息', |
|||
'url' => url('cloud/auth/set_info'), |
|||
'permission_name' => 'cloud_set_info', |
|||
), |
|||
'cloud_set_que' => array( |
|||
'title' => '计划任务', |
|||
'url' => url('cloud/auth/set_que'), |
|||
'permission_name' => 'cloud_set_que', |
|||
), |
|||
'cloud_set_url' => array( |
|||
'title' => '跳转域名', |
|||
'url' => url('cloud/auth/set_url'), |
|||
'permission_name' => 'cloud_set_url', |
|||
), |
|||
), |
|||
), |
|||
), |
|||
'founder' => true, |
|||
); |
|||
|
|||
return $w7_system_menu; |
|||
@ -0,0 +1,30 @@ |
|||
<?php |
|||
|
|||
define('IN_SYS', true); |
|||
require '../framework/bootstrap.inc.php'; |
|||
require IA_ROOT . '/web/common/bootstrap.sys.inc.php'; |
|||
|
|||
if (empty($_W['isfounder']) && !empty($_W['user']) && ($_W['user']['status'] == USER_STATUS_CHECK || $_W['user']['status'] == USER_STATUS_BAN)) { |
|||
isetcookie('__session', '', -10000); |
|||
itoast('您的账号正在审核或是已经被系统禁止,请联系网站管理员解决!'); |
|||
} |
|||
if (($_W['setting']['copyright']['status'] == 1) && empty($_W['isfounder'])) { |
|||
isetcookie('__session', '', -10000); |
|||
itoast('站点已关闭,关闭原因:' . $_W['setting']['copyright']['reason'], url('user/login'), 'info'); |
|||
} |
|||
$_W['page'] = array(); |
|||
$_W['page']['copyright'] = $_W['setting']['copyright']; |
|||
checklogin(); |
|||
isetcookie('__iscontroller', 0); |
|||
$_W['iscontroller'] = 0; |
|||
|
|||
function _calc_current_frames() { |
|||
global $_W; |
|||
$_W['page']['title'] = '我的平台'; |
|||
return true; |
|||
} |
|||
if ($_GPC['getmenu']) { |
|||
$home_menu = system_star_menu(); |
|||
iajax(0, $home_menu); |
|||
} |
|||
template('home/home'); |
|||
@ -0,0 +1 @@ |
|||
div#driver-popover-item{display:none;position:absolute;background:#fff;color:#2d2d2d;margin:0;padding:15px;border-radius:5px;min-width:250px;max-width:300px;box-shadow:0 1px 10px rgba(0,0,0,.4);z-index:1000000000}div#driver-popover-item .driver-popover-tip{border:5px solid #fff;content:"";position:absolute}div#driver-popover-item .driver-popover-tip.bottom{bottom:-10px;border-color:#fff transparent transparent}div#driver-popover-item .driver-popover-tip.bottom.position-center{left:49%}div#driver-popover-item .driver-popover-tip.bottom.position-right{right:20px}div#driver-popover-item .driver-popover-tip.left{left:-10px;top:10px;border-color:transparent #fff transparent transparent}div#driver-popover-item .driver-popover-tip.left.position-center{top:46%}div#driver-popover-item .driver-popover-tip.left.position-bottom{top:auto;bottom:20px}div#driver-popover-item .driver-popover-tip.right{right:-10px;top:10px;border-color:transparent transparent transparent #fff}div#driver-popover-item .driver-popover-tip.right.position-center{top:46%}div#driver-popover-item .driver-popover-tip.right.position-bottom{top:auto;bottom:20px}div#driver-popover-item .driver-popover-tip.top{top:-10px;border-color:transparent transparent #fff}div#driver-popover-item .driver-popover-tip.top.position-center{left:49%}div#driver-popover-item .driver-popover-tip.top.position-right{right:20px}div#driver-popover-item .driver-popover-tip.mid-center{display:none}div#driver-popover-item .driver-popover-footer{display:block;margin-top:10px}div#driver-popover-item .driver-popover-footer button{display:inline-block;padding:3px 10px;border:1px solid #d4d4d4;text-decoration:none;text-shadow:1px 1px 0 #fff;color:#2d2d2d;font:11px/normal sans-serif;cursor:pointer;outline:0;background-color:#f1f1f1;border-radius:2px;zoom:1;line-height:1.3}div#driver-popover-item .driver-popover-footer button.driver-disabled{color:grey;cursor:default;pointer-events:none}div#driver-popover-item .driver-popover-footer .driver-close-btn{float:left}div#driver-popover-item .driver-popover-footer .driver-btn-group,div#driver-popover-item .driver-popover-footer .driver-close-only-btn{float:right}div#driver-popover-item .driver-popover-title{font:19px/normal sans-serif;margin:0 0 5px;font-weight:700;display:block;position:relative;line-height:1.5;zoom:1}div#driver-popover-item .driver-popover-description{margin-bottom:0;font:14px/normal sans-serif;line-height:1.5;color:#2d2d2d;font-weight:400;zoom:1}.driver-clearfix:after,.driver-clearfix:before{content:"";display:table}.driver-clearfix:after{clear:both}.driver-stage-no-animation{-webkit-transition:none!important;-moz-transition:none!important;-ms-transition:none!important;-o-transition:none!important;transition:none!important;background:0 0!important;outline:rgba(0,0,0,.75) solid 5000px}div#driver-page-overlay{background:#000;position:fixed;bottom:0;right:0;display:block;width:100%;height:100%;zoom:1;filter:alpha(opacity=75);opacity:.75;z-index:100002!important}div#driver-highlighted-element-stage,div#driver-page-overlay{top:0;left:0;-webkit-transition:all .3s;-moz-transition:all .3s;-ms-transition:all .3s;-o-transition:all .3s;transition:all .3s}div#driver-highlighted-element-stage{position:absolute;height:50px;width:300px;background:#fff;z-index:100003!important;display:none;border-radius:2px}.driver-highlighted-element{z-index:100004!important}.driver-position-relative{position:relative!important}.driver-fix-stacking{z-index:auto!important;opacity:1!important;-webkit-transform:none!important;-moz-transform:none!important;-ms-transform:none!important;-o-transform:none!important;transform:none!important;-webkit-filter:none!important;-moz-filter:none!important;-ms-filter:none!important;-o-filter:none!important;filter:none!important;-webkit-perspective:none!important;-moz-perspective:none!important;-ms-perspective:none!important;-o-perspective:none!important;perspective:none!important;-webkit-transform-style:flat!important;-moz-transform-style:flat!important;-ms-transform-style:flat!important;transform-style:flat!important;-webkit-transform-box:border-box!important;-moz-transform-box:border-box!important;-ms-transform-box:border-box!important;-o-transform-box:border-box!important;transform-box:border-box!important;will-change:unset!important} |
|||
|
After Width: | Height: | Size: 100 KiB |
@ -0,0 +1,9 @@ |
|||
.emotions{background-color:#f6f6f6;} |
|||
.emotions td{padding:1px;} |
|||
.emotions td div{background: url("https://res.mail.qq.com/zh_CN//images/mo/DEFAULT2/default.gif") no-repeat 0 0 scroll transparent;width:24px;height:24px;cursor:pointer; border:1px solid #dfe6f6;} |
|||
.emotions div:hover{border:1px solid blue;} |
|||
.emotionsGif{position:absolute;top:10px;left:410px;border:1px solid #AAA;padding:8px;background-color:#FFF;text-align:center;width:40px;height:40px} |
|||
.emotionsGif img {border:0;width:24px;height:24px} |
|||
.iconEmotion{font-size:14px;} |
|||
|
|||
.popover{max-width: none;width:470px;} |
|||
@ -0,0 +1 @@ |
|||
define([],function(){return{defaultoptions:{callback:null,type:"image",isWechat:!1,multiple:!1,showType:3,needType:2,global:!1,dest_dir:"",otherVal:"",others:{},uniacid:-1,netWorkVideo:!1},init:function(o,e){var i=this;i.options=$.extend({},i.defaultoptions,e),"audio"==i.options.type&&(i.options.type="voice"),i.options.callback=o,$("#material-Modal").remove();var l=i.options.type,a=i.buildHtml(l);return $(document.body).prepend(a),i.modalobj=$("#material-Modal"),i.registerSelected(),angular.module("we7resource").value("config",i.options),angular.bootstrap(i.modalobj,["we7resource"]),i.modalobj.modal("show"),i.modalobj},show:function(o,e){this.init(o,e)},registerSelected:function(){var i=this;$(window).unbind("resource_selected").on("resource_selected",function(o,e){i.finish(e.items)}),$(window).unbind("resource_canceled").on("resource_canceled",function(o,e){i.modalobj.modal("hide")})},finish:function(o){var e=this;$.isFunction(e.options.callback)&&(0==e.options.multiple?e.options.callback(o[0]):e.options.callback(o),e.modalobj.modal("hide"))},buildHtml:function(o){var e=o;return"icon"==o&&(e="module"),"<div "+("we7-resource-"+o+"-dialog")+' class="uploader-modal modal fade '+e+'" id="material-Modal" role="dialog" aria-labelledby="myModalLabel2"></div>'}}}); |
|||
@ -0,0 +1,129 @@ |
|||
/******************************************************************************* |
|||
* KindEditor - WYSIWYG HTML Editor for Internet |
|||
* Copyright (C) 2006-2011 kindsoft.net |
|||
* |
|||
* @author Roddy <luolonghao@gmail.com> |
|||
* @site http://www.kindsoft.net/
|
|||
* @licence http://www.kindsoft.net/license.php
|
|||
*******************************************************************************/ |
|||
|
|||
KindEditor.plugin('emoticons', function(K) { |
|||
var self = this, name = 'emoticons', |
|||
path = (self.emoticonsPath || self.pluginsPath + 'emoticons/images/'), |
|||
allowPreview = self.allowPreviewEmoticons === undefined ? true : self.allowPreviewEmoticons, |
|||
currentPageNum = 1; |
|||
self.clickToolbar(name, function() { |
|||
var rows = 5, cols = 9, total = 135, startNum = 0, |
|||
cells = rows * cols, pages = Math.ceil(total / cells), |
|||
colsHalf = Math.floor(cols / 2), |
|||
wrapperDiv = K('<div class="ke-plugin-emoticons"></div>'), |
|||
elements = [], |
|||
menu = self.createMenu({ |
|||
name : name, |
|||
beforeRemove : function() { |
|||
removeEvent(); |
|||
} |
|||
}); |
|||
menu.div.append(wrapperDiv); |
|||
var previewDiv, previewImg; |
|||
if (allowPreview) { |
|||
previewDiv = K('<div class="ke-preview"></div>').css('right', 0); |
|||
previewImg = K('<img class="ke-preview-img" src="' + path + startNum + '.gif" />'); |
|||
wrapperDiv.append(previewDiv); |
|||
previewDiv.append(previewImg); |
|||
} |
|||
function bindCellEvent(cell, j, num) { |
|||
if (previewDiv) { |
|||
cell.mouseover(function() { |
|||
if (j > colsHalf) { |
|||
previewDiv.css('left', 0); |
|||
previewDiv.css('right', ''); |
|||
} else { |
|||
previewDiv.css('left', ''); |
|||
previewDiv.css('right', 0); |
|||
} |
|||
previewImg.attr('src', path + num + '.gif'); |
|||
K(this).addClass('ke-on'); |
|||
}); |
|||
} else { |
|||
cell.mouseover(function() { |
|||
K(this).addClass('ke-on'); |
|||
}); |
|||
} |
|||
cell.mouseout(function() { |
|||
K(this).removeClass('ke-on'); |
|||
}); |
|||
cell.click(function(e) { |
|||
self.insertHtml('<img src="' + path + num + '.gif" border="0" alt="" />').hideMenu().focus(); |
|||
e.stop(); |
|||
}); |
|||
} |
|||
function createEmoticonsTable(pageNum, parentDiv) { |
|||
var table = document.createElement('table'); |
|||
parentDiv.append(table); |
|||
if (previewDiv) { |
|||
K(table).mouseover(function() { |
|||
previewDiv.show('block'); |
|||
}); |
|||
K(table).mouseout(function() { |
|||
previewDiv.hide(); |
|||
}); |
|||
elements.push(K(table)); |
|||
} |
|||
table.className = 'ke-table'; |
|||
table.cellPadding = 0; |
|||
table.cellSpacing = 0; |
|||
table.border = 0; |
|||
var num = (pageNum - 1) * cells + startNum; |
|||
for (var i = 0; i < rows; i++) { |
|||
var row = table.insertRow(i); |
|||
for (var j = 0; j < cols; j++) { |
|||
var cell = K(row.insertCell(j)); |
|||
cell.addClass('ke-cell'); |
|||
bindCellEvent(cell, j, num); |
|||
var span = K('<span class="ke-img"></span>') |
|||
.css('background-position', '-' + (24 * num) + 'px 0px') |
|||
.css('background-image', 'url(' + path + 'static.gif)'); |
|||
cell.append(span); |
|||
elements.push(cell); |
|||
num++; |
|||
} |
|||
} |
|||
return table; |
|||
} |
|||
var table = createEmoticonsTable(currentPageNum, wrapperDiv); |
|||
function removeEvent() { |
|||
K.each(elements, function() { |
|||
this.unbind(); |
|||
}); |
|||
} |
|||
var pageDiv; |
|||
function bindPageEvent(el, pageNum) { |
|||
el.click(function(e) { |
|||
removeEvent(); |
|||
table.parentNode.removeChild(table); |
|||
pageDiv.remove(); |
|||
table = createEmoticonsTable(pageNum, wrapperDiv); |
|||
createPageTable(pageNum); |
|||
currentPageNum = pageNum; |
|||
e.stop(); |
|||
}); |
|||
} |
|||
function createPageTable(currentPageNum) { |
|||
pageDiv = K('<div class="ke-page"></div>'); |
|||
wrapperDiv.append(pageDiv); |
|||
for (var pageNum = 1; pageNum <= pages; pageNum++) { |
|||
if (currentPageNum !== pageNum) { |
|||
var a = K('<a href="javascript:;">[' + pageNum + ']</a>'); |
|||
bindPageEvent(a, pageNum); |
|||
pageDiv.append(a); |
|||
elements.push(a); |
|||
} else { |
|||
pageDiv.append(K('@[' + pageNum + ']')); |
|||
} |
|||
pageDiv.append(K('@ ')); |
|||
} |
|||
} |
|||
createPageTable(currentPageNum); |
|||
}); |
|||
}); |
|||
@ -0,0 +1,189 @@ |
|||
/******************************************************************************* |
|||
* KindEditor - WYSIWYG HTML Editor for Internet |
|||
* Copyright (C) 2006-2011 kindsoft.net |
|||
* |
|||
* @author Roddy <luolonghao@gmail.com> |
|||
* @site http://www.kindsoft.net/
|
|||
* @licence http://www.kindsoft.net/license.php
|
|||
*******************************************************************************/ |
|||
|
|||
KindEditor.plugin('filemanager', function(K) { |
|||
var self = this, name = 'filemanager', |
|||
fileManagerJson = K.undef(self.fileManagerJson, self.basePath + 'php/file_manager_json.php'), |
|||
imgPath = self.pluginsPath + name + '/images/', |
|||
lang = self.lang(name + '.'); |
|||
function makeFileTitle(filename, filesize, datetime) { |
|||
return filename + ' (' + Math.ceil(filesize / 1024) + 'KB, ' + datetime + ')'; |
|||
} |
|||
function bindTitle(el, data) { |
|||
if (data.is_dir) { |
|||
el.attr('title', data.filename); |
|||
} else { |
|||
el.attr('title', makeFileTitle(data.filename, data.filesize, data.datetime)); |
|||
} |
|||
} |
|||
self.plugin.filemanagerDialog = function(options) { |
|||
var width = K.undef(options.width, 650), |
|||
height = K.undef(options.height, 510), |
|||
dirName = K.undef(options.dirName, ''), |
|||
viewType = K.undef(options.viewType, 'VIEW').toUpperCase(), // "LIST" or "VIEW"
|
|||
clickFn = options.clickFn; |
|||
var html = [ |
|||
'<div style="padding:10px 20px;">', |
|||
// header start
|
|||
'<div class="ke-plugin-filemanager-header">', |
|||
// left start
|
|||
'<div class="ke-left">', |
|||
'<img class="ke-inline-block" name="moveupImg" src="' + imgPath + 'go-up.gif" width="16" height="16" border="0" alt="" /> ', |
|||
'<a class="ke-inline-block" name="moveupLink" href="javascript:;">' + lang.moveup + '</a>', |
|||
'</div>', |
|||
// right start
|
|||
'<div class="ke-right">', |
|||
lang.viewType + ' <select class="ke-inline-block" name="viewType">', |
|||
'<option value="VIEW">' + lang.viewImage + '</option>', |
|||
'<option value="LIST">' + lang.listImage + '</option>', |
|||
'</select> ', |
|||
lang.orderType + ' <select class="ke-inline-block" name="orderType">', |
|||
'<option value="NAME">' + lang.fileName + '</option>', |
|||
'<option value="SIZE">' + lang.fileSize + '</option>', |
|||
'<option value="TYPE">' + lang.fileType + '</option>', |
|||
'</select>', |
|||
'</div>', |
|||
'<div class="ke-clearfix"></div>', |
|||
'</div>', |
|||
// body start
|
|||
'<div class="ke-plugin-filemanager-body"></div>', |
|||
'</div>' |
|||
].join(''); |
|||
var dialog = self.createDialog({ |
|||
name : name, |
|||
width : width, |
|||
height : height, |
|||
title : self.lang(name), |
|||
body : html |
|||
}), |
|||
div = dialog.div, |
|||
bodyDiv = K('.ke-plugin-filemanager-body', div), |
|||
moveupImg = K('[name="moveupImg"]', div), |
|||
moveupLink = K('[name="moveupLink"]', div), |
|||
viewServerBtn = K('[name="viewServer"]', div), |
|||
viewTypeBox = K('[name="viewType"]', div), |
|||
orderTypeBox = K('[name="orderType"]', div); |
|||
function reloadPage(path, order, func) { |
|||
var param = 'path=' + path + '&order=' + order + '&dir=' + dirName; |
|||
dialog.showLoading(self.lang('ajaxLoading')); |
|||
K.ajax(K.addParam(fileManagerJson, param + '&' + new Date().getTime()), function(data) { |
|||
dialog.hideLoading(); |
|||
func(data); |
|||
}); |
|||
} |
|||
var elList = []; |
|||
function bindEvent(el, result, data, createFunc) { |
|||
var fileUrl = K.formatUrl(result.current_url + data.filename, 'absolute'), |
|||
dirPath = encodeURIComponent(result.current_dir_path + data.filename + '/'); |
|||
if (data.is_dir) { |
|||
el.click(function(e) { |
|||
reloadPage(dirPath, orderTypeBox.val(), createFunc); |
|||
}); |
|||
} else if (data.is_photo) { |
|||
el.click(function(e) { |
|||
clickFn.call(this, fileUrl, data.filename); |
|||
}); |
|||
} else { |
|||
el.click(function(e) { |
|||
clickFn.call(this, fileUrl, data.filename); |
|||
}); |
|||
} |
|||
elList.push(el); |
|||
} |
|||
function createCommon(result, createFunc) { |
|||
// remove events
|
|||
K.each(elList, function() { |
|||
this.unbind(); |
|||
}); |
|||
moveupLink.unbind(); |
|||
viewTypeBox.unbind(); |
|||
orderTypeBox.unbind(); |
|||
// add events
|
|||
if (result.current_dir_path) { |
|||
moveupLink.click(function(e) { |
|||
reloadPage(result.moveup_dir_path, orderTypeBox.val(), createFunc); |
|||
}); |
|||
} |
|||
function changeFunc() { |
|||
if (viewTypeBox.val() == 'VIEW') { |
|||
reloadPage(result.current_dir_path, orderTypeBox.val(), createView); |
|||
} else { |
|||
reloadPage(result.current_dir_path, orderTypeBox.val(), createList); |
|||
} |
|||
} |
|||
viewTypeBox.change(changeFunc); |
|||
orderTypeBox.change(changeFunc); |
|||
bodyDiv.html(''); |
|||
} |
|||
function createList(result) { |
|||
createCommon(result, createList); |
|||
var table = document.createElement('table'); |
|||
table.className = 'ke-table'; |
|||
table.cellPadding = 0; |
|||
table.cellSpacing = 0; |
|||
table.border = 0; |
|||
bodyDiv.append(table); |
|||
var fileList = result.file_list; |
|||
for (var i = 0, len = fileList.length; i < len; i++) { |
|||
var data = fileList[i], row = K(table.insertRow(i)); |
|||
row.mouseover(function(e) { |
|||
K(this).addClass('ke-on'); |
|||
}) |
|||
.mouseout(function(e) { |
|||
K(this).removeClass('ke-on'); |
|||
}); |
|||
var iconUrl = imgPath + (data.is_dir ? 'folder-16.gif' : 'file-16.gif'), |
|||
img = K('<img src="' + iconUrl + '" width="16" height="16" alt="' + data.filename + '" align="absmiddle" />'), |
|||
cell0 = K(row[0].insertCell(0)).addClass('ke-cell ke-name').append(img).append(document.createTextNode(' ' + data.filename)); |
|||
if (!data.is_dir || data.has_file) { |
|||
row.css('cursor', 'pointer'); |
|||
cell0.attr('title', data.filename); |
|||
bindEvent(cell0, result, data, createList); |
|||
} else { |
|||
cell0.attr('title', lang.emptyFolder); |
|||
} |
|||
K(row[0].insertCell(1)).addClass('ke-cell ke-size').html(data.is_dir ? '-' : Math.ceil(data.filesize / 1024) + 'KB'); |
|||
K(row[0].insertCell(2)).addClass('ke-cell ke-datetime').html(data.datetime); |
|||
} |
|||
} |
|||
function createView(result) { |
|||
createCommon(result, createView); |
|||
var fileList = result.file_list; |
|||
for (var i = 0, len = fileList.length; i < len; i++) { |
|||
var data = fileList[i], |
|||
div = K('<div class="ke-inline-block ke-item"></div>'); |
|||
bodyDiv.append(div); |
|||
var photoDiv = K('<div class="ke-inline-block ke-photo"></div>') |
|||
.mouseover(function(e) { |
|||
K(this).addClass('ke-on'); |
|||
}) |
|||
.mouseout(function(e) { |
|||
K(this).removeClass('ke-on'); |
|||
}); |
|||
div.append(photoDiv); |
|||
var fileUrl = result.current_url + data.filename, |
|||
iconUrl = data.is_dir ? imgPath + 'folder-64.gif' : (data.is_photo ? fileUrl : imgPath + 'file-64.gif'); |
|||
var img = K('<img src="' + iconUrl + '" width="80" height="80" alt="' + data.filename + '" />'); |
|||
if (!data.is_dir || data.has_file) { |
|||
photoDiv.css('cursor', 'pointer'); |
|||
bindTitle(photoDiv, data); |
|||
bindEvent(photoDiv, result, data, createView); |
|||
} else { |
|||
photoDiv.attr('title', lang.emptyFolder); |
|||
} |
|||
photoDiv.append(img); |
|||
div.append('<div class="ke-name" title="' + data.filename + '">' + data.filename + '</div>'); |
|||
} |
|||
} |
|||
viewTypeBox.val(viewType); |
|||
reloadPage('', orderTypeBox.val(), viewType == 'VIEW' ? createView : createList); |
|||
return dialog; |
|||
} |
|||
|
|||
}); |
|||
|
After Width: | Height: | Size: 170 B |
|
After Width: | Height: | Size: 1.1 KiB |
|
After Width: | Height: | Size: 226 B |
|
After Width: | Height: | Size: 1.2 KiB |
|
After Width: | Height: | Size: 562 B |
@ -0,0 +1,161 @@ |
|||
/******************************************************************************* |
|||
* KindEditor - WYSIWYG HTML Editor for Internet |
|||
* Copyright (C) 2006-2011 kindsoft.net |
|||
* |
|||
* @author Roddy <luolonghao@gmail.com> |
|||
* @site http://www.kindsoft.net/
|
|||
* @licence http://www.kindsoft.net/license.php
|
|||
*******************************************************************************/ |
|||
|
|||
KindEditor.plugin('flash', function(K) { |
|||
var self = this, name = 'flash', lang = self.lang(name + '.'), |
|||
allowFlashUpload = K.undef(self.allowFlashUpload, true), |
|||
allowFileManager = K.undef(self.allowFileManager, false), |
|||
formatUploadUrl = K.undef(self.formatUploadUrl, true), |
|||
extraParams = K.undef(self.extraFileUploadParams, {}), |
|||
filePostName = K.undef(self.filePostName, 'imgFile'), |
|||
uploadJson = K.undef(self.uploadJson, self.basePath + 'php/upload_json.php'); |
|||
self.plugin.flash = { |
|||
edit : function() { |
|||
var html = [ |
|||
'<div style="padding:20px;">', |
|||
//url
|
|||
'<div class="ke-dialog-row">', |
|||
'<label for="keUrl" style="width:60px;">' + lang.url + '</label>', |
|||
'<input class="ke-input-text" type="text" id="keUrl" name="url" value="" style="width:160px;" /> ', |
|||
'<input type="button" class="ke-upload-button" value="' + lang.upload + '" /> ', |
|||
'<span class="ke-button-common ke-button-outer">', |
|||
'<input type="button" class="ke-button-common ke-button" name="viewServer" value="' + lang.viewServer + '" />', |
|||
'</span>', |
|||
'</div>', |
|||
//width
|
|||
'<div class="ke-dialog-row">', |
|||
'<label for="keWidth" style="width:60px;">' + lang.width + '</label>', |
|||
'<input type="text" id="keWidth" class="ke-input-text ke-input-number" name="width" value="550" maxlength="4" /> ', |
|||
'</div>', |
|||
//height
|
|||
'<div class="ke-dialog-row">', |
|||
'<label for="keHeight" style="width:60px;">' + lang.height + '</label>', |
|||
'<input type="text" id="keHeight" class="ke-input-text ke-input-number" name="height" value="400" maxlength="4" /> ', |
|||
'</div>', |
|||
'</div>' |
|||
].join(''); |
|||
var dialog = self.createDialog({ |
|||
name : name, |
|||
width : 450, |
|||
title : self.lang(name), |
|||
body : html, |
|||
yesBtn : { |
|||
name : self.lang('yes'), |
|||
click : function(e) { |
|||
var url = K.trim(urlBox.val()), |
|||
width = widthBox.val(), |
|||
height = heightBox.val(); |
|||
if (url == 'http://' || K.invalidUrl(url)) { |
|||
alert(self.lang('invalidUrl')); |
|||
urlBox[0].focus(); |
|||
return; |
|||
} |
|||
if (!/^\d*$/.test(width)) { |
|||
alert(self.lang('invalidWidth')); |
|||
widthBox[0].focus(); |
|||
return; |
|||
} |
|||
if (!/^\d*$/.test(height)) { |
|||
alert(self.lang('invalidHeight')); |
|||
heightBox[0].focus(); |
|||
return; |
|||
} |
|||
var html = K.mediaImg(self.themesPath + 'common/blank.gif', { |
|||
src : url, |
|||
type : K.mediaType('.swf'), |
|||
width : width, |
|||
height : height, |
|||
quality : 'high' |
|||
}); |
|||
self.insertHtml(html).hideDialog().focus(); |
|||
} |
|||
} |
|||
}), |
|||
div = dialog.div, |
|||
urlBox = K('[name="url"]', div), |
|||
viewServerBtn = K('[name="viewServer"]', div), |
|||
widthBox = K('[name="width"]', div), |
|||
heightBox = K('[name="height"]', div); |
|||
urlBox.val('http://'); |
|||
|
|||
if (allowFlashUpload) { |
|||
var uploadbutton = K.uploadbutton({ |
|||
button : K('.ke-upload-button', div)[0], |
|||
fieldName : filePostName, |
|||
extraParams : extraParams, |
|||
url : K.addParam(uploadJson, 'dir=flash'), |
|||
afterUpload : function(data) { |
|||
dialog.hideLoading(); |
|||
if (data.error === 0) { |
|||
var url = data.url; |
|||
if (formatUploadUrl) { |
|||
url = K.formatUrl(url, 'absolute'); |
|||
} |
|||
urlBox.val(url); |
|||
if (self.afterUpload) { |
|||
self.afterUpload.call(self, url, data, name); |
|||
} |
|||
alert(self.lang('uploadSuccess')); |
|||
} else { |
|||
alert(data.message); |
|||
} |
|||
}, |
|||
afterError : function(html) { |
|||
dialog.hideLoading(); |
|||
self.errorDialog(html); |
|||
} |
|||
}); |
|||
uploadbutton.fileBox.change(function(e) { |
|||
dialog.showLoading(self.lang('uploadLoading')); |
|||
uploadbutton.submit(); |
|||
}); |
|||
} else { |
|||
K('.ke-upload-button', div).hide(); |
|||
} |
|||
|
|||
if (allowFileManager) { |
|||
viewServerBtn.click(function(e) { |
|||
self.loadPlugin('filemanager', function() { |
|||
self.plugin.filemanagerDialog({ |
|||
viewType : 'LIST', |
|||
dirName : 'flash', |
|||
clickFn : function(url, title) { |
|||
if (self.dialogs.length > 1) { |
|||
K('[name="url"]', div).val(url); |
|||
if (self.afterSelectFile) { |
|||
self.afterSelectFile.call(self, url); |
|||
} |
|||
self.hideDialog(); |
|||
} |
|||
} |
|||
}); |
|||
}); |
|||
}); |
|||
} else { |
|||
viewServerBtn.hide(); |
|||
} |
|||
|
|||
var img = self.plugin.getSelectedFlash(); |
|||
if (img) { |
|||
var attrs = K.mediaAttrs(img.attr('data-ke-tag')); |
|||
urlBox.val(attrs.src); |
|||
widthBox.val(K.removeUnit(img.css('width')) || attrs.width || 0); |
|||
heightBox.val(K.removeUnit(img.css('height')) || attrs.height || 0); |
|||
} |
|||
urlBox[0].focus(); |
|||
urlBox[0].select(); |
|||
}, |
|||
'delete' : function() { |
|||
self.plugin.getSelectedFlash().remove(); |
|||
// [IE] 删除图片后立即点击图片按钮出错
|
|||
self.addBookmark(); |
|||
} |
|||
}; |
|||
self.clickToolbar(name, self.plugin.flash.edit); |
|||
}); |
|||
|
After Width: | Height: | Size: 1.1 KiB |
|
After Width: | Height: | Size: 1.4 KiB |
|
After Width: | Height: | Size: 923 B |
|
After Width: | Height: | Size: 841 B |
|
After Width: | Height: | Size: 20 KiB |
|
After Width: | Height: | Size: 43 KiB |
@ -0,0 +1 @@ |
|||
.jd img{background:url(images/jxface2.gif?v=1.1) left top no-repeat;cursor:pointer;width:35px;height:35px;display:block}.pp img{background:url(images/fface.gif?v=1.1) left top no-repeat;cursor:pointer;width:25px;height:25px;display:block}.bb img,.cat img,.ldw img,.tsj img,.youa img{cursor:pointer;width:35px;height:35px;display:block}.ldw img{background:url(images/wface.gif?v=1.1) left top no-repeat}.tsj img{background:url(images/tface.gif?v=1.1) left top no-repeat}.cat img{background:url(images/cface.gif?v=1.1) left top no-repeat}.bb img{background:url(images/bface.gif?v=1.1) left top no-repeat}.youa img{background:url(images/yface.gif?v=1.1) left top no-repeat}.smileytable td{height:37px}#tabPanel{margin-left:5px;overflow:hidden}#tabContent{float:left;background:#FFF}#tabContent div{display:none;width:480px;overflow:hidden}#tabIconReview.show{left:17px;display:block}.menuFocus{background:#ACCD3C}.menuDefault{background:#FFF}#tabIconReview{position:absolute;left:406px;left:398px\9;top:41px;z-index:65533;width:90px;height:76px}img.review{width:90px;height:76px;border:2px solid #9cb945;background:center no-repeat #FFF}.wrapper .tabbody{position:relative;float:left;clear:both;padding:10px;width:95%}.tabbody table{width:100%}.tabbody td{border:1px solid #BAC498}.tabbody td span{display:block;zoom:1;padding:0 4px} |
|||
@ -0,0 +1,54 @@ |
|||
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" > |
|||
<html xmlns="http://www.w3.org/1999/xhtml"> |
|||
<head> |
|||
<title></title> |
|||
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> |
|||
<meta name="robots" content="noindex, nofollow"/> |
|||
<script type="text/javascript" src="../internal.js"></script> |
|||
<link rel="stylesheet" type="text/css" href="emotion.css"> |
|||
</head> |
|||
<body> |
|||
<div id="tabPanel" class="wrapper"> |
|||
<div id="tabHeads" class="tabhead"> |
|||
<span><var id="lang_input_choice"></var></span> |
|||
<span><var id="lang_input_Tuzki"></var></span> |
|||
<span><var id="lang_input_lvdouwa"></var></span> |
|||
<span><var id="lang_input_BOBO"></var></span> |
|||
<span><var id="lang_input_babyCat"></var></span> |
|||
<span><var id="lang_input_bubble"></var></span> |
|||
<span><var id="lang_input_youa"></var></span> |
|||
</div> |
|||
<div id="tabBodys" class="tabbody"> |
|||
<div id="tab0"></div> |
|||
<div id="tab1"></div> |
|||
<div id="tab2"></div> |
|||
<div id="tab3"></div> |
|||
<div id="tab4"></div> |
|||
<div id="tab5"></div> |
|||
<div id="tab6"></div> |
|||
</div> |
|||
</div> |
|||
<div id="tabIconReview"> |
|||
<img id='faceReview' class='review' src="../../themes/default/images/spacer.gif"/> |
|||
</div> |
|||
<script type="text/javascript" src="emotion.js"></script> |
|||
<script type="text/javascript"> |
|||
var emotion = { |
|||
tabNum:7, //切换面板数量 |
|||
SmilmgName:{ tab0:['j_00', 84], tab1:['t_00', 40], tab2:['w_00', 52], tab3:['B_00', 63], tab4:['C_00', 20], tab5:['i_f', 50], tab6:['y_00', 40] }, //图片前缀名 |
|||
imageFolders:{ tab0:'jx2/', tab1:'tsj/', tab2:'ldw/', tab3:'bobo/', tab4:'babycat/', tab5:'face/', tab6:'youa/'}, //图片对应文件夹路径 |
|||
imageCss:{tab0:'jd', tab1:'tsj', tab2:'ldw', tab3:'bb', tab4:'cat', tab5:'pp', tab6:'youa'}, //图片css类名 |
|||
imageCssOffset:{tab0:35, tab1:35, tab2:35, tab3:35, tab4:35, tab5:25, tab6:35}, //图片偏移 |
|||
SmileyInfor:{ |
|||
tab0:['Kiss', 'Love', 'Yeah', '啊!', '背扭', '顶', '抖胸', '88', '汗', '瞌睡', '鲁拉', '拍砖', '揉脸', '生日快乐', '大笑', '瀑布汗~', '惊讶', '臭美', '傻笑', '抛媚眼', '发怒', '打酱油', '俯卧撑', '气愤', '?', '吻', '怒', '胜利', 'HI', 'KISS', '不说', '不要', '扯花', '大心', '顶', '大惊', '飞吻', '鬼脸', '害羞', '口水', '狂哭', '来', '发财了', '吃西瓜', '套牢', '害羞', '庆祝', '我来了', '敲打', '晕了', '胜利', '臭美', '被打了', '贪吃', '迎接', '酷', '微笑', '亲吻', '调皮', '惊恐', '耍酷', '发火', '害羞', '汗水', '大哭', '', '加油', '困', '你NB', '晕倒', '开心', '偷笑', '大哭', '滴汗', '叹气', '超赞', '??', '飞吻', '天使', '撒花', '生气', '被砸', '吓傻', '随意吐'], |
|||
tab1:['Kiss', 'Love', 'Yeah', '啊!', '背扭', '顶', '抖胸', '88', '汗', '瞌睡', '鲁拉', '拍砖', '揉脸', '生日快乐', '摊手', '睡觉', '瘫坐', '无聊', '星星闪', '旋转', '也不行', '郁闷', '正Music', '抓墙', '撞墙至死', '歪头', '戳眼', '飘过', '互相拍砖', '砍死你', '扔桌子', '少林寺', '什么?', '转头', '我爱牛奶', '我踢', '摇晃', '晕厥', '在笼子里', '震荡'], |
|||
tab2:['大笑', '瀑布汗~', '惊讶', '臭美', '傻笑', '抛媚眼', '发怒', '我错了', 'money', '气愤', '挑逗', '吻', '怒', '胜利', '委屈', '受伤', '说啥呢?', '闭嘴', '不', '逗你玩儿', '飞吻', '眩晕', '魔法', '我来了', '睡了', '我打', '闭嘴', '打', '打晕了', '刷牙', '爆揍', '炸弹', '倒立', '刮胡子', '邪恶的笑', '不要不要', '爱恋中', '放大仔细看', '偷窥', '超高兴', '晕', '松口气', '我跑', '享受', '修养', '哭', '汗', '啊~', '热烈欢迎', '打酱油', '俯卧撑', '?'], |
|||
tab3:['HI', 'KISS', '不说', '不要', '扯花', '大心', '顶', '大惊', '飞吻', '鬼脸', '害羞', '口水', '狂哭', '来', '泪眼', '流泪', '生气', '吐舌', '喜欢', '旋转', '再见', '抓狂', '汗', '鄙视', '拜', '吐血', '嘘', '打人', '蹦跳', '变脸', '扯肉', '吃To', '吃花', '吹泡泡糖', '大变身', '飞天舞', '回眸', '可怜', '猛抽', '泡泡', '苹果', '亲', '', '骚舞', '烧香', '睡', '套娃娃', '捅捅', '舞倒', '西红柿', '爱慕', '摇', '摇摆', '杂耍', '招财', '被殴', '被球闷', '大惊', '理想', '欧打', '呕吐', '碎', '吐痰'], |
|||
tab4:['发财了', '吃西瓜', '套牢', '害羞', '庆祝', '我来了', '敲打', '晕了', '胜利', '臭美', '被打了', '贪吃', '迎接', '酷', '顶', '幸运', '爱心', '躲', '送花', '选择'], |
|||
tab5:['微笑', '亲吻', '调皮', '惊讶', '耍酷', '发火', '害羞', '汗水', '大哭', '得意', '鄙视', '困', '夸奖', '晕倒', '疑问', '媒婆', '狂吐', '青蛙', '发愁', '亲吻', '', '爱心', '心碎', '玫瑰', '礼物', '哭', '奸笑', '可爱', '得意', '呲牙', '暴汗', '楚楚可怜', '困', '哭', '生气', '惊讶', '口水', '彩虹', '夜空', '太阳', '钱钱', '灯泡', '咖啡', '蛋糕', '音乐', '爱', '胜利', '赞', '鄙视', 'OK'], |
|||
tab6:['男兜', '女兜', '开心', '乖乖', '偷笑', '大笑', '抽泣', '大哭', '无奈', '滴汗', '叹气', '狂晕', '委屈', '超赞', '??', '疑问', '飞吻', '天使', '撒花', '生气', '被砸', '口水', '泪奔', '吓傻', '吐舌头', '点头', '随意吐', '旋转', '困困', '鄙视', '狂顶', '篮球', '再见', '欢迎光临', '恭喜发财', '稍等', '我在线', '恕不议价', '库房有货', '货在路上'] |
|||
} |
|||
}; |
|||
</script> |
|||
</body> |
|||
</html> |
|||
@ -0,0 +1,186 @@ |
|||
window.onload = function () { |
|||
editor.setOpt({ |
|||
emotionLocalization:false |
|||
}); |
|||
|
|||
emotion.SmileyPath = editor.options.emotionLocalization === true ? 'images/' : "http://img.baidu.com/hi/"; |
|||
emotion.SmileyBox = createTabList( emotion.tabNum ); |
|||
emotion.tabExist = createArr( emotion.tabNum ); |
|||
|
|||
initImgName(); |
|||
initEvtHandler( "tabHeads" ); |
|||
}; |
|||
|
|||
function initImgName() { |
|||
for ( var pro in emotion.SmilmgName ) { |
|||
var tempName = emotion.SmilmgName[pro], |
|||
tempBox = emotion.SmileyBox[pro], |
|||
tempStr = ""; |
|||
|
|||
if ( tempBox.length ) return; |
|||
for ( var i = 1; i <= tempName[1]; i++ ) { |
|||
tempStr = tempName[0]; |
|||
if ( i < 10 ) tempStr = tempStr + '0'; |
|||
tempStr = tempStr + i + '.gif'; |
|||
tempBox.push( tempStr ); |
|||
} |
|||
} |
|||
} |
|||
|
|||
function initEvtHandler( conId ) { |
|||
var tabHeads = $G( conId ); |
|||
for ( var i = 0, j = 0; i < tabHeads.childNodes.length; i++ ) { |
|||
var tabObj = tabHeads.childNodes[i]; |
|||
if ( tabObj.nodeType == 1 ) { |
|||
domUtils.on( tabObj, "click", (function ( index ) { |
|||
return function () { |
|||
switchTab( index ); |
|||
}; |
|||
})( j ) ); |
|||
j++; |
|||
} |
|||
} |
|||
switchTab( 0 ); |
|||
$G( "tabIconReview" ).style.display = 'none'; |
|||
} |
|||
|
|||
function InsertSmiley( url, evt ) { |
|||
var obj = { |
|||
src:editor.options.emotionLocalization ? editor.options.UEDITOR_HOME_URL + "dialogs/emotion/" + url : url |
|||
}; |
|||
obj._src = obj.src; |
|||
editor.execCommand( 'insertimage', obj ); |
|||
if ( !evt.ctrlKey ) { |
|||
dialog.popup.hide(); |
|||
} |
|||
} |
|||
|
|||
function switchTab( index ) { |
|||
|
|||
autoHeight( index ); |
|||
if ( emotion.tabExist[index] == 0 ) { |
|||
emotion.tabExist[index] = 1; |
|||
createTab( 'tab' + index ); |
|||
} |
|||
//获取呈现元素句柄数组
|
|||
var tabHeads = $G( "tabHeads" ).getElementsByTagName( "span" ), |
|||
tabBodys = $G( "tabBodys" ).getElementsByTagName( "div" ), |
|||
i = 0, L = tabHeads.length; |
|||
//隐藏所有呈现元素
|
|||
for ( ; i < L; i++ ) { |
|||
tabHeads[i].className = ""; |
|||
tabBodys[i].style.display = "none"; |
|||
} |
|||
//显示对应呈现元素
|
|||
tabHeads[index].className = "focus"; |
|||
tabBodys[index].style.display = "block"; |
|||
} |
|||
|
|||
function autoHeight( index ) { |
|||
var iframe = dialog.getDom( "iframe" ), |
|||
parent = iframe.parentNode.parentNode; |
|||
switch ( index ) { |
|||
case 0: |
|||
iframe.style.height = "380px"; |
|||
parent.style.height = "392px"; |
|||
break; |
|||
case 1: |
|||
iframe.style.height = "220px"; |
|||
parent.style.height = "232px"; |
|||
break; |
|||
case 2: |
|||
iframe.style.height = "260px"; |
|||
parent.style.height = "272px"; |
|||
break; |
|||
case 3: |
|||
iframe.style.height = "300px"; |
|||
parent.style.height = "312px"; |
|||
break; |
|||
case 4: |
|||
iframe.style.height = "140px"; |
|||
parent.style.height = "152px"; |
|||
break; |
|||
case 5: |
|||
iframe.style.height = "260px"; |
|||
parent.style.height = "272px"; |
|||
break; |
|||
case 6: |
|||
iframe.style.height = "230px"; |
|||
parent.style.height = "242px"; |
|||
break; |
|||
default: |
|||
|
|||
} |
|||
} |
|||
|
|||
|
|||
function createTab( tabName ) { |
|||
var faceVersion = "?v=1.1", //版本号
|
|||
tab = $G( tabName ), //获取将要生成的Div句柄
|
|||
imagePath = emotion.SmileyPath + emotion.imageFolders[tabName], //获取显示表情和预览表情的路径
|
|||
positionLine = 11 / 2, //中间数
|
|||
iWidth = iHeight = 35, //图片长宽
|
|||
iColWidth = 3, //表格剩余空间的显示比例
|
|||
tableCss = emotion.imageCss[tabName], |
|||
cssOffset = emotion.imageCssOffset[tabName], |
|||
textHTML = ['<table class="smileytable">'], |
|||
i = 0, imgNum = emotion.SmileyBox[tabName].length, imgColNum = 11, faceImage, |
|||
sUrl, realUrl, posflag, offset, infor; |
|||
|
|||
for ( ; i < imgNum; ) { |
|||
textHTML.push( '<tr>' ); |
|||
for ( var j = 0; j < imgColNum; j++, i++ ) { |
|||
faceImage = emotion.SmileyBox[tabName][i]; |
|||
if ( faceImage ) { |
|||
sUrl = imagePath + faceImage + faceVersion; |
|||
realUrl = imagePath + faceImage; |
|||
posflag = j < positionLine ? 0 : 1; |
|||
offset = cssOffset * i * (-1) - 1; |
|||
infor = emotion.SmileyInfor[tabName][i]; |
|||
|
|||
textHTML.push( '<td class="' + tableCss + '" border="1" width="' + iColWidth + '%" style="border-collapse:collapse;" align="center" bgcolor="transparent" onclick="InsertSmiley(\'' + realUrl.replace( /'/g, "\\'" ) + '\',event)" onmouseover="over(this,\'' + sUrl + '\',\'' + posflag + '\')" onmouseout="out(this)">' ); |
|||
textHTML.push( '<span>' ); |
|||
textHTML.push( '<img style="background-position:left ' + offset + 'px;" title="' + infor + '" src="' + emotion.SmileyPath + (editor.options.emotionLocalization ? '0.gif" width="' : 'default/0.gif" width="') + iWidth + '" height="' + iHeight + '"></img>' ); |
|||
textHTML.push( '</span>' ); |
|||
} else { |
|||
textHTML.push( '<td width="' + iColWidth + '%" bgcolor="#FFFFFF">' ); |
|||
} |
|||
textHTML.push( '</td>' ); |
|||
} |
|||
textHTML.push( '</tr>' ); |
|||
} |
|||
textHTML.push( '</table>' ); |
|||
textHTML = textHTML.join( "" ); |
|||
tab.innerHTML = textHTML; |
|||
} |
|||
|
|||
function over( td, srcPath, posFlag ) { |
|||
td.style.backgroundColor = "#ACCD3C"; |
|||
$G( 'faceReview' ).style.backgroundImage = "url(" + srcPath + ")"; |
|||
if ( posFlag == 1 ) $G( "tabIconReview" ).className = "show"; |
|||
$G( "tabIconReview" ).style.display = 'block'; |
|||
} |
|||
|
|||
function out( td ) { |
|||
td.style.backgroundColor = "transparent"; |
|||
var tabIconRevew = $G( "tabIconReview" ); |
|||
tabIconRevew.className = ""; |
|||
tabIconRevew.style.display = 'none'; |
|||
} |
|||
|
|||
function createTabList( tabNum ) { |
|||
var obj = {}; |
|||
for ( var i = 0; i < tabNum; i++ ) { |
|||
obj["tab" + i] = []; |
|||
} |
|||
return obj; |
|||
} |
|||
|
|||
function createArr( tabNum ) { |
|||
var arr = []; |
|||
for ( var i = 0; i < tabNum; i++ ) { |
|||
arr[i] = 0; |
|||
} |
|||
return arr; |
|||
} |
|||
|
|||
|
After Width: | Height: | Size: 18 KiB |
@ -0,0 +1,89 @@ |
|||
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" |
|||
"http://www.w3.org/TR/html4/loose.dtd"> |
|||
<html> |
|||
<head> |
|||
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> |
|||
<title></title> |
|||
<script type="text/javascript" src="../internal.js"></script> |
|||
<style type="text/css"> |
|||
.content{width:530px; height: 350px;margin: 10px auto;} |
|||
.content table{width: 100%} |
|||
.content table td{vertical-align: middle;} |
|||
#address{width:220px;height:21px;background: #FFF;border:1px solid #d7d7d7; line-height: 21px;} |
|||
</style> |
|||
<script type="text/javascript" src="http://maps.googleapis.com/maps/api/js?sensor=false"></script> |
|||
</head> |
|||
<body> |
|||
<div class="content"> |
|||
<table> |
|||
<tr> |
|||
<td><label for="address"><var id="lang_input_address"></var></label></td> |
|||
<td><input id="address" type="text" /></td> |
|||
<td><a id="doSearch" href="javascript:void(0)" class="button"><var id="lang_input_search"></var></a></td> |
|||
</tr> |
|||
</table> |
|||
<div id="container" style="width: 100%; height: 340px;margin: 5px auto; border: 1px solid gray;"></div> |
|||
</div> |
|||
<script type="text/javascript"> |
|||
domUtils.on(window,"load",function(){ |
|||
var map = new google.maps.Map(document.getElementById('container'), { |
|||
zoom: 3, |
|||
streetViewControl: false, |
|||
scaleControl: true, |
|||
mapTypeId: google.maps.MapTypeId.ROADMAP |
|||
}); |
|||
var imgcss; |
|||
var marker = new google.maps.Marker({ |
|||
map: map, |
|||
draggable: true |
|||
}); |
|||
function doSearch(){ |
|||
var address = document.getElementById('address').value; |
|||
var geocoder = new google.maps.Geocoder(); |
|||
geocoder.geocode( { 'address': address}, function (results, status) { |
|||
if (status == google.maps.GeocoderStatus.OK) { |
|||
var bounds = results[0].geometry.viewport; |
|||
map.fitBounds(bounds); |
|||
marker.setPosition(results[0].geometry.location); |
|||
marker.setTitle(address); |
|||
} else alert(lang.searchError); |
|||
}); |
|||
} |
|||
$G('address').onkeydown = function (evt){ |
|||
evt = evt || event; |
|||
if (evt.keyCode == 13) { |
|||
doSearch(); |
|||
} |
|||
}; |
|||
$G("doSearch").onclick = doSearch; |
|||
dialog.onok = function (){ |
|||
var center = map.getCenter(); |
|||
var point = marker.getPosition(); |
|||
var url = "http://maps.googleapis.com/maps/api/staticmap?center=" + center.lat() + ',' + center.lng() + "&zoom=" + map.zoom + "&size=520x340&maptype=" + map.getMapTypeId() + "&markers=" + point.lat() + ',' + point.lng() + "&sensor=false"; |
|||
editor.execCommand('inserthtml', '<img width="520" height="340" src="' + url + '"' + (imgcss ? ' style="' + imgcss + '"' :'') + '/>'); |
|||
}; |
|||
|
|||
function getPars(str,par){ |
|||
var reg = new RegExp(par+"=((\\d+|[.,])*)","g"); |
|||
return reg.exec(str)[1]; |
|||
} |
|||
var img = editor.selection.getRange().getClosedNode(); |
|||
if(img && img.src.indexOf("http://maps.googleapis.com/maps/api/staticmap")!=-1){ |
|||
var url = img.getAttribute("src"); |
|||
var centers = getPars(url,"center").split(","); |
|||
point = new google.maps.LatLng(Number(centers[0]),Number(centers[1])); |
|||
map.setCenter(point); |
|||
map.setZoom(Number(getPars(url,"zoom"))); |
|||
centers = getPars(url,"markers").split(","); |
|||
marker.setPosition(new google.maps.LatLng(Number(centers[0]),Number(centers[1]))); |
|||
imgcss = img.style.cssText; |
|||
}else{ |
|||
setTimeout(function(){ |
|||
doSearch(); |
|||
},30) |
|||
} |
|||
}); |
|||
|
|||
</script> |
|||
</body> |
|||
</html> |
|||
@ -0,0 +1 @@ |
|||
.wrapper{width:370px;margin:10px auto;zoom:1}.tabbody{height:360px}.tabbody .panel{width:100%;height:360px;position:absolute;background:#fff}.tabbody .panel h1{font-size:26px;margin:5px 0 0 5px}.tabbody .panel p{font-size:12px;margin:5px 0 0 5px}.tabbody table{width:90%;line-height:20px;margin:5px 0 0 5px}.tabbody table thead{font-weight:700;line-height:25px} |
|||
@ -0,0 +1,82 @@ |
|||
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" |
|||
"http://www.w3.org/TR/html4/loose.dtd"> |
|||
<html> |
|||
<head> |
|||
<title>帮助</title> |
|||
<meta content="text/html; charset=utf-8" http-equiv="Content-Type"/> |
|||
<script type="text/javascript" src="../internal.js"></script> |
|||
<link rel="stylesheet" type="text/css" href="help.css"> |
|||
</head> |
|||
<body> |
|||
<div class="wrapper" id="helptab"> |
|||
<div id="tabHeads" class="tabhead"> |
|||
<span class="focus" tabsrc="about"><var id="lang_input_about"></var></span> |
|||
<span tabsrc="shortcuts"><var id="lang_input_shortcuts"></var></span> |
|||
</div> |
|||
<div id="tabBodys" class="tabbody"> |
|||
<div id="about" class="panel"> |
|||
<h1>UEditor</h1> |
|||
<p id="version"></p> |
|||
<p><var id="lang_input_introduction"></var></p> |
|||
</div> |
|||
<div id="shortcuts" class="panel"> |
|||
<table> |
|||
<thead> |
|||
<tr> |
|||
<td><var id="lang_Txt_shortcuts"></var></td> |
|||
<td><var id="lang_Txt_func"></var></td> |
|||
</tr> |
|||
</thead> |
|||
<tbody> |
|||
<tr> |
|||
<td>ctrl+b</td> |
|||
<td><var id="lang_Txt_bold"></var></td> |
|||
</tr> |
|||
<tr> |
|||
<td>ctrl+c</td> |
|||
<td><var id="lang_Txt_copy"></var></td> |
|||
</tr> |
|||
<tr> |
|||
<td>ctrl+x</td> |
|||
<td><var id="lang_Txt_cut"></var></td> |
|||
</tr> |
|||
<tr> |
|||
<td>ctrl+v</td> |
|||
<td><var id="lang_Txt_Paste"></var></td> |
|||
</tr> |
|||
<tr> |
|||
<td>ctrl+y</td> |
|||
<td><var id="lang_Txt_undo"></var></td> |
|||
</tr> |
|||
<tr> |
|||
<td>ctrl+z</td> |
|||
<td><var id="lang_Txt_redo"></var></td> |
|||
</tr> |
|||
<tr> |
|||
<td>ctrl+i</td> |
|||
<td><var id="lang_Txt_italic"></var></td> |
|||
</tr> |
|||
<tr> |
|||
<td>ctrl+u</td> |
|||
<td><var id="lang_Txt_underline"></var></td> |
|||
</tr> |
|||
<tr> |
|||
<td>ctrl+a</td> |
|||
<td><var id="lang_Txt_selectAll"></var></td> |
|||
</tr> |
|||
<tr> |
|||
<td>shift+enter</td> |
|||
<td><var id="lang_Txt_visualEnter"></var></td> |
|||
</tr> |
|||
<tr> |
|||
<td>alt+z</td> |
|||
<td><var id="lang_Txt_fullscreen"></var></td> |
|||
</tr> |
|||
</tbody> |
|||
</table> |
|||
</div> |
|||
</div> |
|||
</div> |
|||
<script type="text/javascript" src="help.js"></script> |
|||
</body> |
|||
</html> |
|||
@ -0,0 +1,56 @@ |
|||
/** |
|||
* Created with JetBrains PhpStorm. |
|||
* User: xuheng |
|||
* Date: 12-9-26 |
|||
* Time: 下午1:06 |
|||
* To change this template use File | Settings | File Templates. |
|||
*/ |
|||
/** |
|||
* tab点击处理事件 |
|||
* @param tabHeads |
|||
* @param tabBodys |
|||
* @param obj |
|||
*/ |
|||
function clickHandler( tabHeads,tabBodys,obj ) { |
|||
//head样式更改
|
|||
for ( var k = 0, len = tabHeads.length; k < len; k++ ) { |
|||
tabHeads[k].className = ""; |
|||
} |
|||
obj.className = "focus"; |
|||
//body显隐
|
|||
var tabSrc = obj.getAttribute( "tabSrc" ); |
|||
for ( var j = 0, length = tabBodys.length; j < length; j++ ) { |
|||
var body = tabBodys[j], |
|||
id = body.getAttribute( "id" ); |
|||
body.onclick = function(){ |
|||
this.style.zoom = 1; |
|||
}; |
|||
if ( id != tabSrc ) { |
|||
body.style.zIndex = 1; |
|||
} else { |
|||
body.style.zIndex = 200; |
|||
} |
|||
} |
|||
|
|||
} |
|||
|
|||
/** |
|||
* TAB切换 |
|||
* @param tabParentId tab的父节点ID或者对象本身 |
|||
*/ |
|||
function switchTab( tabParentId ) { |
|||
var tabElements = $G( tabParentId ).children, |
|||
tabHeads = tabElements[0].children, |
|||
tabBodys = tabElements[1].children; |
|||
|
|||
for ( var i = 0, length = tabHeads.length; i < length; i++ ) { |
|||
var head = tabHeads[i]; |
|||
if ( head.className === "focus" )clickHandler(tabHeads,tabBodys, head ); |
|||
head.onclick = function () { |
|||
clickHandler(tabHeads,tabBodys,this); |
|||
} |
|||
} |
|||
} |
|||
switchTab("helptab"); |
|||
|
|||
document.getElementById('version').innerHTML = parent.UE.version; |
|||
|
After Width: | Height: | Size: 519 B |
|
After Width: | Height: | Size: 657 B |
|
After Width: | Height: | Size: 42 KiB |
|
After Width: | Height: | Size: 304 B |
@ -0,0 +1 @@ |
|||
.section,.section ul,.wrapper,body{overflow:hidden}.section .preview caption,.section h3{font-weight:700}body{width:540px}.wrapper{margin:10px auto 0;font-size:12px;width:520px;height:315px}.clear{clear:both}.wrapper .left{float:left;margin-left:10px}.wrapper .right{float:right;border-left:2px dotted #EDEDED;padding-left:15px}.section{margin-bottom:15px;width:240px}.section h3{padding:5px 0;margin-bottom:10px;border-bottom:1px solid #EDEDED;font-size:12px}.section ul{list-style:none;clear:both}.section li{float:left;width:120px}.section .tone{width:80px}.section .preview{width:220px}.section .preview table{text-align:center;vertical-align:middle;color:#666}.section .preview td{border-width:1px;border-style:solid;height:22px}.section .preview th{border-style:solid;border-color:#DDD;border-width:2px 1px 1px;height:22px;background-color:#F7F7F7} |
|||
@ -0,0 +1,64 @@ |
|||
<!DOCTYPE html> |
|||
<html> |
|||
<head> |
|||
<title></title> |
|||
<script type="text/javascript" src="../internal.js"></script> |
|||
<link rel="stylesheet" type="text/css" href="edittable.css"> |
|||
</head> |
|||
<body> |
|||
<div class="wrapper"> |
|||
<div class="left"> |
|||
<div class="section"> |
|||
<h3><var id="lang_tableStyle"></var></h3> |
|||
<ul> |
|||
<li> |
|||
<label onselectstart="return false"><input type="checkbox" id="J_title" name="style"/><var id="lang_insertTitle"></var></label> |
|||
</li> |
|||
<li> |
|||
<label onselectstart="return false"><input type="checkbox" id="J_titleCol" name="style"/><var id="lang_insertTitleCol"></var></label> |
|||
</li> |
|||
</ul> |
|||
<ul> |
|||
<li> |
|||
<label onselectstart="return false"><input type="checkbox" id="J_caption" name="style"/><var id="lang_insertCaption"></var></label> |
|||
</li> |
|||
<li> |
|||
<label onselectstart="return false"><input type="checkbox" id="J_sorttable" name="style"/><var id="lang_orderbycontent"></var></label> |
|||
</li> |
|||
</ul> |
|||
<div class="clear"></div> |
|||
</div> |
|||
<div class="section"> |
|||
<h3><var id="lang_tableSize"></var></h3> |
|||
<ul> |
|||
<li> |
|||
<label><input type="radio" id="J_autoSizeContent" name="size"/><var id="lang_autoSizeContent"></var></label> |
|||
</li> |
|||
<li> |
|||
<label><input type="radio" id="J_autoSizePage" name="size"/><var id="lang_autoSizePage"></var></label> |
|||
</li> |
|||
</ul> |
|||
<div class="clear"></div> |
|||
</div> |
|||
<div class="section"> |
|||
<h3><var id="lang_borderStyle"></var></h3> |
|||
<ul> |
|||
<li> |
|||
<span><var id="lang_color"></var></span> |
|||
<input type="text" class="tone" id="J_tone" readonly='readonly' /> |
|||
</li> |
|||
</ul> |
|||
<div class="clear"></div> |
|||
</div> |
|||
</div> |
|||
<div class="right"> |
|||
<div class="section"> |
|||
<h3><var id="lang_example"></var></h3> |
|||
<div class="preview" id="J_preview"> |
|||
</div> |
|||
</div> |
|||
</div> |
|||
</div> |
|||
<script type="text/javascript" src="edittable.js"></script> |
|||
</body> |
|||
</html> |
|||
@ -0,0 +1,237 @@ |
|||
/** |
|||
* Created with JetBrains PhpStorm. |
|||
* User: xuheng |
|||
* Date: 12-12-19 |
|||
* Time: 下午4:55 |
|||
* To change this template use File | Settings | File Templates. |
|||
*/ |
|||
(function () { |
|||
var title = $G("J_title"), |
|||
titleCol = $G("J_titleCol"), |
|||
caption = $G("J_caption"), |
|||
sorttable = $G("J_sorttable"), |
|||
autoSizeContent = $G("J_autoSizeContent"), |
|||
autoSizePage = $G("J_autoSizePage"), |
|||
tone = $G("J_tone"), |
|||
me, |
|||
preview = $G("J_preview"); |
|||
|
|||
var editTable = function () { |
|||
me = this; |
|||
me.init(); |
|||
}; |
|||
editTable.prototype = { |
|||
init:function () { |
|||
var colorPiker = new UE.ui.ColorPicker({ |
|||
editor:editor |
|||
}), |
|||
colorPop = new UE.ui.Popup({ |
|||
editor:editor, |
|||
content:colorPiker |
|||
}); |
|||
|
|||
title.checked = editor.queryCommandState("inserttitle") == -1; |
|||
titleCol.checked = editor.queryCommandState("inserttitlecol") == -1; |
|||
caption.checked = editor.queryCommandState("insertcaption") == -1; |
|||
sorttable.checked = editor.queryCommandState("enablesort") == 1; |
|||
|
|||
var enablesortState = editor.queryCommandState("enablesort"), |
|||
disablesortState = editor.queryCommandState("disablesort"); |
|||
|
|||
sorttable.checked = !!(enablesortState < 0 && disablesortState >=0); |
|||
sorttable.disabled = !!(enablesortState < 0 && disablesortState < 0); |
|||
sorttable.title = enablesortState < 0 && disablesortState < 0 ? lang.errorMsg:''; |
|||
|
|||
me.createTable(title.checked, titleCol.checked, caption.checked); |
|||
me.setAutoSize(); |
|||
me.setColor(me.getColor()); |
|||
|
|||
domUtils.on(title, "click", me.titleHanler); |
|||
domUtils.on(titleCol, "click", me.titleColHanler); |
|||
domUtils.on(caption, "click", me.captionHanler); |
|||
domUtils.on(sorttable, "click", me.sorttableHanler); |
|||
domUtils.on(autoSizeContent, "click", me.autoSizeContentHanler); |
|||
domUtils.on(autoSizePage, "click", me.autoSizePageHanler); |
|||
|
|||
domUtils.on(tone, "click", function () { |
|||
colorPop.showAnchor(tone); |
|||
}); |
|||
domUtils.on(document, 'mousedown', function () { |
|||
colorPop.hide(); |
|||
}); |
|||
colorPiker.addListener("pickcolor", function () { |
|||
me.setColor(arguments[1]); |
|||
colorPop.hide(); |
|||
}); |
|||
colorPiker.addListener("picknocolor", function () { |
|||
me.setColor(""); |
|||
colorPop.hide(); |
|||
}); |
|||
}, |
|||
|
|||
createTable:function (hasTitle, hasTitleCol, hasCaption) { |
|||
var arr = [], |
|||
sortSpan = '<span>^</span>'; |
|||
arr.push("<table id='J_example'>"); |
|||
if (hasCaption) { |
|||
arr.push("<caption>" + lang.captionName + "</caption>") |
|||
} |
|||
if (hasTitle) { |
|||
arr.push("<tr>"); |
|||
if(hasTitleCol) { arr.push("<th>" + lang.titleName + "</th>"); } |
|||
for (var j = 0; j < 5; j++) { |
|||
arr.push("<th>" + lang.titleName + "</th>"); |
|||
} |
|||
arr.push("</tr>"); |
|||
} |
|||
for (var i = 0; i < 6; i++) { |
|||
arr.push("<tr>"); |
|||
if(hasTitleCol) { arr.push("<th>" + lang.titleName + "</th>") } |
|||
for (var k = 0; k < 5; k++) { |
|||
arr.push("<td>" + lang.cellsName + "</td>") |
|||
} |
|||
arr.push("</tr>"); |
|||
} |
|||
arr.push("</table>"); |
|||
preview.innerHTML = arr.join(""); |
|||
this.updateSortSpan(); |
|||
}, |
|||
titleHanler:function () { |
|||
var example = $G("J_example"), |
|||
frg=document.createDocumentFragment(), |
|||
color = domUtils.getComputedStyle(domUtils.getElementsByTagName(example, "td")[0], "border-color"), |
|||
colCount = example.rows[0].children.length; |
|||
|
|||
if (title.checked) { |
|||
example.insertRow(0); |
|||
for (var i = 0, node; i < colCount; i++) { |
|||
node = document.createElement("th"); |
|||
node.innerHTML = lang.titleName; |
|||
frg.appendChild(node); |
|||
} |
|||
example.rows[0].appendChild(frg); |
|||
|
|||
} else { |
|||
domUtils.remove(example.rows[0]); |
|||
} |
|||
me.setColor(color); |
|||
me.updateSortSpan(); |
|||
}, |
|||
titleColHanler:function () { |
|||
var example = $G("J_example"), |
|||
color = domUtils.getComputedStyle(domUtils.getElementsByTagName(example, "td")[0], "border-color"), |
|||
colArr = example.rows, |
|||
colCount = colArr.length; |
|||
|
|||
if (titleCol.checked) { |
|||
for (var i = 0, node; i < colCount; i++) { |
|||
node = document.createElement("th"); |
|||
node.innerHTML = lang.titleName; |
|||
colArr[i].insertBefore(node, colArr[i].children[0]); |
|||
} |
|||
} else { |
|||
for (var i = 0; i < colCount; i++) { |
|||
domUtils.remove(colArr[i].children[0]); |
|||
} |
|||
} |
|||
me.setColor(color); |
|||
me.updateSortSpan(); |
|||
}, |
|||
captionHanler:function () { |
|||
var example = $G("J_example"); |
|||
if (caption.checked) { |
|||
var row = document.createElement('caption'); |
|||
row.innerHTML = lang.captionName; |
|||
example.insertBefore(row, example.firstChild); |
|||
} else { |
|||
domUtils.remove(domUtils.getElementsByTagName(example, 'caption')[0]); |
|||
} |
|||
}, |
|||
sorttableHanler:function(){ |
|||
me.updateSortSpan(); |
|||
}, |
|||
autoSizeContentHanler:function () { |
|||
var example = $G("J_example"); |
|||
example.removeAttribute("width"); |
|||
}, |
|||
autoSizePageHanler:function () { |
|||
var example = $G("J_example"); |
|||
var tds = example.getElementsByTagName(example, "td"); |
|||
utils.each(tds, function (td) { |
|||
td.removeAttribute("width"); |
|||
}); |
|||
example.setAttribute('width', '100%'); |
|||
}, |
|||
updateSortSpan: function(){ |
|||
var example = $G("J_example"), |
|||
row = example.rows[0]; |
|||
|
|||
var spans = domUtils.getElementsByTagName(example,"span"); |
|||
utils.each(spans,function(span){ |
|||
span.parentNode.removeChild(span); |
|||
}); |
|||
if (sorttable.checked) { |
|||
utils.each(row.cells, function(cell, i){ |
|||
var span = document.createElement("span"); |
|||
span.innerHTML = "^"; |
|||
cell.appendChild(span); |
|||
}); |
|||
} |
|||
}, |
|||
getColor:function () { |
|||
var start = editor.selection.getStart(), color, |
|||
cell = domUtils.findParentByTagName(start, ["td", "th", "caption"], true); |
|||
color = cell && domUtils.getComputedStyle(cell, "border-color"); |
|||
if (!color) color = "#DDDDDD"; |
|||
return color; |
|||
}, |
|||
setColor:function (color) { |
|||
var example = $G("J_example"), |
|||
arr = domUtils.getElementsByTagName(example, "td").concat( |
|||
domUtils.getElementsByTagName(example, "th"), |
|||
domUtils.getElementsByTagName(example, "caption") |
|||
); |
|||
|
|||
tone.value = color; |
|||
utils.each(arr, function (node) { |
|||
node.style.borderColor = color; |
|||
}); |
|||
|
|||
}, |
|||
setAutoSize:function () { |
|||
var me = this; |
|||
autoSizePage.checked = true; |
|||
me.autoSizePageHanler(); |
|||
} |
|||
}; |
|||
|
|||
new editTable; |
|||
|
|||
dialog.onok = function () { |
|||
editor.__hasEnterExecCommand = true; |
|||
|
|||
var checks = { |
|||
title:"inserttitle deletetitle", |
|||
titleCol:"inserttitlecol deletetitlecol", |
|||
caption:"insertcaption deletecaption", |
|||
sorttable:"enablesort disablesort" |
|||
}; |
|||
editor.fireEvent('saveScene'); |
|||
for(var i in checks){ |
|||
var cmds = checks[i].split(" "), |
|||
input = $G("J_" + i); |
|||
if(input["checked"]){ |
|||
editor.queryCommandState(cmds[0])!=-1 &&editor.execCommand(cmds[0]); |
|||
}else{ |
|||
editor.queryCommandState(cmds[1])!=-1 &&editor.execCommand(cmds[1]); |
|||
} |
|||
} |
|||
|
|||
editor.execCommand("edittable", tone.value); |
|||
autoSizeContent.checked ?editor.execCommand('adaptbytext') : ""; |
|||
autoSizePage.checked ? editor.execCommand("adaptbywindow") : ""; |
|||
editor.fireEvent('saveScene'); |
|||
|
|||
editor.__hasEnterExecCommand = false; |
|||
}; |
|||
})(); |
|||
@ -0,0 +1,61 @@ |
|||
<!DOCTYPE html> |
|||
<html> |
|||
<head> |
|||
<title></title> |
|||
<script type="text/javascript" src="../internal.js"></script> |
|||
<style type="text/css"> |
|||
.section { |
|||
text-align: center; |
|||
margin-top: 10px; |
|||
} |
|||
.section input { |
|||
margin-left: 5px; |
|||
width: 70px; |
|||
} |
|||
</style> |
|||
</head> |
|||
<body> |
|||
<div class="section"> |
|||
<span><var id="lang_tdBkColor"></var></span> |
|||
<input type="text" id="J_tone"/> |
|||
</div> |
|||
<script type="text/javascript"> |
|||
var tone = $G("J_tone"), |
|||
colorPiker = new UE.ui.ColorPicker({ |
|||
editor:editor |
|||
}), |
|||
colorPop = new UE.ui.Popup({ |
|||
editor:editor, |
|||
content:colorPiker |
|||
}); |
|||
domUtils.on(tone, "click", function () { |
|||
colorPop.showAnchor(tone); |
|||
}); |
|||
domUtils.on(document, 'mousedown', function () { |
|||
colorPop.hide(); |
|||
}); |
|||
colorPiker.addListener("pickcolor", function () { |
|||
tone.value = arguments[1]; |
|||
colorPop.hide(); |
|||
}); |
|||
colorPiker.addListener("picknocolor", function () { |
|||
tone.value=""; |
|||
colorPop.hide(); |
|||
}); |
|||
dialog.onok=function(){ |
|||
editor.execCommand("edittd",tone.value); |
|||
}; |
|||
|
|||
var start = editor.selection.getStart(), |
|||
cell = start && domUtils.findParentByTagName(start, ["td", "th"], true); |
|||
if(cell){ |
|||
var color = domUtils.getComputedStyle(cell,'background-color'); |
|||
if(/^#/.test(color)){ |
|||
tone.value = color |
|||
} |
|||
|
|||
} |
|||
|
|||
</script> |
|||
</body> |
|||
</html> |
|||
@ -0,0 +1,33 @@ |
|||
<!DOCTYPE html> |
|||
<html> |
|||
<head> |
|||
<title>表格删除提示</title> |
|||
<script type="text/javascript" src="../internal.js"></script> |
|||
<style type="text/css"> |
|||
.section { |
|||
width: 200px; |
|||
margin: 10px auto 0; |
|||
font-size: 14px; |
|||
} |
|||
|
|||
.item { |
|||
text-align: center; |
|||
} |
|||
</style> |
|||
</head> |
|||
<body> |
|||
<div class="section"> |
|||
<div class="item"> |
|||
<label><input type="radio" id="J_delRow" name="cmd" checked/><var id="lang_delRow"></var></label> |
|||
</div> |
|||
<div class="item"> |
|||
<label><input type="radio" id="J_delCol" name="cmd"/><var id="lang_delCol"></var></label> |
|||
</div> |
|||
</div> |
|||
<script type="text/javascript"> |
|||
dialog.onok = function () { |
|||
$G("J_delRow").checked ? editor.execCommand("deleterow") : editor.execCommand("deletecol"); |
|||
}; |
|||
</script> |
|||
</body> |
|||
</html> |
|||
|
After Width: | Height: | Size: 20 KiB |
|
After Width: | Height: | Size: 43 KiB |
@ -0,0 +1,684 @@ |
|||
/** |
|||
* Created with JetBrains PhpStorm. |
|||
* User: taoqili |
|||
* Date: 12-6-12 |
|||
* Time: 下午6:57 |
|||
* To change this template use File | Settings | File Templates. |
|||
*/ |
|||
UE.I18N['en'] = { |
|||
'labelMap':{ |
|||
'anchor':'Anchor', 'undo':'Undo', 'redo':'Redo', 'bold':'Bold', 'indent':'Indent', 'snapscreen':'SnapScreen', |
|||
'italic':'Italic', 'underline':'Underline', 'strikethrough':'Strikethrough', 'subscript':'SubScript','fontborder':'text border', |
|||
'superscript':'SuperScript', 'formatmatch':'Format Match', 'source':'Source', 'blockquote':'BlockQuote', |
|||
'pasteplain':'PastePlain', 'selectall':'SelectAll', 'print':'Print', 'preview':'Preview', |
|||
'horizontal':'Horizontal', 'removeformat':'RemoveFormat', 'time':'Time', 'date':'Date', |
|||
'unlink':'Unlink', 'insertrow':'InsertRow', 'insertcol':'InsertCol', 'mergeright':'MergeRight', 'mergedown':'MergeDown', |
|||
'deleterow':'DeleteRow', 'deletecol':'DeleteCol', 'splittorows':'SplitToRows','insertcode':'insert code', |
|||
'splittocols':'SplitToCols', 'splittocells':'SplitToCells','deletecaption':'DeleteCaption','inserttitle':'InsertTitle', |
|||
'mergecells':'MergeCells', 'deletetable':'DeleteTable', 'cleardoc':'Clear', 'insertparagraphbeforetable':"InsertParagraphBeforeTable", |
|||
'fontfamily':'FontFamily', 'fontsize':'FontSize', 'paragraph':'Paragraph','simpleupload':'Single Image','insertimage':'Multi Image','edittable':'Edit Table', 'edittd':'Edit Td','link':'Link', |
|||
'emotion':'Emotion', 'spechars':'Spechars', 'searchreplace':'SearchReplace', 'map':'BaiduMap', 'gmap':'GoogleMap', |
|||
'insertvideo':'Video', 'help':'Help', 'justifyleft':'JustifyLeft', 'justifyright':'JustifyRight', 'justifycenter':'JustifyCenter', |
|||
'justifyjustify':'Justify', 'forecolor':'FontColor', 'backcolor':'BackColor', 'insertorderedlist':'OL', |
|||
'insertunorderedlist':'UL', 'fullscreen':'FullScreen', 'directionalityltr':'EnterFromLeft', 'directionalityrtl':'EnterFromRight', |
|||
'rowspacingtop':'RowSpacingTop', 'rowspacingbottom':'RowSpacingBottom', 'pagebreak':'PageBreak', 'insertframe':'Iframe', 'imagenone':'Default', |
|||
'imageleft':'ImageLeft', 'imageright':'ImageRight', 'attachment':'Attachment', 'imagecenter':'ImageCenter', 'wordimage':'WordImage', |
|||
'lineheight':'LineHeight','edittip':'EditTip','customstyle':'CustomStyle', 'scrawl':'Scrawl', 'autotypeset':'AutoTypeset', |
|||
'webapp':'WebAPP', 'touppercase':'UpperCase', 'tolowercase':'LowerCase','template':'Template','background':'Background','inserttable':'InsertTable', |
|||
'music':'Music', 'charts': 'charts','drafts': 'Load from Drafts' |
|||
}, |
|||
'insertorderedlist':{ |
|||
'num':'1,2,3...', |
|||
'num1':'1),2),3)...', |
|||
'num2':'(1),(2),(3)...', |
|||
'cn':'一,二,三....', |
|||
'cn1':'一),二),三)....', |
|||
'cn2':'(一),(二),(三)....', |
|||
'decimal':'1,2,3...', |
|||
'lower-alpha':'a,b,c...', |
|||
'lower-roman':'i,ii,iii...', |
|||
'upper-alpha':'A,B,C...', |
|||
'upper-roman':'I,II,III...' |
|||
}, |
|||
'insertunorderedlist':{ |
|||
'circle':'○ Circle', |
|||
'disc':'● Circle dot', |
|||
'square':'■ Rectangle ', |
|||
'dash' :'- Dash', |
|||
'dot' : '。dot' |
|||
}, |
|||
'paragraph':{'p':'Paragraph', 'h1':'Title 1', 'h2':'Title 2', 'h3':'Title 3', 'h4':'Title 4', 'h5':'Title 5', 'h6':'Title 6'}, |
|||
'fontfamily':{ |
|||
'songti':'Sim Sun', |
|||
'kaiti':'Sim Kai', |
|||
'heiti':'Sim Hei', |
|||
'lishu':'Sim Li', |
|||
'yahei': 'Microsoft YaHei', |
|||
'andaleMono':'Andale Mono', |
|||
'arial': 'Arial', |
|||
'arialBlack':'Arial Black', |
|||
'comicSansMs':'Comic Sans MS', |
|||
'impact':'Impact', |
|||
'timesNewRoman':'Times New Roman' |
|||
}, |
|||
'customstyle':{ |
|||
'tc':'Title center', |
|||
'tl':'Title left', |
|||
'im':'Important', |
|||
'hi':'Highlight' |
|||
}, |
|||
'autoupload': { |
|||
'exceedSizeError': 'File Size Exceed', |
|||
'exceedTypeError': 'File Type Not Allow', |
|||
'jsonEncodeError': 'Server Return Format Error', |
|||
'loading':"loading...", |
|||
'loadError':"load error", |
|||
'errorLoadConfig': 'Server config not loaded, upload can not work.', |
|||
}, |
|||
'simpleupload':{ |
|||
'exceedSizeError': 'File Size Exceed', |
|||
'exceedTypeError': 'File Type Not Allow', |
|||
'jsonEncodeError': 'Server Return Format Error', |
|||
'loading':"loading...", |
|||
'loadError':"load error", |
|||
'errorLoadConfig': 'Server config not loaded, upload can not work.', |
|||
}, |
|||
'elementPathTip':"Path", |
|||
'wordCountTip':"Word Count", |
|||
'wordCountMsg':'{#count} characters entered,{#leave} left. ', |
|||
'wordOverFlowMsg':'<span style="color:red;">The number of characters has exceeded allowable maximum values, the server may refuse to save!</span>', |
|||
'ok':"OK", |
|||
'cancel':"Cancel", |
|||
'closeDialog':"closeDialog", |
|||
'tableDrag':"You must import the file uiUtils.js before drag! ", |
|||
'autofloatMsg':"The plugin AutoFloat depends on EditorUI!", |
|||
'loadconfigError': 'Get server config error.', |
|||
'loadconfigFormatError': 'Server config format error.', |
|||
'loadconfigHttpError': 'Get server config http error.', |
|||
'snapScreen_plugin':{ |
|||
'browserMsg':"Only IE supported!", |
|||
'callBackErrorMsg':"The callback data is wrong,please check the config!", |
|||
'uploadErrorMsg':"Upload error,please check your server environment! " |
|||
}, |
|||
'insertcode':{ |
|||
'as3':'ActionScript 3', |
|||
'bash':'Bash/Shell', |
|||
'cpp':'C/C++', |
|||
'css':'CSS', |
|||
'cf':'ColdFusion', |
|||
'c#':'C#', |
|||
'delphi':'Delphi', |
|||
'diff':'Diff', |
|||
'erlang':'Erlang', |
|||
'groovy':'Groovy', |
|||
'html':'HTML', |
|||
'java':'Java', |
|||
'jfx':'JavaFX', |
|||
'js':'JavaScript', |
|||
'pl':'Perl', |
|||
'php':'PHP', |
|||
'plain':'Plain Text', |
|||
'ps':'PowerShell', |
|||
'python':'Python', |
|||
'ruby':'Ruby', |
|||
'scala':'Scala', |
|||
'sql':'SQL', |
|||
'vb':'Visual Basic', |
|||
'xml':'XML' |
|||
}, |
|||
'confirmClear':"Do you confirm to clear the Document?", |
|||
'contextMenu':{ |
|||
'delete':"Delete", |
|||
'selectall':"Select all", |
|||
'deletecode':"Delete Code", |
|||
'cleardoc':"Clear Document", |
|||
'confirmclear':"Do you confirm to clear the Document?", |
|||
'unlink':"Unlink", |
|||
'paragraph':"Paragraph", |
|||
'edittable':"Table property", |
|||
'aligncell':'Align cell', |
|||
'aligntable':'Table alignment', |
|||
'tableleft':'Left float', |
|||
'tablecenter':'Center', |
|||
'tableright':'Right float', |
|||
'aligntd':'Cell alignment', |
|||
'edittd':"Cell property", |
|||
'setbordervisible':'set table edge visible', |
|||
'table':"Table", |
|||
'justifyleft':'Justify Left', |
|||
'justifyright':'Justify Right', |
|||
'justifycenter':'Justify Center', |
|||
'justifyjustify':'Default', |
|||
'deletetable':"Delete table", |
|||
'insertparagraphbefore':"InsertedBeforeLine", |
|||
'insertparagraphafter':'InsertedAfterLine', |
|||
'inserttable':'Insert table', |
|||
'insertcaption':'Insert caption', |
|||
'deletecaption':'Delete Caption', |
|||
'inserttitle':'Insert Title', |
|||
'deletetitle':'Delete Title', |
|||
'inserttitlecol':'Insert Title Col', |
|||
'deletetitlecol':'Delete Title Col', |
|||
'averageDiseRow':'AverageDise Row', |
|||
'averageDisCol':'AverageDis Col', |
|||
'deleterow':"Delete row", |
|||
'deletecol':"Delete col", |
|||
'insertrow':"Insert row", |
|||
'insertcol':"Insert col", |
|||
'insertrownext':'Insert Row Next', |
|||
'insertcolnext':'Insert Col Next', |
|||
'mergeright':"Merge right", |
|||
'mergeleft':"Merge left", |
|||
'mergedown':"Merge down", |
|||
'mergecells':"Merge cells", |
|||
'splittocells':"Split to cells", |
|||
'splittocols':"Split to Cols", |
|||
'splittorows':"Split to Rows", |
|||
'tablesort':'Table sorting', |
|||
'enablesort':'Sorting Enable', |
|||
'disablesort':'Sorting Disable', |
|||
'reversecurrent':'Reverse current', |
|||
'orderbyasc':'Order By ASCII', |
|||
'reversebyasc':'Reverse By ASCII', |
|||
'orderbynum':'Order By Num', |
|||
'reversebynum':'Reverse By Num', |
|||
'borderbk':'Border shading', |
|||
'setcolor':'interlaced color', |
|||
'unsetcolor':'Cancel interlacedcolor', |
|||
'setbackground':'Background interlaced', |
|||
'unsetbackground':'Cancel Bk interlaced', |
|||
'redandblue':'Blue and red', |
|||
'threecolorgradient':'Three-color gradient', |
|||
'copy':"Copy(Ctrl + c)", |
|||
'copymsg':"Browser does not support. Please use 'Ctrl + c' instead!", |
|||
'paste':"Paste(Ctrl + v)", |
|||
'pastemsg':"Browser does not support. Please use 'Ctrl + v' instead!" |
|||
}, |
|||
'copymsg': "Browser does not support. Please use 'Ctrl + c' instead!", |
|||
'pastemsg': "Browser does not support. Please use 'Ctrl + v' instead!", |
|||
'anthorMsg':"Link", |
|||
'clearColor':'Clear', |
|||
'standardColor':'Standard color', |
|||
'themeColor':'Theme color', |
|||
'property':'Property', |
|||
'default':'Default', |
|||
'modify':'Modify', |
|||
'justifyleft':'Justify Left', |
|||
'justifyright':'Justify Right', |
|||
'justifycenter':'Justify Center', |
|||
'justify':'Default', |
|||
'clear':'Clear', |
|||
'anchorMsg':'Anchor', |
|||
'delete':'Delete', |
|||
'clickToUpload':"Click to upload", |
|||
'unset':'Language hasn\'t been set!', |
|||
't_row':'row', |
|||
't_col':'col', |
|||
'pasteOpt':'Paste Option', |
|||
'pasteSourceFormat':"Keep Source Formatting", |
|||
'tagFormat':'Keep tag', |
|||
'pasteTextFormat':'Keep Text only', |
|||
'more':'More', |
|||
'autoTypeSet':{ |
|||
'mergeLine':"Merge empty line", |
|||
'delLine':"Del empty line", |
|||
'removeFormat':"Remove format", |
|||
'indent':"Indent", |
|||
'alignment':"Alignment", |
|||
'imageFloat':"Image float", |
|||
'removeFontsize':"Remove font size", |
|||
'removeFontFamily':"Remove fontFamily", |
|||
'removeHtml':"Remove redundant HTML code", |
|||
'pasteFilter':"Paste filter", |
|||
'run':"Done", |
|||
'symbol':'Symbol Conversion', |
|||
'bdc2sb':'Full-width to Half-width', |
|||
'tobdc':'Half-width to Full-width' |
|||
}, |
|||
|
|||
'background':{ |
|||
'static':{ |
|||
'lang_background_normal':'Normal', |
|||
'lang_background_local':'Online', |
|||
'lang_background_set':'Background Set', |
|||
'lang_background_none':'No Background', |
|||
'lang_background_colored':'Colored Background', |
|||
'lang_background_color':'Color Set', |
|||
'lang_background_netimg':'Net-Image', |
|||
'lang_background_align':'Align Type', |
|||
'lang_background_position':'Position', |
|||
'repeatType':{'options':["Center", "Repeat-x", "Repeat-y", "Tile","Custom"]} |
|||
}, |
|||
'noUploadImage':"No pictures has been uploaded!", |
|||
'toggleSelect':'Change the active state by click!\n Image Size: ' |
|||
}, |
|||
//===============dialog i18N=======================
|
|||
'insertimage':{ |
|||
'static':{ |
|||
'lang_tab_remote':"Insert", |
|||
'lang_tab_upload':"Local", |
|||
'lang_tab_online':"Manager", |
|||
'lang_tab_search':"Search", |
|||
'lang_input_url':"Address:", |
|||
'lang_input_size':"Size:", |
|||
'lang_input_width':"Width", |
|||
'lang_input_height':"Height", |
|||
'lang_input_border':"Border:", |
|||
'lang_input_vhspace':"Margins:", |
|||
'lang_input_title':"Title:", |
|||
'lang_input_align':'Image Float Style:', |
|||
'lang_imgLoading':"Loading...", |
|||
'lang_start_upload':"Start Upload", |
|||
'lock':{'title':"Lock rate"}, |
|||
'searchType':{'title':"ImageType", 'options':["News", "Wallpaper", "emotions", "photo"]}, |
|||
'searchTxt':{'value':"Enter the search keyword!"}, |
|||
'searchBtn':{'value':"Search"}, |
|||
'searchReset':{'value':"Clear"}, |
|||
'noneAlign':{'title':'None Float'}, |
|||
'leftAlign':{'title':'Left Float'}, |
|||
'rightAlign':{'title':'Right Float'}, |
|||
'centerAlign':{'title':'Center In A Line'} |
|||
}, |
|||
'uploadSelectFile':'Select File', |
|||
'uploadAddFile':'Add File', |
|||
'uploadStart':'Start Upload', |
|||
'uploadPause':'Pause Upload', |
|||
'uploadContinue':'Continue Upload', |
|||
'uploadRetry':'Retry Upload', |
|||
'uploadDelete':'Delete', |
|||
'uploadTurnLeft':'Turn Left', |
|||
'uploadTurnRight':'Turn Right', |
|||
'uploadPreview':'Doing Preview', |
|||
'uploadNoPreview':'Can Not Preview', |
|||
'updateStatusReady': 'Selected _ pictures, total _KB.', |
|||
'updateStatusConfirm': '_ uploaded successfully and _ upload failed', |
|||
'updateStatusFinish': 'Total _ pictures (_KB), _ uploaded successfully', |
|||
'updateStatusError': ' and _ upload failed', |
|||
'errorNotSupport': 'WebUploader does not support the browser you are using. Please upgrade your browser or flash player', |
|||
'errorLoadConfig': 'Server config not loaded, upload can not work.', |
|||
'errorExceedSize':'File Size Exceed', |
|||
'errorFileType':'File Type Not Allow', |
|||
'errorInterrupt':'File Upload Interrupted', |
|||
'errorUploadRetry':'Upload Error, Please Retry.', |
|||
'errorHttp':'Http Error', |
|||
'errorServerUpload':'Server Result Error.', |
|||
'remoteLockError':"Cannot Lock the Proportion between width and height", |
|||
'numError':"Please enter the correct Num. e.g 123,400", |
|||
'imageUrlError':"The image format may be wrong!", |
|||
'imageLoadError':"Error,please check the network or URL!", |
|||
'searchRemind':"Enter the search keyword!", |
|||
'searchLoading':"Image is loading,please wait...", |
|||
'searchRetry':" Sorry,can't find the image,please try again!" |
|||
}, |
|||
'attachment':{ |
|||
'static':{ |
|||
'lang_tab_upload': 'Upload', |
|||
'lang_tab_online': 'Online', |
|||
'lang_start_upload':"Start upload", |
|||
'lang_drop_remind':"You can drop files here, a single maximum of 300 files" |
|||
}, |
|||
'uploadSelectFile':'Select File', |
|||
'uploadAddFile':'Add File', |
|||
'uploadStart':'Start Upload', |
|||
'uploadPause':'Pause Upload', |
|||
'uploadContinue':'Continue Upload', |
|||
'uploadRetry':'Retry Upload', |
|||
'uploadDelete':'Delete', |
|||
'uploadTurnLeft':'Turn Left', |
|||
'uploadTurnRight':'Turn Right', |
|||
'uploadPreview':'Doing Preview', |
|||
'updateStatusReady': 'Selected _ files, total _KB.', |
|||
'updateStatusConfirm': '_ uploaded successfully and _ upload failed', |
|||
'updateStatusFinish': 'Total _ files (_KB), _ uploaded successfully', |
|||
'updateStatusError': ' and _ upload failed', |
|||
'errorNotSupport': 'WebUploader does not support the browser you are using. Please upgrade your browser or flash player', |
|||
'errorLoadConfig': 'Server config not loaded, upload can not work.', |
|||
'errorExceedSize':'File Size Exceed', |
|||
'errorFileType':'File Type Not Allow', |
|||
'errorInterrupt':'File Upload Interrupted', |
|||
'errorUploadRetry':'Upload Error, Please Retry.', |
|||
'errorHttp':'Http Error', |
|||
'errorServerUpload':'Server Result Error.' |
|||
}, |
|||
|
|||
'insertvideo':{ |
|||
'static':{ |
|||
'lang_tab_insertV':"Video", |
|||
'lang_tab_searchV':"Search", |
|||
'lang_tab_uploadV':"Upload", |
|||
'lang_video_url':" URL ", |
|||
'lang_video_size':"Video Size", |
|||
'lang_videoW':"Width", |
|||
'lang_videoH':"Height", |
|||
'lang_alignment':"Alignment", |
|||
'videoSearchTxt':{'value':"Enter the search keyword!"}, |
|||
'videoType':{'options':["All", "Hot", "Entertainment", "Funny", "Sports", "Science", "variety"]}, |
|||
'videoSearchBtn':{'value':"Search in Baidu"}, |
|||
'videoSearchReset':{'value':"Clear result"}, |
|||
|
|||
'lang_input_fileStatus':' No file uploaded!', |
|||
'startUpload':{'style':"background:url(upload.png) no-repeat;"}, |
|||
|
|||
'lang_upload_size':"Video Size", |
|||
'lang_upload_width':"Width", |
|||
'lang_upload_height':"Height", |
|||
'lang_upload_alignment':"Alignment", |
|||
'lang_format_advice':"Recommends mp4 format." |
|||
}, |
|||
'numError':"Please enter the correct Num. e.g 123,400", |
|||
'floatLeft':"Float left", |
|||
'floatRight':"Float right", |
|||
'default':"Default", |
|||
'block':"Display in block", |
|||
'urlError':"The video url format may be wrong!", |
|||
'loading':" The video is loading, please wait…", |
|||
'clickToSelect':"Click to select", |
|||
'goToSource':'Visit source video ', |
|||
'noVideo':" Sorry,can't find the video,please try again!", |
|||
|
|||
'browseFiles':'Open files', |
|||
'uploadSuccess':'Upload Successful!', |
|||
'delSuccessFile':'Remove from the success of the queue', |
|||
'delFailSaveFile':'Remove the save failed file', |
|||
'statusPrompt':' file(s) uploaded! ', |
|||
'flashVersionError':'The current Flash version is too low, please update FlashPlayer,then try again!', |
|||
'flashLoadingError':'The Flash failed loading! Please check the path or network state', |
|||
'fileUploadReady':'Wait for uploading...', |
|||
'delUploadQueue':'Remove from the uploading queue ', |
|||
'limitPrompt1':'Can not choose more than single', |
|||
'limitPrompt2':'file(s)!Please choose again!', |
|||
'delFailFile':'Remove failure file', |
|||
'fileSizeLimit':'File size exceeds the limit!', |
|||
'emptyFile':'Can not upload an empty file!', |
|||
'fileTypeError':'File type error!', |
|||
'unknownError':'Unknown error!', |
|||
'fileUploading':'Uploading,please wait...', |
|||
'cancelUpload':'Cancel upload', |
|||
'netError':'Network error', |
|||
'failUpload':'Upload failed', |
|||
'serverIOError':'Server IO error!', |
|||
'noAuthority':'No Permission!', |
|||
'fileNumLimit':'Upload limit to the number', |
|||
'failCheck':'Authentication fails, the upload is skipped!', |
|||
'fileCanceling':'Cancel, please wait...', |
|||
'stopUploading':'Upload has stopped...', |
|||
|
|||
'uploadSelectFile':'Select File', |
|||
'uploadAddFile':'Add File', |
|||
'uploadStart':'Start Upload', |
|||
'uploadPause':'Pause Upload', |
|||
'uploadContinue':'Continue Upload', |
|||
'uploadRetry':'Retry Upload', |
|||
'uploadDelete':'Delete', |
|||
'uploadTurnLeft':'Turn Left', |
|||
'uploadTurnRight':'Turn Right', |
|||
'uploadPreview':'Doing Preview', |
|||
'updateStatusReady': 'Selected _ files, total _KB.', |
|||
'updateStatusConfirm': '_ uploaded successfully and _ upload failed', |
|||
'updateStatusFinish': 'Total _ files (_KB), _ uploaded successfully', |
|||
'updateStatusError': ' and _ upload failed', |
|||
'errorNotSupport': 'WebUploader does not support the browser you are using. Please upgrade your browser or flash player', |
|||
'errorLoadConfig': 'Server config not loaded, upload can not work.', |
|||
'errorExceedSize':'File Size Exceed', |
|||
'errorFileType':'File Type Not Allow', |
|||
'errorInterrupt':'File Upload Interrupted', |
|||
'errorUploadRetry':'Upload Error, Please Retry.', |
|||
'errorHttp':'Http Error', |
|||
'errorServerUpload':'Server Result Error.' |
|||
}, |
|||
'webapp':{ |
|||
'tip1':"This function provided by Baidu APP,please apply for baidu APPKey webmaster first!", |
|||
'tip2':"And then open the file ueditor.config.js to set it! ", |
|||
'applyFor':"APPLY FOR", |
|||
'anthorApi':"Baidu API" |
|||
}, |
|||
'template':{ |
|||
'static':{ |
|||
'lang_template_bkcolor':'Background Color', |
|||
'lang_template_clear' : 'Keep Content', |
|||
'lang_template_select':'Select Template' |
|||
}, |
|||
'blank':"Blank", |
|||
'blog':"Blog", |
|||
'resume':"Resume", |
|||
'richText':"Rich Text", |
|||
'scrPapers':"Scientific Papers" |
|||
}, |
|||
scrawl:{ |
|||
'static':{ |
|||
'lang_input_previousStep':"Previous", |
|||
'lang_input_nextsStep':"Next", |
|||
'lang_input_clear':'Clear', |
|||
'lang_input_addPic':'AddImage', |
|||
'lang_input_ScalePic':'ScaleImage', |
|||
'lang_input_removePic':'RemoveImage', |
|||
'J_imgTxt':{title:'Add background image'} |
|||
}, |
|||
'noScarwl':"No paint, a white paper...", |
|||
'scrawlUpLoading':"Image is uploading, please wait...", |
|||
'continueBtn':"Try again", |
|||
'imageError':"Image failed to load!", |
|||
'backgroundUploading':'Image is uploading,please wait...' |
|||
}, |
|||
'music':{ |
|||
'static':{ |
|||
'lang_input_tips':"Input singer/song/album, search you interested in music!", |
|||
'J_searchBtn':{value:'Search songs'} |
|||
}, |
|||
'emptyTxt':'Not search to the relevant music results, please change a keyword try.', |
|||
'chapter':'Songs', |
|||
'singer':'Singer', |
|||
'special':'Album', |
|||
'listenTest':'Audition' |
|||
}, |
|||
anchor:{ |
|||
'static':{ |
|||
'lang_input_anchorName':'Anchor Name:' |
|||
} |
|||
}, |
|||
'charts':{ |
|||
'static':{ |
|||
'lang_data_source':'Data source:', |
|||
'lang_chart_format': 'Chart format:', |
|||
'lang_data_align': 'Align', |
|||
'lang_chart_align_same': 'Consistent with the X-axis Y-axis', |
|||
'lang_chart_align_reverse': 'X-axis Y-axis opposite', |
|||
'lang_chart_title': 'Title', |
|||
'lang_chart_main_title': 'main title:', |
|||
'lang_chart_sub_title': 'sub title:', |
|||
'lang_chart_x_title': 'X-axis title:', |
|||
'lang_chart_y_title': 'Y-axis title:', |
|||
'lang_chart_tip': 'Prompt', |
|||
'lang_cahrt_tip_prefix': 'prefix:', |
|||
'lang_cahrt_tip_description': '仅饼图有效, 当鼠标移动到饼图中相应的块上时,提示框内的文字的前缀', |
|||
'lang_chart_data_unit': 'Unit', |
|||
'lang_chart_data_unit_title': 'unit:', |
|||
'lang_chart_data_unit_description': '显示在每个数据点上的数据的单位, 比如: 温度的单位 ℃', |
|||
'lang_chart_type': 'Chart type:', |
|||
'lang_prev_btn': 'Previous', |
|||
'lang_next_btn': 'Next' |
|||
} |
|||
}, |
|||
emotion:{ |
|||
'static':{ |
|||
'lang_input_choice':'Choice', |
|||
'lang_input_Tuzki':'Tuzki', |
|||
'lang_input_lvdouwa':'LvDouWa', |
|||
'lang_input_BOBO':'BOBO', |
|||
'lang_input_babyCat':'BabyCat', |
|||
'lang_input_bubble':'Bubble', |
|||
'lang_input_youa':'YouA' |
|||
} |
|||
}, |
|||
gmap:{ |
|||
'static':{ |
|||
'lang_input_address':'Address:', |
|||
'lang_input_search':'Search', |
|||
'address':{value:"Beijing"} |
|||
}, |
|||
searchError:'Unable to locate the address!' |
|||
}, |
|||
help:{ |
|||
'static':{ |
|||
'lang_input_about':'About', |
|||
'lang_input_shortcuts':'Shortcuts', |
|||
'lang_input_introduction':"UEditor is developed by Baidu Co.ltd. It is lightweight, customizable , focusing on user experience and etc. , UEditor is based on open source BSD license , allowing free use and redistribution.", |
|||
'lang_Txt_shortcuts':'Shortcuts', |
|||
'lang_Txt_func':'Function', |
|||
'lang_Txt_bold':'Bold', |
|||
'lang_Txt_copy':'Copy', |
|||
'lang_Txt_cut':'Cut', |
|||
'lang_Txt_Paste':'Paste', |
|||
'lang_Txt_undo':'Undo', |
|||
'lang_Txt_redo':'Redo', |
|||
'lang_Txt_italic':'Italic', |
|||
'lang_Txt_underline':'Underline', |
|||
'lang_Txt_selectAll':'Select All', |
|||
'lang_Txt_visualEnter':'Submit', |
|||
'lang_Txt_fullscreen':'Fullscreen' |
|||
} |
|||
}, |
|||
insertframe:{ |
|||
'static':{ |
|||
'lang_input_address':'Address:', |
|||
'lang_input_width':'Width:', |
|||
'lang_input_height':'height:', |
|||
'lang_input_isScroll':'Enable scrollbars:', |
|||
'lang_input_frameborder':'Show frame border:', |
|||
'lang_input_alignMode':'Alignment:', |
|||
'align':{title:"Alignment", options:["Default", "Left", "Right", "Center"]} |
|||
}, |
|||
'enterAddress':'Please enter an address!' |
|||
}, |
|||
link:{ |
|||
'static':{ |
|||
'lang_input_text':'Text:', |
|||
'lang_input_url':'URL:', |
|||
'lang_input_title':'Title:', |
|||
'lang_input_target':'open in new window:' |
|||
}, |
|||
'validLink':'Supports only effective when a link is selected', |
|||
'httpPrompt':'The hyperlink you enter should start with "http|https|ftp://"!' |
|||
}, |
|||
map:{ |
|||
'static':{ |
|||
lang_city:"City", |
|||
lang_address:"Address", |
|||
city:{value:"Beijing"}, |
|||
lang_search:"Search", |
|||
lang_dynamicmap:"Dynamic map" |
|||
}, |
|||
cityMsg:"Please enter the city name!", |
|||
errorMsg:"Can't find the place!" |
|||
}, |
|||
searchreplace:{ |
|||
'static':{ |
|||
lang_tab_search:"Search", |
|||
lang_tab_replace:"Replace", |
|||
lang_search1:"Search", |
|||
lang_search2:"Search", |
|||
lang_replace:"Replace", |
|||
lang_searchReg:'Support regular expression ,which starts and ends with a slash ,for example "/expression/"', |
|||
lang_searchReg1:'Support regular expression ,which starts and ends with a slash ,for example "/expression/"', |
|||
lang_case_sensitive1:"Case sense", |
|||
lang_case_sensitive2:"Case sense", |
|||
nextFindBtn:{value:"Next"}, |
|||
preFindBtn:{value:"Preview"}, |
|||
nextReplaceBtn:{value:"Next"}, |
|||
preReplaceBtn:{value:"Preview"}, |
|||
repalceBtn:{value:"Replace"}, |
|||
repalceAllBtn:{value:"Replace all"} |
|||
}, |
|||
getEnd:"Has the search to the bottom!", |
|||
getStart:"Has the search to the top!", |
|||
countMsg:"Altogether replaced {#count} character(s)!" |
|||
}, |
|||
snapscreen:{ |
|||
'static':{ |
|||
lang_showMsg:"You should install the UEditor screenshots program first!", |
|||
lang_download:"Download!", |
|||
lang_step1:"Step1:Download the program and then run it", |
|||
lang_step2:"Step2:After complete install,try to click the button again" |
|||
} |
|||
}, |
|||
spechars:{ |
|||
'static':{}, |
|||
tsfh:"Special", |
|||
lmsz:"Roman", |
|||
szfh:"Numeral", |
|||
rwfh:"Japanese", |
|||
xlzm:"The Greek", |
|||
ewzm:"Russian", |
|||
pyzm:"Phonetic", |
|||
yyyb:"English", |
|||
zyzf:"Others" |
|||
}, |
|||
'edittable':{ |
|||
'static':{ |
|||
'lang_tableStyle':'Table style', |
|||
'lang_insertCaption':'Add table header row', |
|||
'lang_insertTitle':'Add table title row', |
|||
'lang_insertTitleCol':'Add table title col', |
|||
'lang_tableSize':'Automatically adjust table size', |
|||
'lang_autoSizeContent':'Adaptive by form text', |
|||
'lang_orderbycontent':"Table of contents sortable", |
|||
'lang_autoSizePage':'Page width adaptive', |
|||
'lang_example':'Example', |
|||
'lang_borderStyle':'Table Border', |
|||
'lang_color':'Color:' |
|||
}, |
|||
captionName:'Caption', |
|||
titleName:'Title', |
|||
cellsName:'text', |
|||
errorMsg:'There are merged cells, can not sort.' |
|||
}, |
|||
'edittip':{ |
|||
'static':{ |
|||
lang_delRow:'Delete entire row', |
|||
lang_delCol:'Delete entire col' |
|||
} |
|||
}, |
|||
'edittd':{ |
|||
'static':{ |
|||
lang_tdBkColor:'Background Color:' |
|||
} |
|||
}, |
|||
'formula':{ |
|||
'static':{ |
|||
} |
|||
}, |
|||
wordimage:{ |
|||
'static':{ |
|||
lang_resave:"The re-save step", |
|||
uploadBtn:{src:"upload.png", alt:"Upload"}, |
|||
clipboard:{style:"background: url(copy.png) -153px -1px no-repeat;"}, |
|||
lang_step:" 1. Click top button to copy the url and then open the dialog to paste it. 2. Open after choose photos uploaded process." |
|||
}, |
|||
fileType:"Image", |
|||
flashError:"Flash initialization failed!", |
|||
netError:"Network error! Please try again!", |
|||
copySuccess:"URL has been copied!", |
|||
|
|||
'flashI18n':{ |
|||
lang:encodeURI( '{"UploadingState":"totalNum: ${a},uploadComplete: ${b}", "BeforeUpload":"waitingNum: ${a}", "ExceedSize":"Size exceed${a}", "ErrorInPreview":"Preview failed", "DefaultDescription":"Description", "LoadingImage":"Loading..."}' ), |
|||
uploadingTF:encodeURI( '{"font":"Arial", "size":12, "color":"0x000", "bold":"true", "italic":"false", "underline":"false"}' ), |
|||
imageTF:encodeURI( '{"font":"Arial", "size":11, "color":"red", "bold":"false", "italic":"false", "underline":"false"}' ), |
|||
textEncoding:"utf-8", |
|||
addImageSkinURL:"addImage.png", |
|||
allDeleteBtnUpSkinURL:"allDeleteBtnUpSkin.png", |
|||
allDeleteBtnHoverSkinURL:"allDeleteBtnHoverSkin.png", |
|||
rotateLeftBtnEnableSkinURL:"rotateLeftEnable.png", |
|||
rotateLeftBtnDisableSkinURL:"rotateLeftDisable.png", |
|||
rotateRightBtnEnableSkinURL:"rotateRightEnable.png", |
|||
rotateRightBtnDisableSkinURL:"rotateRightDisable.png", |
|||
deleteBtnEnableSkinURL:"deleteEnable.png", |
|||
deleteBtnDisableSkinURL:"deleteDisable.png", |
|||
backgroundURL:'', |
|||
listBackgroundURL:'', |
|||
buttonURL:'button.png' |
|||
} |
|||
}, |
|||
'autosave': { |
|||
'success':'Local conservation success' |
|||
} |
|||
}; |
|||
|
After Width: | Height: | Size: 4.2 KiB |
|
After Width: | Height: | Size: 111 B |
@ -0,0 +1,50 @@ |
|||
/* |
|||
Highcharts JS v3.0.6 (2013-10-04) |
|||
|
|||
(c) 2009-2013 Torstein Hønsi |
|||
|
|||
License: www.highcharts.com/license |
|||
*/ |
|||
(function(j,C){function J(a,b,c){this.init.call(this,a,b,c)}function K(a,b,c){a.call(this,b,c);if(this.chart.polar)this.closeSegment=function(a){var c=this.xAxis.center;a.push("L",c[0],c[1])},this.closedStacks=!0}function L(a,b){var c=this.chart,d=this.options.animation,g=this.group,f=this.markerGroup,e=this.xAxis.center,i=c.plotLeft,n=c.plotTop;if(c.polar){if(c.renderer.isSVG)if(d===!0&&(d={}),b){if(c={translateX:e[0]+i,translateY:e[1]+n,scaleX:0.001,scaleY:0.001},g.attr(c),f)f.attrSetters=g.attrSetters, |
|||
f.attr(c)}else c={translateX:i,translateY:n,scaleX:1,scaleY:1},g.animate(c,d),f&&f.animate(c,d),this.animate=null}else a.call(this,b)}var P=j.arrayMin,Q=j.arrayMax,s=j.each,F=j.extend,p=j.merge,R=j.map,r=j.pick,v=j.pInt,m=j.getOptions().plotOptions,h=j.seriesTypes,x=j.extendClass,M=j.splat,o=j.wrap,N=j.Axis,u=j.Tick,z=j.Series,q=h.column.prototype,t=Math,D=t.round,A=t.floor,S=t.max,w=function(){};F(J.prototype,{init:function(a,b,c){var d=this,g=d.defaultOptions;d.chart=b;if(b.angular)g.background= |
|||
{};d.options=a=p(g,a);(a=a.background)&&s([].concat(M(a)).reverse(),function(a){var b=a.backgroundColor,a=p(d.defaultBackgroundOptions,a);if(b)a.backgroundColor=b;a.color=a.backgroundColor;c.options.plotBands.unshift(a)})},defaultOptions:{center:["50%","50%"],size:"85%",startAngle:0},defaultBackgroundOptions:{shape:"circle",borderWidth:1,borderColor:"silver",backgroundColor:{linearGradient:{x1:0,y1:0,x2:0,y2:1},stops:[[0,"#FFF"],[1,"#DDD"]]},from:Number.MIN_VALUE,innerRadius:0,to:Number.MAX_VALUE, |
|||
outerRadius:"105%"}});var G=N.prototype,u=u.prototype,T={getOffset:w,redraw:function(){this.isDirty=!1},render:function(){this.isDirty=!1},setScale:w,setCategories:w,setTitle:w},O={isRadial:!0,defaultRadialGaugeOptions:{labels:{align:"center",x:0,y:null},minorGridLineWidth:0,minorTickInterval:"auto",minorTickLength:10,minorTickPosition:"inside",minorTickWidth:1,plotBands:[],tickLength:10,tickPosition:"inside",tickWidth:2,title:{rotation:0},zIndex:2},defaultRadialXOptions:{gridLineWidth:1,labels:{align:null, |
|||
distance:15,x:0,y:null},maxPadding:0,minPadding:0,plotBands:[],showLastLabel:!1,tickLength:0},defaultRadialYOptions:{gridLineInterpolation:"circle",labels:{align:"right",x:-3,y:-2},plotBands:[],showLastLabel:!1,title:{x:4,text:null,rotation:90}},setOptions:function(a){this.options=p(this.defaultOptions,this.defaultRadialOptions,a)},getOffset:function(){G.getOffset.call(this);this.chart.axisOffset[this.side]=0},getLinePath:function(a,b){var c=this.center,b=r(b,c[2]/2-this.offset);return this.chart.renderer.symbols.arc(this.left+ |
|||
c[0],this.top+c[1],b,b,{start:this.startAngleRad,end:this.endAngleRad,open:!0,innerR:0})},setAxisTranslation:function(){G.setAxisTranslation.call(this);if(this.center&&(this.transA=this.isCircular?(this.endAngleRad-this.startAngleRad)/(this.max-this.min||1):this.center[2]/2/(this.max-this.min||1),this.isXAxis))this.minPixelPadding=this.transA*this.minPointOffset+(this.reversed?(this.endAngleRad-this.startAngleRad)/4:0)},beforeSetTickPositions:function(){this.autoConnect&&(this.max+=this.categories&& |
|||
1||this.pointRange||this.closestPointRange||0)},setAxisSize:function(){G.setAxisSize.call(this);if(this.isRadial)this.center=this.pane.center=h.pie.prototype.getCenter.call(this.pane),this.len=this.width=this.height=this.isCircular?this.center[2]*(this.endAngleRad-this.startAngleRad)/2:this.center[2]/2},getPosition:function(a,b){if(!this.isCircular)b=this.translate(a),a=this.min;return this.postTranslate(this.translate(a),r(b,this.center[2]/2)-this.offset)},postTranslate:function(a,b){var c=this.chart, |
|||
d=this.center,a=this.startAngleRad+a;return{x:c.plotLeft+d[0]+Math.cos(a)*b,y:c.plotTop+d[1]+Math.sin(a)*b}},getPlotBandPath:function(a,b,c){var d=this.center,g=this.startAngleRad,f=d[2]/2,e=[r(c.outerRadius,"100%"),c.innerRadius,r(c.thickness,10)],i=/%$/,n,l=this.isCircular;this.options.gridLineInterpolation==="polygon"?d=this.getPlotLinePath(a).concat(this.getPlotLinePath(b,!0)):(l||(e[0]=this.translate(a),e[1]=this.translate(b)),e=R(e,function(a){i.test(a)&&(a=v(a,10)*f/100);return a}),c.shape=== |
|||
"circle"||!l?(a=-Math.PI/2,b=Math.PI*1.5,n=!0):(a=g+this.translate(a),b=g+this.translate(b)),d=this.chart.renderer.symbols.arc(this.left+d[0],this.top+d[1],e[0],e[0],{start:a,end:b,innerR:r(e[1],e[0]-e[2]),open:n}));return d},getPlotLinePath:function(a,b){var c=this.center,d=this.chart,g=this.getPosition(a),f,e,i;this.isCircular?i=["M",c[0]+d.plotLeft,c[1]+d.plotTop,"L",g.x,g.y]:this.options.gridLineInterpolation==="circle"?(a=this.translate(a))&&(i=this.getLinePath(0,a)):(f=d.xAxis[0],i=[],a=this.translate(a), |
|||
c=f.tickPositions,f.autoConnect&&(c=c.concat([c[0]])),b&&(c=[].concat(c).reverse()),s(c,function(c,b){e=f.getPosition(c,a);i.push(b?"L":"M",e.x,e.y)}));return i},getTitlePosition:function(){var a=this.center,b=this.chart,c=this.options.title;return{x:b.plotLeft+a[0]+(c.x||0),y:b.plotTop+a[1]-{high:0.5,middle:0.25,low:0}[c.align]*a[2]+(c.y||0)}}};o(G,"init",function(a,b,c){var k;var d=b.angular,g=b.polar,f=c.isX,e=d&&f,i,n;n=b.options;var l=c.pane||0;if(d){if(F(this,e?T:O),i=!f)this.defaultRadialOptions= |
|||
this.defaultRadialGaugeOptions}else if(g)F(this,O),this.defaultRadialOptions=(i=f)?this.defaultRadialXOptions:p(this.defaultYAxisOptions,this.defaultRadialYOptions);a.call(this,b,c);if(!e&&(d||g)){a=this.options;if(!b.panes)b.panes=[];this.pane=(k=b.panes[l]=b.panes[l]||new J(M(n.pane)[l],b,this),l=k);l=l.options;b.inverted=!1;n.chart.zoomType=null;this.startAngleRad=b=(l.startAngle-90)*Math.PI/180;this.endAngleRad=n=(r(l.endAngle,l.startAngle+360)-90)*Math.PI/180;this.offset=a.offset||0;if((this.isCircular= |
|||
i)&&c.max===C&&n-b===2*Math.PI)this.autoConnect=!0}});o(u,"getPosition",function(a,b,c,d,g){var f=this.axis;return f.getPosition?f.getPosition(c):a.call(this,b,c,d,g)});o(u,"getLabelPosition",function(a,b,c,d,g,f,e,i,n){var l=this.axis,k=f.y,h=f.align,j=(l.translate(this.pos)+l.startAngleRad+Math.PI/2)/Math.PI*180%360;l.isRadial?(a=l.getPosition(this.pos,l.center[2]/2+r(f.distance,-25)),f.rotation==="auto"?d.attr({rotation:j}):k===null&&(k=v(d.styles.lineHeight)*0.9-d.getBBox().height/2),h===null&& |
|||
(h=l.isCircular?j>20&&j<160?"left":j>200&&j<340?"right":"center":"center",d.attr({align:h})),a.x+=f.x,a.y+=k):a=a.call(this,b,c,d,g,f,e,i,n);return a});o(u,"getMarkPath",function(a,b,c,d,g,f,e){var i=this.axis;i.isRadial?(a=i.getPosition(this.pos,i.center[2]/2+d),b=["M",b,c,"L",a.x,a.y]):b=a.call(this,b,c,d,g,f,e);return b});m.arearange=p(m.area,{lineWidth:1,marker:null,threshold:null,tooltip:{pointFormat:'<span style="color:{series.color}">{series.name}</span>: <b>{point.low}</b> - <b>{point.high}</b><br/>'}, |
|||
trackByArea:!0,dataLabels:{verticalAlign:null,xLow:0,xHigh:0,yLow:0,yHigh:0}});h.arearange=j.extendClass(h.area,{type:"arearange",pointArrayMap:["low","high"],toYData:function(a){return[a.low,a.high]},pointValKey:"low",getSegments:function(){var a=this;s(a.points,function(b){if(!a.options.connectNulls&&(b.low===null||b.high===null))b.y=null;else if(b.low===null&&b.high!==null)b.y=b.high});z.prototype.getSegments.call(this)},translate:function(){var a=this.yAxis;h.area.prototype.translate.apply(this); |
|||
s(this.points,function(b){var c=b.low,d=b.high,g=b.plotY;d===null&&c===null?b.y=null:c===null?(b.plotLow=b.plotY=null,b.plotHigh=a.translate(d,0,1,0,1)):d===null?(b.plotLow=g,b.plotHigh=null):(b.plotLow=g,b.plotHigh=a.translate(d,0,1,0,1))})},getSegmentPath:function(a){var b,c=[],d=a.length,g=z.prototype.getSegmentPath,f,e;e=this.options;var i=e.step;for(b=HighchartsAdapter.grep(a,function(a){return a.plotLow!==null});d--;)f=a[d],f.plotHigh!==null&&c.push({plotX:f.plotX,plotY:f.plotHigh});a=g.call(this, |
|||
b);if(i)i===!0&&(i="left"),e.step={left:"right",center:"center",right:"left"}[i];c=g.call(this,c);e.step=i;e=[].concat(a,c);c[0]="L";this.areaPath=this.areaPath.concat(a,c);return e},drawDataLabels:function(){var a=this.data,b=a.length,c,d=[],g=z.prototype,f=this.options.dataLabels,e,i=this.chart.inverted;if(f.enabled||this._hasPointLabels){for(c=b;c--;)e=a[c],e.y=e.high,e.plotY=e.plotHigh,d[c]=e.dataLabel,e.dataLabel=e.dataLabelUpper,e.below=!1,i?(f.align="left",f.x=f.xHigh):f.y=f.yHigh;g.drawDataLabels.apply(this, |
|||
arguments);for(c=b;c--;)e=a[c],e.dataLabelUpper=e.dataLabel,e.dataLabel=d[c],e.y=e.low,e.plotY=e.plotLow,e.below=!0,i?(f.align="right",f.x=f.xLow):f.y=f.yLow;g.drawDataLabels.apply(this,arguments)}},alignDataLabel:h.column.prototype.alignDataLabel,getSymbol:h.column.prototype.getSymbol,drawPoints:w});m.areasplinerange=p(m.arearange);h.areasplinerange=x(h.arearange,{type:"areasplinerange",getPointSpline:h.spline.prototype.getPointSpline});m.columnrange=p(m.column,m.arearange,{lineWidth:1,pointRange:null}); |
|||
h.columnrange=x(h.arearange,{type:"columnrange",translate:function(){var a=this,b=a.yAxis,c;q.translate.apply(a);s(a.points,function(d){var g=d.shapeArgs,f=a.options.minPointLength,e;d.plotHigh=c=b.translate(d.high,0,1,0,1);d.plotLow=d.plotY;e=c;d=d.plotY-c;d<f&&(f-=d,d+=f,e-=f/2);g.height=d;g.y=e})},trackerGroups:["group","dataLabels"],drawGraph:w,pointAttrToOptions:q.pointAttrToOptions,drawPoints:q.drawPoints,drawTracker:q.drawTracker,animate:q.animate,getColumnMetrics:q.getColumnMetrics});m.gauge= |
|||
p(m.line,{dataLabels:{enabled:!0,y:15,borderWidth:1,borderColor:"silver",borderRadius:3,style:{fontWeight:"bold"},verticalAlign:"top",zIndex:2},dial:{},pivot:{},tooltip:{headerFormat:""},showInLegend:!1});u={type:"gauge",pointClass:j.extendClass(j.Point,{setState:function(a){this.state=a}}),angular:!0,drawGraph:w,fixedBox:!0,trackerGroups:["group","dataLabels"],translate:function(){var a=this.yAxis,b=this.options,c=a.center;this.generatePoints();s(this.points,function(d){var g=p(b.dial,d.dial),f= |
|||
v(r(g.radius,80))*c[2]/200,e=v(r(g.baseLength,70))*f/100,i=v(r(g.rearLength,10))*f/100,n=g.baseWidth||3,l=g.topWidth||1,k=a.startAngleRad+a.translate(d.y,null,null,null,!0);b.wrap===!1&&(k=Math.max(a.startAngleRad,Math.min(a.endAngleRad,k)));k=k*180/Math.PI;d.shapeType="path";d.shapeArgs={d:g.path||["M",-i,-n/2,"L",e,-n/2,f,-l/2,f,l/2,e,n/2,-i,n/2,"z"],translateX:c[0],translateY:c[1],rotation:k};d.plotX=c[0];d.plotY=c[1]})},drawPoints:function(){var a=this,b=a.yAxis.center,c=a.pivot,d=a.options,g= |
|||
d.pivot,f=a.chart.renderer;s(a.points,function(c){var b=c.graphic,g=c.shapeArgs,l=g.d,k=p(d.dial,c.dial);b?(b.animate(g),g.d=l):c.graphic=f[c.shapeType](g).attr({stroke:k.borderColor||"none","stroke-width":k.borderWidth||0,fill:k.backgroundColor||"black",rotation:g.rotation}).add(a.group)});c?c.animate({translateX:b[0],translateY:b[1]}):a.pivot=f.circle(0,0,r(g.radius,5)).attr({"stroke-width":g.borderWidth||0,stroke:g.borderColor||"silver",fill:g.backgroundColor||"black"}).translate(b[0],b[1]).add(a.group)}, |
|||
animate:function(a){var b=this;if(!a)s(b.points,function(a){var d=a.graphic;d&&(d.attr({rotation:b.yAxis.startAngleRad*180/Math.PI}),d.animate({rotation:a.shapeArgs.rotation},b.options.animation))}),b.animate=null},render:function(){this.group=this.plotGroup("group","series",this.visible?"visible":"hidden",this.options.zIndex,this.chart.seriesGroup);h.pie.prototype.render.call(this);this.group.clip(this.chart.clipRect)},setData:h.pie.prototype.setData,drawTracker:h.column.prototype.drawTracker};h.gauge= |
|||
j.extendClass(h.line,u);m.boxplot=p(m.column,{fillColor:"#FFFFFF",lineWidth:1,medianWidth:2,states:{hover:{brightness:-0.3}},threshold:null,tooltip:{pointFormat:'<span style="color:{series.color};font-weight:bold">{series.name}</span><br/>Maximum: {point.high}<br/>Upper quartile: {point.q3}<br/>Median: {point.median}<br/>Lower quartile: {point.q1}<br/>Minimum: {point.low}<br/>'},whiskerLength:"50%",whiskerWidth:2});h.boxplot=x(h.column,{type:"boxplot",pointArrayMap:["low","q1","median","q3","high"], |
|||
toYData:function(a){return[a.low,a.q1,a.median,a.q3,a.high]},pointValKey:"high",pointAttrToOptions:{fill:"fillColor",stroke:"color","stroke-width":"lineWidth"},drawDataLabels:w,translate:function(){var a=this.yAxis,b=this.pointArrayMap;h.column.prototype.translate.apply(this);s(this.points,function(c){s(b,function(b){c[b]!==null&&(c[b+"Plot"]=a.translate(c[b],0,1,0,1))})})},drawPoints:function(){var a=this,b=a.points,c=a.options,d=a.chart.renderer,g,f,e,i,n,l,k,h,j,m,o,H,p,E,I,q,w,t,v,u,z,y,x=a.doQuartiles!== |
|||
!1,B=parseInt(a.options.whiskerLength,10)/100;s(b,function(b){j=b.graphic;z=b.shapeArgs;o={};E={};q={};y=b.color||a.color;if(b.plotY!==C)if(g=b.pointAttr[b.selected?"selected":""],w=z.width,t=A(z.x),v=t+w,u=D(w/2),f=A(x?b.q1Plot:b.lowPlot),e=A(x?b.q3Plot:b.lowPlot),i=A(b.highPlot),n=A(b.lowPlot),o.stroke=b.stemColor||c.stemColor||y,o["stroke-width"]=r(b.stemWidth,c.stemWidth,c.lineWidth),o.dashstyle=b.stemDashStyle||c.stemDashStyle,E.stroke=b.whiskerColor||c.whiskerColor||y,E["stroke-width"]=r(b.whiskerWidth, |
|||
c.whiskerWidth,c.lineWidth),q.stroke=b.medianColor||c.medianColor||y,q["stroke-width"]=r(b.medianWidth,c.medianWidth,c.lineWidth),k=o["stroke-width"]%2/2,h=t+u+k,m=["M",h,e,"L",h,i,"M",h,f,"L",h,n,"z"],x&&(k=g["stroke-width"]%2/2,h=A(h)+k,f=A(f)+k,e=A(e)+k,t+=k,v+=k,H=["M",t,e,"L",t,f,"L",v,f,"L",v,e,"L",t,e,"z"]),B&&(k=E["stroke-width"]%2/2,i+=k,n+=k,p=["M",h-u*B,i,"L",h+u*B,i,"M",h-u*B,n,"L",h+u*B,n]),k=q["stroke-width"]%2/2,l=D(b.medianPlot)+k,I=["M",t,l,"L",v,l,"z"],j)b.stem.animate({d:m}),B&& |
|||
b.whiskers.animate({d:p}),x&&b.box.animate({d:H}),b.medianShape.animate({d:I});else{b.graphic=j=d.g().add(a.group);b.stem=d.path(m).attr(o).add(j);if(B)b.whiskers=d.path(p).attr(E).add(j);if(x)b.box=d.path(H).attr(g).add(j);b.medianShape=d.path(I).attr(q).add(j)}})}});m.errorbar=p(m.boxplot,{color:"#000000",grouping:!1,linkedTo:":previous",tooltip:{pointFormat:m.arearange.tooltip.pointFormat},whiskerWidth:null});h.errorbar=x(h.boxplot,{type:"errorbar",pointArrayMap:["low","high"],toYData:function(a){return[a.low, |
|||
a.high]},pointValKey:"high",doQuartiles:!1,getColumnMetrics:function(){return this.linkedParent&&this.linkedParent.columnMetrics||h.column.prototype.getColumnMetrics.call(this)}});m.waterfall=p(m.column,{lineWidth:1,lineColor:"#333",dashStyle:"dot",borderColor:"#333"});h.waterfall=x(h.column,{type:"waterfall",upColorProp:"fill",pointArrayMap:["low","y"],pointValKey:"y",init:function(a,b){b.stacking=!0;h.column.prototype.init.call(this,a,b)},translate:function(){var a=this.options,b=this.yAxis,c,d, |
|||
g,f,e,i,n,l,k;c=a.threshold;a=a.borderWidth%2/2;h.column.prototype.translate.apply(this);l=c;g=this.points;for(d=0,c=g.length;d<c;d++){f=g[d];e=f.shapeArgs;i=this.getStack(d);k=i.points[this.index];if(isNaN(f.y))f.y=this.yData[d];n=S(l,l+f.y)+k[0];e.y=b.translate(n,0,1);f.isSum||f.isIntermediateSum?(e.y=b.translate(k[1],0,1),e.height=b.translate(k[0],0,1)-e.y):l+=i.total;e.height<0&&(e.y+=e.height,e.height*=-1);f.plotY=e.y=D(e.y)-a;e.height=D(e.height);f.yBottom=e.y+e.height}},processData:function(a){var b= |
|||
this.yData,c=this.points,d,g=b.length,f=this.options.threshold||0,e,i,h,l,k,j;i=e=h=l=f;for(j=0;j<g;j++)k=b[j],d=c&&c[j]?c[j]:{},k==="sum"||d.isSum?b[j]=i:k==="intermediateSum"||d.isIntermediateSum?(b[j]=e,e=f):(i+=k,e+=k),h=Math.min(i,h),l=Math.max(i,l);z.prototype.processData.call(this,a);this.dataMin=h;this.dataMax=l},toYData:function(a){if(a.isSum)return"sum";else if(a.isIntermediateSum)return"intermediateSum";return a.y},getAttribs:function(){h.column.prototype.getAttribs.apply(this,arguments); |
|||
var a=this.options,b=a.states,c=a.upColor||this.color,a=j.Color(c).brighten(0.1).get(),d=p(this.pointAttr),g=this.upColorProp;d[""][g]=c;d.hover[g]=b.hover.upColor||a;d.select[g]=b.select.upColor||c;s(this.points,function(a){if(a.y>0&&!a.color)a.pointAttr=d,a.color=c})},getGraphPath:function(){var a=this.data,b=a.length,c=D(this.options.lineWidth+this.options.borderWidth)%2/2,d=[],g,f,e;for(e=1;e<b;e++)f=a[e].shapeArgs,g=a[e-1].shapeArgs,f=["M",g.x+g.width,g.y+c,"L",f.x,g.y+c],a[e-1].y<0&&(f[2]+= |
|||
g.height,f[5]+=g.height),d=d.concat(f);return d},getExtremes:w,getStack:function(a){var b=this.yAxis.stacks,c=this.stackKey;this.processedYData[a]<this.options.threshold&&(c="-"+c);return b[c][a]},drawGraph:z.prototype.drawGraph});m.bubble=p(m.scatter,{dataLabels:{inside:!0,style:{color:"white",textShadow:"0px 0px 3px black"},verticalAlign:"middle"},marker:{lineColor:null,lineWidth:1},minSize:8,maxSize:"20%",tooltip:{pointFormat:"({point.x}, {point.y}), Size: {point.z}"},turboThreshold:0,zThreshold:0}); |
|||
h.bubble=x(h.scatter,{type:"bubble",pointArrayMap:["y","z"],trackerGroups:["group","dataLabelsGroup"],pointAttrToOptions:{stroke:"lineColor","stroke-width":"lineWidth",fill:"fillColor"},applyOpacity:function(a){var b=this.options.marker,c=r(b.fillOpacity,0.5),a=a||b.fillColor||this.color;c!==1&&(a=j.Color(a).setOpacity(c).get("rgba"));return a},convertAttribs:function(){var a=z.prototype.convertAttribs.apply(this,arguments);a.fill=this.applyOpacity(a.fill);return a},getRadii:function(a,b,c,d){var g, |
|||
f,e,i=this.zData,h=[];for(f=0,g=i.length;f<g;f++)e=b-a,e=e>0?(i[f]-a)/(b-a):0.5,h.push(t.ceil(c+e*(d-c))/2);this.radii=h},animate:function(a){var b=this.options.animation;if(!a)s(this.points,function(a){var d=a.graphic,a=a.shapeArgs;d&&a&&(d.attr("r",1),d.animate({r:a.r},b))}),this.animate=null},translate:function(){var a,b=this.data,c,d,g=this.radii;h.scatter.prototype.translate.call(this);for(a=b.length;a--;)c=b[a],d=g?g[a]:0,c.negative=c.z<(this.options.zThreshold||0),d>=this.minPxSize/2?(c.shapeType= |
|||
"circle",c.shapeArgs={x:c.plotX,y:c.plotY,r:d},c.dlBox={x:c.plotX-d,y:c.plotY-d,width:2*d,height:2*d}):c.shapeArgs=c.plotY=c.dlBox=C},drawLegendSymbol:function(a,b){var c=v(a.itemStyle.fontSize)/2;b.legendSymbol=this.chart.renderer.circle(c,a.baseline-c,c).attr({zIndex:3}).add(b.legendGroup);b.legendSymbol.isMarker=!0},drawPoints:h.column.prototype.drawPoints,alignDataLabel:h.column.prototype.alignDataLabel});N.prototype.beforePadding=function(){var a=this,b=this.len,c=this.chart,d=0,g=b,f=this.isXAxis, |
|||
e=f?"xData":"yData",i=this.min,h={},j=t.min(c.plotWidth,c.plotHeight),k=Number.MAX_VALUE,m=-Number.MAX_VALUE,o=this.max-i,p=b/o,q=[];this.tickPositions&&(s(this.series,function(b){var c=b.options;if(b.type==="bubble"&&b.visible&&(a.allowZoomOutside=!0,q.push(b),f))s(["minSize","maxSize"],function(a){var b=c[a],d=/%$/.test(b),b=v(b);h[a]=d?j*b/100:b}),b.minPxSize=h.minSize,b=b.zData,b.length&&(k=t.min(k,t.max(P(b),c.displayNegative===!1?c.zThreshold:-Number.MAX_VALUE)),m=t.max(m,Q(b)))}),s(q,function(a){var b= |
|||
a[e],c=b.length,j;f&&a.getRadii(k,m,h.minSize,h.maxSize);if(o>0)for(;c--;)j=a.radii[c],d=Math.min((b[c]-i)*p-j,d),g=Math.max((b[c]-i)*p+j,g)}),q.length&&o>0&&r(this.options.min,this.userMin)===C&&r(this.options.max,this.userMax)===C&&(g-=b,p*=(b+d-g)/b,this.min+=d/p,this.max+=g/p))};var y=z.prototype,m=j.Pointer.prototype;y.toXY=function(a){var b,c=this.chart;b=a.plotX;var d=a.plotY;a.rectPlotX=b;a.rectPlotY=d;a.clientX=(b/Math.PI*180+this.xAxis.pane.options.startAngle)%360;b=this.xAxis.postTranslate(a.plotX, |
|||
this.yAxis.len-d);a.plotX=a.polarPlotX=b.x-c.plotLeft;a.plotY=a.polarPlotY=b.y-c.plotTop};y.orderTooltipPoints=function(a){if(this.chart.polar&&(a.sort(function(a,c){return a.clientX-c.clientX}),a[0]))a[0].wrappedClientX=a[0].clientX+360,a.push(a[0])};o(h.area.prototype,"init",K);o(h.areaspline.prototype,"init",K);o(h.spline.prototype,"getPointSpline",function(a,b,c,d){var g,f,e,i,h,j,k;if(this.chart.polar){g=c.plotX;f=c.plotY;a=b[d-1];e=b[d+1];this.connectEnds&&(a||(a=b[b.length-2]),e||(e=b[1])); |
|||
if(a&&e)i=a.plotX,h=a.plotY,b=e.plotX,j=e.plotY,i=(1.5*g+i)/2.5,h=(1.5*f+h)/2.5,e=(1.5*g+b)/2.5,k=(1.5*f+j)/2.5,b=Math.sqrt(Math.pow(i-g,2)+Math.pow(h-f,2)),j=Math.sqrt(Math.pow(e-g,2)+Math.pow(k-f,2)),i=Math.atan2(h-f,i-g),h=Math.atan2(k-f,e-g),k=Math.PI/2+(i+h)/2,Math.abs(i-k)>Math.PI/2&&(k-=Math.PI),i=g+Math.cos(k)*b,h=f+Math.sin(k)*b,e=g+Math.cos(Math.PI+k)*j,k=f+Math.sin(Math.PI+k)*j,c.rightContX=e,c.rightContY=k;d?(c=["C",a.rightContX||a.plotX,a.rightContY||a.plotY,i||g,h||f,g,f],a.rightContX= |
|||
a.rightContY=null):c=["M",g,f]}else c=a.call(this,b,c,d);return c});o(y,"translate",function(a){a.call(this);if(this.chart.polar&&!this.preventPostTranslate)for(var a=this.points,b=a.length;b--;)this.toXY(a[b])});o(y,"getSegmentPath",function(a,b){var c=this.points;if(this.chart.polar&&this.options.connectEnds!==!1&&b[b.length-1]===c[c.length-1]&&c[0].y!==null)this.connectEnds=!0,b=[].concat(b,[c[0]]);return a.call(this,b)});o(y,"animate",L);o(q,"animate",L);o(y,"setTooltipPoints",function(a,b){this.chart.polar&& |
|||
F(this.xAxis,{tooltipLen:360});return a.call(this,b)});o(q,"translate",function(a){var b=this.xAxis,c=this.yAxis.len,d=b.center,g=b.startAngleRad,f=this.chart.renderer,e,h;this.preventPostTranslate=!0;a.call(this);if(b.isRadial){b=this.points;for(h=b.length;h--;)e=b[h],a=e.barX+g,e.shapeType="path",e.shapeArgs={d:f.symbols.arc(d[0],d[1],c-e.plotY,null,{start:a,end:a+e.pointWidth,innerR:c-r(e.yBottom,c)})},this.toXY(e)}});o(q,"alignDataLabel",function(a,b,c,d,g,f){if(this.chart.polar){a=b.rectPlotX/ |
|||
Math.PI*180;if(d.align===null)d.align=a>20&&a<160?"left":a>200&&a<340?"right":"center";if(d.verticalAlign===null)d.verticalAlign=a<45||a>315?"bottom":a>135&&a<225?"top":"middle";y.alignDataLabel.call(this,b,c,d,g,f)}else a.call(this,b,c,d,g,f)});o(m,"getIndex",function(a,b){var c,d=this.chart,g;d.polar?(g=d.xAxis[0].center,c=b.chartX-g[0]-d.plotLeft,d=b.chartY-g[1]-d.plotTop,c=180-Math.round(Math.atan2(c,d)/Math.PI*180)):c=a.call(this,b);return c});o(m,"getCoordinates",function(a,b){var c=this.chart, |
|||
d={xAxis:[],yAxis:[]};c.polar?s(c.axes,function(a){var f=a.isXAxis,e=a.center,h=b.chartX-e[0]-c.plotLeft,e=b.chartY-e[1]-c.plotTop;d[f?"xAxis":"yAxis"].push({axis:a,value:a.translate(f?Math.PI-Math.atan2(h,e):Math.sqrt(Math.pow(h,2)+Math.pow(e,2)),!0)})}):d=a.call(this,b);return d})})(Highcharts); |
|||
@ -0,0 +1,283 @@ |
|||
/* |
|||
Highcharts JS v3.0.6 (2013-10-04) |
|||
|
|||
(c) 2009-2013 Torstein Hønsi |
|||
|
|||
License: www.highcharts.com/license |
|||
*/ |
|||
(function(){function r(a,b){var c;a||(a={});for(c in b)a[c]=b[c];return a}function x(){var a,b=arguments.length,c={},d=function(a,b){var c,h;typeof a!=="object"&&(a={});for(h in b)b.hasOwnProperty(h)&&(c=b[h],a[h]=c&&typeof c==="object"&&Object.prototype.toString.call(c)!=="[object Array]"&&typeof c.nodeType!=="number"?d(a[h]||{},c):b[h]);return a};for(a=0;a<b;a++)c=d(c,arguments[a]);return c}function C(a,b){return parseInt(a,b||10)}function ea(a){return typeof a==="string"}function T(a){return typeof a=== |
|||
"object"}function Ia(a){return Object.prototype.toString.call(a)==="[object Array]"}function sa(a){return typeof a==="number"}function na(a){return R.log(a)/R.LN10}function fa(a){return R.pow(10,a)}function ga(a,b){for(var c=a.length;c--;)if(a[c]===b){a.splice(c,1);break}}function u(a){return a!==w&&a!==null}function v(a,b,c){var d,e;if(ea(b))u(c)?a.setAttribute(b,c):a&&a.getAttribute&&(e=a.getAttribute(b));else if(u(b)&&T(b))for(d in b)a.setAttribute(d,b[d]);return e}function ja(a){return Ia(a)? |
|||
a:[a]}function o(){var a=arguments,b,c,d=a.length;for(b=0;b<d;b++)if(c=a[b],typeof c!=="undefined"&&c!==null)return c}function K(a,b){if(ta&&b&&b.opacity!==w)b.filter="alpha(opacity="+b.opacity*100+")";r(a.style,b)}function U(a,b,c,d,e){a=y.createElement(a);b&&r(a,b);e&&K(a,{padding:0,border:S,margin:0});c&&K(a,c);d&&d.appendChild(a);return a}function ha(a,b){var c=function(){};c.prototype=new a;r(c.prototype,b);return c}function Aa(a,b,c,d){var e=M.lang,a=+a||0,f=b===-1?(a.toString().split(".")[1]|| |
|||
"").length:isNaN(b=N(b))?2:b,b=c===void 0?e.decimalPoint:c,d=d===void 0?e.thousandsSep:d,e=a<0?"-":"",c=String(C(a=N(a).toFixed(f))),g=c.length>3?c.length%3:0;return e+(g?c.substr(0,g)+d:"")+c.substr(g).replace(/(\d{3})(?=\d)/g,"$1"+d)+(f?b+N(a-c).toFixed(f).slice(2):"")}function Ba(a,b){return Array((b||2)+1-String(a).length).join(0)+a}function mb(a,b,c){var d=a[b];a[b]=function(){var a=Array.prototype.slice.call(arguments);a.unshift(d);return c.apply(this,a)}}function Ca(a,b){for(var c="{",d=!1, |
|||
e,f,g,h,i,j=[];(c=a.indexOf(c))!==-1;){e=a.slice(0,c);if(d){f=e.split(":");g=f.shift().split(".");i=g.length;e=b;for(h=0;h<i;h++)e=e[g[h]];if(f.length)f=f.join(":"),g=/\.([0-9])/,h=M.lang,i=void 0,/f$/.test(f)?(i=(i=f.match(g))?i[1]:-1,e=Aa(e,i,h.decimalPoint,f.indexOf(",")>-1?h.thousandsSep:"")):e=Xa(f,e)}j.push(e);a=a.slice(c+1);c=(d=!d)?"}":"{"}j.push(a);return j.join("")}function nb(a){return R.pow(10,P(R.log(a)/R.LN10))}function ob(a,b,c,d){var e,c=o(c,1);e=a/c;b||(b=[1,2,2.5,5,10],d&&d.allowDecimals=== |
|||
!1&&(c===1?b=[1,2,5,10]:c<=0.1&&(b=[1/c])));for(d=0;d<b.length;d++)if(a=b[d],e<=(b[d]+(b[d+1]||b[d]))/2)break;a*=c;return a}function Cb(a,b){var c=b||[[Db,[1,2,5,10,20,25,50,100,200,500]],[pb,[1,2,5,10,15,30]],[Ya,[1,2,5,10,15,30]],[Qa,[1,2,3,4,6,8,12]],[ua,[1,2]],[Za,[1,2]],[Ra,[1,2,3,4,6]],[Da,null]],d=c[c.length-1],e=D[d[0]],f=d[1],g;for(g=0;g<c.length;g++)if(d=c[g],e=D[d[0]],f=d[1],c[g+1]&&a<=(e*f[f.length-1]+D[c[g+1][0]])/2)break;e===D[Da]&&a<5*e&&(f=[1,2,5]);c=ob(a/e,f,d[0]===Da?nb(a/e):1); |
|||
return{unitRange:e,count:c,unitName:d[0]}}function Eb(a,b,c,d){var e=[],f={},g=M.global.useUTC,h,i=new Date(b),j=a.unitRange,k=a.count;if(u(b)){j>=D[pb]&&(i.setMilliseconds(0),i.setSeconds(j>=D[Ya]?0:k*P(i.getSeconds()/k)));if(j>=D[Ya])i[Fb](j>=D[Qa]?0:k*P(i[qb]()/k));if(j>=D[Qa])i[Gb](j>=D[ua]?0:k*P(i[rb]()/k));if(j>=D[ua])i[sb](j>=D[Ra]?1:k*P(i[Sa]()/k));j>=D[Ra]&&(i[Hb](j>=D[Da]?0:k*P(i[$a]()/k)),h=i[ab]());j>=D[Da]&&(h-=h%k,i[Ib](h));if(j===D[Za])i[sb](i[Sa]()-i[tb]()+o(d,1));b=1;h=i[ab]();for(var d= |
|||
i.getTime(),l=i[$a](),m=i[Sa](),p=g?0:(864E5+i.getTimezoneOffset()*6E4)%864E5;d<c;)e.push(d),j===D[Da]?d=bb(h+b*k,0):j===D[Ra]?d=bb(h,l+b*k):!g&&(j===D[ua]||j===D[Za])?d=bb(h,l,m+b*k*(j===D[ua]?1:7)):d+=j*k,b++;e.push(d);n(ub(e,function(a){return j<=D[Qa]&&a%D[ua]===p}),function(a){f[a]=ua})}e.info=r(a,{higherRanks:f,totalRange:j*k});return e}function Jb(){this.symbol=this.color=0}function Kb(a,b){var c=a.length,d,e;for(e=0;e<c;e++)a[e].ss_i=e;a.sort(function(a,c){d=b(a,c);return d===0?a.ss_i-c.ss_i: |
|||
d});for(e=0;e<c;e++)delete a[e].ss_i}function Ja(a){for(var b=a.length,c=a[0];b--;)a[b]<c&&(c=a[b]);return c}function va(a){for(var b=a.length,c=a[0];b--;)a[b]>c&&(c=a[b]);return c}function Ka(a,b){for(var c in a)a[c]&&a[c]!==b&&a[c].destroy&&a[c].destroy(),delete a[c]}function Ta(a){cb||(cb=U(Ea));a&&cb.appendChild(a);cb.innerHTML=""}function ka(a,b){var c="Highcharts error #"+a+": www.highcharts.com/errors/"+a;if(b)throw c;else O.console&&console.log(c)}function ia(a){return parseFloat(a.toPrecision(14))} |
|||
function La(a,b){Fa=o(a,b.animation)}function Lb(){var a=M.global.useUTC,b=a?"getUTC":"get",c=a?"setUTC":"set";bb=a?Date.UTC:function(a,b,c,g,h,i){return(new Date(a,b,o(c,1),o(g,0),o(h,0),o(i,0))).getTime()};qb=b+"Minutes";rb=b+"Hours";tb=b+"Day";Sa=b+"Date";$a=b+"Month";ab=b+"FullYear";Fb=c+"Minutes";Gb=c+"Hours";sb=c+"Date";Hb=c+"Month";Ib=c+"FullYear"}function wa(){}function Ma(a,b,c,d){this.axis=a;this.pos=b;this.type=c||"";this.isNew=!0;!c&&!d&&this.addLabel()}function vb(a,b){this.axis=a;if(b)this.options= |
|||
b,this.id=b.id}function Mb(a,b,c,d,e,f){var g=a.chart.inverted;this.axis=a;this.isNegative=c;this.options=b;this.x=d;this.total=null;this.points={};this.stack=e;this.percent=f==="percent";this.alignOptions={align:b.align||(g?c?"left":"right":"center"),verticalAlign:b.verticalAlign||(g?"middle":c?"bottom":"top"),y:o(b.y,g?4:c?14:-6),x:o(b.x,g?c?-6:6:0)};this.textAlign=b.textAlign||(g?c?"right":"left":"center")}function db(){this.init.apply(this,arguments)}function wb(){this.init.apply(this,arguments)} |
|||
function xb(a,b){this.init(a,b)}function eb(a,b){this.init(a,b)}function yb(){this.init.apply(this,arguments)}var w,y=document,O=window,R=Math,t=R.round,P=R.floor,xa=R.ceil,s=R.max,I=R.min,N=R.abs,V=R.cos,ca=R.sin,ya=R.PI,Ua=ya*2/360,oa=navigator.userAgent,Nb=O.opera,ta=/msie/i.test(oa)&&!Nb,fb=y.documentMode===8,gb=/AppleWebKit/.test(oa),hb=/Firefox/.test(oa),Ob=/(Mobile|Android|Windows Phone)/.test(oa),za="http://www.w3.org/2000/svg",Z=!!y.createElementNS&&!!y.createElementNS(za,"svg").createSVGRect, |
|||
Ub=hb&&parseInt(oa.split("Firefox/")[1],10)<4,$=!Z&&!ta&&!!y.createElement("canvas").getContext,Va,ib=y.documentElement.ontouchstart!==w,Pb={},zb=0,cb,M,Xa,Fa,Ab,D,pa=function(){},Ga=[],Ea="div",S="none",Qb="rgba(192,192,192,"+(Z?1.0E-4:0.002)+")",Db="millisecond",pb="second",Ya="minute",Qa="hour",ua="day",Za="week",Ra="month",Da="year",Rb="stroke-width",bb,qb,rb,tb,Sa,$a,ab,Fb,Gb,sb,Hb,Ib,W={};O.Highcharts=O.Highcharts?ka(16,!0):{};Xa=function(a,b,c){if(!u(b)||isNaN(b))return"Invalid date";var a= |
|||
o(a,"%Y-%m-%d %H:%M:%S"),d=new Date(b),e,f=d[rb](),g=d[tb](),h=d[Sa](),i=d[$a](),j=d[ab](),k=M.lang,l=k.weekdays,d=r({a:l[g].substr(0,3),A:l[g],d:Ba(h),e:h,b:k.shortMonths[i],B:k.months[i],m:Ba(i+1),y:j.toString().substr(2,2),Y:j,H:Ba(f),I:Ba(f%12||12),l:f%12||12,M:Ba(d[qb]()),p:f<12?"AM":"PM",P:f<12?"am":"pm",S:Ba(d.getSeconds()),L:Ba(t(b%1E3),3)},Highcharts.dateFormats);for(e in d)for(;a.indexOf("%"+e)!==-1;)a=a.replace("%"+e,typeof d[e]==="function"?d[e](b):d[e]);return c?a.substr(0,1).toUpperCase()+ |
|||
a.substr(1):a};Jb.prototype={wrapColor:function(a){if(this.color>=a)this.color=0},wrapSymbol:function(a){if(this.symbol>=a)this.symbol=0}};D=function(){for(var a=0,b=arguments,c=b.length,d={};a<c;a++)d[b[a++]]=b[a];return d}(Db,1,pb,1E3,Ya,6E4,Qa,36E5,ua,864E5,Za,6048E5,Ra,26784E5,Da,31556952E3);Ab={init:function(a,b,c){var b=b||"",d=a.shift,e=b.indexOf("C")>-1,f=e?7:3,g,b=b.split(" "),c=[].concat(c),h,i,j=function(a){for(g=a.length;g--;)a[g]==="M"&&a.splice(g+1,0,a[g+1],a[g+2],a[g+1],a[g+2])};e&& |
|||
(j(b),j(c));a.isArea&&(h=b.splice(b.length-6,6),i=c.splice(c.length-6,6));if(d<=c.length/f&&b.length===c.length)for(;d--;)c=[].concat(c).splice(0,f).concat(c);a.shift=0;if(b.length)for(a=c.length;b.length<a;)d=[].concat(b).splice(b.length-f,f),e&&(d[f-6]=d[f-2],d[f-5]=d[f-1]),b=b.concat(d);h&&(b=b.concat(h),c=c.concat(i));return[b,c]},step:function(a,b,c,d){var e=[],f=a.length;if(c===1)e=d;else if(f===b.length&&c<1)for(;f--;)d=parseFloat(a[f]),e[f]=isNaN(d)?a[f]:c*parseFloat(b[f]-d)+d;else e=b;return e}}; |
|||
(function(a){O.HighchartsAdapter=O.HighchartsAdapter||a&&{init:function(b){var c=a.fx,d=c.step,e,f=a.Tween,g=f&&f.propHooks;e=a.cssHooks.opacity;a.extend(a.easing,{easeOutQuad:function(a,b,c,d,e){return-d*(b/=e)*(b-2)+c}});a.each(["cur","_default","width","height","opacity"],function(a,b){var e=d,k,l;b==="cur"?e=c.prototype:b==="_default"&&f&&(e=g[b],b="set");(k=e[b])&&(e[b]=function(c){c=a?c:this;if(c.prop!=="align")return l=c.elem,l.attr?l.attr(c.prop,b==="cur"?w:c.now):k.apply(this,arguments)})}); |
|||
mb(e,"get",function(a,b,c){return b.attr?b.opacity||0:a.call(this,b,c)});e=function(a){var c=a.elem,d;if(!a.started)d=b.init(c,c.d,c.toD),a.start=d[0],a.end=d[1],a.started=!0;c.attr("d",b.step(a.start,a.end,a.pos,c.toD))};f?g.d={set:e}:d.d=e;this.each=Array.prototype.forEach?function(a,b){return Array.prototype.forEach.call(a,b)}:function(a,b){for(var c=0,d=a.length;c<d;c++)if(b.call(a[c],a[c],c,a)===!1)return c};a.fn.highcharts=function(){var a="Chart",b=arguments,c,d;ea(b[0])&&(a=b[0],b=Array.prototype.slice.call(b, |
|||
1));c=b[0];if(c!==w)c.chart=c.chart||{},c.chart.renderTo=this[0],new Highcharts[a](c,b[1]),d=this;c===w&&(d=Ga[v(this[0],"data-highcharts-chart")]);return d}},getScript:a.getScript,inArray:a.inArray,adapterRun:function(b,c){return a(b)[c]()},grep:a.grep,map:function(a,c){for(var d=[],e=0,f=a.length;e<f;e++)d[e]=c.call(a[e],a[e],e,a);return d},offset:function(b){return a(b).offset()},addEvent:function(b,c,d){a(b).bind(c,d)},removeEvent:function(b,c,d){var e=y.removeEventListener?"removeEventListener": |
|||
"detachEvent";y[e]&&b&&!b[e]&&(b[e]=function(){});a(b).unbind(c,d)},fireEvent:function(b,c,d,e){var f=a.Event(c),g="detached"+c,h;!ta&&d&&(delete d.layerX,delete d.layerY);r(f,d);b[c]&&(b[g]=b[c],b[c]=null);a.each(["preventDefault","stopPropagation"],function(a,b){var c=f[b];f[b]=function(){try{c.call(f)}catch(a){b==="preventDefault"&&(h=!0)}}});a(b).trigger(f);b[g]&&(b[c]=b[g],b[g]=null);e&&!f.isDefaultPrevented()&&!h&&e(f)},washMouseEvent:function(a){var c=a.originalEvent||a;if(c.pageX===w)c.pageX= |
|||
a.pageX,c.pageY=a.pageY;return c},animate:function(b,c,d){var e=a(b);if(!b.style)b.style={};if(c.d)b.toD=c.d,c.d=1;e.stop();c.opacity!==w&&b.attr&&(c.opacity+="px");e.animate(c,d)},stop:function(b){a(b).stop()}}})(O.jQuery);var X=O.HighchartsAdapter,G=X||{};X&&X.init.call(X,Ab);var jb=G.adapterRun,Vb=G.getScript,qa=G.inArray,n=G.each,ub=G.grep,Wb=G.offset,Na=G.map,J=G.addEvent,aa=G.removeEvent,z=G.fireEvent,Xb=G.washMouseEvent,Bb=G.animate,Wa=G.stop,G={enabled:!0,x:0,y:15,style:{color:"#666",cursor:"default", |
|||
fontSize:"11px",lineHeight:"14px"}};M={colors:"#2f7ed8,#0d233a,#8bbc21,#910000,#1aadce,#492970,#f28f43,#77a1e5,#c42525,#a6c96a".split(","),symbols:["circle","diamond","square","triangle","triangle-down"],lang:{loading:"Loading...",months:"January,February,March,April,May,June,July,August,September,October,November,December".split(","),shortMonths:"Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec".split(","),weekdays:"Sunday,Monday,Tuesday,Wednesday,Thursday,Friday,Saturday".split(","),decimalPoint:".", |
|||
numericSymbols:"k,M,G,T,P,E".split(","),resetZoom:"Reset zoom",resetZoomTitle:"Reset zoom level 1:1",thousandsSep:","},global:{useUTC:!0,canvasToolsURL:"http://code.highcharts.com/3.0.6/modules/canvas-tools.js",VMLRadialGradientURL:"http://code.highcharts.com/3.0.6/gfx/vml-radial-gradient.png"},chart:{borderColor:"#4572A7",borderRadius:5,defaultSeriesType:"line",ignoreHiddenSeries:!0,spacing:[10,10,15,10],style:{fontFamily:'"Lucida Grande", "Lucida Sans Unicode", Verdana, Arial, Helvetica, sans-serif', |
|||
fontSize:"12px"},backgroundColor:"#FFFFFF",plotBorderColor:"#C0C0C0",resetZoomButton:{theme:{zIndex:20},position:{align:"right",x:-10,y:10}}},title:{text:"Chart title",align:"center",margin:15,style:{color:"#274b6d",fontSize:"16px"}},subtitle:{text:"",align:"center",style:{color:"#4d759e"}},plotOptions:{line:{allowPointSelect:!1,showCheckbox:!1,animation:{duration:1E3},events:{},lineWidth:2,marker:{enabled:!0,lineWidth:0,radius:4,lineColor:"#FFFFFF",states:{hover:{enabled:!0},select:{fillColor:"#FFFFFF", |
|||
lineColor:"#000000",lineWidth:2}}},point:{events:{}},dataLabels:x(G,{align:"center",enabled:!1,formatter:function(){return this.y===null?"":Aa(this.y,-1)},verticalAlign:"bottom",y:0}),cropThreshold:300,pointRange:0,showInLegend:!0,states:{hover:{marker:{}},select:{marker:{}}},stickyTracking:!0}},labels:{style:{position:"absolute",color:"#3E576F"}},legend:{enabled:!0,align:"center",layout:"horizontal",labelFormatter:function(){return this.name},borderWidth:1,borderColor:"#909090",borderRadius:5,navigation:{activeColor:"#274b6d", |
|||
inactiveColor:"#CCC"},shadow:!1,itemStyle:{cursor:"pointer",color:"#274b6d",fontSize:"12px"},itemHoverStyle:{color:"#000"},itemHiddenStyle:{color:"#CCC"},itemCheckboxStyle:{position:"absolute",width:"13px",height:"13px"},symbolWidth:16,symbolPadding:5,verticalAlign:"bottom",x:0,y:0,title:{style:{fontWeight:"bold"}}},loading:{labelStyle:{fontWeight:"bold",position:"relative",top:"1em"},style:{position:"absolute",backgroundColor:"white",opacity:0.5,textAlign:"center"}},tooltip:{enabled:!0,animation:Z, |
|||
backgroundColor:"rgba(255, 255, 255, .85)",borderWidth:1,borderRadius:3,dateTimeLabelFormats:{millisecond:"%A, %b %e, %H:%M:%S.%L",second:"%A, %b %e, %H:%M:%S",minute:"%A, %b %e, %H:%M",hour:"%A, %b %e, %H:%M",day:"%A, %b %e, %Y",week:"Week from %A, %b %e, %Y",month:"%B %Y",year:"%Y"},headerFormat:'<span style="font-size: 10px">{point.key}</span><br/>',pointFormat:'<span style="color:{series.color}">{series.name}</span>: <b>{point.y}</b><br/>',shadow:!0,snap:Ob?25:10,style:{color:"#333333",cursor:"default", |
|||
fontSize:"12px",padding:"8px",whiteSpace:"nowrap"}},credits:{enabled:!0,text:"Highcharts.com",href:"http://www.highcharts.com",position:{align:"right",x:-10,verticalAlign:"bottom",y:-5},style:{cursor:"pointer",color:"#909090",fontSize:"9px"}}};var Y=M.plotOptions,X=Y.line;Lb();var ra=function(a){var b=[],c,d;(function(a){a&&a.stops?d=Na(a.stops,function(a){return ra(a[1])}):(c=/rgba\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]?(?:\.[0-9]+)?)\s*\)/.exec(a))?b=[C(c[1]),C(c[2]), |
|||
C(c[3]),parseFloat(c[4],10)]:(c=/#([a-fA-F0-9]{2})([a-fA-F0-9]{2})([a-fA-F0-9]{2})/.exec(a))?b=[C(c[1],16),C(c[2],16),C(c[3],16),1]:(c=/rgb\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*\)/.exec(a))&&(b=[C(c[1]),C(c[2]),C(c[3]),1])})(a);return{get:function(c){var f;d?(f=x(a),f.stops=[].concat(f.stops),n(d,function(a,b){f.stops[b]=[f.stops[b][0],a.get(c)]})):f=b&&!isNaN(b[0])?c==="rgb"?"rgb("+b[0]+","+b[1]+","+b[2]+")":c==="a"?b[3]:"rgba("+b.join(",")+")":a;return f},brighten:function(a){if(d)n(d, |
|||
function(b){b.brighten(a)});else if(sa(a)&&a!==0){var c;for(c=0;c<3;c++)b[c]+=C(a*255),b[c]<0&&(b[c]=0),b[c]>255&&(b[c]=255)}return this},rgba:b,setOpacity:function(a){b[3]=a;return this}}};wa.prototype={init:function(a,b){this.element=b==="span"?U(b):y.createElementNS(za,b);this.renderer=a;this.attrSetters={}},opacity:1,animate:function(a,b,c){b=o(b,Fa,!0);Wa(this);if(b){b=x(b);if(c)b.complete=c;Bb(this,a,b)}else this.attr(a),c&&c()},attr:function(a,b){var c,d,e,f,g=this.element,h=g.nodeName.toLowerCase(), |
|||
i=this.renderer,j,k=this.attrSetters,l=this.shadows,m,p,q=this;ea(a)&&u(b)&&(c=a,a={},a[c]=b);if(ea(a))c=a,h==="circle"?c={x:"cx",y:"cy"}[c]||c:c==="strokeWidth"&&(c="stroke-width"),q=v(g,c)||this[c]||0,c!=="d"&&c!=="visibility"&&c!=="fill"&&(q=parseFloat(q));else{for(c in a)if(j=!1,d=a[c],e=k[c]&&k[c].call(this,d,c),e!==!1){e!==w&&(d=e);if(c==="d")d&&d.join&&(d=d.join(" ")),/(NaN| {2}|^$)/.test(d)&&(d="M 0 0");else if(c==="x"&&h==="text")for(e=0;e<g.childNodes.length;e++)f=g.childNodes[e],v(f,"x")=== |
|||
v(g,"x")&&v(f,"x",d);else if(this.rotation&&(c==="x"||c==="y"))p=!0;else if(c==="fill")d=i.color(d,g,c);else if(h==="circle"&&(c==="x"||c==="y"))c={x:"cx",y:"cy"}[c]||c;else if(h==="rect"&&c==="r")v(g,{rx:d,ry:d}),j=!0;else if(c==="translateX"||c==="translateY"||c==="rotation"||c==="verticalAlign"||c==="scaleX"||c==="scaleY")j=p=!0;else if(c==="stroke")d=i.color(d,g,c);else if(c==="dashstyle")if(c="stroke-dasharray",d=d&&d.toLowerCase(),d==="solid")d=S;else{if(d){d=d.replace("shortdashdotdot","3,1,1,1,1,1,").replace("shortdashdot", |
|||
"3,1,1,1").replace("shortdot","1,1,").replace("shortdash","3,1,").replace("longdash","8,3,").replace(/dot/g,"1,3,").replace("dash","4,3,").replace(/,$/,"").split(",");for(e=d.length;e--;)d[e]=C(d[e])*o(a["stroke-width"],this["stroke-width"]);d=d.join(",")}}else if(c==="width")d=C(d);else if(c==="align")c="text-anchor",d={left:"start",center:"middle",right:"end"}[d];else if(c==="title")e=g.getElementsByTagName("title")[0],e||(e=y.createElementNS(za,"title"),g.appendChild(e)),e.textContent=d;c==="strokeWidth"&& |
|||
(c="stroke-width");if(c==="stroke-width"||c==="stroke"){this[c]=d;if(this.stroke&&this["stroke-width"])v(g,"stroke",this.stroke),v(g,"stroke-width",this["stroke-width"]),this.hasStroke=!0;else if(c==="stroke-width"&&d===0&&this.hasStroke)g.removeAttribute("stroke"),this.hasStroke=!1;j=!0}this.symbolName&&/^(x|y|width|height|r|start|end|innerR|anchorX|anchorY)/.test(c)&&(m||(this.symbolAttr(a),m=!0),j=!0);if(l&&/^(width|height|visibility|x|y|d|transform|cx|cy|r)$/.test(c))for(e=l.length;e--;)v(l[e], |
|||
c,c==="height"?s(d-(l[e].cutHeight||0),0):d);if((c==="width"||c==="height")&&h==="rect"&&d<0)d=0;this[c]=d;c==="text"?(d!==this.textStr&&delete this.bBox,this.textStr=d,this.added&&i.buildText(this)):j||v(g,c,d)}p&&this.updateTransform()}return q},addClass:function(a){var b=this.element,c=v(b,"class")||"";c.indexOf(a)===-1&&v(b,"class",c+" "+a);return this},symbolAttr:function(a){var b=this;n("x,y,r,start,end,width,height,innerR,anchorX,anchorY".split(","),function(c){b[c]=o(a[c],b[c])});b.attr({d:b.renderer.symbols[b.symbolName](b.x, |
|||
b.y,b.width,b.height,b)})},clip:function(a){return this.attr("clip-path",a?"url("+this.renderer.url+"#"+a.id+")":S)},crisp:function(a,b,c,d,e){var f,g={},h={},i,a=a||this.strokeWidth||this.attr&&this.attr("stroke-width")||0;i=t(a)%2/2;h.x=P(b||this.x||0)+i;h.y=P(c||this.y||0)+i;h.width=P((d||this.width||0)-2*i);h.height=P((e||this.height||0)-2*i);h.strokeWidth=a;for(f in h)this[f]!==h[f]&&(this[f]=g[f]=h[f]);return g},css:function(a){var b=this.element,c=a&&a.width&&b.nodeName.toLowerCase()==="text", |
|||
d,e="",f=function(a,b){return"-"+b.toLowerCase()};if(a&&a.color)a.fill=a.color;this.styles=a=r(this.styles,a);$&&c&&delete a.width;if(ta&&!Z)c&&delete a.width,K(this.element,a);else{for(d in a)e+=d.replace(/([A-Z])/g,f)+":"+a[d]+";";v(b,"style",e)}c&&this.added&&this.renderer.buildText(this);return this},on:function(a,b){var c=this,d=c.element;ib&&a==="click"?(d.ontouchstart=function(a){c.touchEventFired=Date.now();a.preventDefault();b.call(d,a)},d.onclick=function(a){(oa.indexOf("Android")===-1|| |
|||
Date.now()-(c.touchEventFired||0)>1100)&&b.call(d,a)}):d["on"+a]=b;return this},setRadialReference:function(a){this.element.radialReference=a;return this},translate:function(a,b){return this.attr({translateX:a,translateY:b})},invert:function(){this.inverted=!0;this.updateTransform();return this},htmlCss:function(a){var b=this.element;if(b=a&&b.tagName==="SPAN"&&a.width)delete a.width,this.textWidth=b,this.updateTransform();this.styles=r(this.styles,a);K(this.element,a);return this},htmlGetBBox:function(){var a= |
|||
this.element,b=this.bBox;if(!b){if(a.nodeName==="text")a.style.position="absolute";b=this.bBox={x:a.offsetLeft,y:a.offsetTop,width:a.offsetWidth,height:a.offsetHeight}}return b},htmlUpdateTransform:function(){if(this.added){var a=this.renderer,b=this.element,c=this.translateX||0,d=this.translateY||0,e=this.x||0,f=this.y||0,g=this.textAlign||"left",h={left:0,center:0.5,right:1}[g],i=g&&g!=="left",j=this.shadows;K(b,{marginLeft:c,marginTop:d});j&&n(j,function(a){K(a,{marginLeft:c+1,marginTop:d+1})}); |
|||
this.inverted&&n(b.childNodes,function(c){a.invertChild(c,b)});if(b.tagName==="SPAN"){var k,l,j=this.rotation,m;k=0;var p=1,q=0,ba;m=C(this.textWidth);var A=this.xCorr||0,L=this.yCorr||0,Sb=[j,g,b.innerHTML,this.textWidth].join(",");if(Sb!==this.cTT){u(j)&&(k=j*Ua,p=V(k),q=ca(k),this.setSpanRotation(j,q,p));k=o(this.elemWidth,b.offsetWidth);l=o(this.elemHeight,b.offsetHeight);if(k>m&&/[ \-]/.test(b.textContent||b.innerText))K(b,{width:m+"px",display:"block",whiteSpace:"normal"}),k=m;m=a.fontMetrics(b.style.fontSize).b; |
|||
A=p<0&&-k;L=q<0&&-l;ba=p*q<0;A+=q*m*(ba?1-h:h);L-=p*m*(j?ba?h:1-h:1);i&&(A-=k*h*(p<0?-1:1),j&&(L-=l*h*(q<0?-1:1)),K(b,{textAlign:g}));this.xCorr=A;this.yCorr=L}K(b,{left:e+A+"px",top:f+L+"px"});if(gb)l=b.offsetHeight;this.cTT=Sb}}else this.alignOnAdd=!0},setSpanRotation:function(a){var b={};b[ta?"-ms-transform":gb?"-webkit-transform":hb?"MozTransform":Nb?"-o-transform":""]=b.transform="rotate("+a+"deg)";K(this.element,b)},updateTransform:function(){var a=this.translateX||0,b=this.translateY||0,c= |
|||
this.scaleX,d=this.scaleY,e=this.inverted,f=this.rotation;e&&(a+=this.attr("width"),b+=this.attr("height"));a=["translate("+a+","+b+")"];e?a.push("rotate(90) scale(-1,1)"):f&&a.push("rotate("+f+" "+(this.x||0)+" "+(this.y||0)+")");(u(c)||u(d))&&a.push("scale("+o(c,1)+" "+o(d,1)+")");a.length&&v(this.element,"transform",a.join(" "))},toFront:function(){var a=this.element;a.parentNode.appendChild(a);return this},align:function(a,b,c){var d,e,f,g,h={};e=this.renderer;f=e.alignedObjects;if(a){if(this.alignOptions= |
|||
a,this.alignByTranslate=b,!c||ea(c))this.alignTo=d=c||"renderer",ga(f,this),f.push(this),c=null}else a=this.alignOptions,b=this.alignByTranslate,d=this.alignTo;c=o(c,e[d],e);d=a.align;e=a.verticalAlign;f=(c.x||0)+(a.x||0);g=(c.y||0)+(a.y||0);if(d==="right"||d==="center")f+=(c.width-(a.width||0))/{right:1,center:2}[d];h[b?"translateX":"x"]=t(f);if(e==="bottom"||e==="middle")g+=(c.height-(a.height||0))/({bottom:1,middle:2}[e]||1);h[b?"translateY":"y"]=t(g);this[this.placed?"animate":"attr"](h);this.placed= |
|||
!0;this.alignAttr=h;return this},getBBox:function(){var a=this.bBox,b=this.renderer,c,d=this.rotation;c=this.element;var e=this.styles,f=d*Ua;if(!a){if(c.namespaceURI===za||b.forExport){try{a=c.getBBox?r({},c.getBBox()):{width:c.offsetWidth,height:c.offsetHeight}}catch(g){}if(!a||a.width<0)a={width:0,height:0}}else a=this.htmlGetBBox();if(b.isSVG){b=a.width;c=a.height;if(ta&&e&&e.fontSize==="11px"&&c.toPrecision(3)==="22.7")a.height=c=14;if(d)a.width=N(c*ca(f))+N(b*V(f)),a.height=N(c*V(f))+N(b*ca(f))}this.bBox= |
|||
a}return a},show:function(){return this.attr({visibility:"visible"})},hide:function(){return this.attr({visibility:"hidden"})},fadeOut:function(a){var b=this;b.animate({opacity:0},{duration:a||150,complete:function(){b.hide()}})},add:function(a){var b=this.renderer,c=a||b,d=c.element||b.box,e=d.childNodes,f=this.element,g=v(f,"zIndex"),h;if(a)this.parentGroup=a;this.parentInverted=a&&a.inverted;this.textStr!==void 0&&b.buildText(this);if(g)c.handleZ=!0,g=C(g);if(c.handleZ)for(c=0;c<e.length;c++)if(a= |
|||
e[c],b=v(a,"zIndex"),a!==f&&(C(b)>g||!u(g)&&u(b))){d.insertBefore(f,a);h=!0;break}h||d.appendChild(f);this.added=!0;z(this,"add");return this},safeRemoveChild:function(a){var b=a.parentNode;b&&b.removeChild(a)},destroy:function(){var a=this,b=a.element||{},c=a.shadows,d=a.renderer.isSVG&&b.nodeName==="SPAN"&&b.parentNode,e,f;b.onclick=b.onmouseout=b.onmouseover=b.onmousemove=b.point=null;Wa(a);if(a.clipPath)a.clipPath=a.clipPath.destroy();if(a.stops){for(f=0;f<a.stops.length;f++)a.stops[f]=a.stops[f].destroy(); |
|||
a.stops=null}a.safeRemoveChild(b);for(c&&n(c,function(b){a.safeRemoveChild(b)});d&&d.childNodes.length===0;)b=d.parentNode,a.safeRemoveChild(d),d=b;a.alignTo&&ga(a.renderer.alignedObjects,a);for(e in a)delete a[e];return null},shadow:function(a,b,c){var d=[],e,f,g=this.element,h,i,j,k;if(a){i=o(a.width,3);j=(a.opacity||0.15)/i;k=this.parentInverted?"(-1,-1)":"("+o(a.offsetX,1)+", "+o(a.offsetY,1)+")";for(e=1;e<=i;e++){f=g.cloneNode(0);h=i*2+1-2*e;v(f,{isShadow:"true",stroke:a.color||"black","stroke-opacity":j* |
|||
e,"stroke-width":h,transform:"translate"+k,fill:S});if(c)v(f,"height",s(v(f,"height")-h,0)),f.cutHeight=h;b?b.element.appendChild(f):g.parentNode.insertBefore(f,g);d.push(f)}this.shadows=d}return this}};var Ha=function(){this.init.apply(this,arguments)};Ha.prototype={Element:wa,init:function(a,b,c,d){var e=location,f,g;f=this.createElement("svg").attr({version:"1.1"});g=f.element;a.appendChild(g);a.innerHTML.indexOf("xmlns")===-1&&v(g,"xmlns",za);this.isSVG=!0;this.box=g;this.boxWrapper=f;this.alignedObjects= |
|||
[];this.url=(hb||gb)&&y.getElementsByTagName("base").length?e.href.replace(/#.*?$/,"").replace(/([\('\)])/g,"\\$1").replace(/ /g,"%20"):"";this.createElement("desc").add().element.appendChild(y.createTextNode("Created with Highcharts 3.0.6"));this.defs=this.createElement("defs").add();this.forExport=d;this.gradients={};this.setSize(b,c,!1);var h;if(hb&&a.getBoundingClientRect)this.subPixelFix=b=function(){K(a,{left:0,top:0});h=a.getBoundingClientRect();K(a,{left:xa(h.left)-h.left+"px",top:xa(h.top)- |
|||
h.top+"px"})},b(),J(O,"resize",b)},isHidden:function(){return!this.boxWrapper.getBBox().width},destroy:function(){var a=this.defs;this.box=null;this.boxWrapper=this.boxWrapper.destroy();Ka(this.gradients||{});this.gradients=null;if(a)this.defs=a.destroy();this.subPixelFix&&aa(O,"resize",this.subPixelFix);return this.alignedObjects=null},createElement:function(a){var b=new this.Element;b.init(this,a);return b},draw:function(){},buildText:function(a){for(var b=a.element,c=this,d=c.forExport,e=o(a.textStr, |
|||
"").toString().replace(/<(b|strong)>/g,'<span style="font-weight:bold">').replace(/<(i|em)>/g,'<span style="font-style:italic">').replace(/<a/g,"<span").replace(/<\/(b|strong|i|em|a)>/g,"</span>").split(/<br.*?>/g),f=b.childNodes,g=/style="([^"]+)"/,h=/href="(http[^"]+)"/,i=v(b,"x"),j=a.styles,k=j&&j.width&&C(j.width),l=j&&j.lineHeight,m=f.length;m--;)b.removeChild(f[m]);k&&!a.added&&this.box.appendChild(b);e[e.length-1]===""&&e.pop();n(e,function(e,f){var m,o=0,e=e.replace(/<span/g,"|||<span").replace(/<\/span>/g, |
|||
"</span>|||");m=e.split("|||");n(m,function(e){if(e!==""||m.length===1){var p={},n=y.createElementNS(za,"tspan"),s;g.test(e)&&(s=e.match(g)[1].replace(/(;| |^)color([ :])/,"$1fill$2"),v(n,"style",s));h.test(e)&&!d&&(v(n,"onclick",'location.href="'+e.match(h)[1]+'"'),K(n,{cursor:"pointer"}));e=(e.replace(/<(.|\n)*?>/g,"")||" ").replace(/</g,"<").replace(/>/g,">");if(e!==" "&&(n.appendChild(y.createTextNode(e)),o?p.dx=0:p.x=i,v(n,p),!o&&f&&(!Z&&d&&K(n,{display:"block"}),v(n,"dy",l||c.fontMetrics(/px$/.test(n.style.fontSize)? |
|||
n.style.fontSize:j.fontSize).h,gb&&n.offsetHeight)),b.appendChild(n),o++,k))for(var e=e.replace(/([^\^])-/g,"$1- ").split(" "),u,t,p=a._clipHeight,E=[],w=C(l||16),B=1;e.length||E.length;)delete a.bBox,u=a.getBBox(),t=u.width,u=t>k,!u||e.length===1?(e=E,E=[],e.length&&(B++,p&&B*w>p?(e=["..."],a.attr("title",a.textStr)):(n=y.createElementNS(za,"tspan"),v(n,{dy:w,x:i}),s&&v(n,"style",s),b.appendChild(n),t>k&&(k=t)))):(n.removeChild(n.firstChild),E.unshift(e.pop())),e.length&&n.appendChild(y.createTextNode(e.join(" ").replace(/- /g, |
|||
"-")))}})})},button:function(a,b,c,d,e,f,g,h){var i=this.label(a,b,c,null,null,null,null,null,"button"),j=0,k,l,m,p,q,n,a={x1:0,y1:0,x2:0,y2:1},e=x({"stroke-width":1,stroke:"#CCCCCC",fill:{linearGradient:a,stops:[[0,"#FEFEFE"],[1,"#F6F6F6"]]},r:2,padding:5,style:{color:"black"}},e);m=e.style;delete e.style;f=x(e,{stroke:"#68A",fill:{linearGradient:a,stops:[[0,"#FFF"],[1,"#ACF"]]}},f);p=f.style;delete f.style;g=x(e,{stroke:"#68A",fill:{linearGradient:a,stops:[[0,"#9BD"],[1,"#CDF"]]}},g);q=g.style; |
|||
delete g.style;h=x(e,{style:{color:"#CCC"}},h);n=h.style;delete h.style;J(i.element,ta?"mouseover":"mouseenter",function(){j!==3&&i.attr(f).css(p)});J(i.element,ta?"mouseout":"mouseleave",function(){j!==3&&(k=[e,f,g][j],l=[m,p,q][j],i.attr(k).css(l))});i.setState=function(a){(i.state=j=a)?a===2?i.attr(g).css(q):a===3&&i.attr(h).css(n):i.attr(e).css(m)};return i.on("click",function(){j!==3&&d.call(i)}).attr(e).css(r({cursor:"default"},m))},crispLine:function(a,b){a[1]===a[4]&&(a[1]=a[4]=t(a[1])-b% |
|||
2/2);a[2]===a[5]&&(a[2]=a[5]=t(a[2])+b%2/2);return a},path:function(a){var b={fill:S};Ia(a)?b.d=a:T(a)&&r(b,a);return this.createElement("path").attr(b)},circle:function(a,b,c){a=T(a)?a:{x:a,y:b,r:c};return this.createElement("circle").attr(a)},arc:function(a,b,c,d,e,f){if(T(a))b=a.y,c=a.r,d=a.innerR,e=a.start,f=a.end,a=a.x;a=this.symbol("arc",a||0,b||0,c||0,c||0,{innerR:d||0,start:e||0,end:f||0});a.r=c;return a},rect:function(a,b,c,d,e,f){e=T(a)?a.r:e;e=this.createElement("rect").attr({rx:e,ry:e, |
|||
fill:S});return e.attr(T(a)?a:e.crisp(f,a,b,s(c,0),s(d,0)))},setSize:function(a,b,c){var d=this.alignedObjects,e=d.length;this.width=a;this.height=b;for(this.boxWrapper[o(c,!0)?"animate":"attr"]({width:a,height:b});e--;)d[e].align()},g:function(a){var b=this.createElement("g");return u(a)?b.attr({"class":"highcharts-"+a}):b},image:function(a,b,c,d,e){var f={preserveAspectRatio:S};arguments.length>1&&r(f,{x:b,y:c,width:d,height:e});f=this.createElement("image").attr(f);f.element.setAttributeNS?f.element.setAttributeNS("http://www.w3.org/1999/xlink", |
|||
"href",a):f.element.setAttribute("hc-svg-href",a);return f},symbol:function(a,b,c,d,e,f){var g,h=this.symbols[a],h=h&&h(t(b),t(c),d,e,f),i=/^url\((.*?)\)$/,j,k;if(h)g=this.path(h),r(g,{symbolName:a,x:b,y:c,width:d,height:e}),f&&r(g,f);else if(i.test(a))k=function(a,b){a.element&&(a.attr({width:b[0],height:b[1]}),a.alignByTranslate||a.translate(t((d-b[0])/2),t((e-b[1])/2)))},j=a.match(i)[1],a=Pb[j],g=this.image(j).attr({x:b,y:c}),g.isImg=!0,a?k(g,a):(g.attr({width:0,height:0}),U("img",{onload:function(){k(g, |
|||
Pb[j]=[this.width,this.height])},src:j}));return g},symbols:{circle:function(a,b,c,d){var e=0.166*c;return["M",a+c/2,b,"C",a+c+e,b,a+c+e,b+d,a+c/2,b+d,"C",a-e,b+d,a-e,b,a+c/2,b,"Z"]},square:function(a,b,c,d){return["M",a,b,"L",a+c,b,a+c,b+d,a,b+d,"Z"]},triangle:function(a,b,c,d){return["M",a+c/2,b,"L",a+c,b+d,a,b+d,"Z"]},"triangle-down":function(a,b,c,d){return["M",a,b,"L",a+c,b,a+c/2,b+d,"Z"]},diamond:function(a,b,c,d){return["M",a+c/2,b,"L",a+c,b+d/2,a+c/2,b+d,a,b+d/2,"Z"]},arc:function(a,b,c,d, |
|||
e){var f=e.start,c=e.r||c||d,g=e.end-0.001,d=e.innerR,h=e.open,i=V(f),j=ca(f),k=V(g),g=ca(g),e=e.end-f<ya?0:1;return["M",a+c*i,b+c*j,"A",c,c,0,e,1,a+c*k,b+c*g,h?"M":"L",a+d*k,b+d*g,"A",d,d,0,e,0,a+d*i,b+d*j,h?"":"Z"]}},clipRect:function(a,b,c,d){var e="highcharts-"+zb++,f=this.createElement("clipPath").attr({id:e}).add(this.defs),a=this.rect(a,b,c,d,0).add(f);a.id=e;a.clipPath=f;return a},color:function(a,b,c){var d=this,e,f=/^rgba/,g,h,i,j,k,l,m,p=[];a&&a.linearGradient?g="linearGradient":a&&a.radialGradient&& |
|||
(g="radialGradient");if(g){c=a[g];h=d.gradients;j=a.stops;b=b.radialReference;Ia(c)&&(a[g]=c={x1:c[0],y1:c[1],x2:c[2],y2:c[3],gradientUnits:"userSpaceOnUse"});g==="radialGradient"&&b&&!u(c.gradientUnits)&&(c=x(c,{cx:b[0]-b[2]/2+c.cx*b[2],cy:b[1]-b[2]/2+c.cy*b[2],r:c.r*b[2],gradientUnits:"userSpaceOnUse"}));for(m in c)m!=="id"&&p.push(m,c[m]);for(m in j)p.push(j[m]);p=p.join(",");h[p]?a=h[p].id:(c.id=a="highcharts-"+zb++,h[p]=i=d.createElement(g).attr(c).add(d.defs),i.stops=[],n(j,function(a){f.test(a[1])? |
|||
(e=ra(a[1]),k=e.get("rgb"),l=e.get("a")):(k=a[1],l=1);a=d.createElement("stop").attr({offset:a[0],"stop-color":k,"stop-opacity":l}).add(i);i.stops.push(a)}));return"url("+d.url+"#"+a+")"}else return f.test(a)?(e=ra(a),v(b,c+"-opacity",e.get("a")),e.get("rgb")):(b.removeAttribute(c+"-opacity"),a)},text:function(a,b,c,d){var e=M.chart.style,f=$||!Z&&this.forExport;if(d&&!this.forExport)return this.html(a,b,c);b=t(o(b,0));c=t(o(c,0));a=this.createElement("text").attr({x:b,y:c,text:a}).css({fontFamily:e.fontFamily, |
|||
fontSize:e.fontSize});f&&a.css({position:"absolute"});a.x=b;a.y=c;return a},html:function(a,b,c){var d=M.chart.style,e=this.createElement("span"),f=e.attrSetters,g=e.element,h=e.renderer;f.text=function(a){a!==g.innerHTML&&delete this.bBox;g.innerHTML=a;return!1};f.x=f.y=f.align=function(a,b){b==="align"&&(b="textAlign");e[b]=a;e.htmlUpdateTransform();return!1};e.attr({text:a,x:t(b),y:t(c)}).css({position:"absolute",whiteSpace:"nowrap",fontFamily:d.fontFamily,fontSize:d.fontSize});e.css=e.htmlCss; |
|||
if(h.isSVG)e.add=function(a){var b,c=h.box.parentNode,d=[];if(a){if(b=a.div,!b){for(;a;)d.push(a),a=a.parentGroup;n(d.reverse(),function(a){var d;b=a.div=a.div||U(Ea,{className:v(a.element,"class")},{position:"absolute",left:(a.translateX||0)+"px",top:(a.translateY||0)+"px"},b||c);d=b.style;r(a.attrSetters,{translateX:function(a){d.left=a+"px"},translateY:function(a){d.top=a+"px"},visibility:function(a,b){d[b]=a}})})}}else b=c;b.appendChild(g);e.added=!0;e.alignOnAdd&&e.htmlUpdateTransform();return e}; |
|||
return e},fontMetrics:function(a){var a=C(a||11),a=a<24?a+4:t(a*1.2),b=t(a*0.8);return{h:a,b:b}},label:function(a,b,c,d,e,f,g,h,i){function j(){var a,b;a=o.element.style;L=(Oa===void 0||la===void 0||q.styles.textAlign)&&o.getBBox();q.width=(Oa||L.width||0)+2*da+kb;q.height=(la||L.height||0)+2*da;v=da+p.fontMetrics(a&&a.fontSize).b;if(C){if(!A)a=t(-s*da),b=h?-v:0,q.box=A=d?p.symbol(d,a,b,q.width,q.height):p.rect(a,b,q.width,q.height,0,lb[Rb]),A.add(q);A.isImg||A.attr(x({width:q.width,height:q.height}, |
|||
lb));lb=null}}function k(){var a=q.styles,a=a&&a.textAlign,b=kb+da*(1-s),c;c=h?0:v;if(u(Oa)&&(a==="center"||a==="right"))b+={center:0.5,right:1}[a]*(Oa-L.width);(b!==o.x||c!==o.y)&&o.attr({x:b,y:c});o.x=b;o.y=c}function l(a,b){A?A.attr(a,b):lb[a]=b}function m(){o.add(q);q.attr({text:a,x:b,y:c});A&&u(e)&&q.attr({anchorX:e,anchorY:f})}var p=this,q=p.g(i),o=p.text("",0,0,g).attr({zIndex:1}),A,L,s=0,da=3,kb=0,Oa,la,E,H,B=0,lb={},v,g=q.attrSetters,C;J(q,"add",m);g.width=function(a){Oa=a;return!1};g.height= |
|||
function(a){la=a;return!1};g.padding=function(a){u(a)&&a!==da&&(da=a,k());return!1};g.paddingLeft=function(a){u(a)&&a!==kb&&(kb=a,k());return!1};g.align=function(a){s={left:0,center:0.5,right:1}[a];return!1};g.text=function(a,b){o.attr(b,a);j();k();return!1};g[Rb]=function(a,b){C=!0;B=a%2/2;l(b,a);return!1};g.stroke=g.fill=g.r=function(a,b){b==="fill"&&(C=!0);l(b,a);return!1};g.anchorX=function(a,b){e=a;l(b,a+B-E);return!1};g.anchorY=function(a,b){f=a;l(b,a-H);return!1};g.x=function(a){q.x=a;a-=s* |
|||
((Oa||L.width)+da);E=t(a);q.attr("translateX",E);return!1};g.y=function(a){H=q.y=t(a);q.attr("translateY",H);return!1};var y=q.css;return r(q,{css:function(a){if(a){var b={},a=x(a);n("fontSize,fontWeight,fontFamily,color,lineHeight,width,textDecoration,textShadow".split(","),function(c){a[c]!==w&&(b[c]=a[c],delete a[c])});o.css(b)}return y.call(q,a)},getBBox:function(){return{width:L.width+2*da,height:L.height+2*da,x:L.x-da,y:L.y-da}},shadow:function(a){A&&A.shadow(a);return q},destroy:function(){aa(q, |
|||
"add",m);aa(q.element,"mouseenter");aa(q.element,"mouseleave");o&&(o=o.destroy());A&&(A=A.destroy());wa.prototype.destroy.call(q);q=p=j=k=l=m=null}})}};Va=Ha;var F;if(!Z&&!$){Highcharts.VMLElement=F={init:function(a,b){var c=["<",b,' filled="f" stroked="f"'],d=["position: ","absolute",";"],e=b===Ea;(b==="shape"||e)&&d.push("left:0;top:0;width:1px;height:1px;");d.push("visibility: ",e?"hidden":"visible");c.push(' style="',d.join(""),'"/>');if(b)c=e||b==="span"||b==="img"?c.join(""):a.prepVML(c),this.element= |
|||
U(c);this.renderer=a;this.attrSetters={}},add:function(a){var b=this.renderer,c=this.element,d=b.box,d=a?a.element||a:d;a&&a.inverted&&b.invertChild(c,d);d.appendChild(c);this.added=!0;this.alignOnAdd&&!this.deferUpdateTransform&&this.updateTransform();z(this,"add");return this},updateTransform:wa.prototype.htmlUpdateTransform,setSpanRotation:function(a,b,c){K(this.element,{filter:a?["progid:DXImageTransform.Microsoft.Matrix(M11=",c,", M12=",-b,", M21=",b,", M22=",c,", sizingMethod='auto expand')"].join(""): |
|||
S})},pathToVML:function(a){for(var b=a.length,c=[],d;b--;)if(sa(a[b]))c[b]=t(a[b]*10)-5;else if(a[b]==="Z")c[b]="x";else if(c[b]=a[b],a.isArc&&(a[b]==="wa"||a[b]==="at"))d=a[b]==="wa"?1:-1,c[b+5]===c[b+7]&&(c[b+7]-=d),c[b+6]===c[b+8]&&(c[b+8]-=d);return c.join(" ")||"x"},attr:function(a,b){var c,d,e,f=this.element||{},g=f.style,h=f.nodeName,i=this.renderer,j=this.symbolName,k,l=this.shadows,m,p=this.attrSetters,q=this;ea(a)&&u(b)&&(c=a,a={},a[c]=b);if(ea(a))c=a,q=c==="strokeWidth"||c==="stroke-width"? |
|||
this.strokeweight:this[c];else for(c in a)if(d=a[c],m=!1,e=p[c]&&p[c].call(this,d,c),e!==!1&&d!==null){e!==w&&(d=e);if(j&&/^(x|y|r|start|end|width|height|innerR|anchorX|anchorY)/.test(c))k||(this.symbolAttr(a),k=!0),m=!0;else if(c==="d"){d=d||[];this.d=d.join(" ");f.path=d=this.pathToVML(d);if(l)for(e=l.length;e--;)l[e].path=l[e].cutOff?this.cutOffPath(d,l[e].cutOff):d;m=!0}else if(c==="visibility"){if(l)for(e=l.length;e--;)l[e].style[c]=d;h==="DIV"&&(d=d==="hidden"?"-999em":0,fb||(g[c]=d?"visible": |
|||
"hidden"),c="top");g[c]=d;m=!0}else if(c==="zIndex")d&&(g[c]=d),m=!0;else if(qa(c,["x","y","width","height"])!==-1)this[c]=d,c==="x"||c==="y"?c={x:"left",y:"top"}[c]:d=s(0,d),this.updateClipping?(this[c]=d,this.updateClipping()):g[c]=d,m=!0;else if(c==="class"&&h==="DIV")f.className=d;else if(c==="stroke")d=i.color(d,f,c),c="strokecolor";else if(c==="stroke-width"||c==="strokeWidth")f.stroked=d?!0:!1,c="strokeweight",this[c]=d,sa(d)&&(d+="px");else if(c==="dashstyle")(f.getElementsByTagName("stroke")[0]|| |
|||
U(i.prepVML(["<stroke/>"]),null,null,f))[c]=d||"solid",this.dashstyle=d,m=!0;else if(c==="fill")if(h==="SPAN")g.color=d;else{if(h!=="IMG")f.filled=d!==S?!0:!1,d=i.color(d,f,c,this),c="fillcolor"}else if(c==="opacity")m=!0;else if(h==="shape"&&c==="rotation")this[c]=f.style[c]=d,f.style.left=-t(ca(d*Ua)+1)+"px",f.style.top=t(V(d*Ua))+"px";else if(c==="translateX"||c==="translateY"||c==="rotation")this[c]=d,this.updateTransform(),m=!0;else if(c==="text")this.bBox=null,f.innerHTML=d,m=!0;m||(fb?f[c]= |
|||
d:v(f,c,d))}return q},clip:function(a){var b=this,c;a?(c=a.members,ga(c,b),c.push(b),b.destroyClip=function(){ga(c,b)},a=a.getCSS(b)):(b.destroyClip&&b.destroyClip(),a={clip:fb?"inherit":"rect(auto)"});return b.css(a)},css:wa.prototype.htmlCss,safeRemoveChild:function(a){a.parentNode&&Ta(a)},destroy:function(){this.destroyClip&&this.destroyClip();return wa.prototype.destroy.apply(this)},on:function(a,b){this.element["on"+a]=function(){var a=O.event;a.target=a.srcElement;b(a)};return this},cutOffPath:function(a, |
|||
b){var c,a=a.split(/[ ,]/);c=a.length;if(c===9||c===11)a[c-4]=a[c-2]=C(a[c-2])-10*b;return a.join(" ")},shadow:function(a,b,c){var d=[],e,f=this.element,g=this.renderer,h,i=f.style,j,k=f.path,l,m,p,q;k&&typeof k.value!=="string"&&(k="x");m=k;if(a){p=o(a.width,3);q=(a.opacity||0.15)/p;for(e=1;e<=3;e++){l=p*2+1-2*e;c&&(m=this.cutOffPath(k.value,l+0.5));j=['<shape isShadow="true" strokeweight="',l,'" filled="false" path="',m,'" coordsize="10 10" style="',f.style.cssText,'" />'];h=U(g.prepVML(j),null, |
|||
{left:C(i.left)+o(a.offsetX,1),top:C(i.top)+o(a.offsetY,1)});if(c)h.cutOff=l+1;j=['<stroke color="',a.color||"black",'" opacity="',q*e,'"/>'];U(g.prepVML(j),null,null,h);b?b.element.appendChild(h):f.parentNode.insertBefore(h,f);d.push(h)}this.shadows=d}return this}};F=ha(wa,F);var ma={Element:F,isIE8:oa.indexOf("MSIE 8.0")>-1,init:function(a,b,c){var d,e;this.alignedObjects=[];d=this.createElement(Ea);e=d.element;e.style.position="relative";a.appendChild(d.element);this.isVML=!0;this.box=e;this.boxWrapper= |
|||
d;this.setSize(b,c,!1);y.namespaces.hcv||(y.namespaces.add("hcv","urn:schemas-microsoft-com:vml"),(y.styleSheets.length?y.styleSheets[0]:y.createStyleSheet()).cssText+="hcv\\:fill, hcv\\:path, hcv\\:shape, hcv\\:stroke{ behavior:url(#default#VML); display: inline-block; } ")},isHidden:function(){return!this.box.offsetWidth},clipRect:function(a,b,c,d){var e=this.createElement(),f=T(a);return r(e,{members:[],left:(f?a.x:a)+1,top:(f?a.y:b)+1,width:(f?a.width:c)-1,height:(f?a.height:d)-1,getCSS:function(a){var b= |
|||
a.element,c=b.nodeName,a=a.inverted,d=this.top-(c==="shape"?b.offsetTop:0),e=this.left,b=e+this.width,f=d+this.height,d={clip:"rect("+t(a?e:d)+"px,"+t(a?f:b)+"px,"+t(a?b:f)+"px,"+t(a?d:e)+"px)"};!a&&fb&&c==="DIV"&&r(d,{width:b+"px",height:f+"px"});return d},updateClipping:function(){n(e.members,function(a){a.css(e.getCSS(a))})}})},color:function(a,b,c,d){var e=this,f,g=/^rgba/,h,i,j=S;a&&a.linearGradient?i="gradient":a&&a.radialGradient&&(i="pattern");if(i){var k,l,m=a.linearGradient||a.radialGradient, |
|||
p,q,o,A,L,s="",a=a.stops,u,t=[],w=function(){h=['<fill colors="'+t.join(",")+'" opacity="',o,'" o:opacity2="',q,'" type="',i,'" ',s,'focus="100%" method="any" />'];U(e.prepVML(h),null,null,b)};p=a[0];u=a[a.length-1];p[0]>0&&a.unshift([0,p[1]]);u[0]<1&&a.push([1,u[1]]);n(a,function(a,b){g.test(a[1])?(f=ra(a[1]),k=f.get("rgb"),l=f.get("a")):(k=a[1],l=1);t.push(a[0]*100+"% "+k);b?(o=l,A=k):(q=l,L=k)});if(c==="fill")if(i==="gradient")c=m.x1||m[0]||0,a=m.y1||m[1]||0,p=m.x2||m[2]||0,m=m.y2||m[3]||0,s='angle="'+ |
|||
(90-R.atan((m-a)/(p-c))*180/ya)+'"',w();else{var j=m.r,r=j*2,E=j*2,H=m.cx,B=m.cy,x=b.radialReference,v,j=function(){x&&(v=d.getBBox(),H+=(x[0]-v.x)/v.width-0.5,B+=(x[1]-v.y)/v.height-0.5,r*=x[2]/v.width,E*=x[2]/v.height);s='src="'+M.global.VMLRadialGradientURL+'" size="'+r+","+E+'" origin="0.5,0.5" position="'+H+","+B+'" color2="'+L+'" ';w()};d.added?j():J(d,"add",j);j=A}else j=k}else if(g.test(a)&&b.tagName!=="IMG")f=ra(a),h=["<",c,' opacity="',f.get("a"),'"/>'],U(this.prepVML(h),null,null,b),j= |
|||
f.get("rgb");else{j=b.getElementsByTagName(c);if(j.length)j[0].opacity=1,j[0].type="solid";j=a}return j},prepVML:function(a){var b=this.isIE8,a=a.join("");b?(a=a.replace("/>",' xmlns="urn:schemas-microsoft-com:vml" />'),a=a.indexOf('style="')===-1?a.replace("/>",' style="display:inline-block;behavior:url(#default#VML);" />'):a.replace('style="','style="display:inline-block;behavior:url(#default#VML);')):a=a.replace("<","<hcv:");return a},text:Ha.prototype.html,path:function(a){var b={coordsize:"10 10"}; |
|||
Ia(a)?b.d=a:T(a)&&r(b,a);return this.createElement("shape").attr(b)},circle:function(a,b,c){var d=this.symbol("circle");if(T(a))c=a.r,b=a.y,a=a.x;d.isCircle=!0;d.r=c;return d.attr({x:a,y:b})},g:function(a){var b;a&&(b={className:"highcharts-"+a,"class":"highcharts-"+a});return this.createElement(Ea).attr(b)},image:function(a,b,c,d,e){var f=this.createElement("img").attr({src:a});arguments.length>1&&f.attr({x:b,y:c,width:d,height:e});return f},rect:function(a,b,c,d,e,f){var g=this.symbol("rect");g.r= |
|||
T(a)?a.r:e;return g.attr(T(a)?a:g.crisp(f,a,b,s(c,0),s(d,0)))},invertChild:function(a,b){var c=b.style;K(a,{flip:"x",left:C(c.width)-1,top:C(c.height)-1,rotation:-90})},symbols:{arc:function(a,b,c,d,e){var f=e.start,g=e.end,h=e.r||c||d,c=e.innerR,d=V(f),i=ca(f),j=V(g),k=ca(g);if(g-f===0)return["x"];f=["wa",a-h,b-h,a+h,b+h,a+h*d,b+h*i,a+h*j,b+h*k];e.open&&!c&&f.push("e","M",a,b);f.push("at",a-c,b-c,a+c,b+c,a+c*j,b+c*k,a+c*d,b+c*i,"x","e");f.isArc=!0;return f},circle:function(a,b,c,d,e){e&&(c=d=2*e.r); |
|||
e&&e.isCircle&&(a-=c/2,b-=d/2);return["wa",a,b,a+c,b+d,a+c,b+d/2,a+c,b+d/2,"e"]},rect:function(a,b,c,d,e){var f=a+c,g=b+d,h;!u(e)||!e.r?f=Ha.prototype.symbols.square.apply(0,arguments):(h=I(e.r,c,d),f=["M",a+h,b,"L",f-h,b,"wa",f-2*h,b,f,b+2*h,f-h,b,f,b+h,"L",f,g-h,"wa",f-2*h,g-2*h,f,g,f,g-h,f-h,g,"L",a+h,g,"wa",a,g-2*h,a+2*h,g,a+h,g,a,g-h,"L",a,b+h,"wa",a,b,a+2*h,b+2*h,a,b+h,a+h,b,"x","e"]);return f}}};Highcharts.VMLRenderer=F=function(){this.init.apply(this,arguments)};F.prototype=x(Ha.prototype, |
|||
ma);Va=F}var Tb;if($)Highcharts.CanVGRenderer=F=function(){za="http://www.w3.org/1999/xhtml"},F.prototype.symbols={},Tb=function(){function a(){var a=b.length,d;for(d=0;d<a;d++)b[d]();b=[]}var b=[];return{push:function(c,d){b.length===0&&Vb(d,a);b.push(c)}}}(),Va=F;Ma.prototype={addLabel:function(){var a=this.axis,b=a.options,c=a.chart,d=a.horiz,e=a.categories,f=a.series[0]&&a.series[0].names,g=this.pos,h=b.labels,i=a.tickPositions,d=d&&e&&!h.step&&!h.staggerLines&&!h.rotation&&c.plotWidth/i.length|| |
|||
!d&&(c.margin[3]||c.chartWidth*0.33),j=g===i[0],k=g===i[i.length-1],l,f=e?o(e[g],f&&f[g],g):g,e=this.label,m=i.info;a.isDatetimeAxis&&m&&(l=b.dateTimeLabelFormats[m.higherRanks[g]||m.unitName]);this.isFirst=j;this.isLast=k;b=a.labelFormatter.call({axis:a,chart:c,isFirst:j,isLast:k,dateTimeLabelFormat:l,value:a.isLog?ia(fa(f)):f});g=d&&{width:s(1,t(d-2*(h.padding||10)))+"px"};g=r(g,h.style);if(u(e))e&&e.attr({text:b}).css(g);else{l={align:a.labelAlign};if(sa(h.rotation))l.rotation=h.rotation;if(d&& |
|||
h.ellipsis)l._clipHeight=a.len/i.length;this.label=u(b)&&h.enabled?c.renderer.text(b,0,0,h.useHTML).attr(l).css(g).add(a.labelGroup):null}},getLabelSize:function(){var a=this.label,b=this.axis;return a?(this.labelBBox=a.getBBox())[b.horiz?"height":"width"]:0},getLabelSides:function(){var a=this.axis,b=this.labelBBox.width,a=b*{left:0,center:0.5,right:1}[a.labelAlign]-a.options.labels.x;return[-a,b-a]},handleOverflow:function(a,b){var c=!0,d=this.axis,e=d.chart,f=this.isFirst,g=this.isLast,h=b.x,i= |
|||
d.reversed,j=d.tickPositions;if(f||g){var k=this.getLabelSides(),l=k[0],k=k[1],e=e.plotLeft,m=e+d.len,j=(d=d.ticks[j[a+(f?1:-1)]])&&d.label.xy&&d.label.xy.x+d.getLabelSides()[f?0:1];f&&!i||g&&i?h+l<e&&(h=e-l,d&&h+k>j&&(c=!1)):h+k>m&&(h=m-k,d&&h+l<j&&(c=!1));b.x=h}return c},getPosition:function(a,b,c,d){var e=this.axis,f=e.chart,g=d&&f.oldChartHeight||f.chartHeight;return{x:a?e.translate(b+c,null,null,d)+e.transB:e.left+e.offset+(e.opposite?(d&&f.oldChartWidth||f.chartWidth)-e.right-e.left:0),y:a? |
|||
g-e.bottom+e.offset-(e.opposite?e.height:0):g-e.translate(b+c,null,null,d)-e.transB}},getLabelPosition:function(a,b,c,d,e,f,g,h){var i=this.axis,j=i.transA,k=i.reversed,l=i.staggerLines,m=i.chart.renderer.fontMetrics(e.style.fontSize).b,p=e.rotation,a=a+e.x-(f&&d?f*j*(k?-1:1):0),b=b+e.y-(f&&!d?f*j*(k?1:-1):0);p&&i.side===2&&(b-=m-m*V(p*Ua));!u(e.y)&&!p&&(b+=m-c.getBBox().height/2);l&&(b+=g/(h||1)%l*(i.labelOffset/l));return{x:a,y:b}},getMarkPath:function(a,b,c,d,e,f){return f.crispLine(["M",a,b,"L", |
|||
a+(e?0:-c),b+(e?c:0)],d)},render:function(a,b,c){var d=this.axis,e=d.options,f=d.chart.renderer,g=d.horiz,h=this.type,i=this.label,j=this.pos,k=e.labels,l=this.gridLine,m=h?h+"Grid":"grid",p=h?h+"Tick":"tick",q=e[m+"LineWidth"],n=e[m+"LineColor"],A=e[m+"LineDashStyle"],s=e[p+"Length"],m=e[p+"Width"]||0,u=e[p+"Color"],t=e[p+"Position"],p=this.mark,r=k.step,v=!0,x=d.tickmarkOffset,E=this.getPosition(g,j,x,b),H=E.x,E=E.y,B=g&&H===d.pos+d.len||!g&&E===d.pos?-1:1,C=d.staggerLines;this.isActive=!0;if(q){j= |
|||
d.getPlotLinePath(j+x,q*B,b,!0);if(l===w){l={stroke:n,"stroke-width":q};if(A)l.dashstyle=A;if(!h)l.zIndex=1;if(b)l.opacity=0;this.gridLine=l=q?f.path(j).attr(l).add(d.gridGroup):null}if(!b&&l&&j)l[this.isNew?"attr":"animate"]({d:j,opacity:c})}if(m&&s)t==="inside"&&(s=-s),d.opposite&&(s=-s),b=this.getMarkPath(H,E,s,m*B,g,f),p?p.animate({d:b,opacity:c}):this.mark=f.path(b).attr({stroke:u,"stroke-width":m,opacity:c}).add(d.axisGroup);if(i&&!isNaN(H))i.xy=E=this.getLabelPosition(H,E,i,g,k,x,a,r),this.isFirst&& |
|||
!this.isLast&&!o(e.showFirstLabel,1)||this.isLast&&!this.isFirst&&!o(e.showLastLabel,1)?v=!1:!C&&g&&k.overflow==="justify"&&!this.handleOverflow(a,E)&&(v=!1),r&&a%r&&(v=!1),v&&!isNaN(E.y)?(E.opacity=c,i[this.isNew?"attr":"animate"](E),this.isNew=!1):i.attr("y",-9999)},destroy:function(){Ka(this,this.axis)}};vb.prototype={render:function(){var a=this,b=a.axis,c=b.horiz,d=(b.pointRange||0)/2,e=a.options,f=e.label,g=a.label,h=e.width,i=e.to,j=e.from,k=u(j)&&u(i),l=e.value,m=e.dashStyle,p=a.svgElem,q= |
|||
[],n,A=e.color,L=e.zIndex,t=e.events,w=b.chart.renderer;b.isLog&&(j=na(j),i=na(i),l=na(l));if(h){if(q=b.getPlotLinePath(l,h),d={stroke:A,"stroke-width":h},m)d.dashstyle=m}else if(k){if(j=s(j,b.min-d),i=I(i,b.max+d),q=b.getPlotBandPath(j,i,e),d={fill:A},e.borderWidth)d.stroke=e.borderColor,d["stroke-width"]=e.borderWidth}else return;if(u(L))d.zIndex=L;if(p)q?p.animate({d:q},null,p.onGetPath):(p.hide(),p.onGetPath=function(){p.show()});else if(q&&q.length&&(a.svgElem=p=w.path(q).attr(d).add(),t))for(n in e= |
|||
function(b){p.on(b,function(c){t[b].apply(a,[c])})},t)e(n);if(f&&u(f.text)&&q&&q.length&&b.width>0&&b.height>0){f=x({align:c&&k&&"center",x:c?!k&&4:10,verticalAlign:!c&&k&&"middle",y:c?k?16:10:k?6:-4,rotation:c&&!k&&90},f);if(!g)a.label=g=w.text(f.text,0,0,f.useHTML).attr({align:f.textAlign||f.align,rotation:f.rotation,zIndex:L}).css(f.style).add();b=[q[1],q[4],o(q[6],q[1])];q=[q[2],q[5],o(q[7],q[2])];c=Ja(b);k=Ja(q);g.align(f,!1,{x:c,y:k,width:va(b)-c,height:va(q)-k});g.show()}else g&&g.hide();return a}, |
|||
destroy:function(){ga(this.axis.plotLinesAndBands,this);delete this.axis;Ka(this)}};Mb.prototype={destroy:function(){Ka(this,this.axis)},render:function(a){var b=this.options,c=b.format,c=c?Ca(c,this):b.formatter.call(this);this.label?this.label.attr({text:c,visibility:"hidden"}):this.label=this.axis.chart.renderer.text(c,0,0,b.useHTML).css(b.style).attr({align:this.textAlign,rotation:b.rotation,visibility:"hidden"}).add(a)},setOffset:function(a,b){var c=this.axis,d=c.chart,e=d.inverted,f=this.isNegative, |
|||
g=c.translate(this.percent?100:this.total,0,0,0,1),c=c.translate(0),c=N(g-c),h=d.xAxis[0].translate(this.x)+a,i=d.plotHeight,f={x:e?f?g:g-c:h,y:e?i-h-b:f?i-g-c:i-g,width:e?c:b,height:e?b:c};if(e=this.label)e.align(this.alignOptions,null,f),f=e.alignAttr,e.attr({visibility:this.options.crop===!1||d.isInsidePlot(f.x,f.y)?Z?"inherit":"visible":"hidden"})}};db.prototype={defaultOptions:{dateTimeLabelFormats:{millisecond:"%H:%M:%S.%L",second:"%H:%M:%S",minute:"%H:%M",hour:"%H:%M",day:"%e. %b",week:"%e. %b", |
|||
month:"%b '%y",year:"%Y"},endOnTick:!1,gridLineColor:"#C0C0C0",labels:G,lineColor:"#C0D0E0",lineWidth:1,minPadding:0.01,maxPadding:0.01,minorGridLineColor:"#E0E0E0",minorGridLineWidth:1,minorTickColor:"#A0A0A0",minorTickLength:2,minorTickPosition:"outside",startOfWeek:1,startOnTick:!1,tickColor:"#C0D0E0",tickLength:5,tickmarkPlacement:"between",tickPixelInterval:100,tickPosition:"outside",tickWidth:1,title:{align:"middle",style:{color:"#4d759e",fontWeight:"bold"}},type:"linear"},defaultYAxisOptions:{endOnTick:!0, |
|||
gridLineWidth:1,tickPixelInterval:72,showLastLabel:!0,labels:{x:-8,y:3},lineWidth:0,maxPadding:0.05,minPadding:0.05,startOnTick:!0,tickWidth:0,title:{rotation:270,text:"Values"},stackLabels:{enabled:!1,formatter:function(){return Aa(this.total,-1)},style:G.style}},defaultLeftAxisOptions:{labels:{x:-8,y:null},title:{rotation:270}},defaultRightAxisOptions:{labels:{x:8,y:null},title:{rotation:90}},defaultBottomAxisOptions:{labels:{x:0,y:14},title:{rotation:0}},defaultTopAxisOptions:{labels:{x:0,y:-5}, |
|||
title:{rotation:0}},init:function(a,b){var c=b.isX;this.horiz=a.inverted?!c:c;this.xOrY=(this.isXAxis=c)?"x":"y";this.opposite=b.opposite;this.side=this.horiz?this.opposite?0:2:this.opposite?1:3;this.setOptions(b);var d=this.options,e=d.type;this.labelFormatter=d.labels.formatter||this.defaultLabelFormatter;this.userOptions=b;this.minPixelPadding=0;this.chart=a;this.reversed=d.reversed;this.zoomEnabled=d.zoomEnabled!==!1;this.categories=d.categories||e==="category";this.isLog=e==="logarithmic";this.isDatetimeAxis= |
|||
e==="datetime";this.isLinked=u(d.linkedTo);this.tickmarkOffset=this.categories&&d.tickmarkPlacement==="between"?0.5:0;this.ticks={};this.minorTicks={};this.plotLinesAndBands=[];this.alternateBands={};this.len=0;this.minRange=this.userMinRange=d.minRange||d.maxZoom;this.range=d.range;this.offset=d.offset||0;this.stacks={};this.oldStacks={};this.stackExtremes={};this.min=this.max=null;var f,d=this.options.events;qa(this,a.axes)===-1&&(a.axes.push(this),a[c?"xAxis":"yAxis"].push(this));this.series=this.series|| |
|||
[];if(a.inverted&&c&&this.reversed===w)this.reversed=!0;this.removePlotLine=this.removePlotBand=this.removePlotBandOrLine;for(f in d)J(this,f,d[f]);if(this.isLog)this.val2lin=na,this.lin2val=fa},setOptions:function(a){this.options=x(this.defaultOptions,this.isXAxis?{}:this.defaultYAxisOptions,[this.defaultTopAxisOptions,this.defaultRightAxisOptions,this.defaultBottomAxisOptions,this.defaultLeftAxisOptions][this.side],x(M[this.isXAxis?"xAxis":"yAxis"],a))},update:function(a,b){var c=this.chart,a=c.options[this.xOrY+ |
|||
"Axis"][this.options.index]=x(this.userOptions,a);this.destroy(!0);this._addedPlotLB=this.userMin=this.userMax=w;this.init(c,r(a,{events:w}));c.isDirtyBox=!0;o(b,!0)&&c.redraw()},remove:function(a){var b=this.chart,c=this.xOrY+"Axis";n(this.series,function(a){a.remove(!1)});ga(b.axes,this);ga(b[c],this);b.options[c].splice(this.options.index,1);n(b[c],function(a,b){a.options.index=b});this.destroy();b.isDirtyBox=!0;o(a,!0)&&b.redraw()},defaultLabelFormatter:function(){var a=this.axis,b=this.value, |
|||
c=a.categories,d=this.dateTimeLabelFormat,e=M.lang.numericSymbols,f=e&&e.length,g,h=a.options.labels.format,a=a.isLog?b:a.tickInterval;if(h)g=Ca(h,this);else if(c)g=b;else if(d)g=Xa(d,b);else if(f&&a>=1E3)for(;f--&&g===w;)c=Math.pow(1E3,f+1),a>=c&&e[f]!==null&&(g=Aa(b/c,-1)+e[f]);g===w&&(g=b>=1E3?Aa(b,0):Aa(b,-1));return g},getSeriesExtremes:function(){var a=this,b=a.chart;a.hasVisibleSeries=!1;a.dataMin=a.dataMax=null;a.stackExtremes={};a.buildStacks();n(a.series,function(c){if(c.visible||!b.options.chart.ignoreHiddenSeries){var d; |
|||
d=c.options.threshold;var e;a.hasVisibleSeries=!0;a.isLog&&d<=0&&(d=null);if(a.isXAxis){if(d=c.xData,d.length)a.dataMin=I(o(a.dataMin,d[0]),Ja(d)),a.dataMax=s(o(a.dataMax,d[0]),va(d))}else{c.getExtremes();e=c.dataMax;c=c.dataMin;if(u(c)&&u(e))a.dataMin=I(o(a.dataMin,c),c),a.dataMax=s(o(a.dataMax,e),e);if(u(d))if(a.dataMin>=d)a.dataMin=d,a.ignoreMinPadding=!0;else if(a.dataMax<d)a.dataMax=d,a.ignoreMaxPadding=!0}}})},translate:function(a,b,c,d,e,f){var g=this.len,h=1,i=0,j=d?this.oldTransA:this.transA, |
|||
d=d?this.oldMin:this.min,k=this.minPixelPadding,e=(this.options.ordinal||this.isLog&&e)&&this.lin2val;if(!j)j=this.transA;c&&(h*=-1,i=g);this.reversed&&(h*=-1,i-=h*g);b?(a=a*h+i,a-=k,a=a/j+d,e&&(a=this.lin2val(a))):(e&&(a=this.val2lin(a)),f==="between"&&(f=0.5),a=h*(a-d)*j+i+h*k+(sa(f)?j*f*this.pointRange:0));return a},toPixels:function(a,b){return this.translate(a,!1,!this.horiz,null,!0)+(b?0:this.pos)},toValue:function(a,b){return this.translate(a-(b?0:this.pos),!0,!this.horiz,null,!0)},getPlotLinePath:function(a, |
|||
b,c,d){var e=this.chart,f=this.left,g=this.top,h,i,j,a=this.translate(a,null,null,c),k=c&&e.oldChartHeight||e.chartHeight,l=c&&e.oldChartWidth||e.chartWidth,m;h=this.transB;c=i=t(a+h);h=j=t(k-a-h);if(isNaN(a))m=!0;else if(this.horiz){if(h=g,j=k-this.bottom,c<f||c>f+this.width)m=!0}else if(c=f,i=l-this.right,h<g||h>g+this.height)m=!0;return m&&!d?null:e.renderer.crispLine(["M",c,h,"L",i,j],b||0)},getPlotBandPath:function(a,b){var c=this.getPlotLinePath(b),d=this.getPlotLinePath(a);d&&c?d.push(c[4], |
|||
c[5],c[1],c[2]):d=null;return d},getLinearTickPositions:function(a,b,c){for(var d,b=ia(P(b/a)*a),c=ia(xa(c/a)*a),e=[];b<=c;){e.push(b);b=ia(b+a);if(b===d)break;d=b}return e},getLogTickPositions:function(a,b,c,d){var e=this.options,f=this.len,g=[];if(!d)this._minorAutoInterval=null;if(a>=0.5)a=t(a),g=this.getLinearTickPositions(a,b,c);else if(a>=0.08)for(var f=P(b),h,i,j,k,l,e=a>0.3?[1,2,4]:a>0.15?[1,2,4,6,8]:[1,2,3,4,5,6,7,8,9];f<c+1&&!l;f++){i=e.length;for(h=0;h<i&&!l;h++)j=na(fa(f)*e[h]),j>b&&(!d|| |
|||
k<=c)&&g.push(k),k>c&&(l=!0),k=j}else if(b=fa(b),c=fa(c),a=e[d?"minorTickInterval":"tickInterval"],a=o(a==="auto"?null:a,this._minorAutoInterval,(c-b)*(e.tickPixelInterval/(d?5:1))/((d?f/this.tickPositions.length:f)||1)),a=ob(a,null,nb(a)),g=Na(this.getLinearTickPositions(a,b,c),na),!d)this._minorAutoInterval=a/5;if(!d)this.tickInterval=a;return g},getMinorTickPositions:function(){var a=this.options,b=this.tickPositions,c=this.minorTickInterval,d=[],e;if(this.isLog){e=b.length;for(a=1;a<e;a++)d=d.concat(this.getLogTickPositions(c, |
|||
b[a-1],b[a],!0))}else if(this.isDatetimeAxis&&a.minorTickInterval==="auto")d=d.concat(Eb(Cb(c),this.min,this.max,a.startOfWeek)),d[0]<this.min&&d.shift();else for(b=this.min+(b[0]-this.min)%c;b<=this.max;b+=c)d.push(b);return d},adjustForMinRange:function(){var a=this.options,b=this.min,c=this.max,d,e=this.dataMax-this.dataMin>=this.minRange,f,g,h,i,j;if(this.isXAxis&&this.minRange===w&&!this.isLog)u(a.min)||u(a.max)?this.minRange=null:(n(this.series,function(a){i=a.xData;for(g=j=a.xIncrement?1:i.length- |
|||
1;g>0;g--)if(h=i[g]-i[g-1],f===w||h<f)f=h}),this.minRange=I(f*5,this.dataMax-this.dataMin));if(c-b<this.minRange){var k=this.minRange;d=(k-c+b)/2;d=[b-d,o(a.min,b-d)];if(e)d[2]=this.dataMin;b=va(d);c=[b+k,o(a.max,b+k)];if(e)c[2]=this.dataMax;c=Ja(c);c-b<k&&(d[0]=c-k,d[1]=o(a.min,c-k),b=va(d))}this.min=b;this.max=c},setAxisTranslation:function(a){var b=this.max-this.min,c=0,d,e=0,f=0,g=this.linkedParent,h=this.transA;if(this.isXAxis)g?(e=g.minPointOffset,f=g.pointRangePadding):n(this.series,function(a){var g= |
|||
a.pointRange,h=a.options.pointPlacement,l=a.closestPointRange;g>b&&(g=0);c=s(c,g);e=s(e,ea(h)?0:g/2);f=s(f,h==="on"?0:g);!a.noSharedTooltip&&u(l)&&(d=u(d)?I(d,l):l)}),g=this.ordinalSlope&&d?this.ordinalSlope/d:1,this.minPointOffset=e*=g,this.pointRangePadding=f*=g,this.pointRange=I(c,b),this.closestPointRange=d;if(a)this.oldTransA=h;this.translationSlope=this.transA=h=this.len/(b+f||1);this.transB=this.horiz?this.left:this.bottom;this.minPixelPadding=h*e},setTickPositions:function(a){var b=this,c= |
|||
b.chart,d=b.options,e=b.isLog,f=b.isDatetimeAxis,g=b.isXAxis,h=b.isLinked,i=b.options.tickPositioner,j=d.maxPadding,k=d.minPadding,l=d.tickInterval,m=d.minTickInterval,p=d.tickPixelInterval,q,ba=b.categories;h?(b.linkedParent=c[g?"xAxis":"yAxis"][d.linkedTo],c=b.linkedParent.getExtremes(),b.min=o(c.min,c.dataMin),b.max=o(c.max,c.dataMax),d.type!==b.linkedParent.options.type&&ka(11,1)):(b.min=o(b.userMin,d.min,b.dataMin),b.max=o(b.userMax,d.max,b.dataMax));if(e)!a&&I(b.min,o(b.dataMin,b.min))<=0&& |
|||
ka(10,1),b.min=ia(na(b.min)),b.max=ia(na(b.max));if(b.range&&(b.userMin=b.min=s(b.min,b.max-b.range),b.userMax=b.max,a))b.range=null;b.beforePadding&&b.beforePadding();b.adjustForMinRange();if(!ba&&!b.usePercentage&&!h&&u(b.min)&&u(b.max)&&(c=b.max-b.min)){if(!u(d.min)&&!u(b.userMin)&&k&&(b.dataMin<0||!b.ignoreMinPadding))b.min-=c*k;if(!u(d.max)&&!u(b.userMax)&&j&&(b.dataMax>0||!b.ignoreMaxPadding))b.max+=c*j}b.min===b.max||b.min===void 0||b.max===void 0?b.tickInterval=1:h&&!l&&p===b.linkedParent.options.tickPixelInterval? |
|||
b.tickInterval=b.linkedParent.tickInterval:(b.tickInterval=o(l,ba?1:(b.max-b.min)*p/s(b.len,p)),!u(l)&&b.len<p&&!this.isRadial&&(q=!0,b.tickInterval/=4));g&&!a&&n(b.series,function(a){a.processData(b.min!==b.oldMin||b.max!==b.oldMax)});b.setAxisTranslation(!0);b.beforeSetTickPositions&&b.beforeSetTickPositions();if(b.postProcessTickInterval)b.tickInterval=b.postProcessTickInterval(b.tickInterval);if(b.pointRange)b.tickInterval=s(b.pointRange,b.tickInterval);if(!l&&b.tickInterval<m)b.tickInterval= |
|||
m;if(!f&&!e&&!l)b.tickInterval=ob(b.tickInterval,null,nb(b.tickInterval),d);b.minorTickInterval=d.minorTickInterval==="auto"&&b.tickInterval?b.tickInterval/5:d.minorTickInterval;b.tickPositions=a=d.tickPositions?[].concat(d.tickPositions):i&&i.apply(b,[b.min,b.max]);if(!a)!b.ordinalPositions&&(b.max-b.min)/b.tickInterval>s(2*b.len,200)&&ka(19,!0),a=f?(b.getNonLinearTimeTicks||Eb)(Cb(b.tickInterval,d.units),b.min,b.max,d.startOfWeek,b.ordinalPositions,b.closestPointRange,!0):e?b.getLogTickPositions(b.tickInterval, |
|||
b.min,b.max):b.getLinearTickPositions(b.tickInterval,b.min,b.max),q&&a.splice(1,a.length-2),b.tickPositions=a;if(!h)e=a[0],f=a[a.length-1],h=b.minPointOffset||0,d.startOnTick?b.min=e:b.min-h>e&&a.shift(),d.endOnTick?b.max=f:b.max+h<f&&a.pop(),a.length===1&&(b.min-=0.001,b.max+=0.001)},setMaxTicks:function(){var a=this.chart,b=a.maxTicks||{},c=this.tickPositions,d=this._maxTicksKey=[this.xOrY,this.pos,this.len].join("-");if(!this.isLinked&&!this.isDatetimeAxis&&c&&c.length>(b[d]||0)&&this.options.alignTicks!== |
|||
!1)b[d]=c.length;a.maxTicks=b},adjustTickAmount:function(){var a=this._maxTicksKey,b=this.tickPositions,c=this.chart.maxTicks;if(c&&c[a]&&!this.isDatetimeAxis&&!this.categories&&!this.isLinked&&this.options.alignTicks!==!1){var d=this.tickAmount,e=b.length;this.tickAmount=a=c[a];if(e<a){for(;b.length<a;)b.push(ia(b[b.length-1]+this.tickInterval));this.transA*=(e-1)/(a-1);this.max=b[b.length-1]}if(u(d)&&a!==d)this.isDirty=!0}},setScale:function(){var a=this.stacks,b,c,d,e;this.oldMin=this.min;this.oldMax= |
|||
this.max;this.oldAxisLength=this.len;this.setAxisSize();e=this.len!==this.oldAxisLength;n(this.series,function(a){if(a.isDirtyData||a.isDirty||a.xAxis.isDirty)d=!0});if(e||d||this.isLinked||this.forceRedraw||this.userMin!==this.oldUserMin||this.userMax!==this.oldUserMax){if(!this.isXAxis)for(b in a)delete a[b];this.forceRedraw=!1;this.getSeriesExtremes();this.setTickPositions();this.oldUserMin=this.userMin;this.oldUserMax=this.userMax;if(!this.isDirty)this.isDirty=e||this.min!==this.oldMin||this.max!== |
|||
this.oldMax}else if(!this.isXAxis){if(this.oldStacks)a=this.stacks=this.oldStacks;for(b in a)for(c in a[b])a[b][c].cum=a[b][c].total}this.setMaxTicks()},setExtremes:function(a,b,c,d,e){var f=this,g=f.chart,c=o(c,!0),e=r(e,{min:a,max:b});z(f,"setExtremes",e,function(){f.userMin=a;f.userMax=b;f.eventArgs=e;f.isDirtyExtremes=!0;c&&g.redraw(d)})},zoom:function(a,b){this.allowZoomOutside||(u(this.dataMin)&&a<=this.dataMin&&(a=w),u(this.dataMax)&&b>=this.dataMax&&(b=w));this.displayBtn=a!==w||b!==w;this.setExtremes(a, |
|||
b,!1,w,{trigger:"zoom"});return!0},setAxisSize:function(){var a=this.chart,b=this.options,c=b.offsetLeft||0,d=b.offsetRight||0,e=this.horiz,f,g;this.left=g=o(b.left,a.plotLeft+c);this.top=f=o(b.top,a.plotTop);this.width=c=o(b.width,a.plotWidth-c+d);this.height=b=o(b.height,a.plotHeight);this.bottom=a.chartHeight-b-f;this.right=a.chartWidth-c-g;this.len=s(e?c:b,0);this.pos=e?g:f},getExtremes:function(){var a=this.isLog;return{min:a?ia(fa(this.min)):this.min,max:a?ia(fa(this.max)):this.max,dataMin:this.dataMin, |
|||
dataMax:this.dataMax,userMin:this.userMin,userMax:this.userMax}},getThreshold:function(a){var b=this.isLog,c=b?fa(this.min):this.min,b=b?fa(this.max):this.max;c>a||a===null?a=c:b<a&&(a=b);return this.translate(a,0,1,0,1)},addPlotBand:function(a){this.addPlotBandOrLine(a,"plotBands")},addPlotLine:function(a){this.addPlotBandOrLine(a,"plotLines")},addPlotBandOrLine:function(a,b){var c=(new vb(this,a)).render(),d=this.userOptions;c&&(b&&(d[b]=d[b]||[],d[b].push(a)),this.plotLinesAndBands.push(c));return c}, |
|||
autoLabelAlign:function(a){a=(o(a,0)-this.side*90+720)%360;return a>15&&a<165?"right":a>195&&a<345?"left":"center"},getOffset:function(){var a=this,b=a.chart,c=b.renderer,d=a.options,e=a.tickPositions,f=a.ticks,g=a.horiz,h=a.side,i=b.inverted?[1,0,3,2][h]:h,j,k=0,l,m=0,p=d.title,q=d.labels,ba=0,A=b.axisOffset,L=b.clipOffset,t=[-1,1,1,-1][h],r,v=1,x=o(q.maxStaggerLines,5),la,E,H,B;a.hasData=j=a.hasVisibleSeries||u(a.min)&&u(a.max)&&!!e;a.showAxis=b=j||o(d.showEmpty,!0);a.staggerLines=a.horiz&&q.staggerLines; |
|||
if(!a.axisGroup)a.gridGroup=c.g("grid").attr({zIndex:d.gridZIndex||1}).add(),a.axisGroup=c.g("axis").attr({zIndex:d.zIndex||2}).add(),a.labelGroup=c.g("axis-labels").attr({zIndex:q.zIndex||7}).add();if(j||a.isLinked){a.labelAlign=o(q.align||a.autoLabelAlign(q.rotation));n(e,function(b){f[b]?f[b].addLabel():f[b]=new Ma(a,b)});if(a.horiz&&!a.staggerLines&&x&&!q.rotation){for(r=a.reversed?[].concat(e).reverse():e;v<x;){j=[];la=!1;for(q=0;q<r.length;q++)E=r[q],H=(H=f[E].label&&f[E].label.getBBox())?H.width: |
|||
0,B=q%v,H&&(E=a.translate(E),j[B]!==w&&E<j[B]&&(la=!0),j[B]=E+H);if(la)v++;else break}if(v>1)a.staggerLines=v}n(e,function(b){if(h===0||h===2||{1:"left",3:"right"}[h]===a.labelAlign)ba=s(f[b].getLabelSize(),ba)});if(a.staggerLines)ba*=a.staggerLines,a.labelOffset=ba}else for(r in f)f[r].destroy(),delete f[r];if(p&&p.text&&p.enabled!==!1){if(!a.axisTitle)a.axisTitle=c.text(p.text,0,0,p.useHTML).attr({zIndex:7,rotation:p.rotation||0,align:p.textAlign||{low:"left",middle:"center",high:"right"}[p.align]}).css(p.style).add(a.axisGroup), |
|||
a.axisTitle.isNew=!0;if(b)k=a.axisTitle.getBBox()[g?"height":"width"],m=o(p.margin,g?5:10),l=p.offset;a.axisTitle[b?"show":"hide"]()}a.offset=t*o(d.offset,A[h]);a.axisTitleMargin=o(l,ba+m+(h!==2&&ba&&t*d.labels[g?"y":"x"]));A[h]=s(A[h],a.axisTitleMargin+k+t*a.offset);L[i]=s(L[i],P(d.lineWidth/2)*2)},getLinePath:function(a){var b=this.chart,c=this.opposite,d=this.offset,e=this.horiz,f=this.left+(c?this.width:0)+d,d=b.chartHeight-this.bottom-(c?this.height:0)+d;c&&(a*=-1);return b.renderer.crispLine(["M", |
|||
e?this.left:f,e?d:this.top,"L",e?b.chartWidth-this.right:f,e?d:b.chartHeight-this.bottom],a)},getTitlePosition:function(){var a=this.horiz,b=this.left,c=this.top,d=this.len,e=this.options.title,f=a?b:c,g=this.opposite,h=this.offset,i=C(e.style.fontSize||12),d={low:f+(a?0:d),middle:f+d/2,high:f+(a?d:0)}[e.align],b=(a?c+this.height:b)+(a?1:-1)*(g?-1:1)*this.axisTitleMargin+(this.side===2?i:0);return{x:a?d:b+(g?this.width:0)+h+(e.x||0),y:a?b-(g?this.height:0)+h:d+(e.y||0)}},render:function(){var a=this, |
|||
b=a.chart,c=b.renderer,d=a.options,e=a.isLog,f=a.isLinked,g=a.tickPositions,h=a.axisTitle,i=a.stacks,j=a.ticks,k=a.minorTicks,l=a.alternateBands,m=d.stackLabels,p=d.alternateGridColor,q=a.tickmarkOffset,o=d.lineWidth,A,s=b.hasRendered&&u(a.oldMin)&&!isNaN(a.oldMin);A=a.hasData;var t=a.showAxis,r,v;n([j,k,l],function(a){for(var b in a)a[b].isActive=!1});if(A||f)if(a.minorTickInterval&&!a.categories&&n(a.getMinorTickPositions(),function(b){k[b]||(k[b]=new Ma(a,b,"minor"));s&&k[b].isNew&&k[b].render(null, |
|||
!0);k[b].render(null,!1,1)}),g.length&&(n(g.slice(1).concat([g[0]]),function(b,c){c=c===g.length-1?0:c+1;if(!f||b>=a.min&&b<=a.max)j[b]||(j[b]=new Ma(a,b)),s&&j[b].isNew&&j[b].render(c,!0),j[b].render(c,!1,1)}),q&&a.min===0&&(j[-1]||(j[-1]=new Ma(a,-1,null,!0)),j[-1].render(-1))),p&&n(g,function(b,c){if(c%2===0&&b<a.max)l[b]||(l[b]=new vb(a)),r=b+q,v=g[c+1]!==w?g[c+1]+q:a.max,l[b].options={from:e?fa(r):r,to:e?fa(v):v,color:p},l[b].render(),l[b].isActive=!0}),!a._addedPlotLB)n((d.plotLines||[]).concat(d.plotBands|| |
|||
[]),function(b){a.addPlotBandOrLine(b)}),a._addedPlotLB=!0;n([j,k,l],function(a){var c,d,e=[],f=Fa?Fa.duration||500:0,g=function(){for(d=e.length;d--;)a[e[d]]&&!a[e[d]].isActive&&(a[e[d]].destroy(),delete a[e[d]])};for(c in a)if(!a[c].isActive)a[c].render(c,!1,0),a[c].isActive=!1,e.push(c);a===l||!b.hasRendered||!f?g():f&&setTimeout(g,f)});if(o)A=a.getLinePath(o),a.axisLine?a.axisLine.animate({d:A}):a.axisLine=c.path(A).attr({stroke:d.lineColor,"stroke-width":o,zIndex:7}).add(a.axisGroup),a.axisLine[t? |
|||
"show":"hide"]();if(h&&t)h[h.isNew?"attr":"animate"](a.getTitlePosition()),h.isNew=!1;if(m&&m.enabled){var x,la,d=a.stackTotalGroup;if(!d)a.stackTotalGroup=d=c.g("stack-labels").attr({visibility:"visible",zIndex:6}).add();d.translate(b.plotLeft,b.plotTop);for(x in i)for(la in c=i[x],c)c[la].render(d)}a.isDirty=!1},removePlotBandOrLine:function(a){for(var b=this.plotLinesAndBands,c=this.options,d=this.userOptions,e=b.length;e--;)b[e].id===a&&b[e].destroy();n([c.plotLines||[],d.plotLines||[],c.plotBands|| |
|||
[],d.plotBands||[]],function(b){for(e=b.length;e--;)b[e].id===a&&ga(b,b[e])})},setTitle:function(a,b){this.update({title:a},b)},redraw:function(){var a=this.chart.pointer;a.reset&&a.reset(!0);this.render();n(this.plotLinesAndBands,function(a){a.render()});n(this.series,function(a){a.isDirty=!0})},buildStacks:function(){var a=this.series,b=a.length;if(!this.isXAxis){for(;b--;)a[b].setStackedPoints();if(this.usePercentage)for(b=0;b<a.length;b++)a[b].setPercentStacks()}},setCategories:function(a,b){this.update({categories:a}, |
|||
b)},destroy:function(a){var b=this,c=b.stacks,d,e=b.plotLinesAndBands;a||aa(b);for(d in c)Ka(c[d]),c[d]=null;n([b.ticks,b.minorTicks,b.alternateBands],function(a){Ka(a)});for(a=e.length;a--;)e[a].destroy();n("stackTotalGroup,axisLine,axisGroup,gridGroup,labelGroup,axisTitle".split(","),function(a){b[a]&&(b[a]=b[a].destroy())})}};wb.prototype={init:function(a,b){var c=b.borderWidth,d=b.style,e=C(d.padding);this.chart=a;this.options=b;this.crosshairs=[];this.now={x:0,y:0};this.isHidden=!0;this.label= |
|||
a.renderer.label("",0,0,b.shape,null,null,b.useHTML,null,"tooltip").attr({padding:e,fill:b.backgroundColor,"stroke-width":c,r:b.borderRadius,zIndex:8}).css(d).css({padding:0}).add().attr({y:-999});$||this.label.shadow(b.shadow);this.shared=b.shared},destroy:function(){n(this.crosshairs,function(a){a&&a.destroy()});if(this.label)this.label=this.label.destroy();clearTimeout(this.hideTimer);clearTimeout(this.tooltipTimeout)},move:function(a,b,c,d){var e=this,f=e.now,g=e.options.animation!==!1&&!e.isHidden; |
|||
r(f,{x:g?(2*f.x+a)/3:a,y:g?(f.y+b)/2:b,anchorX:g?(2*f.anchorX+c)/3:c,anchorY:g?(f.anchorY+d)/2:d});e.label.attr(f);if(g&&(N(a-f.x)>1||N(b-f.y)>1))clearTimeout(this.tooltipTimeout),this.tooltipTimeout=setTimeout(function(){e&&e.move(a,b,c,d)},32)},hide:function(){var a=this,b;clearTimeout(this.hideTimer);if(!this.isHidden)b=this.chart.hoverPoints,this.hideTimer=setTimeout(function(){a.label.fadeOut();a.isHidden=!0},o(this.options.hideDelay,500)),b&&n(b,function(a){a.setState()}),this.chart.hoverPoints= |
|||
null},hideCrosshairs:function(){n(this.crosshairs,function(a){a&&a.hide()})},getAnchor:function(a,b){var c,d=this.chart,e=d.inverted,f=d.plotTop,g=0,h=0,i,a=ja(a);c=a[0].tooltipPos;this.followPointer&&b&&(b.chartX===w&&(b=d.pointer.normalize(b)),c=[b.chartX-d.plotLeft,b.chartY-f]);c||(n(a,function(a){i=a.series.yAxis;g+=a.plotX;h+=(a.plotLow?(a.plotLow+a.plotHigh)/2:a.plotY)+(!e&&i?i.top-f:0)}),g/=a.length,h/=a.length,c=[e?d.plotWidth-h:g,this.shared&&!e&&a.length>1&&b?b.chartY-f:e?d.plotHeight-g: |
|||
h]);return Na(c,t)},getPosition:function(a,b,c){var d=this.chart,e=d.plotLeft,f=d.plotTop,g=d.plotWidth,h=d.plotHeight,i=o(this.options.distance,12),j=c.plotX,c=c.plotY,d=j+e+(d.inverted?i:-a-i),k=c-b+f+15,l;d<7&&(d=e+s(j,0)+i);d+a>e+g&&(d-=d+a-(e+g),k=c-b+f-i,l=!0);k<f+5&&(k=f+5,l&&c>=k&&c<=k+b&&(k=c+f+i));k+b>f+h&&(k=s(f,f+h-b-i));return{x:d,y:k}},defaultFormatter:function(a){var b=this.points||ja(this),c=b[0].series,d;d=[c.tooltipHeaderFormatter(b[0])];n(b,function(a){c=a.series;d.push(c.tooltipFormatter&& |
|||
c.tooltipFormatter(a)||a.point.tooltipFormatter(c.tooltipOptions.pointFormat))});d.push(a.options.footerFormat||"");return d.join("")},refresh:function(a,b){var c=this.chart,d=this.label,e=this.options,f,g,h={},i,j=[];i=e.formatter||this.defaultFormatter;var h=c.hoverPoints,k,l=e.crosshairs,m=this.shared;clearTimeout(this.hideTimer);this.followPointer=ja(a)[0].series.tooltipOptions.followPointer;g=this.getAnchor(a,b);f=g[0];g=g[1];m&&(!a.series||!a.series.noSharedTooltip)?(c.hoverPoints=a,h&&n(h, |
|||
function(a){a.setState()}),n(a,function(a){a.setState("hover");j.push(a.getLabelConfig())}),h={x:a[0].category,y:a[0].y},h.points=j,a=a[0]):h=a.getLabelConfig();i=i.call(h,this);h=a.series;i===!1?this.hide():(this.isHidden&&(Wa(d),d.attr("opacity",1).show()),d.attr({text:i}),k=e.borderColor||a.color||h.color||"#606060",d.attr({stroke:k}),this.updatePosition({plotX:f,plotY:g}),this.isHidden=!1);if(l){l=ja(l);for(d=l.length;d--;)if(m=a.series,e=m[d?"yAxis":"xAxis"],l[d]&&e)if(h=d?o(a.stackY,a.y):a.x, |
|||
e.isLog&&(h=na(h)),d===1&&m.modifyValue&&(h=m.modifyValue(h)),e=e.getPlotLinePath(h,1),this.crosshairs[d])this.crosshairs[d].attr({d:e,visibility:"visible"});else{h={"stroke-width":l[d].width||1,stroke:l[d].color||"#C0C0C0",zIndex:l[d].zIndex||2};if(l[d].dashStyle)h.dashstyle=l[d].dashStyle;this.crosshairs[d]=c.renderer.path(e).attr(h).add()}}z(c,"tooltipRefresh",{text:i,x:f+c.plotLeft,y:g+c.plotTop,borderColor:k})},updatePosition:function(a){var b=this.chart,c=this.label,c=(this.options.positioner|| |
|||
this.getPosition).call(this,c.width,c.height,a);this.move(t(c.x),t(c.y),a.plotX+b.plotLeft,a.plotY+b.plotTop)}};xb.prototype={init:function(a,b){var c=b.chart,d=c.events,e=$?"":c.zoomType,c=a.inverted,f;this.options=b;this.chart=a;this.zoomX=f=/x/.test(e);this.zoomY=e=/y/.test(e);this.zoomHor=f&&!c||e&&c;this.zoomVert=e&&!c||f&&c;this.runChartClick=d&&!!d.click;this.pinchDown=[];this.lastValidTouch={};if(b.tooltip.enabled)a.tooltip=new wb(a,b.tooltip);this.setDOMEvents()},normalize:function(a,b){var c, |
|||
d,a=a||O.event;if(!a.target)a.target=a.srcElement;a=Xb(a);d=a.touches?a.touches.item(0):a;if(!b)this.chartPosition=b=Wb(this.chart.container);d.pageX===w?(c=s(a.x,a.clientX-b.left),d=a.y):(c=d.pageX-b.left,d=d.pageY-b.top);return r(a,{chartX:t(c),chartY:t(d)})},getCoordinates:function(a){var b={xAxis:[],yAxis:[]};n(this.chart.axes,function(c){b[c.isXAxis?"xAxis":"yAxis"].push({axis:c,value:c.toValue(a[c.horiz?"chartX":"chartY"])})});return b},getIndex:function(a){var b=this.chart;return b.inverted? |
|||
b.plotHeight+b.plotTop-a.chartY:a.chartX-b.plotLeft},runPointActions:function(a){var b=this.chart,c=b.series,d=b.tooltip,e,f=b.hoverPoint,g=b.hoverSeries,h,i,j=b.chartWidth,k=this.getIndex(a);if(d&&this.options.tooltip.shared&&(!g||!g.noSharedTooltip)){e=[];h=c.length;for(i=0;i<h;i++)if(c[i].visible&&c[i].options.enableMouseTracking!==!1&&!c[i].noSharedTooltip&&c[i].tooltipPoints.length&&(b=c[i].tooltipPoints[k])&&b.series)b._dist=N(k-b.clientX),j=I(j,b._dist),e.push(b);for(h=e.length;h--;)e[h]._dist> |
|||
j&&e.splice(h,1);if(e.length&&e[0].clientX!==this.hoverX)d.refresh(e,a),this.hoverX=e[0].clientX}if(g&&g.tracker){if((b=g.tooltipPoints[k])&&b!==f)b.onMouseOver(a)}else d&&d.followPointer&&!d.isHidden&&(a=d.getAnchor([{}],a),d.updatePosition({plotX:a[0],plotY:a[1]}))},reset:function(a){var b=this.chart,c=b.hoverSeries,d=b.hoverPoint,e=b.tooltip,b=e&&e.shared?b.hoverPoints:d;(a=a&&e&&b)&&ja(b)[0].plotX===w&&(a=!1);if(a)e.refresh(b);else{if(d)d.onMouseOut();if(c)c.onMouseOut();e&&(e.hide(),e.hideCrosshairs()); |
|||
this.hoverX=null}},scaleGroups:function(a,b){var c=this.chart,d;n(c.series,function(e){d=a||e.getPlotBox();e.xAxis&&e.xAxis.zoomEnabled&&(e.group.attr(d),e.markerGroup&&(e.markerGroup.attr(d),e.markerGroup.clip(b?c.clipRect:null)),e.dataLabelsGroup&&e.dataLabelsGroup.attr(d))});c.clipRect.attr(b||c.clipBox)},pinchTranslateDirection:function(a,b,c,d,e,f,g){var h=this.chart,i=a?"x":"y",j=a?"X":"Y",k="chart"+j,l=a?"width":"height",m=h["plot"+(a?"Left":"Top")],p,q,o=1,n=h.inverted,s=h.bounds[a?"h":"v"], |
|||
t=b.length===1,u=b[0][k],r=c[0][k],w=!t&&b[1][k],v=!t&&c[1][k],x,c=function(){!t&&N(u-w)>20&&(o=N(r-v)/N(u-w));q=(m-r)/o+u;p=h["plot"+(a?"Width":"Height")]/o};c();b=q;b<s.min?(b=s.min,x=!0):b+p>s.max&&(b=s.max-p,x=!0);x?(r-=0.8*(r-g[i][0]),t||(v-=0.8*(v-g[i][1])),c()):g[i]=[r,v];n||(f[i]=q-m,f[l]=p);f=n?1/o:o;e[l]=p;e[i]=b;d[n?a?"scaleY":"scaleX":"scale"+j]=o;d["translate"+j]=f*m+(r-f*u)},pinch:function(a){var b=this,c=b.chart,d=b.pinchDown,e=c.tooltip&&c.tooltip.options.followTouchMove,f=a.touches, |
|||
g=f.length,h=b.lastValidTouch,i=b.zoomHor||b.pinchHor,j=b.zoomVert||b.pinchVert,k=i||j,l=b.selectionMarker,m={},p=g===1&&(b.inClass(a.target,"highcharts-tracker")&&c.runTrackerClick||c.runChartClick),q={};(k||e)&&!p&&a.preventDefault();Na(f,function(a){return b.normalize(a)});if(a.type==="touchstart")n(f,function(a,b){d[b]={chartX:a.chartX,chartY:a.chartY}}),h.x=[d[0].chartX,d[1]&&d[1].chartX],h.y=[d[0].chartY,d[1]&&d[1].chartY],n(c.axes,function(a){if(a.zoomEnabled){var b=c.bounds[a.horiz?"h":"v"], |
|||
d=a.minPixelPadding,e=a.toPixels(a.dataMin),f=a.toPixels(a.dataMax),g=I(e,f),e=s(e,f);b.min=I(a.pos,g-d);b.max=s(a.pos+a.len,e+d)}});else if(d.length){if(!l)b.selectionMarker=l=r({destroy:pa},c.plotBox);i&&b.pinchTranslateDirection(!0,d,f,m,l,q,h);j&&b.pinchTranslateDirection(!1,d,f,m,l,q,h);b.hasPinched=k;b.scaleGroups(m,q);!k&&e&&g===1&&this.runPointActions(b.normalize(a))}},dragStart:function(a){var b=this.chart;b.mouseIsDown=a.type;b.cancelClick=!1;b.mouseDownX=this.mouseDownX=a.chartX;b.mouseDownY= |
|||
this.mouseDownY=a.chartY},drag:function(a){var b=this.chart,c=b.options.chart,d=a.chartX,e=a.chartY,f=this.zoomHor,g=this.zoomVert,h=b.plotLeft,i=b.plotTop,j=b.plotWidth,k=b.plotHeight,l,m=this.mouseDownX,p=this.mouseDownY;d<h?d=h:d>h+j&&(d=h+j);e<i?e=i:e>i+k&&(e=i+k);this.hasDragged=Math.sqrt(Math.pow(m-d,2)+Math.pow(p-e,2));if(this.hasDragged>10){l=b.isInsidePlot(m-h,p-i);if(b.hasCartesianSeries&&(this.zoomX||this.zoomY)&&l&&!this.selectionMarker)this.selectionMarker=b.renderer.rect(h,i,f?1:j,g? |
|||
1:k,0).attr({fill:c.selectionMarkerFill||"rgba(69,114,167,0.25)",zIndex:7}).add();this.selectionMarker&&f&&(d-=m,this.selectionMarker.attr({width:N(d),x:(d>0?0:d)+m}));this.selectionMarker&&g&&(d=e-p,this.selectionMarker.attr({height:N(d),y:(d>0?0:d)+p}));l&&!this.selectionMarker&&c.panning&&b.pan(a,c.panning)}},drop:function(a){var b=this.chart,c=this.hasPinched;if(this.selectionMarker){var d={xAxis:[],yAxis:[],originalEvent:a.originalEvent||a},e=this.selectionMarker,f=e.x,g=e.y,h;if(this.hasDragged|| |
|||
c)n(b.axes,function(a){if(a.zoomEnabled){var b=a.horiz,c=a.toValue(b?f:g),b=a.toValue(b?f+e.width:g+e.height);!isNaN(c)&&!isNaN(b)&&(d[a.xOrY+"Axis"].push({axis:a,min:I(c,b),max:s(c,b)}),h=!0)}}),h&&z(b,"selection",d,function(a){b.zoom(r(a,c?{animation:!1}:null))});this.selectionMarker=this.selectionMarker.destroy();c&&this.scaleGroups()}if(b)K(b.container,{cursor:b._cursor}),b.cancelClick=this.hasDragged>10,b.mouseIsDown=this.hasDragged=this.hasPinched=!1,this.pinchDown=[]},onContainerMouseDown:function(a){a= |
|||
this.normalize(a);a.preventDefault&&a.preventDefault();this.dragStart(a)},onDocumentMouseUp:function(a){this.drop(a)},onDocumentMouseMove:function(a){var b=this.chart,c=this.chartPosition,d=b.hoverSeries,a=this.normalize(a,c);c&&d&&!this.inClass(a.target,"highcharts-tracker")&&!b.isInsidePlot(a.chartX-b.plotLeft,a.chartY-b.plotTop)&&this.reset()},onContainerMouseLeave:function(){this.reset();this.chartPosition=null},onContainerMouseMove:function(a){var b=this.chart,a=this.normalize(a);a.returnValue= |
|||
!1;b.mouseIsDown==="mousedown"&&this.drag(a);(this.inClass(a.target,"highcharts-tracker")||b.isInsidePlot(a.chartX-b.plotLeft,a.chartY-b.plotTop))&&!b.openMenu&&this.runPointActions(a)},inClass:function(a,b){for(var c;a;){if(c=v(a,"class"))if(c.indexOf(b)!==-1)return!0;else if(c.indexOf("highcharts-container")!==-1)return!1;a=a.parentNode}},onTrackerMouseOut:function(a){var b=this.chart.hoverSeries;if(b&&!b.options.stickyTracking&&!this.inClass(a.toElement||a.relatedTarget,"highcharts-tooltip"))b.onMouseOut()}, |
|||
onContainerClick:function(a){var b=this.chart,c=b.hoverPoint,d=b.plotLeft,e=b.plotTop,f=b.inverted,g,h,i,a=this.normalize(a);a.cancelBubble=!0;if(!b.cancelClick)c&&this.inClass(a.target,"highcharts-tracker")?(g=this.chartPosition,h=c.plotX,i=c.plotY,r(c,{pageX:g.left+d+(f?b.plotWidth-i:h),pageY:g.top+e+(f?b.plotHeight-h:i)}),z(c.series,"click",r(a,{point:c})),b.hoverPoint&&c.firePointEvent("click",a)):(r(a,this.getCoordinates(a)),b.isInsidePlot(a.chartX-d,a.chartY-e)&&z(b,"click",a))},onContainerTouchStart:function(a){var b= |
|||
this.chart;a.touches.length===1?(a=this.normalize(a),b.isInsidePlot(a.chartX-b.plotLeft,a.chartY-b.plotTop)?(this.runPointActions(a),this.pinch(a)):this.reset()):a.touches.length===2&&this.pinch(a)},onContainerTouchMove:function(a){(a.touches.length===1||a.touches.length===2)&&this.pinch(a)},onDocumentTouchEnd:function(a){this.drop(a)},setDOMEvents:function(){var a=this,b=a.chart.container,c;this._events=c=[[b,"onmousedown","onContainerMouseDown"],[b,"onmousemove","onContainerMouseMove"],[b,"onclick", |
|||
"onContainerClick"],[b,"mouseleave","onContainerMouseLeave"],[y,"mousemove","onDocumentMouseMove"],[y,"mouseup","onDocumentMouseUp"]];ib&&c.push([b,"ontouchstart","onContainerTouchStart"],[b,"ontouchmove","onContainerTouchMove"],[y,"touchend","onDocumentTouchEnd"]);n(c,function(b){a["_"+b[2]]=function(c){a[b[2]](c)};b[1].indexOf("on")===0?b[0][b[1]]=a["_"+b[2]]:J(b[0],b[1],a["_"+b[2]])})},destroy:function(){var a=this;n(a._events,function(b){b[1].indexOf("on")===0?b[0][b[1]]=null:aa(b[0],b[1],a["_"+ |
|||
b[2]])});delete a._events;clearInterval(a.tooltipTimeout)}};eb.prototype={init:function(a,b){var c=this,d=b.itemStyle,e=o(b.padding,8),f=b.itemMarginTop||0;this.options=b;if(b.enabled)c.baseline=C(d.fontSize)+3+f,c.itemStyle=d,c.itemHiddenStyle=x(d,b.itemHiddenStyle),c.itemMarginTop=f,c.padding=e,c.initialItemX=e,c.initialItemY=e-5,c.maxItemWidth=0,c.chart=a,c.itemHeight=0,c.lastLineHeight=0,c.render(),J(c.chart,"endResize",function(){c.positionCheckboxes()})},colorizeItem:function(a,b){var c=this.options, |
|||
d=a.legendItem,e=a.legendLine,f=a.legendSymbol,g=this.itemHiddenStyle.color,c=b?c.itemStyle.color:g,h=b?a.color:g,g=a.options&&a.options.marker,i={stroke:h,fill:h},j;d&&d.css({fill:c,color:c});e&&e.attr({stroke:h});if(f){if(g&&f.isMarker)for(j in g=a.convertAttribs(g),g)d=g[j],d!==w&&(i[j]=d);f.attr(i)}},positionItem:function(a){var b=this.options,c=b.symbolPadding,b=!b.rtl,d=a._legendItemPos,e=d[0],d=d[1],f=a.checkbox;a.legendGroup&&a.legendGroup.translate(b?e:this.legendWidth-e-2*c-4,d);if(f)f.x= |
|||
e,f.y=d},destroyItem:function(a){var b=a.checkbox;n(["legendItem","legendLine","legendSymbol","legendGroup"],function(b){a[b]&&(a[b]=a[b].destroy())});b&&Ta(a.checkbox)},destroy:function(){var a=this.group,b=this.box;if(b)this.box=b.destroy();if(a)this.group=a.destroy()},positionCheckboxes:function(a){var b=this.group.alignAttr,c,d=this.clipHeight||this.legendHeight;if(b)c=b.translateY,n(this.allItems,function(e){var f=e.checkbox,g;f&&(g=c+f.y+(a||0)+3,K(f,{left:b.translateX+e.legendItemWidth+f.x- |
|||
20+"px",top:g+"px",display:g>c-6&&g<c+d-6?"":S}))})},renderTitle:function(){var a=this.padding,b=this.options.title,c=0;if(b.text){if(!this.title)this.title=this.chart.renderer.label(b.text,a-3,a-4,null,null,null,null,null,"legend-title").attr({zIndex:1}).css(b.style).add(this.group);a=this.title.getBBox();c=a.height;this.offsetWidth=a.width;this.contentGroup.attr({translateY:c})}this.titleHeight=c},renderItem:function(a){var B;var b=this,c=b.chart,d=c.renderer,e=b.options,f=e.layout==="horizontal", |
|||
g=e.symbolWidth,h=e.symbolPadding,i=b.itemStyle,j=b.itemHiddenStyle,k=b.padding,l=f?o(e.itemDistance,8):0,m=!e.rtl,p=e.width,q=e.itemMarginBottom||0,n=b.itemMarginTop,A=b.initialItemX,t=a.legendItem,u=a.series||a,r=u.options,w=r.showCheckbox,v=e.useHTML;if(!t&&(a.legendGroup=d.g("legend-item").attr({zIndex:1}).add(b.scrollGroup),u.drawLegendSymbol(b,a),a.legendItem=t=d.text(e.labelFormat?Ca(e.labelFormat,a):e.labelFormatter.call(a),m?g+h:-h,b.baseline,v).css(x(a.visible?i:j)).attr({align:m?"left": |
|||
"right",zIndex:2}).add(a.legendGroup),(v?t:a.legendGroup).on("mouseover",function(){a.setState("hover");t.css(b.options.itemHoverStyle)}).on("mouseout",function(){t.css(a.visible?i:j);a.setState()}).on("click",function(b){var c=function(){a.setVisible()},b={browserEvent:b};a.firePointEvent?a.firePointEvent("legendItemClick",b,c):z(a,"legendItemClick",b,c)}),b.colorizeItem(a,a.visible),r&&w))a.checkbox=U("input",{type:"checkbox",checked:a.selected,defaultChecked:a.selected},e.itemCheckboxStyle,c.container), |
|||
J(a.checkbox,"click",function(b){z(a,"checkboxClick",{checked:b.target.checked},function(){a.select()})});d=t.getBBox();B=a.legendItemWidth=e.itemWidth||g+h+d.width+l+(w?20:0),e=B;b.itemHeight=g=d.height;if(f&&b.itemX-A+e>(p||c.chartWidth-2*k-A))b.itemX=A,b.itemY+=n+b.lastLineHeight+q,b.lastLineHeight=0;b.maxItemWidth=s(b.maxItemWidth,e);b.lastItemY=n+b.itemY+q;b.lastLineHeight=s(g,b.lastLineHeight);a._legendItemPos=[b.itemX,b.itemY];f?b.itemX+=e:(b.itemY+=n+g+q,b.lastLineHeight=g);b.offsetWidth= |
|||
p||s((f?b.itemX-A-l:e)+k,b.offsetWidth)},render:function(){var a=this,b=a.chart,c=b.renderer,d=a.group,e,f,g,h,i=a.box,j=a.options,k=a.padding,l=j.borderWidth,m=j.backgroundColor;a.itemX=a.initialItemX;a.itemY=a.initialItemY;a.offsetWidth=0;a.lastItemY=0;if(!d)a.group=d=c.g("legend").attr({zIndex:7}).add(),a.contentGroup=c.g().attr({zIndex:1}).add(d),a.scrollGroup=c.g().add(a.contentGroup);a.renderTitle();e=[];n(b.series,function(a){var b=a.options;b.showInLegend&&!u(b.linkedTo)&&(e=e.concat(a.legendItems|| |
|||
(b.legendType==="point"?a.data:a)))});Kb(e,function(a,b){return(a.options&&a.options.legendIndex||0)-(b.options&&b.options.legendIndex||0)});j.reversed&&e.reverse();a.allItems=e;a.display=f=!!e.length;n(e,function(b){a.renderItem(b)});g=j.width||a.offsetWidth;h=a.lastItemY+a.lastLineHeight+a.titleHeight;h=a.handleOverflow(h);if(l||m){g+=k;h+=k;if(i){if(g>0&&h>0)i[i.isNew?"attr":"animate"](i.crisp(null,null,null,g,h)),i.isNew=!1}else a.box=i=c.rect(0,0,g,h,j.borderRadius,l||0).attr({stroke:j.borderColor, |
|||
"stroke-width":l||0,fill:m||S}).add(d).shadow(j.shadow),i.isNew=!0;i[f?"show":"hide"]()}a.legendWidth=g;a.legendHeight=h;n(e,function(b){a.positionItem(b)});f&&d.align(r({width:g,height:h},j),!0,"spacingBox");b.isResizing||this.positionCheckboxes()},handleOverflow:function(a){var b=this,c=this.chart,d=c.renderer,e=this.options,f=e.y,f=c.spacingBox.height+(e.verticalAlign==="top"?-f:f)-this.padding,g=e.maxHeight,h=this.clipRect,i=e.navigation,j=o(i.animation,!0),k=i.arrowSize||12,l=this.nav;e.layout=== |
|||
"horizontal"&&(f/=2);g&&(f=I(f,g));if(a>f&&!e.useHTML){this.clipHeight=c=f-20-this.titleHeight;this.pageCount=xa(a/c);this.currentPage=o(this.currentPage,1);this.fullHeight=a;if(!h)h=b.clipRect=d.clipRect(0,0,9999,0),b.contentGroup.clip(h);h.attr({height:c});if(!l)this.nav=l=d.g().attr({zIndex:1}).add(this.group),this.up=d.symbol("triangle",0,0,k,k).on("click",function(){b.scroll(-1,j)}).add(l),this.pager=d.text("",15,10).css(i.style).add(l),this.down=d.symbol("triangle-down",0,0,k,k).on("click", |
|||
function(){b.scroll(1,j)}).add(l);b.scroll(0);a=f}else if(l)h.attr({height:c.chartHeight}),l.hide(),this.scrollGroup.attr({translateY:1}),this.clipHeight=0;return a},scroll:function(a,b){var c=this.pageCount,d=this.currentPage+a,e=this.clipHeight,f=this.options.navigation,g=f.activeColor,h=f.inactiveColor,f=this.pager,i=this.padding;d>c&&(d=c);if(d>0)b!==w&&La(b,this.chart),this.nav.attr({translateX:i,translateY:e+7+this.titleHeight,visibility:"visible"}),this.up.attr({fill:d===1?h:g}).css({cursor:d=== |
|||
1?"default":"pointer"}),f.attr({text:d+"/"+this.pageCount}),this.down.attr({x:18+this.pager.getBBox().width,fill:d===c?h:g}).css({cursor:d===c?"default":"pointer"}),e=-I(e*(d-1),this.fullHeight-e+i)+1,this.scrollGroup.animate({translateY:e}),f.attr({text:d+"/"+c}),this.currentPage=d,this.positionCheckboxes(e)}};/Trident.*?11\.0/.test(oa)&&mb(eb.prototype,"positionItem",function(a,b){var c=this;setTimeout(function(){a.call(c,b)})});yb.prototype={init:function(a,b){var c,d=a.series;a.series=null;c= |
|||
x(M,a);c.series=a.series=d;d=c.chart;this.margin=this.splashArray("margin",d);this.spacing=this.splashArray("spacing",d);var e=d.events;this.bounds={h:{},v:{}};this.callback=b;this.isResizing=0;this.options=c;this.axes=[];this.series=[];this.hasCartesianSeries=d.showAxes;var f=this,g;f.index=Ga.length;Ga.push(f);d.reflow!==!1&&J(f,"load",function(){f.initReflow()});if(e)for(g in e)J(f,g,e[g]);f.xAxis=[];f.yAxis=[];f.animation=$?!1:o(d.animation,!0);f.pointCount=0;f.counters=new Jb;f.firstRender()}, |
|||
initSeries:function(a){var b=this.options.chart;(b=W[a.type||b.type||b.defaultSeriesType])||ka(17,!0);b=new b;b.init(this,a);return b},addSeries:function(a,b,c){var d,e=this;a&&(b=o(b,!0),z(e,"addSeries",{options:a},function(){d=e.initSeries(a);e.isDirtyLegend=!0;e.linkSeries();b&&e.redraw(c)}));return d},addAxis:function(a,b,c,d){var e=b?"xAxis":"yAxis",f=this.options;new db(this,x(a,{index:this[e].length,isX:b}));f[e]=ja(f[e]||{});f[e].push(a);o(c,!0)&&this.redraw(d)},isInsidePlot:function(a,b, |
|||
c){var d=c?b:a,a=c?a:b;return d>=0&&d<=this.plotWidth&&a>=0&&a<=this.plotHeight},adjustTickAmounts:function(){this.options.chart.alignTicks!==!1&&n(this.axes,function(a){a.adjustTickAmount()});this.maxTicks=null},redraw:function(a){var b=this.axes,c=this.series,d=this.pointer,e=this.legend,f=this.isDirtyLegend,g,h,i=this.isDirtyBox,j=c.length,k=j,l=this.renderer,m=l.isHidden(),p=[];La(a,this);m&&this.cloneRenderTo();for(this.layOutTitles();k--;)if(a=c[k],a.options.stacking&&(g=!0,a.isDirty)){h=!0; |
|||
break}if(h)for(k=j;k--;)if(a=c[k],a.options.stacking)a.isDirty=!0;n(c,function(a){a.isDirty&&a.options.legendType==="point"&&(f=!0)});if(f&&e.options.enabled)e.render(),this.isDirtyLegend=!1;g&&this.getStacks();if(this.hasCartesianSeries){if(!this.isResizing)this.maxTicks=null,n(b,function(a){a.setScale()});this.adjustTickAmounts();this.getMargins();n(b,function(a){a.isDirty&&(i=!0)});n(b,function(a){if(a.isDirtyExtremes)a.isDirtyExtremes=!1,p.push(function(){z(a,"afterSetExtremes",r(a.eventArgs, |
|||
a.getExtremes()));delete a.eventArgs});(i||g)&&a.redraw()})}i&&this.drawChartBox();n(c,function(a){a.isDirty&&a.visible&&(!a.isCartesian||a.xAxis)&&a.redraw()});d&&d.reset&&d.reset(!0);l.draw();z(this,"redraw");m&&this.cloneRenderTo(!0);n(p,function(a){a.call()})},showLoading:function(a){var b=this.options,c=this.loadingDiv,d=b.loading;if(!c)this.loadingDiv=c=U(Ea,{className:"highcharts-loading"},r(d.style,{zIndex:10,display:S}),this.container),this.loadingSpan=U("span",null,d.labelStyle,c);this.loadingSpan.innerHTML= |
|||
a||b.lang.loading;if(!this.loadingShown)K(c,{opacity:0,display:"",left:this.plotLeft+"px",top:this.plotTop+"px",width:this.plotWidth+"px",height:this.plotHeight+"px"}),Bb(c,{opacity:d.style.opacity},{duration:d.showDuration||0}),this.loadingShown=!0},hideLoading:function(){var a=this.options,b=this.loadingDiv;b&&Bb(b,{opacity:0},{duration:a.loading.hideDuration||100,complete:function(){K(b,{display:S})}});this.loadingShown=!1},get:function(a){var b=this.axes,c=this.series,d,e;for(d=0;d<b.length;d++)if(b[d].options.id=== |
|||
a)return b[d];for(d=0;d<c.length;d++)if(c[d].options.id===a)return c[d];for(d=0;d<c.length;d++){e=c[d].points||[];for(b=0;b<e.length;b++)if(e[b].id===a)return e[b]}return null},getAxes:function(){var a=this,b=this.options,c=b.xAxis=ja(b.xAxis||{}),b=b.yAxis=ja(b.yAxis||{});n(c,function(a,b){a.index=b;a.isX=!0});n(b,function(a,b){a.index=b});c=c.concat(b);n(c,function(b){new db(a,b)});a.adjustTickAmounts()},getSelectedPoints:function(){var a=[];n(this.series,function(b){a=a.concat(ub(b.points||[], |
|||
function(a){return a.selected}))});return a},getSelectedSeries:function(){return ub(this.series,function(a){return a.selected})},getStacks:function(){var a=this;n(a.yAxis,function(a){if(a.stacks&&a.hasVisibleSeries)a.oldStacks=a.stacks});n(a.series,function(b){if(b.options.stacking&&(b.visible===!0||a.options.chart.ignoreHiddenSeries===!1))b.stackKey=b.type+o(b.options.stack,"")})},showResetZoom:function(){var a=this,b=M.lang,c=a.options.chart.resetZoomButton,d=c.theme,e=d.states,f=c.relativeTo=== |
|||
"chart"?null:"plotBox";this.resetZoomButton=a.renderer.button(b.resetZoom,null,null,function(){a.zoomOut()},d,e&&e.hover).attr({align:c.position.align,title:b.resetZoomTitle}).add().align(c.position,!1,f)},zoomOut:function(){var a=this;z(a,"selection",{resetSelection:!0},function(){a.zoom()})},zoom:function(a){var b,c=this.pointer,d=!1,e;!a||a.resetSelection?n(this.axes,function(a){b=a.zoom()}):n(a.xAxis.concat(a.yAxis),function(a){var e=a.axis,h=e.isXAxis;if(c[h?"zoomX":"zoomY"]||c[h?"pinchX":"pinchY"])b= |
|||
e.zoom(a.min,a.max),e.displayBtn&&(d=!0)});e=this.resetZoomButton;if(d&&!e)this.showResetZoom();else if(!d&&T(e))this.resetZoomButton=e.destroy();b&&this.redraw(o(this.options.chart.animation,a&&a.animation,this.pointCount<100))},pan:function(a,b){var c=this,d=c.hoverPoints,e;d&&n(d,function(a){a.setState()});n(b==="xy"?[1,0]:[1],function(b){var d=a[b?"chartX":"chartY"],h=c[b?"xAxis":"yAxis"][0],i=c[b?"mouseDownX":"mouseDownY"],j=(h.pointRange||0)/2,k=h.getExtremes(),l=h.toValue(i-d,!0)+j,i=h.toValue(i+ |
|||
c[b?"plotWidth":"plotHeight"]-d,!0)-j;h.series.length&&l>I(k.dataMin,k.min)&&i<s(k.dataMax,k.max)&&(h.setExtremes(l,i,!1,!1,{trigger:"pan"}),e=!0);c[b?"mouseDownX":"mouseDownY"]=d});e&&c.redraw(!1);K(c.container,{cursor:"move"})},setTitle:function(a,b){var f;var c=this,d=c.options,e;e=d.title=x(d.title,a);f=d.subtitle=x(d.subtitle,b),d=f;n([["title",a,e],["subtitle",b,d]],function(a){var b=a[0],d=c[b],e=a[1],a=a[2];d&&e&&(c[b]=d=d.destroy());a&&a.text&&!d&&(c[b]=c.renderer.text(a.text,0,0,a.useHTML).attr({align:a.align, |
|||
"class":"highcharts-"+b,zIndex:a.zIndex||4}).css(a.style).add())});c.layOutTitles()},layOutTitles:function(){var a=0,b=this.title,c=this.subtitle,d=this.options,e=d.title,d=d.subtitle,f=this.spacingBox.width-44;if(b&&(b.css({width:(e.width||f)+"px"}).align(r({y:15},e),!1,"spacingBox"),!e.floating&&!e.verticalAlign))a=b.getBBox().height,a>=18&&a<=25&&(a=15);c&&(c.css({width:(d.width||f)+"px"}).align(r({y:a+e.margin},d),!1,"spacingBox"),!d.floating&&!d.verticalAlign&&(a=xa(a+c.getBBox().height)));this.titleOffset= |
|||
a},getChartSize:function(){var a=this.options.chart,b=this.renderToClone||this.renderTo;this.containerWidth=jb(b,"width");this.containerHeight=jb(b,"height");this.chartWidth=s(0,a.width||this.containerWidth||600);this.chartHeight=s(0,o(a.height,this.containerHeight>19?this.containerHeight:400))},cloneRenderTo:function(a){var b=this.renderToClone,c=this.container;a?b&&(this.renderTo.appendChild(c),Ta(b),delete this.renderToClone):(c&&c.parentNode===this.renderTo&&this.renderTo.removeChild(c),this.renderToClone= |
|||
b=this.renderTo.cloneNode(0),K(b,{position:"absolute",top:"-9999px",display:"block"}),y.body.appendChild(b),c&&b.appendChild(c))},getContainer:function(){var a,b=this.options.chart,c,d,e;this.renderTo=a=b.renderTo;e="highcharts-"+zb++;if(ea(a))this.renderTo=a=y.getElementById(a);a||ka(13,!0);c=C(v(a,"data-highcharts-chart"));!isNaN(c)&&Ga[c]&&Ga[c].destroy();v(a,"data-highcharts-chart",this.index);a.innerHTML="";a.offsetWidth||this.cloneRenderTo();this.getChartSize();c=this.chartWidth;d=this.chartHeight; |
|||
this.container=a=U(Ea,{className:"highcharts-container"+(b.className?" "+b.className:""),id:e},r({position:"relative",overflow:"hidden",width:c+"px",height:d+"px",textAlign:"left",lineHeight:"normal",zIndex:0,"-webkit-tap-highlight-color":"rgba(0,0,0,0)"},b.style),this.renderToClone||a);this._cursor=a.style.cursor;this.renderer=b.forExport?new Ha(a,c,d,!0):new Va(a,c,d);$&&this.renderer.create(this,a,c,d)},getMargins:function(){var a=this.spacing,b,c=this.legend,d=this.margin,e=this.options.legend, |
|||
f=o(e.margin,10),g=e.x,h=e.y,i=e.align,j=e.verticalAlign,k=this.titleOffset;this.resetMargins();b=this.axisOffset;if(k&&!u(d[0]))this.plotTop=s(this.plotTop,k+this.options.title.margin+a[0]);if(c.display&&!e.floating)if(i==="right"){if(!u(d[1]))this.marginRight=s(this.marginRight,c.legendWidth-g+f+a[1])}else if(i==="left"){if(!u(d[3]))this.plotLeft=s(this.plotLeft,c.legendWidth+g+f+a[3])}else if(j==="top"){if(!u(d[0]))this.plotTop=s(this.plotTop,c.legendHeight+h+f+a[0])}else if(j==="bottom"&&!u(d[2]))this.marginBottom= |
|||
s(this.marginBottom,c.legendHeight-h+f+a[2]);this.extraBottomMargin&&(this.marginBottom+=this.extraBottomMargin);this.extraTopMargin&&(this.plotTop+=this.extraTopMargin);this.hasCartesianSeries&&n(this.axes,function(a){a.getOffset()});u(d[3])||(this.plotLeft+=b[3]);u(d[0])||(this.plotTop+=b[0]);u(d[2])||(this.marginBottom+=b[2]);u(d[1])||(this.marginRight+=b[1]);this.setChartSize()},initReflow:function(){function a(a){var g=c.width||jb(d,"width"),h=c.height||jb(d,"height"),a=a?a.target:O;if(!b.hasUserSize&& |
|||
g&&h&&(a===O||a===y)){if(g!==b.containerWidth||h!==b.containerHeight)clearTimeout(e),b.reflowTimeout=e=setTimeout(function(){if(b.container)b.setSize(g,h,!1),b.hasUserSize=null},100);b.containerWidth=g;b.containerHeight=h}}var b=this,c=b.options.chart,d=b.renderTo,e;b.reflow=a;J(O,"resize",a);J(b,"destroy",function(){aa(O,"resize",a)})},setSize:function(a,b,c){var d=this,e,f,g;d.isResizing+=1;g=function(){d&&z(d,"endResize",null,function(){d.isResizing-=1})};La(c,d);d.oldChartHeight=d.chartHeight; |
|||
d.oldChartWidth=d.chartWidth;if(u(a))d.chartWidth=e=s(0,t(a)),d.hasUserSize=!!e;if(u(b))d.chartHeight=f=s(0,t(b));K(d.container,{width:e+"px",height:f+"px"});d.setChartSize(!0);d.renderer.setSize(e,f,c);d.maxTicks=null;n(d.axes,function(a){a.isDirty=!0;a.setScale()});n(d.series,function(a){a.isDirty=!0});d.isDirtyLegend=!0;d.isDirtyBox=!0;d.getMargins();d.redraw(c);d.oldChartHeight=null;z(d,"resize");Fa===!1?g():setTimeout(g,Fa&&Fa.duration||500)},setChartSize:function(a){var b=this.inverted,c=this.renderer, |
|||
d=this.chartWidth,e=this.chartHeight,f=this.options.chart,g=this.spacing,h=this.clipOffset,i,j,k,l;this.plotLeft=i=t(this.plotLeft);this.plotTop=j=t(this.plotTop);this.plotWidth=k=s(0,t(d-i-this.marginRight));this.plotHeight=l=s(0,t(e-j-this.marginBottom));this.plotSizeX=b?l:k;this.plotSizeY=b?k:l;this.plotBorderWidth=f.plotBorderWidth||0;this.spacingBox=c.spacingBox={x:g[3],y:g[0],width:d-g[3]-g[1],height:e-g[0]-g[2]};this.plotBox=c.plotBox={x:i,y:j,width:k,height:l};d=2*P(this.plotBorderWidth/2); |
|||
b=xa(s(d,h[3])/2);c=xa(s(d,h[0])/2);this.clipBox={x:b,y:c,width:P(this.plotSizeX-s(d,h[1])/2-b),height:P(this.plotSizeY-s(d,h[2])/2-c)};a||n(this.axes,function(a){a.setAxisSize();a.setAxisTranslation()})},resetMargins:function(){var a=this.spacing,b=this.margin;this.plotTop=o(b[0],a[0]);this.marginRight=o(b[1],a[1]);this.marginBottom=o(b[2],a[2]);this.plotLeft=o(b[3],a[3]);this.axisOffset=[0,0,0,0];this.clipOffset=[0,0,0,0]},drawChartBox:function(){var a=this.options.chart,b=this.renderer,c=this.chartWidth, |
|||
d=this.chartHeight,e=this.chartBackground,f=this.plotBackground,g=this.plotBorder,h=this.plotBGImage,i=a.borderWidth||0,j=a.backgroundColor,k=a.plotBackgroundColor,l=a.plotBackgroundImage,m=a.plotBorderWidth||0,p,q=this.plotLeft,o=this.plotTop,n=this.plotWidth,s=this.plotHeight,t=this.plotBox,u=this.clipRect,r=this.clipBox;p=i+(a.shadow?8:0);if(i||j)if(e)e.animate(e.crisp(null,null,null,c-p,d-p));else{e={fill:j||S};if(i)e.stroke=a.borderColor,e["stroke-width"]=i;this.chartBackground=b.rect(p/2,p/ |
|||
2,c-p,d-p,a.borderRadius,i).attr(e).add().shadow(a.shadow)}if(k)f?f.animate(t):this.plotBackground=b.rect(q,o,n,s,0).attr({fill:k}).add().shadow(a.plotShadow);if(l)h?h.animate(t):this.plotBGImage=b.image(l,q,o,n,s).add();u?u.animate({width:r.width,height:r.height}):this.clipRect=b.clipRect(r);if(m)g?g.animate(g.crisp(null,q,o,n,s)):this.plotBorder=b.rect(q,o,n,s,0,-m).attr({stroke:a.plotBorderColor,"stroke-width":m,zIndex:1}).add();this.isDirtyBox=!1},propFromSeries:function(){var a=this,b=a.options.chart, |
|||
c,d=a.options.series,e,f;n(["inverted","angular","polar"],function(g){c=W[b.type||b.defaultSeriesType];f=a[g]||b[g]||c&&c.prototype[g];for(e=d&&d.length;!f&&e--;)(c=W[d[e].type])&&c.prototype[g]&&(f=!0);a[g]=f})},linkSeries:function(){var a=this,b=a.series;n(b,function(a){a.linkedSeries.length=0});n(b,function(b){var d=b.options.linkedTo;if(ea(d)&&(d=d===":previous"?a.series[b.index-1]:a.get(d)))d.linkedSeries.push(b),b.linkedParent=d})},render:function(){var a=this,b=a.axes,c=a.renderer,d=a.options, |
|||
e=d.labels,f=d.credits,g;a.setTitle();a.legend=new eb(a,d.legend);a.getStacks();n(b,function(a){a.setScale()});a.getMargins();a.maxTicks=null;n(b,function(a){a.setTickPositions(!0);a.setMaxTicks()});a.adjustTickAmounts();a.getMargins();a.drawChartBox();a.hasCartesianSeries&&n(b,function(a){a.render()});if(!a.seriesGroup)a.seriesGroup=c.g("series-group").attr({zIndex:3}).add();n(a.series,function(a){a.translate();a.setTooltipPoints();a.render()});e.items&&n(e.items,function(b){var d=r(e.style,b.style), |
|||
f=C(d.left)+a.plotLeft,g=C(d.top)+a.plotTop+12;delete d.left;delete d.top;c.text(b.html,f,g).attr({zIndex:2}).css(d).add()});if(f.enabled&&!a.credits)g=f.href,a.credits=c.text(f.text,0,0).on("click",function(){if(g)location.href=g}).attr({align:f.position.align,zIndex:8}).css(f.style).add().align(f.position);a.hasRendered=!0},destroy:function(){var a=this,b=a.axes,c=a.series,d=a.container,e,f=d&&d.parentNode;z(a,"destroy");Ga[a.index]=w;a.renderTo.removeAttribute("data-highcharts-chart");aa(a);for(e= |
|||
b.length;e--;)b[e]=b[e].destroy();for(e=c.length;e--;)c[e]=c[e].destroy();n("title,subtitle,chartBackground,plotBackground,plotBGImage,plotBorder,seriesGroup,clipRect,credits,pointer,scroller,rangeSelector,legend,resetZoomButton,tooltip,renderer".split(","),function(b){var c=a[b];c&&c.destroy&&(a[b]=c.destroy())});if(d)d.innerHTML="",aa(d),f&&Ta(d);for(e in a)delete a[e]},isReadyToRender:function(){var a=this;return!Z&&O==O.top&&y.readyState!=="complete"||$&&!O.canvg?($?Tb.push(function(){a.firstRender()}, |
|||
a.options.global.canvasToolsURL):y.attachEvent("onreadystatechange",function(){y.detachEvent("onreadystatechange",a.firstRender);y.readyState==="complete"&&a.firstRender()}),!1):!0},firstRender:function(){var a=this,b=a.options,c=a.callback;if(a.isReadyToRender())a.getContainer(),z(a,"init"),a.resetMargins(),a.setChartSize(),a.propFromSeries(),a.getAxes(),n(b.series||[],function(b){a.initSeries(b)}),a.linkSeries(),z(a,"beforeRender"),a.pointer=new xb(a,b),a.render(),a.renderer.draw(),c&&c.apply(a, |
|||
[a]),n(a.callbacks,function(b){b.apply(a,[a])}),a.cloneRenderTo(!0),z(a,"load")},splashArray:function(a,b){var c=b[a],c=T(c)?c:[c,c,c,c];return[o(b[a+"Top"],c[0]),o(b[a+"Right"],c[1]),o(b[a+"Bottom"],c[2]),o(b[a+"Left"],c[3])]}};yb.prototype.callbacks=[];var Pa=function(){};Pa.prototype={init:function(a,b,c){this.series=a;this.applyOptions(b,c);this.pointAttr={};if(a.options.colorByPoint&&(b=a.options.colors||a.chart.options.colors,this.color=this.color||b[a.colorCounter++],a.colorCounter===b.length))a.colorCounter= |
|||
0;a.chart.pointCount++;return this},applyOptions:function(a,b){var c=this.series,d=c.pointValKey,a=Pa.prototype.optionsToObject.call(this,a);r(this,a);this.options=this.options?r(this.options,a):a;if(d)this.y=this[d];if(this.x===w&&c)this.x=b===w?c.autoIncrement():b;return this},optionsToObject:function(a){var b,c=this.series,d=c.pointArrayMap||["y"],e=d.length,f=0,g=0;if(typeof a==="number"||a===null)b={y:a};else if(Ia(a)){b={};if(a.length>e){c=typeof a[0];if(c==="string")b.name=a[0];else if(c=== |
|||
"number")b.x=a[0];f++}for(;g<e;)b[d[g++]]=a[f++]}else if(typeof a==="object"){b=a;if(a.dataLabels)c._hasPointLabels=!0;if(a.marker)c._hasPointMarkers=!0}return b},destroy:function(){var a=this.series.chart,b=a.hoverPoints,c;a.pointCount--;if(b&&(this.setState(),ga(b,this),!b.length))a.hoverPoints=null;if(this===a.hoverPoint)this.onMouseOut();if(this.graphic||this.dataLabel)aa(this),this.destroyElements();this.legendItem&&a.legend.destroyItem(this);for(c in this)this[c]=null},destroyElements:function(){for(var a= |
|||
"graphic,dataLabel,dataLabelUpper,group,connector,shadowGroup".split(","),b,c=6;c--;)b=a[c],this[b]&&(this[b]=this[b].destroy())},getLabelConfig:function(){return{x:this.category,y:this.y,key:this.name||this.category,series:this.series,point:this,percentage:this.percentage,total:this.total||this.stackTotal}},select:function(a,b){var c=this,d=c.series,e=d.chart,a=o(a,!c.selected);c.firePointEvent(a?"select":"unselect",{accumulate:b},function(){c.selected=c.options.selected=a;d.options.data[qa(c,d.data)]= |
|||
c.options;c.setState(a&&"select");b||n(e.getSelectedPoints(),function(a){if(a.selected&&a!==c)a.selected=a.options.selected=!1,d.options.data[qa(a,d.data)]=a.options,a.setState(""),a.firePointEvent("unselect")})})},onMouseOver:function(a){var b=this.series,c=b.chart,d=c.tooltip,e=c.hoverPoint;if(e&&e!==this)e.onMouseOut();this.firePointEvent("mouseOver");d&&(!d.shared||b.noSharedTooltip)&&d.refresh(this,a);this.setState("hover");c.hoverPoint=this},onMouseOut:function(){var a=this.series.chart,b=a.hoverPoints; |
|||
if(!b||qa(this,b)===-1)this.firePointEvent("mouseOut"),this.setState(),a.hoverPoint=null},tooltipFormatter:function(a){var b=this.series,c=b.tooltipOptions,d=o(c.valueDecimals,""),e=c.valuePrefix||"",f=c.valueSuffix||"";n(b.pointArrayMap||["y"],function(b){b="{point."+b;if(e||f)a=a.replace(b+"}",e+b+"}"+f);a=a.replace(b+"}",b+":,."+d+"f}")});return Ca(a,{point:this,series:this.series})},update:function(a,b,c){var d=this,e=d.series,f=d.graphic,g,h=e.data,i=e.chart,j=e.options,b=o(b,!0);d.firePointEvent("update", |
|||
{options:a},function(){d.applyOptions(a);if(T(a)&&(e.getAttribs(),f))a.marker&&a.marker.symbol?d.graphic=f.destroy():f.attr(d.pointAttr[d.state||""]);g=qa(d,h);e.xData[g]=d.x;e.yData[g]=e.toYData?e.toYData(d):d.y;e.zData[g]=d.z;j.data[g]=d.options;e.isDirty=e.isDirtyData=!0;if(!e.fixedBox&&e.hasCartesianSeries)i.isDirtyBox=!0;j.legendType==="point"&&i.legend.destroyItem(d);b&&i.redraw(c)})},remove:function(a,b){var c=this,d=c.series,e=d.points,f=d.chart,g,h=d.data;La(b,f);a=o(a,!0);c.firePointEvent("remove", |
|||
null,function(){g=qa(c,h);h.length===e.length&&e.splice(g,1);h.splice(g,1);d.options.data.splice(g,1);d.xData.splice(g,1);d.yData.splice(g,1);d.zData.splice(g,1);c.destroy();d.isDirty=!0;d.isDirtyData=!0;a&&f.redraw()})},firePointEvent:function(a,b,c){var d=this,e=this.series.options;(e.point.events[a]||d.options&&d.options.events&&d.options.events[a])&&this.importEvents();a==="click"&&e.allowPointSelect&&(c=function(a){d.select(null,a.ctrlKey||a.metaKey||a.shiftKey)});z(this,a,b,c)},importEvents:function(){if(!this.hasImportedEvents){var a= |
|||
x(this.series.options.point,this.options).events,b;this.events=a;for(b in a)J(this,b,a[b]);this.hasImportedEvents=!0}},setState:function(a){var b=this.plotX,c=this.plotY,d=this.series,e=d.options.states,f=Y[d.type].marker&&d.options.marker,g=f&&!f.enabled,h=f&&f.states[a],i=h&&h.enabled===!1,j=d.stateMarkerGraphic,k=this.marker||{},l=d.chart,m=this.pointAttr,a=a||"";if(!(a===this.state||this.selected&&a!=="select"||e[a]&&e[a].enabled===!1||a&&(i||g&&!h.enabled))){if(this.graphic)e=f&&this.graphic.symbolName&& |
|||
m[a].r,this.graphic.attr(x(m[a],e?{x:b-e,y:c-e,width:2*e,height:2*e}:{}));else{if(a&&h)e=h.radius,k=k.symbol||d.symbol,j&&j.currentSymbol!==k&&(j=j.destroy()),j?j.attr({x:b-e,y:c-e}):(d.stateMarkerGraphic=j=l.renderer.symbol(k,b-e,c-e,2*e,2*e).attr(m[a]).add(d.markerGroup),j.currentSymbol=k);if(j)j[a&&l.isInsidePlot(b,c)?"show":"hide"]()}this.state=a}}};var Q=function(){};Q.prototype={isCartesian:!0,type:"line",pointClass:Pa,sorted:!0,requireSorting:!0,pointAttrToOptions:{stroke:"lineColor","stroke-width":"lineWidth", |
|||
fill:"fillColor",r:"radius"},colorCounter:0,init:function(a,b){var c,d,e=a.series;this.chart=a;this.options=b=this.setOptions(b);this.linkedSeries=[];this.bindAxes();r(this,{name:b.name,state:"",pointAttr:{},visible:b.visible!==!1,selected:b.selected===!0});if($)b.animation=!1;d=b.events;for(c in d)J(this,c,d[c]);if(d&&d.click||b.point&&b.point.events&&b.point.events.click||b.allowPointSelect)a.runTrackerClick=!0;this.getColor();this.getSymbol();this.setData(b.data,!1);if(this.isCartesian)a.hasCartesianSeries= |
|||
!0;e.push(this);this._i=e.length-1;Kb(e,function(a,b){return o(a.options.index,a._i)-o(b.options.index,a._i)});n(e,function(a,b){a.index=b;a.name=a.name||"Series "+(b+1)})},bindAxes:function(){var a=this,b=a.options,c=a.chart,d;a.isCartesian&&n(["xAxis","yAxis"],function(e){n(c[e],function(c){d=c.options;if(b[e]===d.index||b[e]!==w&&b[e]===d.id||b[e]===w&&d.index===0)c.series.push(a),a[e]=c,c.isDirty=!0});a[e]||ka(18,!0)})},autoIncrement:function(){var a=this.options,b=this.xIncrement,b=o(b,a.pointStart, |
|||
0);this.pointInterval=o(this.pointInterval,a.pointInterval,1);this.xIncrement=b+this.pointInterval;return b},getSegments:function(){var a=-1,b=[],c,d=this.points,e=d.length;if(e)if(this.options.connectNulls){for(c=e;c--;)d[c].y===null&&d.splice(c,1);d.length&&(b=[d])}else n(d,function(c,g){c.y===null?(g>a+1&&b.push(d.slice(a+1,g)),a=g):g===e-1&&b.push(d.slice(a+1,g+1))});this.segments=b},setOptions:function(a){var b=this.chart.options,c=b.plotOptions,d=c[this.type];this.userOptions=a;a=x(d,c.series, |
|||
a);this.tooltipOptions=x(b.tooltip,a.tooltip);d.marker===null&&delete a.marker;return a},getColor:function(){var a=this.options,b=this.userOptions,c=this.chart.options.colors,d=this.chart.counters,e;e=a.color||Y[this.type].color;if(!e&&!a.colorByPoint)u(b._colorIndex)?a=b._colorIndex:(b._colorIndex=d.color,a=d.color++),e=c[a];this.color=e;d.wrapColor(c.length)},getSymbol:function(){var a=this.userOptions,b=this.options.marker,c=this.chart,d=c.options.symbols,c=c.counters;this.symbol=b.symbol;if(!this.symbol)u(a._symbolIndex)? |
|||
a=a._symbolIndex:(a._symbolIndex=c.symbol,a=c.symbol++),this.symbol=d[a];if(/^url/.test(this.symbol))b.radius=0;c.wrapSymbol(d.length)},drawLegendSymbol:function(a){var b=this.options,c=b.marker,d=a.options,e;e=d.symbolWidth;var f=this.chart.renderer,g=this.legendGroup,a=a.baseline-t(f.fontMetrics(d.itemStyle.fontSize).b*0.3);if(b.lineWidth){d={"stroke-width":b.lineWidth};if(b.dashStyle)d.dashstyle=b.dashStyle;this.legendLine=f.path(["M",0,a,"L",e,a]).attr(d).add(g)}if(c&&c.enabled)b=c.radius,this.legendSymbol= |
|||
e=f.symbol(this.symbol,e/2-b,a-b,2*b,2*b).add(g),e.isMarker=!0},addPoint:function(a,b,c,d){var e=this.options,f=this.data,g=this.graph,h=this.area,i=this.chart,j=this.xData,k=this.yData,l=this.zData,m=this.names,p=g&&g.shift||0,q=e.data,s;La(d,i);c&&n([g,h,this.graphNeg,this.areaNeg],function(a){if(a)a.shift=p+1});if(h)h.isArea=!0;b=o(b,!0);d={series:this};this.pointClass.prototype.applyOptions.apply(d,[a]);g=d.x;h=j.length;if(this.requireSorting&&g<j[h-1])for(s=!0;h&&j[h-1]>g;)h--;j.splice(h,0,g); |
|||
k.splice(h,0,this.toYData?this.toYData(d):d.y);l.splice(h,0,d.z);if(m)m[g]=d.name;q.splice(h,0,a);s&&(this.data.splice(h,0,null),this.processData());e.legendType==="point"&&this.generatePoints();c&&(f[0]&&f[0].remove?f[0].remove(!1):(f.shift(),j.shift(),k.shift(),l.shift(),q.shift()));this.isDirtyData=this.isDirty=!0;b&&(this.getAttribs(),i.redraw())},setData:function(a,b){var c=this.points,d=this.options,e=this.chart,f=null,g=this.xAxis,h=g&&g.categories&&!g.categories.length?[]:null,i;this.xIncrement= |
|||
null;this.pointRange=g&&g.categories?1:d.pointRange;this.colorCounter=0;var j=[],k=[],l=[],m=a?a.length:[];i=o(d.turboThreshold,1E3);var p=this.pointArrayMap,p=p&&p.length,q=!!this.toYData;if(i&&m>i){for(i=0;f===null&&i<m;)f=a[i],i++;if(sa(f)){f=o(d.pointStart,0);d=o(d.pointInterval,1);for(i=0;i<m;i++)j[i]=f,k[i]=a[i],f+=d;this.xIncrement=f}else if(Ia(f))if(p)for(i=0;i<m;i++)d=a[i],j[i]=d[0],k[i]=d.slice(1,p+1);else for(i=0;i<m;i++)d=a[i],j[i]=d[0],k[i]=d[1];else ka(12)}else for(i=0;i<m;i++)if(a[i]!== |
|||
w&&(d={series:this},this.pointClass.prototype.applyOptions.apply(d,[a[i]]),j[i]=d.x,k[i]=q?this.toYData(d):d.y,l[i]=d.z,h&&d.name))h[d.x]=d.name;ea(k[0])&&ka(14,!0);this.data=[];this.options.data=a;this.xData=j;this.yData=k;this.zData=l;this.names=h;for(i=c&&c.length||0;i--;)c[i]&&c[i].destroy&&c[i].destroy();if(g)g.minRange=g.userMinRange;this.isDirty=this.isDirtyData=e.isDirtyBox=!0;o(b,!0)&&e.redraw(!1)},remove:function(a,b){var c=this,d=c.chart,a=o(a,!0);if(!c.isRemoving)c.isRemoving=!0,z(c,"remove", |
|||
null,function(){c.destroy();d.isDirtyLegend=d.isDirtyBox=!0;d.linkSeries();a&&d.redraw(b)});c.isRemoving=!1},processData:function(a){var b=this.xData,c=this.yData,d=b.length,e;e=0;var f,g,h=this.xAxis,i=this.options,j=i.cropThreshold,k=this.isCartesian;if(k&&!this.isDirty&&!h.isDirty&&!this.yAxis.isDirty&&!a)return!1;if(k&&this.sorted&&(!j||d>j||this.forceCrop))if(a=h.min,h=h.max,b[d-1]<a||b[0]>h)b=[],c=[];else if(b[0]<a||b[d-1]>h)e=this.cropData(this.xData,this.yData,a,h),b=e.xData,c=e.yData,e=e.start, |
|||
f=!0;for(h=b.length-1;h>=0;h--)d=b[h]-b[h-1],d>0&&(g===w||d<g)?g=d:d<0&&this.requireSorting&&ka(15);this.cropped=f;this.cropStart=e;this.processedXData=b;this.processedYData=c;if(i.pointRange===null)this.pointRange=g||1;this.closestPointRange=g},cropData:function(a,b,c,d){var e=a.length,f=0,g=e,h=o(this.cropShoulder,1),i;for(i=0;i<e;i++)if(a[i]>=c){f=s(0,i-h);break}for(;i<e;i++)if(a[i]>d){g=i+h;break}return{xData:a.slice(f,g),yData:b.slice(f,g),start:f,end:g}},generatePoints:function(){var a=this.options.data, |
|||
b=this.data,c,d=this.processedXData,e=this.processedYData,f=this.pointClass,g=d.length,h=this.cropStart||0,i,j=this.hasGroupedData,k,l=[],m;if(!b&&!j)b=[],b.length=a.length,b=this.data=b;for(m=0;m<g;m++)i=h+m,j?l[m]=(new f).init(this,[d[m]].concat(ja(e[m]))):(b[i]?k=b[i]:a[i]!==w&&(b[i]=k=(new f).init(this,a[i],d[m])),l[m]=k);if(b&&(g!==(c=b.length)||j))for(m=0;m<c;m++)if(m===h&&!j&&(m+=g),b[m])b[m].destroyElements(),b[m].plotX=w;this.data=b;this.points=l},setStackedPoints:function(){if(this.options.stacking&& |
|||
!(this.visible!==!0&&this.chart.options.chart.ignoreHiddenSeries!==!1)){var a=this.processedXData,b=this.processedYData,c=[],d=b.length,e=this.options,f=e.threshold,g=e.stack,e=e.stacking,h=this.stackKey,i="-"+h,j=this.negStacks,k=this.yAxis,l=k.stacks,m=k.oldStacks,p,q,o,n,t;for(o=0;o<d;o++){n=a[o];t=b[o];q=(p=j&&t<f)?i:h;l[q]||(l[q]={});if(!l[q][n])m[q]&&m[q][n]?(l[q][n]=m[q][n],l[q][n].total=null):l[q][n]=new Mb(k,k.options.stackLabels,p,n,g,e);q=l[q][n];q.points[this.index]=[q.cum||0];e==="percent"? |
|||
(p=p?h:i,j&&l[p]&&l[p][n]?(p=l[p][n],q.total=p.total=s(p.total,q.total)+N(t)||0):q.total+=N(t)||0):q.total+=t||0;q.cum=(q.cum||0)+(t||0);q.points[this.index].push(q.cum);c[o]=q.cum}if(e==="percent")k.usePercentage=!0;this.stackedYData=c;k.oldStacks={}}},setPercentStacks:function(){var a=this,b=a.stackKey,c=a.yAxis.stacks;n([b,"-"+b],function(b){var d;for(var e=a.xData.length,f,g;e--;)if(f=a.xData[e],d=(g=c[b]&&c[b][f])&&g.points[a.index],f=d)g=g.total?100/g.total:0,f[0]=ia(f[0]*g),f[1]=ia(f[1]*g), |
|||
a.stackedYData[e]=f[1]})},getExtremes:function(){var a=this.yAxis,b=this.processedXData,c=this.stackedYData||this.processedYData,d=c.length,e=[],f=0,g=this.xAxis.getExtremes(),h=g.min,g=g.max,i,j,k,l;for(l=0;l<d;l++)if(j=b[l],k=c[l],i=k!==null&&k!==w&&(!a.isLog||k.length||k>0),j=this.getExtremesFromAll||this.cropped||(b[l+1]||j)>=h&&(b[l-1]||j)<=g,i&&j)if(i=k.length)for(;i--;)k[i]!==null&&(e[f++]=k[i]);else e[f++]=k;this.dataMin=o(void 0,Ja(e));this.dataMax=o(void 0,va(e))},translate:function(){this.processedXData|| |
|||
this.processData();this.generatePoints();for(var a=this.options,b=a.stacking,c=this.xAxis,d=c.categories,e=this.yAxis,f=this.points,g=f.length,h=!!this.modifyValue,i=a.pointPlacement,j=i==="between"||sa(i),k=a.threshold,a=0;a<g;a++){var l=f[a],m=l.x,p=l.y,q=l.low,n=e.stacks[(this.negStacks&&p<k?"-":"")+this.stackKey];if(e.isLog&&p<=0)l.y=p=null;l.plotX=c.translate(m,0,0,0,1,i,this.type==="flags");if(b&&this.visible&&n&&n[m])n=n[m],p=n.points[this.index],q=p[0],p=p[1],q===0&&(q=o(k,e.min)),e.isLog&& |
|||
q<=0&&(q=null),l.percentage=b==="percent"&&p,l.total=l.stackTotal=n.total,l.stackY=p,n.setOffset(this.pointXOffset||0,this.barW||0);l.yBottom=u(q)?e.translate(q,0,1,0,1):null;h&&(p=this.modifyValue(p,l));l.plotY=typeof p==="number"&&p!==Infinity?e.translate(p,0,1,0,1):w;l.clientX=j?c.translate(m,0,0,0,1):l.plotX;l.negative=l.y<(k||0);l.category=d&&d[l.x]!==w?d[l.x]:l.x}this.getSegments()},setTooltipPoints:function(a){var b=[],c,d,e=this.xAxis,f=e&&e.getExtremes(),g=e?e.tooltipLen||e.len:this.chart.plotSizeX, |
|||
h,i,j=[];if(this.options.enableMouseTracking!==!1){if(a)this.tooltipPoints=null;n(this.segments||this.points,function(a){b=b.concat(a)});e&&e.reversed&&(b=b.reverse());this.orderTooltipPoints&&this.orderTooltipPoints(b);a=b.length;for(i=0;i<a;i++)if(e=b[i],c=e.x,c>=f.min&&c<=f.max){h=b[i+1];c=d===w?0:d+1;for(d=b[i+1]?I(s(0,P((e.clientX+(h?h.wrappedClientX||h.clientX:g))/2)),g):g;c>=0&&c<=d;)j[c++]=e}this.tooltipPoints=j}},tooltipHeaderFormatter:function(a){var b=this.tooltipOptions,c=b.xDateFormat, |
|||
d=b.dateTimeLabelFormats,e=this.xAxis,f=e&&e.options.type==="datetime",b=b.headerFormat,e=e&&e.closestPointRange,g;if(f&&!c)if(e)for(g in D){if(D[g]>=e){c=d[g];break}}else c=d.day;f&&c&&sa(a.key)&&(b=b.replace("{point.key}","{point.key:"+c+"}"));return Ca(b,{point:a,series:this})},onMouseOver:function(){var a=this.chart,b=a.hoverSeries;if(b&&b!==this)b.onMouseOut();this.options.events.mouseOver&&z(this,"mouseOver");this.setState("hover");a.hoverSeries=this},onMouseOut:function(){var a=this.options, |
|||
b=this.chart,c=b.tooltip,d=b.hoverPoint;if(d)d.onMouseOut();this&&a.events.mouseOut&&z(this,"mouseOut");c&&!a.stickyTracking&&(!c.shared||this.noSharedTooltip)&&c.hide();this.setState();b.hoverSeries=null},animate:function(a){var b=this,c=b.chart,d=c.renderer,e;e=b.options.animation;var f=c.clipBox,g=c.inverted,h;if(e&&!T(e))e=Y[b.type].animation;h="_sharedClip"+e.duration+e.easing;if(a)a=c[h],e=c[h+"m"],a||(c[h]=a=d.clipRect(r(f,{width:0})),c[h+"m"]=e=d.clipRect(-99,g?-c.plotLeft:-c.plotTop,99,g? |
|||
c.chartWidth:c.chartHeight)),b.group.clip(a),b.markerGroup.clip(e),b.sharedClipKey=h;else{if(a=c[h])a.animate({width:c.plotSizeX},e),c[h+"m"].animate({width:c.plotSizeX+99},e);b.animate=null;b.animationTimeout=setTimeout(function(){b.afterAnimate()},e.duration)}},afterAnimate:function(){var a=this.chart,b=this.sharedClipKey,c=this.group;c&&this.options.clip!==!1&&(c.clip(a.clipRect),this.markerGroup.clip());setTimeout(function(){b&&a[b]&&(a[b]=a[b].destroy(),a[b+"m"]=a[b+"m"].destroy())},100)},drawPoints:function(){var a, |
|||
b=this.points,c=this.chart,d,e,f,g,h,i,j,k,l=this.options.marker,m,p=this.markerGroup;if(l.enabled||this._hasPointMarkers)for(f=b.length;f--;)if(g=b[f],d=P(g.plotX),e=g.plotY,k=g.graphic,i=g.marker||{},a=l.enabled&&i.enabled===w||i.enabled,m=c.isInsidePlot(t(d),e,c.inverted),a&&e!==w&&!isNaN(e)&&g.y!==null)if(a=g.pointAttr[g.selected?"select":""],h=a.r,i=o(i.symbol,this.symbol),j=i.indexOf("url")===0,k)k.attr({visibility:m?Z?"inherit":"visible":"hidden"}).animate(r({x:d-h,y:e-h},k.symbolName?{width:2* |
|||
h,height:2*h}:{}));else{if(m&&(h>0||j))g.graphic=c.renderer.symbol(i,d-h,e-h,2*h,2*h).attr(a).add(p)}else if(k)g.graphic=k.destroy()},convertAttribs:function(a,b,c,d){var e=this.pointAttrToOptions,f,g,h={},a=a||{},b=b||{},c=c||{},d=d||{};for(f in e)g=e[f],h[f]=o(a[g],b[f],c[f],d[f]);return h},getAttribs:function(){var a=this,b=a.options,c=Y[a.type].marker?b.marker:b,d=c.states,e=d.hover,f,g=a.color,h={stroke:g,fill:g},i=a.points||[],j=[],k,l=a.pointAttrToOptions,m=b.negativeColor,p=c.lineColor,q; |
|||
b.marker?(e.radius=e.radius||c.radius+2,e.lineWidth=e.lineWidth||c.lineWidth+1):e.color=e.color||ra(e.color||g).brighten(e.brightness).get();j[""]=a.convertAttribs(c,h);n(["hover","select"],function(b){j[b]=a.convertAttribs(d[b],j[""])});a.pointAttr=j;for(g=i.length;g--;){h=i[g];if((c=h.options&&h.options.marker||h.options)&&c.enabled===!1)c.radius=0;if(h.negative&&m)h.color=h.fillColor=m;f=b.colorByPoint||h.color;if(h.options)for(q in l)u(c[l[q]])&&(f=!0);if(f){c=c||{};k=[];d=c.states||{};f=d.hover= |
|||
d.hover||{};if(!b.marker)f.color=ra(f.color||h.color).brighten(f.brightness||e.brightness).get();k[""]=a.convertAttribs(r({color:h.color,fillColor:h.color,lineColor:p===null?h.color:w},c),j[""]);k.hover=a.convertAttribs(d.hover,j.hover,k[""]);k.select=a.convertAttribs(d.select,j.select,k[""])}else k=j;h.pointAttr=k}},update:function(a,b){var c=this.chart,d=this.type,e=W[d].prototype,f,a=x(this.userOptions,{animation:!1,index:this.index,pointStart:this.xData[0]},{data:this.options.data},a);this.remove(!1); |
|||
for(f in e)e.hasOwnProperty(f)&&(this[f]=w);r(this,W[a.type||d].prototype);this.init(c,a);o(b,!0)&&c.redraw(!1)},destroy:function(){var a=this,b=a.chart,c=/AppleWebKit\/533/.test(oa),d,e,f=a.data||[],g,h,i;z(a,"destroy");aa(a);n(["xAxis","yAxis"],function(b){if(i=a[b])ga(i.series,a),i.isDirty=i.forceRedraw=!0,i.stacks={}});a.legendItem&&a.chart.legend.destroyItem(a);for(e=f.length;e--;)(g=f[e])&&g.destroy&&g.destroy();a.points=null;clearTimeout(a.animationTimeout);n("area,graph,dataLabelsGroup,group,markerGroup,tracker,graphNeg,areaNeg,posClip,negClip".split(","), |
|||
function(b){a[b]&&(d=c&&b==="group"?"hide":"destroy",a[b][d]())});if(b.hoverSeries===a)b.hoverSeries=null;ga(b.series,a);for(h in a)delete a[h]},drawDataLabels:function(){var a=this,b=a.options.dataLabels,c=a.points,d,e,f,g;if(b.enabled||a._hasPointLabels)a.dlProcessOptions&&a.dlProcessOptions(b),g=a.plotGroup("dataLabelsGroup","data-labels",a.visible?"visible":"hidden",b.zIndex||6),e=b,n(c,function(c){var i,j=c.dataLabel,k,l,m=c.connector,p=!0;d=c.options&&c.options.dataLabels;i=o(d&&d.enabled,e.enabled); |
|||
if(j&&!i)c.dataLabel=j.destroy();else if(i){b=x(e,d);i=b.rotation;k=c.getLabelConfig();f=b.format?Ca(b.format,k):b.formatter.call(k,b);b.style.color=o(b.color,b.style.color,a.color,"black");if(j)if(u(f))j.attr({text:f}),p=!1;else{if(c.dataLabel=j=j.destroy(),m)c.connector=m.destroy()}else if(u(f)){j={fill:b.backgroundColor,stroke:b.borderColor,"stroke-width":b.borderWidth,r:b.borderRadius||0,rotation:i,padding:b.padding,zIndex:1};for(l in j)j[l]===w&&delete j[l];j=c.dataLabel=a.chart.renderer[i?"text": |
|||
"label"](f,0,-999,null,null,null,b.useHTML).attr(j).css(b.style).add(g).shadow(b.shadow)}j&&a.alignDataLabel(c,j,b,null,p)}})},alignDataLabel:function(a,b,c,d,e){var f=this.chart,g=f.inverted,h=o(a.plotX,-999),i=o(a.plotY,-999),j=b.getBBox();if(a=this.visible&&f.isInsidePlot(a.plotX,a.plotY,g))d=r({x:g?f.plotWidth-i:h,y:t(g?f.plotHeight-h:i),width:0,height:0},d),r(c,{width:j.width,height:j.height}),c.rotation?(g={align:c.align,x:d.x+c.x+d.width/2,y:d.y+c.y+d.height/2},b[e?"attr":"animate"](g)):(b.align(c, |
|||
null,d),g=b.alignAttr,o(c.overflow,"justify")==="justify"?this.justifyDataLabel(b,c,g,j,d,e):o(c.crop,!0)&&(a=f.isInsidePlot(g.x,g.y)&&f.isInsidePlot(g.x+j.width,g.y+j.height)));a||b.attr({y:-999})},justifyDataLabel:function(a,b,c,d,e,f){var g=this.chart,h=b.align,i=b.verticalAlign,j,k;j=c.x;if(j<0)h==="right"?b.align="left":b.x=-j,k=!0;j=c.x+d.width;if(j>g.plotWidth)h==="left"?b.align="right":b.x=g.plotWidth-j,k=!0;j=c.y;if(j<0)i==="bottom"?b.verticalAlign="top":b.y=-j,k=!0;j=c.y+d.height;if(j>g.plotHeight)i=== |
|||
"top"?b.verticalAlign="bottom":b.y=g.plotHeight-j,k=!0;if(k)a.placed=!f,a.align(b,null,e)},getSegmentPath:function(a){var b=this,c=[],d=b.options.step;n(a,function(e,f){var g=e.plotX,h=e.plotY,i;b.getPointSpline?c.push.apply(c,b.getPointSpline(a,e,f)):(c.push(f?"L":"M"),d&&f&&(i=a[f-1],d==="right"?c.push(i.plotX,h):d==="center"?c.push((i.plotX+g)/2,i.plotY,(i.plotX+g)/2,h):c.push(g,i.plotY)),c.push(e.plotX,e.plotY))});return c},getGraphPath:function(){var a=this,b=[],c,d=[];n(a.segments,function(e){c= |
|||
a.getSegmentPath(e);e.length>1?b=b.concat(c):d.push(e[0])});a.singlePoints=d;return a.graphPath=b},drawGraph:function(){var a=this,b=this.options,c=[["graph",b.lineColor||this.color]],d=b.lineWidth,e=b.dashStyle,f=this.getGraphPath(),g=b.negativeColor;g&&c.push(["graphNeg",g]);n(c,function(c,g){var j=c[0],k=a[j];if(k)Wa(k),k.animate({d:f});else if(d&&f.length)k={stroke:c[1],"stroke-width":d,zIndex:1},e?k.dashstyle=e:k["stroke-linecap"]=k["stroke-linejoin"]="round",a[j]=a.chart.renderer.path(f).attr(k).add(a.group).shadow(!g&& |
|||
b.shadow)})},clipNeg:function(){var a=this.options,b=this.chart,c=b.renderer,d=a.negativeColor||a.negativeFillColor,e,f=this.graph,g=this.area,h=this.posClip,i=this.negClip;e=b.chartWidth;var j=b.chartHeight,k=s(e,j),l=this.yAxis;if(d&&(f||g)){d=t(l.toPixels(a.threshold||0,!0));a={x:0,y:0,width:k,height:d};k={x:0,y:d,width:k,height:k};if(b.inverted)a.height=k.y=b.plotWidth-d,c.isVML&&(a={x:b.plotWidth-d-b.plotLeft,y:0,width:e,height:j},k={x:d+b.plotLeft-e,y:0,width:b.plotLeft+d,height:e});l.reversed? |
|||
(b=k,e=a):(b=a,e=k);h?(h.animate(b),i.animate(e)):(this.posClip=h=c.clipRect(b),this.negClip=i=c.clipRect(e),f&&this.graphNeg&&(f.clip(h),this.graphNeg.clip(i)),g&&(g.clip(h),this.areaNeg.clip(i)))}},invertGroups:function(){function a(){var a={width:b.yAxis.len,height:b.xAxis.len};n(["group","markerGroup"],function(c){b[c]&&b[c].attr(a).invert()})}var b=this,c=b.chart;if(b.xAxis)J(c,"resize",a),J(b,"destroy",function(){aa(c,"resize",a)}),a(),b.invertGroups=a},plotGroup:function(a,b,c,d,e){var f=this[a], |
|||
g=!f;g&&(this[a]=f=this.chart.renderer.g(b).attr({visibility:c,zIndex:d||0.1}).add(e));f[g?"attr":"animate"](this.getPlotBox());return f},getPlotBox:function(){return{translateX:this.xAxis?this.xAxis.left:this.chart.plotLeft,translateY:this.yAxis?this.yAxis.top:this.chart.plotTop,scaleX:1,scaleY:1}},render:function(){var a=this.chart,b,c=this.options,d=c.animation&&!!this.animate&&a.renderer.isSVG,e=this.visible?"visible":"hidden",f=c.zIndex,g=this.hasRendered,h=a.seriesGroup;b=this.plotGroup("group", |
|||
"series",e,f,h);this.markerGroup=this.plotGroup("markerGroup","markers",e,f,h);d&&this.animate(!0);this.getAttribs();b.inverted=this.isCartesian?a.inverted:!1;this.drawGraph&&(this.drawGraph(),this.clipNeg());this.drawDataLabels();this.drawPoints();this.options.enableMouseTracking!==!1&&this.drawTracker();a.inverted&&this.invertGroups();c.clip!==!1&&!this.sharedClipKey&&!g&&b.clip(a.clipRect);d?this.animate():g||this.afterAnimate();this.isDirty=this.isDirtyData=!1;this.hasRendered=!0},redraw:function(){var a= |
|||
this.chart,b=this.isDirtyData,c=this.group,d=this.xAxis,e=this.yAxis;c&&(a.inverted&&c.attr({width:a.plotWidth,height:a.plotHeight}),c.animate({translateX:o(d&&d.left,a.plotLeft),translateY:o(e&&e.top,a.plotTop)}));this.translate();this.setTooltipPoints(!0);this.render();b&&z(this,"updatedData")},setState:function(a){var b=this.options,c=this.graph,d=this.graphNeg,e=b.states,b=b.lineWidth,a=a||"";if(this.state!==a)this.state=a,e[a]&&e[a].enabled===!1||(a&&(b=e[a].lineWidth||b+1),c&&!c.dashstyle&& |
|||
(a={"stroke-width":b},c.attr(a),d&&d.attr(a)))},setVisible:function(a,b){var c=this,d=c.chart,e=c.legendItem,f,g=d.options.chart.ignoreHiddenSeries,h=c.visible;f=(c.visible=a=c.userOptions.visible=a===w?!h:a)?"show":"hide";n(["group","dataLabelsGroup","markerGroup","tracker"],function(a){if(c[a])c[a][f]()});if(d.hoverSeries===c)c.onMouseOut();e&&d.legend.colorizeItem(c,a);c.isDirty=!0;c.options.stacking&&n(d.series,function(a){if(a.options.stacking&&a.visible)a.isDirty=!0});n(c.linkedSeries,function(b){b.setVisible(a, |
|||
!1)});if(g)d.isDirtyBox=!0;b!==!1&&d.redraw();z(c,f)},show:function(){this.setVisible(!0)},hide:function(){this.setVisible(!1)},select:function(a){this.selected=a=a===w?!this.selected:a;if(this.checkbox)this.checkbox.checked=a;z(this,a?"select":"unselect")},drawTracker:function(){var a=this,b=a.options,c=b.trackByArea,d=[].concat(c?a.areaPath:a.graphPath),e=d.length,f=a.chart,g=f.pointer,h=f.renderer,i=f.options.tooltip.snap,j=a.tracker,k=b.cursor,l=k&&{cursor:k},k=a.singlePoints,m,p=function(){if(f.hoverSeries!== |
|||
a)a.onMouseOver()};if(e&&!c)for(m=e+1;m--;)d[m]==="M"&&d.splice(m+1,0,d[m+1]-i,d[m+2],"L"),(m&&d[m]==="M"||m===e)&&d.splice(m,0,"L",d[m-2]+i,d[m-1]);for(m=0;m<k.length;m++)e=k[m],d.push("M",e.plotX-i,e.plotY,"L",e.plotX+i,e.plotY);j?j.attr({d:d}):(a.tracker=h.path(d).attr({"stroke-linejoin":"round",visibility:a.visible?"visible":"hidden",stroke:Qb,fill:c?Qb:S,"stroke-width":b.lineWidth+(c?0:2*i),zIndex:2}).add(a.group),n([a.tracker,a.markerGroup],function(a){a.addClass("highcharts-tracker").on("mouseover", |
|||
p).on("mouseout",function(a){g.onTrackerMouseOut(a)}).css(l);if(ib)a.on("touchstart",p)}))}};G=ha(Q);W.line=G;Y.area=x(X,{threshold:0});G=ha(Q,{type:"area",getSegments:function(){var a=[],b=[],c=[],d=this.xAxis,e=this.yAxis,f=e.stacks[this.stackKey],g={},h,i,j=this.points,k=this.options.connectNulls,l,m,p;if(this.options.stacking&&!this.cropped){for(m=0;m<j.length;m++)g[j[m].x]=j[m];for(p in f)c.push(+p);c.sort(function(a,b){return a-b});n(c,function(a){if(!k||g[a]&&g[a].y!==null)g[a]?b.push(g[a]): |
|||
(h=d.translate(a),l=f[a].percent?f[a].total?f[a].cum*100/f[a].total:0:f[a].cum,i=e.toPixels(l,!0),b.push({y:null,plotX:h,clientX:h,plotY:i,yBottom:i,onMouseOver:pa}))});b.length&&a.push(b)}else Q.prototype.getSegments.call(this),a=this.segments;this.segments=a},getSegmentPath:function(a){var b=Q.prototype.getSegmentPath.call(this,a),c=[].concat(b),d,e=this.options;d=b.length;var f=this.yAxis.getThreshold(e.threshold),g;d===3&&c.push("L",b[1],b[2]);if(e.stacking&&!this.closedStacks)for(d=a.length- |
|||
1;d>=0;d--)g=o(a[d].yBottom,f),d<a.length-1&&e.step&&c.push(a[d+1].plotX,g),c.push(a[d].plotX,g);else this.closeSegment(c,a,f);this.areaPath=this.areaPath.concat(c);return b},closeSegment:function(a,b,c){a.push("L",b[b.length-1].plotX,c,"L",b[0].plotX,c)},drawGraph:function(){this.areaPath=[];Q.prototype.drawGraph.apply(this);var a=this,b=this.areaPath,c=this.options,d=c.negativeColor,e=c.negativeFillColor,f=[["area",this.color,c.fillColor]];(d||e)&&f.push(["areaNeg",d,e]);n(f,function(d){var e=d[0], |
|||
f=a[e];f?f.animate({d:b}):a[e]=a.chart.renderer.path(b).attr({fill:o(d[2],ra(d[1]).setOpacity(o(c.fillOpacity,0.75)).get()),zIndex:0}).add(a.group)})},drawLegendSymbol:function(a,b){b.legendSymbol=this.chart.renderer.rect(0,a.baseline-11,a.options.symbolWidth,12,2).attr({zIndex:3}).add(b.legendGroup)}});W.area=G;Y.spline=x(X);F=ha(Q,{type:"spline",getPointSpline:function(a,b,c){var d=b.plotX,e=b.plotY,f=a[c-1],g=a[c+1],h,i,j,k;if(f&&g){a=f.plotY;j=g.plotX;var g=g.plotY,l;h=(1.5*d+f.plotX)/2.5;i=(1.5* |
|||
e+a)/2.5;j=(1.5*d+j)/2.5;k=(1.5*e+g)/2.5;l=(k-i)*(j-d)/(j-h)+e-k;i+=l;k+=l;i>a&&i>e?(i=s(a,e),k=2*e-i):i<a&&i<e&&(i=I(a,e),k=2*e-i);k>g&&k>e?(k=s(g,e),i=2*e-k):k<g&&k<e&&(k=I(g,e),i=2*e-k);b.rightContX=j;b.rightContY=k}c?(b=["C",f.rightContX||f.plotX,f.rightContY||f.plotY,h||d,i||e,d,e],f.rightContX=f.rightContY=null):b=["M",d,e];return b}});W.spline=F;Y.areaspline=x(Y.area);ma=G.prototype;F=ha(F,{type:"areaspline",closedStacks:!0,getSegmentPath:ma.getSegmentPath,closeSegment:ma.closeSegment,drawGraph:ma.drawGraph, |
|||
drawLegendSymbol:ma.drawLegendSymbol});W.areaspline=F;Y.column=x(X,{borderColor:"#FFFFFF",borderWidth:1,borderRadius:0,groupPadding:0.2,marker:null,pointPadding:0.1,minPointLength:0,cropThreshold:50,pointRange:null,states:{hover:{brightness:0.1,shadow:!1},select:{color:"#C0C0C0",borderColor:"#000000",shadow:!1}},dataLabels:{align:null,verticalAlign:null,y:null},stickyTracking:!1,threshold:0});F=ha(Q,{type:"column",pointAttrToOptions:{stroke:"borderColor","stroke-width":"borderWidth",fill:"color", |
|||
r:"borderRadius"},cropShoulder:0,trackerGroups:["group","dataLabelsGroup"],negStacks:!0,init:function(){Q.prototype.init.apply(this,arguments);var a=this,b=a.chart;b.hasRendered&&n(b.series,function(b){if(b.type===a.type)b.isDirty=!0})},getColumnMetrics:function(){var a=this,b=a.options,c=a.xAxis,d=a.yAxis,e=c.reversed,f,g={},h,i=0;b.grouping===!1?i=1:n(a.chart.series,function(b){var c=b.options,e=b.yAxis;if(b.type===a.type&&b.visible&&d.len===e.len&&d.pos===e.pos)c.stacking?(f=b.stackKey,g[f]=== |
|||
w&&(g[f]=i++),h=g[f]):c.grouping!==!1&&(h=i++),b.columnIndex=h});var c=I(N(c.transA)*(c.ordinalSlope||b.pointRange||c.closestPointRange||1),c.len),j=c*b.groupPadding,k=(c-2*j)/i,l=b.pointWidth,b=u(l)?(k-l)/2:k*b.pointPadding,l=o(l,k-2*b);return a.columnMetrics={width:l,offset:b+(j+((e?i-(a.columnIndex||0):a.columnIndex)||0)*k-c/2)*(e?-1:1)}},translate:function(){var a=this.chart,b=this.options,c=b.borderWidth,d=this.yAxis,e=this.translatedThreshold=d.getThreshold(b.threshold),f=o(b.minPointLength, |
|||
5),b=this.getColumnMetrics(),g=b.width,h=this.barW=xa(s(g,1+2*c)),i=this.pointXOffset=b.offset,j=-(c%2?0.5:0),k=c%2?0.5:1;a.renderer.isVML&&a.inverted&&(k+=1);Q.prototype.translate.apply(this);n(this.points,function(a){var b=o(a.yBottom,e),c=I(s(-999-b,a.plotY),d.len+999+b),n=a.plotX+i,u=h,r=I(c,b),w,c=s(c,b)-r;N(c)<f&&f&&(c=f,r=t(N(r-e)>f?b-f:e-(d.translate(a.y,0,1,0,1)<=e?f:0)));a.barX=n;a.pointWidth=g;b=N(n)<0.5;u=t(n+u)+j;n=t(n)+j;u-=n;w=N(r)<0.5;c=t(r+c)+k;r=t(r)+k;c-=r;b&&(n+=1,u-=1);w&&(r-= |
|||
1,c+=1);a.shapeType="rect";a.shapeArgs={x:n,y:r,width:u,height:c}})},getSymbol:pa,drawLegendSymbol:G.prototype.drawLegendSymbol,drawGraph:pa,drawPoints:function(){var a=this,b=a.options,c=a.chart.renderer,d;n(a.points,function(e){var f=e.plotY,g=e.graphic;if(f!==w&&!isNaN(f)&&e.y!==null)d=e.shapeArgs,g?(Wa(g),g.animate(x(d))):e.graphic=c[e.shapeType](d).attr(e.pointAttr[e.selected?"select":""]).add(a.group).shadow(b.shadow,null,b.stacking&&!b.borderRadius);else if(g)e.graphic=g.destroy()})},drawTracker:function(){var a= |
|||
this,b=a.chart,c=b.pointer,d=a.options.cursor,e=d&&{cursor:d},f=function(c){var d=c.target,e;if(b.hoverSeries!==a)a.onMouseOver();for(;d&&!e;)e=d.point,d=d.parentNode;if(e!==w&&e!==b.hoverPoint)e.onMouseOver(c)};n(a.points,function(a){if(a.graphic)a.graphic.element.point=a;if(a.dataLabel)a.dataLabel.element.point=a});if(!a._hasTracking)n(a.trackerGroups,function(b){if(a[b]&&(a[b].addClass("highcharts-tracker").on("mouseover",f).on("mouseout",function(a){c.onTrackerMouseOut(a)}).css(e),ib))a[b].on("touchstart", |
|||
f)}),a._hasTracking=!0},alignDataLabel:function(a,b,c,d,e){var f=this.chart,g=f.inverted,h=a.dlBox||a.shapeArgs,i=a.below||a.plotY>o(this.translatedThreshold,f.plotSizeY),j=o(c.inside,!!this.options.stacking);if(h&&(d=x(h),g&&(d={x:f.plotWidth-d.y-d.height,y:f.plotHeight-d.x-d.width,width:d.height,height:d.width}),!j))g?(d.x+=i?0:d.width,d.width=0):(d.y+=i?d.height:0,d.height=0);c.align=o(c.align,!g||j?"center":i?"right":"left");c.verticalAlign=o(c.verticalAlign,g||j?"middle":i?"top":"bottom");Q.prototype.alignDataLabel.call(this, |
|||
a,b,c,d,e)},animate:function(a){var b=this.yAxis,c=this.options,d=this.chart.inverted,e={};if(Z)a?(e.scaleY=0.001,a=I(b.pos+b.len,s(b.pos,b.toPixels(c.threshold))),d?e.translateX=a-b.len:e.translateY=a,this.group.attr(e)):(e.scaleY=1,e[d?"translateX":"translateY"]=b.pos,this.group.animate(e,this.options.animation),this.animate=null)},remove:function(){var a=this,b=a.chart;b.hasRendered&&n(b.series,function(b){if(b.type===a.type)b.isDirty=!0});Q.prototype.remove.apply(a,arguments)}});W.column=F;Y.bar= |
|||
x(Y.column);ma=ha(F,{type:"bar",inverted:!0});W.bar=ma;Y.scatter=x(X,{lineWidth:0,tooltip:{headerFormat:'<span style="font-size: 10px; color:{series.color}">{series.name}</span><br/>',pointFormat:"x: <b>{point.x}</b><br/>y: <b>{point.y}</b><br/>",followPointer:!0},stickyTracking:!1});ma=ha(Q,{type:"scatter",sorted:!1,requireSorting:!1,noSharedTooltip:!0,trackerGroups:["markerGroup"],drawTracker:F.prototype.drawTracker,setTooltipPoints:pa});W.scatter=ma;Y.pie=x(X,{borderColor:"#FFFFFF",borderWidth:1, |
|||
center:[null,null],clip:!1,colorByPoint:!0,dataLabels:{distance:30,enabled:!0,formatter:function(){return this.point.name}},ignoreHiddenPoint:!0,legendType:"point",marker:null,size:null,showInLegend:!1,slicedOffset:10,states:{hover:{brightness:0.1,shadow:!1}},stickyTracking:!1,tooltip:{followPointer:!0}});X={type:"pie",isCartesian:!1,pointClass:ha(Pa,{init:function(){Pa.prototype.init.apply(this,arguments);var a=this,b;if(a.y<0)a.y=null;r(a,{visible:a.visible!==!1,name:o(a.name,"Slice")});b=function(b){a.slice(b.type=== |
|||
"select")};J(a,"select",b);J(a,"unselect",b);return a},setVisible:function(a){var b=this,c=b.series,d=c.chart,e;b.visible=b.options.visible=a=a===w?!b.visible:a;c.options.data[qa(b,c.data)]=b.options;e=a?"show":"hide";n(["graphic","dataLabel","connector","shadowGroup"],function(a){if(b[a])b[a][e]()});b.legendItem&&d.legend.colorizeItem(b,a);if(!c.isDirty&&c.options.ignoreHiddenPoint)c.isDirty=!0,d.redraw()},slice:function(a,b,c){var d=this.series;La(c,d.chart);o(b,!0);this.sliced=this.options.sliced= |
|||
a=u(a)?a:!this.sliced;d.options.data[qa(this,d.data)]=this.options;a=a?this.slicedTranslation:{translateX:0,translateY:0};this.graphic.animate(a);this.shadowGroup&&this.shadowGroup.animate(a)}}),requireSorting:!1,noSharedTooltip:!0,trackerGroups:["group","dataLabelsGroup"],pointAttrToOptions:{stroke:"borderColor","stroke-width":"borderWidth",fill:"color"},getColor:pa,animate:function(a){var b=this,c=b.points,d=b.startAngleRad;if(!a)n(c,function(a){var c=a.graphic,a=a.shapeArgs;c&&(c.attr({r:b.center[3]/ |
|||
2,start:d,end:d}),c.animate({r:a.r,start:a.start,end:a.end},b.options.animation))}),b.animate=null},setData:function(a,b){Q.prototype.setData.call(this,a,!1);this.processData();this.generatePoints();o(b,!0)&&this.chart.redraw()},generatePoints:function(){var a,b=0,c,d,e,f=this.options.ignoreHiddenPoint;Q.prototype.generatePoints.call(this);c=this.points;d=c.length;for(a=0;a<d;a++)e=c[a],b+=f&&!e.visible?0:e.y;this.total=b;for(a=0;a<d;a++)e=c[a],e.percentage=b>0?e.y/b*100:0,e.total=b},getCenter:function(){var a= |
|||
this.options,b=this.chart,c=2*(a.slicedOffset||0),d,e=b.plotWidth-2*c,f=b.plotHeight-2*c,b=a.center,a=[o(b[0],"50%"),o(b[1],"50%"),a.size||"100%",a.innerSize||0],g=I(e,f),h;return Na(a,function(a,b){h=/%$/.test(a);d=b<2||b===2&&h;return(h?[e,f,g,g][b]*C(a)/100:a)+(d?c:0)})},translate:function(a){this.generatePoints();var b=0,c=this.options,d=c.slicedOffset,e=d+c.borderWidth,f,g,h,i=c.startAngle||0,j=this.startAngleRad=ya/180*(i-90),i=(this.endAngleRad=ya/180*((c.endAngle||i+360)-90))-j,k=this.points, |
|||
l=c.dataLabels.distance,c=c.ignoreHiddenPoint,m,n=k.length,o;if(!a)this.center=a=this.getCenter();this.getX=function(b,c){h=R.asin((b-a[1])/(a[2]/2+l));return a[0]+(c?-1:1)*V(h)*(a[2]/2+l)};for(m=0;m<n;m++){o=k[m];f=j+b*i;if(!c||o.visible)b+=o.percentage/100;g=j+b*i;o.shapeType="arc";o.shapeArgs={x:a[0],y:a[1],r:a[2]/2,innerR:a[3]/2,start:t(f*1E3)/1E3,end:t(g*1E3)/1E3};h=(g+f)/2;h>0.75*i&&(h-=2*ya);o.slicedTranslation={translateX:t(V(h)*d),translateY:t(ca(h)*d)};f=V(h)*a[2]/2;g=ca(h)*a[2]/2;o.tooltipPos= |
|||
[a[0]+f*0.7,a[1]+g*0.7];o.half=h<-ya/2||h>ya/2?1:0;o.angle=h;e=I(e,l/2);o.labelPos=[a[0]+f+V(h)*l,a[1]+g+ca(h)*l,a[0]+f+V(h)*e,a[1]+g+ca(h)*e,a[0]+f,a[1]+g,l<0?"center":o.half?"right":"left",h]}},setTooltipPoints:pa,drawGraph:null,drawPoints:function(){var a=this,b=a.chart.renderer,c,d,e=a.options.shadow,f,g;if(e&&!a.shadowGroup)a.shadowGroup=b.g("shadow").add(a.group);n(a.points,function(h){d=h.graphic;g=h.shapeArgs;f=h.shadowGroup;if(e&&!f)f=h.shadowGroup=b.g("shadow").add(a.shadowGroup);c=h.sliced? |
|||
h.slicedTranslation:{translateX:0,translateY:0};f&&f.attr(c);d?d.animate(r(g,c)):h.graphic=d=b.arc(g).setRadialReference(a.center).attr(h.pointAttr[h.selected?"select":""]).attr({"stroke-linejoin":"round"}).attr(c).add(a.group).shadow(e,f);h.visible===!1&&h.setVisible(!1)})},sortByAngle:function(a,b){a.sort(function(a,d){return a.angle!==void 0&&(d.angle-a.angle)*b})},drawDataLabels:function(){var a=this,b=a.data,c,d=a.chart,e=a.options.dataLabels,f=o(e.connectorPadding,10),g=o(e.connectorWidth,1), |
|||
h=d.plotWidth,d=d.plotHeight,i,j,k=o(e.softConnector,!0),l=e.distance,m=a.center,p=m[2]/2,q=m[1],u=l>0,r,w,v,x,C=[[],[]],y,z,E,H,B,D=[0,0,0,0],I=function(a,b){return b.y-a.y};if(a.visible&&(e.enabled||a._hasPointLabels)){Q.prototype.drawDataLabels.apply(a);n(b,function(a){a.dataLabel&&C[a.half].push(a)});for(H=0;!x&&b[H];)x=b[H]&&b[H].dataLabel&&(b[H].dataLabel.getBBox().height||21),H++;for(H=2;H--;){var b=[],K=[],G=C[H],J=G.length,F;a.sortByAngle(G,H-0.5);if(l>0){for(B=q-p-l;B<=q+p+l;B+=x)b.push(B); |
|||
w=b.length;if(J>w){c=[].concat(G);c.sort(I);for(B=J;B--;)c[B].rank=B;for(B=J;B--;)G[B].rank>=w&&G.splice(B,1);J=G.length}for(B=0;B<J;B++){c=G[B];v=c.labelPos;c=9999;var O,M;for(M=0;M<w;M++)O=N(b[M]-v[1]),O<c&&(c=O,F=M);if(F<B&&b[B]!==null)F=B;else for(w<J-B+F&&b[B]!==null&&(F=w-J+B);b[F]===null;)F++;K.push({i:F,y:b[F]});b[F]=null}K.sort(I)}for(B=0;B<J;B++){c=G[B];v=c.labelPos;r=c.dataLabel;E=c.visible===!1?"hidden":"visible";c=v[1];if(l>0){if(w=K.pop(),F=w.i,z=w.y,c>z&&b[F+1]!==null||c<z&&b[F-1]!== |
|||
null)z=c}else z=c;y=e.justify?m[0]+(H?-1:1)*(p+l):a.getX(F===0||F===b.length-1?c:z,H);r._attr={visibility:E,align:v[6]};r._pos={x:y+e.x+({left:f,right:-f}[v[6]]||0),y:z+e.y-10};r.connX=y;r.connY=z;if(this.options.size===null)w=r.width,y-w<f?D[3]=s(t(w-y+f),D[3]):y+w>h-f&&(D[1]=s(t(y+w-h+f),D[1])),z-x/2<0?D[0]=s(t(-z+x/2),D[0]):z+x/2>d&&(D[2]=s(t(z+x/2-d),D[2]))}}if(va(D)===0||this.verifyDataLabelOverflow(D))this.placeDataLabels(),u&&g&&n(this.points,function(b){i=b.connector;v=b.labelPos;if((r=b.dataLabel)&& |
|||
r._pos)E=r._attr.visibility,y=r.connX,z=r.connY,j=k?["M",y+(v[6]==="left"?5:-5),z,"C",y,z,2*v[2]-v[4],2*v[3]-v[5],v[2],v[3],"L",v[4],v[5]]:["M",y+(v[6]==="left"?5:-5),z,"L",v[2],v[3],"L",v[4],v[5]],i?(i.animate({d:j}),i.attr("visibility",E)):b.connector=i=a.chart.renderer.path(j).attr({"stroke-width":g,stroke:e.connectorColor||b.color||"#606060",visibility:E}).add(a.group);else if(i)b.connector=i.destroy()})}},verifyDataLabelOverflow:function(a){var b=this.center,c=this.options,d=c.center,e=c=c.minSize|| |
|||
80,f;d[0]!==null?e=s(b[2]-s(a[1],a[3]),c):(e=s(b[2]-a[1]-a[3],c),b[0]+=(a[3]-a[1])/2);d[1]!==null?e=s(I(e,b[2]-s(a[0],a[2])),c):(e=s(I(e,b[2]-a[0]-a[2]),c),b[1]+=(a[0]-a[2])/2);e<b[2]?(b[2]=e,this.translate(b),n(this.points,function(a){if(a.dataLabel)a.dataLabel._pos=null}),this.drawDataLabels()):f=!0;return f},placeDataLabels:function(){n(this.points,function(a){var a=a.dataLabel,b;if(a)(b=a._pos)?(a.attr(a._attr),a[a.moved?"animate":"attr"](b),a.moved=!0):a&&a.attr({y:-999})})},alignDataLabel:pa, |
|||
drawTracker:F.prototype.drawTracker,drawLegendSymbol:G.prototype.drawLegendSymbol,getSymbol:pa};X=ha(Q,X);W.pie=X;r(Highcharts,{Axis:db,Chart:yb,Color:ra,Legend:eb,Pointer:xb,Point:Pa,Tick:Ma,Tooltip:wb,Renderer:Va,Series:Q,SVGElement:wa,SVGRenderer:Ha,arrayMin:Ja,arrayMax:va,charts:Ga,dateFormat:Xa,format:Ca,pathAnim:Ab,getOptions:function(){return M},hasBidiBug:Ub,isTouchDevice:Ob,numberFormat:Aa,seriesTypes:W,setOptions:function(a){M=x(M,a);Lb();return M},addEvent:J,removeEvent:aa,createElement:U, |
|||
discardElement:Ta,css:K,each:n,extend:r,map:Na,merge:x,pick:o,splat:ja,extendClass:ha,pInt:C,wrap:mb,svg:Z,canvas:$,vml:!Z&&!$,product:"Highcharts",version:"3.0.6"})})(); |
|||
@ -0,0 +1,11 @@ |
|||
(function(e){function q(b,a,c){return"rgba("+[Math.round(b[0]+(a[0]-b[0])*c),Math.round(b[1]+(a[1]-b[1])*c),Math.round(b[2]+(a[2]-b[2])*c),b[3]+(a[3]-b[3])*c].join(",")+")"}var m=function(){},j=e.getOptions(),g=e.each,n=e.extend,o=e.wrap,h=e.Chart,i=e.seriesTypes,k=i.pie,l=i.column,r=HighchartsAdapter.fireEvent;n(j.lang,{drillUpText:"◁ Back to {series.name}"});j.drilldown={activeAxisLabelStyle:{cursor:"pointer",color:"#039",fontWeight:"bold",textDecoration:"underline"},activeDataLabelStyle:{cursor:"pointer", |
|||
color:"#039",fontWeight:"bold",textDecoration:"underline"},animation:{duration:500},drillUpButton:{position:{align:"right",x:-10,y:10}}};e.SVGRenderer.prototype.Element.prototype.fadeIn=function(){this.attr({opacity:0.1,visibility:"visible"}).animate({opacity:1},{duration:250})};h.prototype.drilldownLevels=[];h.prototype.addSeriesAsDrilldown=function(b,a){var c=b.series,d=c.xAxis,f=c.yAxis,e;e=b.color||c.color;var g,a=n({color:e},a);g=HighchartsAdapter.inArray(this,c.points);this.drilldownLevels.push({seriesOptions:c.userOptions, |
|||
shapeArgs:b.shapeArgs,bBox:b.graphic.getBBox(),color:e,newSeries:a,pointOptions:c.options.data[g],pointIndex:g,oldExtremes:{xMin:d&&d.userMin,xMax:d&&d.userMax,yMin:f&&f.userMin,yMax:f&&f.userMax}});e=this.addSeries(a,!1);if(d)d.oldPos=d.pos,d.userMin=d.userMax=null,f.userMin=f.userMax=null;if(c.type===e.type)e.animate=e.animateDrilldown||m,e.options.animation=!0;c.remove(!1);this.redraw();this.showDrillUpButton()};h.prototype.getDrilldownBackText=function(){return this.options.lang.drillUpText.replace("{series.name}", |
|||
this.drilldownLevels[this.drilldownLevels.length-1].seriesOptions.name)};h.prototype.showDrillUpButton=function(){var b=this,a=this.getDrilldownBackText(),c=b.options.drilldown.drillUpButton;this.drillUpButton?this.drillUpButton.attr({text:a}).align():this.drillUpButton=this.renderer.button(a,null,null,function(){b.drillUp()}).attr(n({align:c.position.align,zIndex:9},c.theme)).add().align(c.position,!1,c.relativeTo||"plotBox")};h.prototype.drillUp=function(){var b=this.drilldownLevels.pop(),a=this.series[0], |
|||
c=b.oldExtremes,d=this.addSeries(b.seriesOptions,!1);r(this,"drillup",{seriesOptions:b.seriesOptions});if(d.type===a.type)d.drilldownLevel=b,d.animate=d.animateDrillupTo||m,d.options.animation=!0,a.animateDrillupFrom&&a.animateDrillupFrom(b);a.remove(!1);d.xAxis&&(d.xAxis.setExtremes(c.xMin,c.xMax,!1),d.yAxis.setExtremes(c.yMin,c.yMax,!1));this.redraw();this.drilldownLevels.length===0?this.drillUpButton=this.drillUpButton.destroy():this.drillUpButton.attr({text:this.getDrilldownBackText()}).align()}; |
|||
k.prototype.animateDrilldown=function(b){var a=this.chart.drilldownLevels[this.chart.drilldownLevels.length-1],c=this.chart.options.drilldown.animation,d=a.shapeArgs,f=d.start,s=(d.end-f)/this.points.length,h=e.Color(a.color).rgba;b||g(this.points,function(a,b){var g=e.Color(a.color).rgba;a.graphic.attr(e.merge(d,{start:f+b*s,end:f+(b+1)*s})).animate(a.shapeArgs,e.merge(c,{step:function(a,d){d.prop==="start"&&this.attr({fill:q(h,g,d.pos)})}}))})};k.prototype.animateDrillupTo=l.prototype.animateDrillupTo= |
|||
function(b){if(!b){var a=this,c=a.drilldownLevel;g(this.points,function(a){a.graphic.hide();a.dataLabel&&a.dataLabel.hide();a.connector&&a.connector.hide()});setTimeout(function(){g(a.points,function(a,b){var e=b===c.pointIndex?"show":"fadeIn";a.graphic[e]();if(a.dataLabel)a.dataLabel[e]();if(a.connector)a.connector[e]()})},Math.max(this.chart.options.drilldown.animation.duration-50,0));this.animate=m}};l.prototype.animateDrilldown=function(b){var a=this.chart.drilldownLevels[this.chart.drilldownLevels.length- |
|||
1].shapeArgs,c=this.chart.options.drilldown.animation;b||(a.x+=this.xAxis.oldPos-this.xAxis.pos,g(this.points,function(b){b.graphic.attr(a).animate(b.shapeArgs,c)}))};l.prototype.animateDrillupFrom=k.prototype.animateDrillupFrom=function(b){var a=this.chart.options.drilldown.animation,c=this.group;delete this.group;g(this.points,function(d){var f=d.graphic,g=e.Color(d.color).rgba;delete d.graphic;f.animate(b.shapeArgs,e.merge(a,{step:function(a,c){c.prop==="start"&&this.attr({fill:q(g,e.Color(b.color).rgba, |
|||
c.pos)})},complete:function(){f.destroy();c&&(c=c.destroy())}}))})};e.Point.prototype.doDrilldown=function(){for(var b=this.series.chart,a=b.options.drilldown,c=a.series.length,d;c--&&!d;)a.series[c].id===this.drilldown&&(d=a.series[c]);r(b,"drilldown",{point:this,seriesOptions:d});d&&b.addSeriesAsDrilldown(this,d)};o(e.Point.prototype,"init",function(b,a,c,d){var f=b.call(this,a,c,d),b=a.chart,a=(a=a.xAxis&&a.xAxis.ticks[d])&&a.label;if(f.drilldown){if(e.addEvent(f,"click",function(){f.doDrilldown()}), |
|||
a){if(!a._basicStyle)a._basicStyle=a.element.getAttribute("style");a.addClass("highcharts-drilldown-axis-label").css(b.options.drilldown.activeAxisLabelStyle).on("click",function(){f.doDrilldown&&f.doDrilldown()})}}else a&&a._basicStyle&&a.element.setAttribute("style",a._basicStyle);return f});o(e.Series.prototype,"drawDataLabels",function(b){var a=this.chart.options.drilldown.activeDataLabelStyle;b.call(this);g(this.points,function(b){if(b.drilldown&&b.dataLabel)b.dataLabel.attr({"class":"highcharts-drilldown-data-label"}).css(a).on("click", |
|||
function(){b.doDrilldown()})})});l.prototype.supportsDrilldown=!0;k.prototype.supportsDrilldown=!0;var p,j=function(b){b.call(this);g(this.points,function(a){a.drilldown&&a.graphic&&a.graphic.attr({"class":"highcharts-drilldown-point"}).css({cursor:"pointer"})})};for(p in i)i[p].prototype.supportsDrilldown&&o(i[p].prototype,"drawTracker",j)})(Highcharts); |
|||
@ -0,0 +1,447 @@ |
|||
/** |
|||
* Highcharts Drilldown plugin |
|||
* |
|||
* Author: Torstein Honsi |
|||
* Last revision: 2013-02-18 |
|||
* License: MIT License |
|||
* |
|||
* Demo: http://jsfiddle.net/highcharts/Vf3yT/
|
|||
*/ |
|||
|
|||
/*global HighchartsAdapter*/ |
|||
(function (H) { |
|||
|
|||
"use strict"; |
|||
|
|||
var noop = function () {}, |
|||
defaultOptions = H.getOptions(), |
|||
each = H.each, |
|||
extend = H.extend, |
|||
wrap = H.wrap, |
|||
Chart = H.Chart, |
|||
seriesTypes = H.seriesTypes, |
|||
PieSeries = seriesTypes.pie, |
|||
ColumnSeries = seriesTypes.column, |
|||
fireEvent = HighchartsAdapter.fireEvent; |
|||
|
|||
// Utilities
|
|||
function tweenColors(startColor, endColor, pos) { |
|||
var rgba = [ |
|||
Math.round(startColor[0] + (endColor[0] - startColor[0]) * pos), |
|||
Math.round(startColor[1] + (endColor[1] - startColor[1]) * pos), |
|||
Math.round(startColor[2] + (endColor[2] - startColor[2]) * pos), |
|||
startColor[3] + (endColor[3] - startColor[3]) * pos |
|||
]; |
|||
return 'rgba(' + rgba.join(',') + ')'; |
|||
} |
|||
|
|||
// Add language
|
|||
extend(defaultOptions.lang, { |
|||
drillUpText: '◁ Back to {series.name}' |
|||
}); |
|||
defaultOptions.drilldown = { |
|||
activeAxisLabelStyle: { |
|||
cursor: 'pointer', |
|||
color: '#039', |
|||
fontWeight: 'bold', |
|||
textDecoration: 'underline' |
|||
}, |
|||
activeDataLabelStyle: { |
|||
cursor: 'pointer', |
|||
color: '#039', |
|||
fontWeight: 'bold', |
|||
textDecoration: 'underline' |
|||
}, |
|||
animation: { |
|||
duration: 500 |
|||
}, |
|||
drillUpButton: { |
|||
position: { |
|||
align: 'right', |
|||
x: -10, |
|||
y: 10 |
|||
} |
|||
// relativeTo: 'plotBox'
|
|||
// theme
|
|||
} |
|||
}; |
|||
|
|||
/** |
|||
* A general fadeIn method |
|||
*/ |
|||
H.SVGRenderer.prototype.Element.prototype.fadeIn = function () { |
|||
this |
|||
.attr({ |
|||
opacity: 0.1, |
|||
visibility: 'visible' |
|||
}) |
|||
.animate({ |
|||
opacity: 1 |
|||
}, { |
|||
duration: 250 |
|||
}); |
|||
}; |
|||
|
|||
// Extend the Chart prototype
|
|||
Chart.prototype.drilldownLevels = []; |
|||
|
|||
Chart.prototype.addSeriesAsDrilldown = function (point, ddOptions) { |
|||
var oldSeries = point.series, |
|||
xAxis = oldSeries.xAxis, |
|||
yAxis = oldSeries.yAxis, |
|||
newSeries, |
|||
color = point.color || oldSeries.color, |
|||
pointIndex, |
|||
level; |
|||
|
|||
ddOptions = extend({ |
|||
color: color |
|||
}, ddOptions); |
|||
pointIndex = HighchartsAdapter.inArray(this, oldSeries.points); |
|||
level = { |
|||
seriesOptions: oldSeries.userOptions, |
|||
shapeArgs: point.shapeArgs, |
|||
bBox: point.graphic.getBBox(), |
|||
color: color, |
|||
newSeries: ddOptions, |
|||
pointOptions: oldSeries.options.data[pointIndex], |
|||
pointIndex: pointIndex, |
|||
oldExtremes: { |
|||
xMin: xAxis && xAxis.userMin, |
|||
xMax: xAxis && xAxis.userMax, |
|||
yMin: yAxis && yAxis.userMin, |
|||
yMax: yAxis && yAxis.userMax |
|||
} |
|||
}; |
|||
|
|||
this.drilldownLevels.push(level); |
|||
|
|||
newSeries = this.addSeries(ddOptions, false); |
|||
if (xAxis) { |
|||
xAxis.oldPos = xAxis.pos; |
|||
xAxis.userMin = xAxis.userMax = null; |
|||
yAxis.userMin = yAxis.userMax = null; |
|||
} |
|||
|
|||
// Run fancy cross-animation on supported and equal types
|
|||
if (oldSeries.type === newSeries.type) { |
|||
newSeries.animate = newSeries.animateDrilldown || noop; |
|||
newSeries.options.animation = true; |
|||
} |
|||
|
|||
oldSeries.remove(false); |
|||
|
|||
this.redraw(); |
|||
this.showDrillUpButton(); |
|||
}; |
|||
|
|||
Chart.prototype.getDrilldownBackText = function () { |
|||
var lastLevel = this.drilldownLevels[this.drilldownLevels.length - 1]; |
|||
|
|||
return this.options.lang.drillUpText.replace('{series.name}', lastLevel.seriesOptions.name); |
|||
|
|||
}; |
|||
|
|||
Chart.prototype.showDrillUpButton = function () { |
|||
var chart = this, |
|||
backText = this.getDrilldownBackText(), |
|||
buttonOptions = chart.options.drilldown.drillUpButton; |
|||
|
|||
|
|||
if (!this.drillUpButton) { |
|||
this.drillUpButton = this.renderer.button( |
|||
backText, |
|||
null, |
|||
null, |
|||
function () { |
|||
chart.drillUp(); |
|||
} |
|||
) |
|||
.attr(extend({ |
|||
align: buttonOptions.position.align, |
|||
zIndex: 9 |
|||
}, buttonOptions.theme)) |
|||
.add() |
|||
.align(buttonOptions.position, false, buttonOptions.relativeTo || 'plotBox'); |
|||
} else { |
|||
this.drillUpButton.attr({ |
|||
text: backText |
|||
}) |
|||
.align(); |
|||
} |
|||
}; |
|||
|
|||
Chart.prototype.drillUp = function () { |
|||
var chart = this, |
|||
level = chart.drilldownLevels.pop(), |
|||
oldSeries = chart.series[0], |
|||
oldExtremes = level.oldExtremes, |
|||
newSeries = chart.addSeries(level.seriesOptions, false); |
|||
|
|||
fireEvent(chart, 'drillup', { seriesOptions: level.seriesOptions }); |
|||
|
|||
if (newSeries.type === oldSeries.type) { |
|||
newSeries.drilldownLevel = level; |
|||
newSeries.animate = newSeries.animateDrillupTo || noop; |
|||
newSeries.options.animation = true; |
|||
|
|||
if (oldSeries.animateDrillupFrom) { |
|||
oldSeries.animateDrillupFrom(level); |
|||
} |
|||
} |
|||
|
|||
oldSeries.remove(false); |
|||
|
|||
// Reset the zoom level of the upper series
|
|||
if (newSeries.xAxis) { |
|||
newSeries.xAxis.setExtremes(oldExtremes.xMin, oldExtremes.xMax, false); |
|||
newSeries.yAxis.setExtremes(oldExtremes.yMin, oldExtremes.yMax, false); |
|||
} |
|||
|
|||
|
|||
this.redraw(); |
|||
|
|||
if (this.drilldownLevels.length === 0) { |
|||
this.drillUpButton = this.drillUpButton.destroy(); |
|||
} else { |
|||
this.drillUpButton.attr({ |
|||
text: this.getDrilldownBackText() |
|||
}) |
|||
.align(); |
|||
} |
|||
}; |
|||
|
|||
PieSeries.prototype.animateDrilldown = function (init) { |
|||
var level = this.chart.drilldownLevels[this.chart.drilldownLevels.length - 1], |
|||
animationOptions = this.chart.options.drilldown.animation, |
|||
animateFrom = level.shapeArgs, |
|||
start = animateFrom.start, |
|||
angle = animateFrom.end - start, |
|||
startAngle = angle / this.points.length, |
|||
startColor = H.Color(level.color).rgba; |
|||
|
|||
if (!init) { |
|||
each(this.points, function (point, i) { |
|||
var endColor = H.Color(point.color).rgba; |
|||
|
|||
/*jslint unparam: true*/ |
|||
point.graphic |
|||
.attr(H.merge(animateFrom, { |
|||
start: start + i * startAngle, |
|||
end: start + (i + 1) * startAngle |
|||
})) |
|||
.animate(point.shapeArgs, H.merge(animationOptions, { |
|||
step: function (val, fx) { |
|||
if (fx.prop === 'start') { |
|||
this.attr({ |
|||
fill: tweenColors(startColor, endColor, fx.pos) |
|||
}); |
|||
} |
|||
} |
|||
})); |
|||
/*jslint unparam: false*/ |
|||
}); |
|||
} |
|||
}; |
|||
|
|||
|
|||
/** |
|||
* When drilling up, keep the upper series invisible until the lower series has |
|||
* moved into place |
|||
*/ |
|||
PieSeries.prototype.animateDrillupTo = |
|||
ColumnSeries.prototype.animateDrillupTo = function (init) { |
|||
if (!init) { |
|||
var newSeries = this, |
|||
level = newSeries.drilldownLevel; |
|||
|
|||
each(this.points, function (point) { |
|||
point.graphic.hide(); |
|||
if (point.dataLabel) { |
|||
point.dataLabel.hide(); |
|||
} |
|||
if (point.connector) { |
|||
point.connector.hide(); |
|||
} |
|||
}); |
|||
|
|||
|
|||
// Do dummy animation on first point to get to complete
|
|||
setTimeout(function () { |
|||
each(newSeries.points, function (point, i) { |
|||
// Fade in other points
|
|||
var verb = i === level.pointIndex ? 'show' : 'fadeIn'; |
|||
point.graphic[verb](); |
|||
if (point.dataLabel) { |
|||
point.dataLabel[verb](); |
|||
} |
|||
if (point.connector) { |
|||
point.connector[verb](); |
|||
} |
|||
}); |
|||
}, Math.max(this.chart.options.drilldown.animation.duration - 50, 0)); |
|||
|
|||
// Reset
|
|||
this.animate = noop; |
|||
} |
|||
|
|||
}; |
|||
|
|||
ColumnSeries.prototype.animateDrilldown = function (init) { |
|||
var animateFrom = this.chart.drilldownLevels[this.chart.drilldownLevels.length - 1].shapeArgs, |
|||
animationOptions = this.chart.options.drilldown.animation; |
|||
|
|||
if (!init) { |
|||
|
|||
animateFrom.x += (this.xAxis.oldPos - this.xAxis.pos); |
|||
|
|||
each(this.points, function (point) { |
|||
point.graphic |
|||
.attr(animateFrom) |
|||
.animate(point.shapeArgs, animationOptions); |
|||
}); |
|||
} |
|||
|
|||
}; |
|||
|
|||
/** |
|||
* When drilling up, pull out the individual point graphics from the lower series |
|||
* and animate them into the origin point in the upper series. |
|||
*/ |
|||
ColumnSeries.prototype.animateDrillupFrom = |
|||
PieSeries.prototype.animateDrillupFrom = |
|||
function (level) { |
|||
var animationOptions = this.chart.options.drilldown.animation, |
|||
group = this.group; |
|||
|
|||
delete this.group; |
|||
each(this.points, function (point) { |
|||
var graphic = point.graphic, |
|||
startColor = H.Color(point.color).rgba; |
|||
|
|||
delete point.graphic; |
|||
|
|||
/*jslint unparam: true*/ |
|||
graphic.animate(level.shapeArgs, H.merge(animationOptions, { |
|||
|
|||
step: function (val, fx) { |
|||
if (fx.prop === 'start') { |
|||
this.attr({ |
|||
fill: tweenColors(startColor, H.Color(level.color).rgba, fx.pos) |
|||
}); |
|||
} |
|||
}, |
|||
complete: function () { |
|||
graphic.destroy(); |
|||
if (group) { |
|||
group = group.destroy(); |
|||
} |
|||
} |
|||
})); |
|||
/*jslint unparam: false*/ |
|||
}); |
|||
}; |
|||
|
|||
H.Point.prototype.doDrilldown = function () { |
|||
var series = this.series, |
|||
chart = series.chart, |
|||
drilldown = chart.options.drilldown, |
|||
i = drilldown.series.length, |
|||
seriesOptions; |
|||
|
|||
while (i-- && !seriesOptions) { |
|||
if (drilldown.series[i].id === this.drilldown) { |
|||
seriesOptions = drilldown.series[i]; |
|||
} |
|||
} |
|||
|
|||
// Fire the event. If seriesOptions is undefined, the implementer can check for
|
|||
// seriesOptions, and call addSeriesAsDrilldown async if necessary.
|
|||
fireEvent(chart, 'drilldown', { |
|||
point: this, |
|||
seriesOptions: seriesOptions |
|||
}); |
|||
|
|||
if (seriesOptions) { |
|||
chart.addSeriesAsDrilldown(this, seriesOptions); |
|||
} |
|||
|
|||
}; |
|||
|
|||
wrap(H.Point.prototype, 'init', function (proceed, series, options, x) { |
|||
var point = proceed.call(this, series, options, x), |
|||
chart = series.chart, |
|||
tick = series.xAxis && series.xAxis.ticks[x], |
|||
tickLabel = tick && tick.label; |
|||
|
|||
if (point.drilldown) { |
|||
|
|||
// Add the click event to the point label
|
|||
H.addEvent(point, 'click', function () { |
|||
point.doDrilldown(); |
|||
}); |
|||
|
|||
// Make axis labels clickable
|
|||
if (tickLabel) { |
|||
if (!tickLabel._basicStyle) { |
|||
tickLabel._basicStyle = tickLabel.element.getAttribute('style'); |
|||
} |
|||
tickLabel |
|||
.addClass('highcharts-drilldown-axis-label') |
|||
.css(chart.options.drilldown.activeAxisLabelStyle) |
|||
.on('click', function () { |
|||
if (point.doDrilldown) { |
|||
point.doDrilldown(); |
|||
} |
|||
}); |
|||
|
|||
} |
|||
} else if (tickLabel && tickLabel._basicStyle) { |
|||
tickLabel.element.setAttribute('style', tickLabel._basicStyle); |
|||
} |
|||
|
|||
return point; |
|||
}); |
|||
|
|||
wrap(H.Series.prototype, 'drawDataLabels', function (proceed) { |
|||
var css = this.chart.options.drilldown.activeDataLabelStyle; |
|||
|
|||
proceed.call(this); |
|||
|
|||
each(this.points, function (point) { |
|||
if (point.drilldown && point.dataLabel) { |
|||
point.dataLabel |
|||
.attr({ |
|||
'class': 'highcharts-drilldown-data-label' |
|||
}) |
|||
.css(css) |
|||
.on('click', function () { |
|||
point.doDrilldown(); |
|||
}); |
|||
} |
|||
}); |
|||
}); |
|||
|
|||
// Mark the trackers with a pointer
|
|||
ColumnSeries.prototype.supportsDrilldown = true; |
|||
PieSeries.prototype.supportsDrilldown = true; |
|||
var type, |
|||
drawTrackerWrapper = function (proceed) { |
|||
proceed.call(this); |
|||
each(this.points, function (point) { |
|||
if (point.drilldown && point.graphic) { |
|||
point.graphic |
|||
.attr({ |
|||
'class': 'highcharts-drilldown-point' |
|||
}) |
|||
.css({ cursor: 'pointer' }); |
|||
} |
|||
}); |
|||
}; |
|||
for (type in seriesTypes) { |
|||
if (seriesTypes[type].prototype.supportsDrilldown) { |
|||
wrap(seriesTypes[type].prototype, 'drawTracker', drawTrackerWrapper); |
|||
} |
|||
} |
|||
|
|||
}(Highcharts)); |
|||
@ -0,0 +1,22 @@ |
|||
/* |
|||
Highcharts JS v3.0.6 (2013-10-04) |
|||
Exporting module |
|||
|
|||
(c) 2010-2013 Torstein Hønsi |
|||
|
|||
License: www.highcharts.com/license |
|||
*/ |
|||
(function(f){var A=f.Chart,t=f.addEvent,C=f.removeEvent,k=f.createElement,n=f.discardElement,u=f.css,o=f.merge,r=f.each,p=f.extend,D=Math.max,j=document,B=window,E=f.isTouchDevice,F=f.Renderer.prototype.symbols,x=f.getOptions(),y;p(x.lang,{printChart:"Print chart",downloadPNG:"Download PNG image",downloadJPEG:"Download JPEG image",downloadPDF:"Download PDF document",downloadSVG:"Download SVG vector image",contextButtonTitle:"Chart context menu"});x.navigation={menuStyle:{border:"1px solid #A0A0A0", |
|||
background:"#FFFFFF",padding:"5px 0"},menuItemStyle:{padding:"0 10px",background:"none",color:"#303030",fontSize:E?"14px":"11px"},menuItemHoverStyle:{background:"#4572A5",color:"#FFFFFF"},buttonOptions:{symbolFill:"#E0E0E0",symbolSize:14,symbolStroke:"#666",symbolStrokeWidth:3,symbolX:12.5,symbolY:10.5,align:"right",buttonSpacing:3,height:22,theme:{fill:"white",stroke:"none"},verticalAlign:"top",width:24}};x.exporting={type:"image/png",url:"http://export.highcharts.com/",buttons:{contextButton:{menuClassName:"highcharts-contextmenu", |
|||
symbol:"menu",_titleKey:"contextButtonTitle",menuItems:[{textKey:"printChart",onclick:function(){this.print()}},{separator:!0},{textKey:"downloadPNG",onclick:function(){this.exportChart()}},{textKey:"downloadJPEG",onclick:function(){this.exportChart({type:"image/jpeg"})}},{textKey:"downloadPDF",onclick:function(){this.exportChart({type:"application/pdf"})}},{textKey:"downloadSVG",onclick:function(){this.exportChart({type:"image/svg+xml"})}}]}}};f.post=function(c,a){var d,b;b=k("form",{method:"post", |
|||
action:c,enctype:"multipart/form-data"},{display:"none"},j.body);for(d in a)k("input",{type:"hidden",name:d,value:a[d]},null,b);b.submit();n(b)};p(A.prototype,{getSVG:function(c){var a=this,d,b,z,h,g=o(a.options,c);if(!j.createElementNS)j.createElementNS=function(a,b){return j.createElement(b)};c=k("div",null,{position:"absolute",top:"-9999em",width:a.chartWidth+"px",height:a.chartHeight+"px"},j.body);b=a.renderTo.style.width;h=a.renderTo.style.height;b=g.exporting.sourceWidth||g.chart.width||/px$/.test(b)&& |
|||
parseInt(b,10)||600;h=g.exporting.sourceHeight||g.chart.height||/px$/.test(h)&&parseInt(h,10)||400;p(g.chart,{animation:!1,renderTo:c,forExport:!0,width:b,height:h});g.exporting.enabled=!1;g.series=[];r(a.series,function(a){z=o(a.options,{animation:!1,showCheckbox:!1,visible:a.visible});z.isInternal||g.series.push(z)});d=new f.Chart(g,a.callback);r(["xAxis","yAxis"],function(b){r(a[b],function(a,c){var g=d[b][c],f=a.getExtremes(),h=f.userMin,f=f.userMax;g&&(h!==void 0||f!==void 0)&&g.setExtremes(h, |
|||
f,!0,!1)})});b=d.container.innerHTML;g=null;d.destroy();n(c);b=b.replace(/zIndex="[^"]+"/g,"").replace(/isShadow="[^"]+"/g,"").replace(/symbolName="[^"]+"/g,"").replace(/jQuery[0-9]+="[^"]+"/g,"").replace(/url\([^#]+#/g,"url(#").replace(/<svg /,'<svg xmlns:xlink="http://www.w3.org/1999/xlink" ').replace(/ href=/g," xlink:href=").replace(/\n/," ").replace(/<\/svg>.*?$/,"</svg>").replace(/ /g," ").replace(/­/g,"").replace(/<IMG /g,"<image ").replace(/height=([^" ]+)/g,'height="$1"').replace(/width=([^" ]+)/g, |
|||
'width="$1"').replace(/hc-svg-href="([^"]+)">/g,'xlink:href="$1"/>').replace(/id=([^" >]+)/g,'id="$1"').replace(/class=([^" >]+)/g,'class="$1"').replace(/ transform /g," ").replace(/:(path|rect)/g,"$1").replace(/style="([^"]+)"/g,function(a){return a.toLowerCase()});return b=b.replace(/(url\(#highcharts-[0-9]+)"/g,"$1").replace(/"/g,"'")},exportChart:function(c,a){var c=c||{},d=this.options.exporting,d=this.getSVG(o({chart:{borderRadius:0}},d.chartOptions,a,{exporting:{sourceWidth:c.sourceWidth|| |
|||
d.sourceWidth,sourceHeight:c.sourceHeight||d.sourceHeight}})),c=o(this.options.exporting,c);f.post(c.url,{filename:c.filename||"chart",type:c.type,width:c.width||0,scale:c.scale||2,svg:d})},print:function(){var c=this,a=c.container,d=[],b=a.parentNode,f=j.body,h=f.childNodes;if(!c.isPrinting)c.isPrinting=!0,r(h,function(a,b){if(a.nodeType===1)d[b]=a.style.display,a.style.display="none"}),f.appendChild(a),B.focus(),B.print(),setTimeout(function(){b.appendChild(a);r(h,function(a,b){if(a.nodeType=== |
|||
1)a.style.display=d[b]});c.isPrinting=!1},1E3)},contextMenu:function(c,a,d,b,f,h,g){var e=this,j=e.options.navigation,q=j.menuItemStyle,l=e.chartWidth,m=e.chartHeight,o="cache-"+c,i=e[o],s=D(f,h),v,w,n;if(!i)e[o]=i=k("div",{className:c},{position:"absolute",zIndex:1E3,padding:s+"px"},e.container),v=k("div",null,p({MozBoxShadow:"3px 3px 10px #888",WebkitBoxShadow:"3px 3px 10px #888",boxShadow:"3px 3px 10px #888"},j.menuStyle),i),w=function(){u(i,{display:"none"});g&&g.setState(0);e.openMenu=!1},t(i, |
|||
"mouseleave",function(){n=setTimeout(w,500)}),t(i,"mouseenter",function(){clearTimeout(n)}),t(document,"mousedown",function(a){e.pointer.inClass(a.target,c)||w()}),r(a,function(a){if(a){var b=a.separator?k("hr",null,null,v):k("div",{onmouseover:function(){u(this,j.menuItemHoverStyle)},onmouseout:function(){u(this,q)},onclick:function(){w();a.onclick.apply(e,arguments)},innerHTML:a.text||e.options.lang[a.textKey]},p({cursor:"pointer"},q),v);e.exportDivElements.push(b)}}),e.exportDivElements.push(v, |
|||
i),e.exportMenuWidth=i.offsetWidth,e.exportMenuHeight=i.offsetHeight;a={display:"block"};d+e.exportMenuWidth>l?a.right=l-d-f-s+"px":a.left=d-s+"px";b+h+e.exportMenuHeight>m&&g.alignOptions.verticalAlign!=="top"?a.bottom=m-b-s+"px":a.top=b+h-s+"px";u(i,a);e.openMenu=!0},addButton:function(c){var a=this,d=a.renderer,b=o(a.options.navigation.buttonOptions,c),j=b.onclick,h=b.menuItems,g,e,k={stroke:b.symbolStroke,fill:b.symbolFill},q=b.symbolSize||12;if(!a.btnCount)a.btnCount=0;if(!a.exportDivElements)a.exportDivElements= |
|||
[],a.exportSVGElements=[];if(b.enabled!==!1){var l=b.theme,m=l.states,n=m&&m.hover,m=m&&m.select,i;delete l.states;j?i=function(){j.apply(a,arguments)}:h&&(i=function(){a.contextMenu(e.menuClassName,h,e.translateX,e.translateY,e.width,e.height,e);e.setState(2)});b.text&&b.symbol?l.paddingLeft=f.pick(l.paddingLeft,25):b.text||p(l,{width:b.width,height:b.height,padding:0});e=d.button(b.text,0,0,i,l,n,m).attr({title:a.options.lang[b._titleKey],"stroke-linecap":"round"});e.menuClassName=c.menuClassName|| |
|||
"highcharts-menu-"+a.btnCount++;b.symbol&&(g=d.symbol(b.symbol,b.symbolX-q/2,b.symbolY-q/2,q,q).attr(p(k,{"stroke-width":b.symbolStrokeWidth||1,zIndex:1})).add(e));e.add().align(p(b,{width:e.width,x:f.pick(b.x,y)}),!0,"spacingBox");y+=(e.width+b.buttonSpacing)*(b.align==="right"?-1:1);a.exportSVGElements.push(e,g)}},destroyExport:function(c){var c=c.target,a,d;for(a=0;a<c.exportSVGElements.length;a++)if(d=c.exportSVGElements[a])d.onclick=d.ontouchstart=null,c.exportSVGElements[a]=d.destroy();for(a= |
|||
0;a<c.exportDivElements.length;a++)d=c.exportDivElements[a],C(d,"mouseleave"),c.exportDivElements[a]=d.onmouseout=d.onmouseover=d.ontouchstart=d.onclick=null,n(d)}});F.menu=function(c,a,d,b){return["M",c,a+2.5,"L",c+d,a+2.5,"M",c,a+b/2+0.5,"L",c+d,a+b/2+0.5,"M",c,a+b-1.5,"L",c+d,a+b-1.5]};A.prototype.callbacks.push(function(c){var a,d=c.options.exporting,b=d.buttons;y=0;if(d.enabled!==!1){for(a in b)c.addButton(b[a]);t(c,"destroy",c.destroyExport)}})})(Highcharts); |
|||
@ -0,0 +1,709 @@ |
|||
/** |
|||
* @license Highcharts JS v3.0.6 (2013-10-04) |
|||
* Exporting module |
|||
* |
|||
* (c) 2010-2013 Torstein Hønsi |
|||
* |
|||
* License: www.highcharts.com/license |
|||
*/ |
|||
|
|||
// JSLint options:
|
|||
/*global Highcharts, document, window, Math, setTimeout */ |
|||
|
|||
(function (Highcharts) { // encapsulate
|
|||
|
|||
// create shortcuts
|
|||
var Chart = Highcharts.Chart, |
|||
addEvent = Highcharts.addEvent, |
|||
removeEvent = Highcharts.removeEvent, |
|||
createElement = Highcharts.createElement, |
|||
discardElement = Highcharts.discardElement, |
|||
css = Highcharts.css, |
|||
merge = Highcharts.merge, |
|||
each = Highcharts.each, |
|||
extend = Highcharts.extend, |
|||
math = Math, |
|||
mathMax = math.max, |
|||
doc = document, |
|||
win = window, |
|||
isTouchDevice = Highcharts.isTouchDevice, |
|||
M = 'M', |
|||
L = 'L', |
|||
DIV = 'div', |
|||
HIDDEN = 'hidden', |
|||
NONE = 'none', |
|||
PREFIX = 'highcharts-', |
|||
ABSOLUTE = 'absolute', |
|||
PX = 'px', |
|||
UNDEFINED, |
|||
symbols = Highcharts.Renderer.prototype.symbols, |
|||
defaultOptions = Highcharts.getOptions(), |
|||
buttonOffset; |
|||
|
|||
// Add language
|
|||
extend(defaultOptions.lang, { |
|||
printChart: 'Print chart', |
|||
downloadPNG: 'Download PNG image', |
|||
downloadJPEG: 'Download JPEG image', |
|||
downloadPDF: 'Download PDF document', |
|||
downloadSVG: 'Download SVG vector image', |
|||
contextButtonTitle: 'Chart context menu' |
|||
}); |
|||
|
|||
// Buttons and menus are collected in a separate config option set called 'navigation'.
|
|||
// This can be extended later to add control buttons like zoom and pan right click menus.
|
|||
defaultOptions.navigation = { |
|||
menuStyle: { |
|||
border: '1px solid #A0A0A0', |
|||
background: '#FFFFFF', |
|||
padding: '5px 0' |
|||
}, |
|||
menuItemStyle: { |
|||
padding: '0 10px', |
|||
background: NONE, |
|||
color: '#303030', |
|||
fontSize: isTouchDevice ? '14px' : '11px' |
|||
}, |
|||
menuItemHoverStyle: { |
|||
background: '#4572A5', |
|||
color: '#FFFFFF' |
|||
}, |
|||
|
|||
buttonOptions: { |
|||
symbolFill: '#E0E0E0', |
|||
symbolSize: 14, |
|||
symbolStroke: '#666', |
|||
symbolStrokeWidth: 3, |
|||
symbolX: 12.5, |
|||
symbolY: 10.5, |
|||
align: 'right', |
|||
buttonSpacing: 3, |
|||
height: 22, |
|||
// text: null,
|
|||
theme: { |
|||
fill: 'white', // capture hover
|
|||
stroke: 'none' |
|||
}, |
|||
verticalAlign: 'top', |
|||
width: 24 |
|||
} |
|||
}; |
|||
|
|||
|
|||
|
|||
// Add the export related options
|
|||
defaultOptions.exporting = { |
|||
//enabled: true,
|
|||
//filename: 'chart',
|
|||
type: 'image/png', |
|||
url: 'http://export.highcharts.com/', |
|||
//width: undefined,
|
|||
//scale: 2
|
|||
buttons: { |
|||
contextButton: { |
|||
menuClassName: PREFIX + 'contextmenu', |
|||
//x: -10,
|
|||
symbol: 'menu', |
|||
_titleKey: 'contextButtonTitle', |
|||
menuItems: [{ |
|||
textKey: 'printChart', |
|||
onclick: function () { |
|||
this.print(); |
|||
} |
|||
}, { |
|||
separator: true |
|||
}, { |
|||
textKey: 'downloadPNG', |
|||
onclick: function () { |
|||
this.exportChart(); |
|||
} |
|||
}, { |
|||
textKey: 'downloadJPEG', |
|||
onclick: function () { |
|||
this.exportChart({ |
|||
type: 'image/jpeg' |
|||
}); |
|||
} |
|||
}, { |
|||
textKey: 'downloadPDF', |
|||
onclick: function () { |
|||
this.exportChart({ |
|||
type: 'application/pdf' |
|||
}); |
|||
} |
|||
}, { |
|||
textKey: 'downloadSVG', |
|||
onclick: function () { |
|||
this.exportChart({ |
|||
type: 'image/svg+xml' |
|||
}); |
|||
} |
|||
} |
|||
// Enable this block to add "View SVG" to the dropdown menu
|
|||
/* |
|||
,{ |
|||
|
|||
text: 'View SVG', |
|||
onclick: function () { |
|||
var svg = this.getSVG() |
|||
.replace(/</g, '\n<') |
|||
.replace(/>/g, '>'); |
|||
|
|||
doc.body.innerHTML = '<pre>' + svg + '</pre>'; |
|||
} |
|||
} // */
|
|||
] |
|||
} |
|||
} |
|||
}; |
|||
|
|||
// Add the Highcharts.post utility
|
|||
Highcharts.post = function (url, data) { |
|||
var name, |
|||
form; |
|||
|
|||
// create the form
|
|||
form = createElement('form', { |
|||
method: 'post', |
|||
action: url, |
|||
enctype: 'multipart/form-data' |
|||
}, { |
|||
display: NONE |
|||
}, doc.body); |
|||
|
|||
// add the data
|
|||
for (name in data) { |
|||
createElement('input', { |
|||
type: HIDDEN, |
|||
name: name, |
|||
value: data[name] |
|||
}, null, form); |
|||
} |
|||
|
|||
// submit
|
|||
form.submit(); |
|||
|
|||
// clean up
|
|||
discardElement(form); |
|||
}; |
|||
|
|||
extend(Chart.prototype, { |
|||
|
|||
/** |
|||
* Return an SVG representation of the chart |
|||
* |
|||
* @param additionalOptions {Object} Additional chart options for the generated SVG representation |
|||
*/ |
|||
getSVG: function (additionalOptions) { |
|||
var chart = this, |
|||
chartCopy, |
|||
sandbox, |
|||
svg, |
|||
seriesOptions, |
|||
sourceWidth, |
|||
sourceHeight, |
|||
cssWidth, |
|||
cssHeight, |
|||
options = merge(chart.options, additionalOptions); // copy the options and add extra options
|
|||
|
|||
// IE compatibility hack for generating SVG content that it doesn't really understand
|
|||
if (!doc.createElementNS) { |
|||
/*jslint unparam: true*//* allow unused parameter ns in function below */ |
|||
doc.createElementNS = function (ns, tagName) { |
|||
return doc.createElement(tagName); |
|||
}; |
|||
/*jslint unparam: false*/ |
|||
} |
|||
|
|||
// create a sandbox where a new chart will be generated
|
|||
sandbox = createElement(DIV, null, { |
|||
position: ABSOLUTE, |
|||
top: '-9999em', |
|||
width: chart.chartWidth + PX, |
|||
height: chart.chartHeight + PX |
|||
}, doc.body); |
|||
|
|||
// get the source size
|
|||
cssWidth = chart.renderTo.style.width; |
|||
cssHeight = chart.renderTo.style.height; |
|||
sourceWidth = options.exporting.sourceWidth || |
|||
options.chart.width || |
|||
(/px$/.test(cssWidth) && parseInt(cssWidth, 10)) || |
|||
600; |
|||
sourceHeight = options.exporting.sourceHeight || |
|||
options.chart.height || |
|||
(/px$/.test(cssHeight) && parseInt(cssHeight, 10)) || |
|||
400; |
|||
|
|||
// override some options
|
|||
extend(options.chart, { |
|||
animation: false, |
|||
renderTo: sandbox, |
|||
forExport: true, |
|||
width: sourceWidth, |
|||
height: sourceHeight |
|||
}); |
|||
options.exporting.enabled = false; // hide buttons in print
|
|||
|
|||
// prepare for replicating the chart
|
|||
options.series = []; |
|||
each(chart.series, function (serie) { |
|||
seriesOptions = merge(serie.options, { |
|||
animation: false, // turn off animation
|
|||
showCheckbox: false, |
|||
visible: serie.visible |
|||
}); |
|||
|
|||
if (!seriesOptions.isInternal) { // used for the navigator series that has its own option set
|
|||
options.series.push(seriesOptions); |
|||
} |
|||
}); |
|||
|
|||
// generate the chart copy
|
|||
chartCopy = new Highcharts.Chart(options, chart.callback); |
|||
|
|||
// reflect axis extremes in the export
|
|||
each(['xAxis', 'yAxis'], function (axisType) { |
|||
each(chart[axisType], function (axis, i) { |
|||
var axisCopy = chartCopy[axisType][i], |
|||
extremes = axis.getExtremes(), |
|||
userMin = extremes.userMin, |
|||
userMax = extremes.userMax; |
|||
|
|||
if (axisCopy && (userMin !== UNDEFINED || userMax !== UNDEFINED)) { |
|||
axisCopy.setExtremes(userMin, userMax, true, false); |
|||
} |
|||
}); |
|||
}); |
|||
|
|||
// get the SVG from the container's innerHTML
|
|||
svg = chartCopy.container.innerHTML; |
|||
|
|||
// free up memory
|
|||
options = null; |
|||
chartCopy.destroy(); |
|||
discardElement(sandbox); |
|||
|
|||
// sanitize
|
|||
svg = svg |
|||
.replace(/zIndex="[^"]+"/g, '') |
|||
.replace(/isShadow="[^"]+"/g, '') |
|||
.replace(/symbolName="[^"]+"/g, '') |
|||
.replace(/jQuery[0-9]+="[^"]+"/g, '') |
|||
.replace(/url\([^#]+#/g, 'url(#') |
|||
.replace(/<svg /, '<svg xmlns:xlink="http://www.w3.org/1999/xlink" ') |
|||
.replace(/ href=/g, ' xlink:href=') |
|||
.replace(/\n/, ' ') |
|||
.replace(/<\/svg>.*?$/, '</svg>') // any HTML added to the container after the SVG (#894)
|
|||
/* This fails in IE < 8 |
|||
.replace(/([0-9]+)\.([0-9]+)/g, function(s1, s2, s3) { // round off to save weight
|
|||
return s2 +'.'+ s3[0]; |
|||
})*/ |
|||
|
|||
// Replace HTML entities, issue #347
|
|||
.replace(/ /g, '\u00A0') // no-break space
|
|||
.replace(/­/g, '\u00AD') // soft hyphen
|
|||
|
|||
// IE specific
|
|||
.replace(/<IMG /g, '<image ') |
|||
.replace(/height=([^" ]+)/g, 'height="$1"') |
|||
.replace(/width=([^" ]+)/g, 'width="$1"') |
|||
.replace(/hc-svg-href="([^"]+)">/g, 'xlink:href="$1"/>') |
|||
.replace(/id=([^" >]+)/g, 'id="$1"') |
|||
.replace(/class=([^" >]+)/g, 'class="$1"') |
|||
.replace(/ transform /g, ' ') |
|||
.replace(/:(path|rect)/g, '$1') |
|||
.replace(/style="([^"]+)"/g, function (s) { |
|||
return s.toLowerCase(); |
|||
}); |
|||
|
|||
// IE9 beta bugs with innerHTML. Test again with final IE9.
|
|||
svg = svg.replace(/(url\(#highcharts-[0-9]+)"/g, '$1') |
|||
.replace(/"/g, "'"); |
|||
|
|||
return svg; |
|||
}, |
|||
|
|||
/** |
|||
* Submit the SVG representation of the chart to the server |
|||
* @param {Object} options Exporting options. Possible members are url, type and width. |
|||
* @param {Object} chartOptions Additional chart options for the SVG representation of the chart |
|||
*/ |
|||
exportChart: function (options, chartOptions) { |
|||
options = options || {}; |
|||
|
|||
var chart = this, |
|||
chartExportingOptions = chart.options.exporting, |
|||
svg = chart.getSVG(merge( |
|||
{ chart: { borderRadius: 0 } }, |
|||
chartExportingOptions.chartOptions, |
|||
chartOptions, |
|||
{ |
|||
exporting: { |
|||
sourceWidth: options.sourceWidth || chartExportingOptions.sourceWidth, |
|||
sourceHeight: options.sourceHeight || chartExportingOptions.sourceHeight |
|||
} |
|||
} |
|||
)); |
|||
|
|||
// merge the options
|
|||
options = merge(chart.options.exporting, options); |
|||
|
|||
// do the post
|
|||
Highcharts.post(options.url, { |
|||
filename: options.filename || 'chart', |
|||
type: options.type, |
|||
width: options.width || 0, // IE8 fails to post undefined correctly, so use 0
|
|||
scale: options.scale || 2, |
|||
svg: svg |
|||
}); |
|||
|
|||
}, |
|||
|
|||
/** |
|||
* Print the chart |
|||
*/ |
|||
print: function () { |
|||
|
|||
var chart = this, |
|||
container = chart.container, |
|||
origDisplay = [], |
|||
origParent = container.parentNode, |
|||
body = doc.body, |
|||
childNodes = body.childNodes; |
|||
|
|||
if (chart.isPrinting) { // block the button while in printing mode
|
|||
return; |
|||
} |
|||
|
|||
chart.isPrinting = true; |
|||
|
|||
// hide all body content
|
|||
each(childNodes, function (node, i) { |
|||
if (node.nodeType === 1) { |
|||
origDisplay[i] = node.style.display; |
|||
node.style.display = NONE; |
|||
} |
|||
}); |
|||
|
|||
// pull out the chart
|
|||
body.appendChild(container); |
|||
|
|||
// print
|
|||
win.focus(); // #1510
|
|||
win.print(); |
|||
|
|||
// allow the browser to prepare before reverting
|
|||
setTimeout(function () { |
|||
|
|||
// put the chart back in
|
|||
origParent.appendChild(container); |
|||
|
|||
// restore all body content
|
|||
each(childNodes, function (node, i) { |
|||
if (node.nodeType === 1) { |
|||
node.style.display = origDisplay[i]; |
|||
} |
|||
}); |
|||
|
|||
chart.isPrinting = false; |
|||
|
|||
}, 1000); |
|||
|
|||
}, |
|||
|
|||
/** |
|||
* Display a popup menu for choosing the export type |
|||
* |
|||
* @param {String} className An identifier for the menu |
|||
* @param {Array} items A collection with text and onclicks for the items |
|||
* @param {Number} x The x position of the opener button |
|||
* @param {Number} y The y position of the opener button |
|||
* @param {Number} width The width of the opener button |
|||
* @param {Number} height The height of the opener button |
|||
*/ |
|||
contextMenu: function (className, items, x, y, width, height, button) { |
|||
var chart = this, |
|||
navOptions = chart.options.navigation, |
|||
menuItemStyle = navOptions.menuItemStyle, |
|||
chartWidth = chart.chartWidth, |
|||
chartHeight = chart.chartHeight, |
|||
cacheName = 'cache-' + className, |
|||
menu = chart[cacheName], |
|||
menuPadding = mathMax(width, height), // for mouse leave detection
|
|||
boxShadow = '3px 3px 10px #888', |
|||
innerMenu, |
|||
hide, |
|||
hideTimer, |
|||
menuStyle; |
|||
|
|||
// create the menu only the first time
|
|||
if (!menu) { |
|||
|
|||
// create a HTML element above the SVG
|
|||
chart[cacheName] = menu = createElement(DIV, { |
|||
className: className |
|||
}, { |
|||
position: ABSOLUTE, |
|||
zIndex: 1000, |
|||
padding: menuPadding + PX |
|||
}, chart.container); |
|||
|
|||
innerMenu = createElement(DIV, null, |
|||
extend({ |
|||
MozBoxShadow: boxShadow, |
|||
WebkitBoxShadow: boxShadow, |
|||
boxShadow: boxShadow |
|||
}, navOptions.menuStyle), menu); |
|||
|
|||
// hide on mouse out
|
|||
hide = function () { |
|||
css(menu, { display: NONE }); |
|||
if (button) { |
|||
button.setState(0); |
|||
} |
|||
chart.openMenu = false; |
|||
}; |
|||
|
|||
// Hide the menu some time after mouse leave (#1357)
|
|||
addEvent(menu, 'mouseleave', function () { |
|||
hideTimer = setTimeout(hide, 500); |
|||
}); |
|||
addEvent(menu, 'mouseenter', function () { |
|||
clearTimeout(hideTimer); |
|||
}); |
|||
// Hide it on clicking or touching outside the menu (#2258)
|
|||
addEvent(document, 'mousedown', function (e) { |
|||
if (!chart.pointer.inClass(e.target, className)) { |
|||
hide(); |
|||
} |
|||
}); |
|||
|
|||
|
|||
// create the items
|
|||
each(items, function (item) { |
|||
if (item) { |
|||
var element = item.separator ? |
|||
createElement('hr', null, null, innerMenu) : |
|||
createElement(DIV, { |
|||
onmouseover: function () { |
|||
css(this, navOptions.menuItemHoverStyle); |
|||
}, |
|||
onmouseout: function () { |
|||
css(this, menuItemStyle); |
|||
}, |
|||
onclick: function () { |
|||
hide(); |
|||
item.onclick.apply(chart, arguments); |
|||
}, |
|||
innerHTML: item.text || chart.options.lang[item.textKey] |
|||
}, extend({ |
|||
cursor: 'pointer' |
|||
}, menuItemStyle), innerMenu); |
|||
|
|||
|
|||
// Keep references to menu divs to be able to destroy them
|
|||
chart.exportDivElements.push(element); |
|||
} |
|||
}); |
|||
|
|||
// Keep references to menu and innerMenu div to be able to destroy them
|
|||
chart.exportDivElements.push(innerMenu, menu); |
|||
|
|||
chart.exportMenuWidth = menu.offsetWidth; |
|||
chart.exportMenuHeight = menu.offsetHeight; |
|||
} |
|||
|
|||
menuStyle = { display: 'block' }; |
|||
|
|||
// if outside right, right align it
|
|||
if (x + chart.exportMenuWidth > chartWidth) { |
|||
menuStyle.right = (chartWidth - x - width - menuPadding) + PX; |
|||
} else { |
|||
menuStyle.left = (x - menuPadding) + PX; |
|||
} |
|||
// if outside bottom, bottom align it
|
|||
if (y + height + chart.exportMenuHeight > chartHeight && button.alignOptions.verticalAlign !== 'top') { |
|||
menuStyle.bottom = (chartHeight - y - menuPadding) + PX; |
|||
} else { |
|||
menuStyle.top = (y + height - menuPadding) + PX; |
|||
} |
|||
|
|||
css(menu, menuStyle); |
|||
chart.openMenu = true; |
|||
}, |
|||
|
|||
/** |
|||
* Add the export button to the chart |
|||
*/ |
|||
addButton: function (options) { |
|||
var chart = this, |
|||
renderer = chart.renderer, |
|||
btnOptions = merge(chart.options.navigation.buttonOptions, options), |
|||
onclick = btnOptions.onclick, |
|||
menuItems = btnOptions.menuItems, |
|||
symbol, |
|||
button, |
|||
symbolAttr = { |
|||
stroke: btnOptions.symbolStroke, |
|||
fill: btnOptions.symbolFill |
|||
}, |
|||
symbolSize = btnOptions.symbolSize || 12; |
|||
if (!chart.btnCount) { |
|||
chart.btnCount = 0; |
|||
} |
|||
|
|||
// Keeps references to the button elements
|
|||
if (!chart.exportDivElements) { |
|||
chart.exportDivElements = []; |
|||
chart.exportSVGElements = []; |
|||
} |
|||
|
|||
if (btnOptions.enabled === false) { |
|||
return; |
|||
} |
|||
|
|||
|
|||
var attr = btnOptions.theme, |
|||
states = attr.states, |
|||
hover = states && states.hover, |
|||
select = states && states.select, |
|||
callback; |
|||
|
|||
delete attr.states; |
|||
|
|||
if (onclick) { |
|||
callback = function () { |
|||
onclick.apply(chart, arguments); |
|||
}; |
|||
|
|||
} else if (menuItems) { |
|||
callback = function () { |
|||
chart.contextMenu( |
|||
button.menuClassName, |
|||
menuItems, |
|||
button.translateX, |
|||
button.translateY, |
|||
button.width, |
|||
button.height, |
|||
button |
|||
); |
|||
button.setState(2); |
|||
}; |
|||
} |
|||
|
|||
|
|||
if (btnOptions.text && btnOptions.symbol) { |
|||
attr.paddingLeft = Highcharts.pick(attr.paddingLeft, 25); |
|||
|
|||
} else if (!btnOptions.text) { |
|||
extend(attr, { |
|||
width: btnOptions.width, |
|||
height: btnOptions.height, |
|||
padding: 0 |
|||
}); |
|||
} |
|||
|
|||
button = renderer.button(btnOptions.text, 0, 0, callback, attr, hover, select) |
|||
.attr({ |
|||
title: chart.options.lang[btnOptions._titleKey], |
|||
'stroke-linecap': 'round' |
|||
}); |
|||
button.menuClassName = options.menuClassName || PREFIX + 'menu-' + chart.btnCount++; |
|||
|
|||
if (btnOptions.symbol) { |
|||
symbol = renderer.symbol( |
|||
btnOptions.symbol, |
|||
btnOptions.symbolX - (symbolSize / 2), |
|||
btnOptions.symbolY - (symbolSize / 2), |
|||
symbolSize, |
|||
symbolSize |
|||
) |
|||
.attr(extend(symbolAttr, { |
|||
'stroke-width': btnOptions.symbolStrokeWidth || 1, |
|||
zIndex: 1 |
|||
})).add(button); |
|||
} |
|||
|
|||
button.add() |
|||
.align(extend(btnOptions, { |
|||
width: button.width, |
|||
x: Highcharts.pick(btnOptions.x, buttonOffset) // #1654
|
|||
}), true, 'spacingBox'); |
|||
|
|||
buttonOffset += (button.width + btnOptions.buttonSpacing) * (btnOptions.align === 'right' ? -1 : 1); |
|||
|
|||
chart.exportSVGElements.push(button, symbol); |
|||
|
|||
}, |
|||
|
|||
/** |
|||
* Destroy the buttons. |
|||
*/ |
|||
destroyExport: function (e) { |
|||
var chart = e.target, |
|||
i, |
|||
elem; |
|||
|
|||
// Destroy the extra buttons added
|
|||
for (i = 0; i < chart.exportSVGElements.length; i++) { |
|||
elem = chart.exportSVGElements[i]; |
|||
|
|||
// Destroy and null the svg/vml elements
|
|||
if (elem) { // #1822
|
|||
elem.onclick = elem.ontouchstart = null; |
|||
chart.exportSVGElements[i] = elem.destroy(); |
|||
} |
|||
} |
|||
|
|||
// Destroy the divs for the menu
|
|||
for (i = 0; i < chart.exportDivElements.length; i++) { |
|||
elem = chart.exportDivElements[i]; |
|||
|
|||
// Remove the event handler
|
|||
removeEvent(elem, 'mouseleave'); |
|||
|
|||
// Remove inline events
|
|||
chart.exportDivElements[i] = elem.onmouseout = elem.onmouseover = elem.ontouchstart = elem.onclick = null; |
|||
|
|||
// Destroy the div by moving to garbage bin
|
|||
discardElement(elem); |
|||
} |
|||
} |
|||
}); |
|||
|
|||
|
|||
symbols.menu = function (x, y, width, height) { |
|||
var arr = [ |
|||
M, x, y + 2.5, |
|||
L, x + width, y + 2.5, |
|||
M, x, y + height / 2 + 0.5, |
|||
L, x + width, y + height / 2 + 0.5, |
|||
M, x, y + height - 1.5, |
|||
L, x + width, y + height - 1.5 |
|||
]; |
|||
return arr; |
|||
}; |
|||
|
|||
// Add the buttons on chart load
|
|||
Chart.prototype.callbacks.push(function (chart) { |
|||
var n, |
|||
exportingOptions = chart.options.exporting, |
|||
buttons = exportingOptions.buttons; |
|||
|
|||
buttonOffset = 0; |
|||
|
|||
if (exportingOptions.enabled !== false) { |
|||
|
|||
for (n in buttons) { |
|||
chart.addButton(buttons[n]); |
|||
} |
|||
|
|||
// Destroy the export elements at chart destroy
|
|||
addEvent(chart, 'destroy', chart.destroyExport); |
|||
} |
|||
|
|||
}); |
|||
|
|||
|
|||
}(Highcharts)); |
|||
@ -0,0 +1,12 @@ |
|||
/* |
|||
|
|||
Highcharts funnel module, Beta |
|||
|
|||
(c) 2010-2012 Torstein Hønsi |
|||
|
|||
License: www.highcharts.com/license |
|||
*/ |
|||
(function(d){var u=d.getOptions().plotOptions,p=d.seriesTypes,D=d.merge,z=function(){},A=d.each;u.funnel=D(u.pie,{center:["50%","50%"],width:"90%",neckWidth:"30%",height:"100%",neckHeight:"25%",dataLabels:{connectorWidth:1,connectorColor:"#606060"},size:!0,states:{select:{color:"#C0C0C0",borderColor:"#000000",shadow:!1}}});p.funnel=d.extendClass(p.pie,{type:"funnel",animate:z,translate:function(){var a=function(k,a){return/%$/.test(k)?a*parseInt(k,10)/100:parseInt(k,10)},g=0,e=this.chart,f=e.plotWidth, |
|||
e=e.plotHeight,h=0,c=this.options,C=c.center,b=a(C[0],f),d=a(C[0],e),p=a(c.width,f),i,q,j=a(c.height,e),r=a(c.neckWidth,f),s=a(c.neckHeight,e),v=j-s,a=this.data,w,x,u=c.dataLabels.position==="left"?1:0,y,m,B,n,l,t,o;this.getWidthAt=q=function(k){return k>j-s||j===s?r:r+(p-r)*((j-s-k)/(j-s))};this.getX=function(k,a){return b+(a?-1:1)*(q(k)/2+c.dataLabels.distance)};this.center=[b,d,j];this.centerX=b;A(a,function(a){g+=a.y});A(a,function(a){o=null;x=g?a.y/g:0;m=d-j/2+h*j;l=m+x*j;i=q(m);y=b-i/2;B=y+ |
|||
i;i=q(l);n=b-i/2;t=n+i;m>v?(y=n=b-r/2,B=t=b+r/2):l>v&&(o=l,i=q(v),n=b-i/2,t=n+i,l=v);w=["M",y,m,"L",B,m,t,l];o&&w.push(t,o,n,o);w.push(n,l,"Z");a.shapeType="path";a.shapeArgs={d:w};a.percentage=x*100;a.plotX=b;a.plotY=(m+(o||l))/2;a.tooltipPos=[b,a.plotY];a.slice=z;a.half=u;h+=x});this.setTooltipPoints()},drawPoints:function(){var a=this,g=a.options,e=a.chart.renderer;A(a.data,function(f){var h=f.graphic,c=f.shapeArgs;h?h.animate(c):f.graphic=e.path(c).attr({fill:f.color,stroke:g.borderColor,"stroke-width":g.borderWidth}).add(a.group)})}, |
|||
sortByAngle:z,drawDataLabels:function(){var a=this.data,g=this.options.dataLabels.distance,e,f,h,c=a.length,d,b;for(this.center[2]-=2*g;c--;)h=a[c],f=(e=h.half)?1:-1,b=h.plotY,d=this.getX(b,e),h.labelPos=[0,b,d+(g-5)*f,b,d+g*f,b,e?"right":"left",0];p.pie.prototype.drawDataLabels.call(this)}})})(Highcharts); |
|||
@ -0,0 +1,289 @@ |
|||
/** |
|||
* @license |
|||
* Highcharts funnel module, Beta |
|||
* |
|||
* (c) 2010-2012 Torstein Hønsi |
|||
* |
|||
* License: www.highcharts.com/license |
|||
*/ |
|||
|
|||
/*global Highcharts */ |
|||
(function (Highcharts) { |
|||
|
|||
'use strict'; |
|||
|
|||
// create shortcuts
|
|||
var defaultOptions = Highcharts.getOptions(), |
|||
defaultPlotOptions = defaultOptions.plotOptions, |
|||
seriesTypes = Highcharts.seriesTypes, |
|||
merge = Highcharts.merge, |
|||
noop = function () {}, |
|||
each = Highcharts.each; |
|||
|
|||
// set default options
|
|||
defaultPlotOptions.funnel = merge(defaultPlotOptions.pie, { |
|||
center: ['50%', '50%'], |
|||
width: '90%', |
|||
neckWidth: '30%', |
|||
height: '100%', |
|||
neckHeight: '25%', |
|||
|
|||
dataLabels: { |
|||
//position: 'right',
|
|||
connectorWidth: 1, |
|||
connectorColor: '#606060' |
|||
}, |
|||
size: true, // to avoid adapting to data label size in Pie.drawDataLabels
|
|||
states: { |
|||
select: { |
|||
color: '#C0C0C0', |
|||
borderColor: '#000000', |
|||
shadow: false |
|||
} |
|||
} |
|||
}); |
|||
|
|||
|
|||
seriesTypes.funnel = Highcharts.extendClass(seriesTypes.pie, { |
|||
|
|||
type: 'funnel', |
|||
animate: noop, |
|||
|
|||
/** |
|||
* Overrides the pie translate method |
|||
*/ |
|||
translate: function () { |
|||
|
|||
var |
|||
// Get positions - either an integer or a percentage string must be given
|
|||
getLength = function (length, relativeTo) { |
|||
return (/%$/).test(length) ? |
|||
relativeTo * parseInt(length, 10) / 100 : |
|||
parseInt(length, 10); |
|||
}, |
|||
|
|||
sum = 0, |
|||
series = this, |
|||
chart = series.chart, |
|||
plotWidth = chart.plotWidth, |
|||
plotHeight = chart.plotHeight, |
|||
cumulative = 0, // start at top
|
|||
options = series.options, |
|||
center = options.center, |
|||
centerX = getLength(center[0], plotWidth), |
|||
centerY = getLength(center[0], plotHeight), |
|||
width = getLength(options.width, plotWidth), |
|||
tempWidth, |
|||
getWidthAt, |
|||
height = getLength(options.height, plotHeight), |
|||
neckWidth = getLength(options.neckWidth, plotWidth), |
|||
neckHeight = getLength(options.neckHeight, plotHeight), |
|||
neckY = height - neckHeight, |
|||
data = series.data, |
|||
path, |
|||
fraction, |
|||
half = options.dataLabels.position === 'left' ? 1 : 0, |
|||
|
|||
x1, |
|||
y1, |
|||
x2, |
|||
x3, |
|||
y3, |
|||
x4, |
|||
y5; |
|||
|
|||
// Return the width at a specific y coordinate
|
|||
series.getWidthAt = getWidthAt = function (y) { |
|||
return y > height - neckHeight || height === neckHeight ? |
|||
neckWidth : |
|||
neckWidth + (width - neckWidth) * ((height - neckHeight - y) / (height - neckHeight)); |
|||
}; |
|||
series.getX = function (y, half) { |
|||
return centerX + (half ? -1 : 1) * ((getWidthAt(y) / 2) + options.dataLabels.distance); |
|||
}; |
|||
|
|||
// Expose
|
|||
series.center = [centerX, centerY, height]; |
|||
series.centerX = centerX; |
|||
|
|||
/* |
|||
* Individual point coordinate naming: |
|||
* |
|||
* x1,y1 _________________ x2,y1 |
|||
* \ / |
|||
* \ / |
|||
* \ / |
|||
* \ / |
|||
* \ / |
|||
* x3,y3 _________ x4,y3 |
|||
* |
|||
* Additional for the base of the neck: |
|||
* |
|||
* | | |
|||
* | | |
|||
* | | |
|||
* x3,y5 _________ x4,y5 |
|||
*/ |
|||
|
|||
|
|||
|
|||
|
|||
// get the total sum
|
|||
each(data, function (point) { |
|||
sum += point.y; |
|||
}); |
|||
|
|||
each(data, function (point) { |
|||
// set start and end positions
|
|||
y5 = null; |
|||
fraction = sum ? point.y / sum : 0; |
|||
y1 = centerY - height / 2 + cumulative * height; |
|||
y3 = y1 + fraction * height; |
|||
//tempWidth = neckWidth + (width - neckWidth) * ((height - neckHeight - y1) / (height - neckHeight));
|
|||
tempWidth = getWidthAt(y1); |
|||
x1 = centerX - tempWidth / 2; |
|||
x2 = x1 + tempWidth; |
|||
tempWidth = getWidthAt(y3); |
|||
x3 = centerX - tempWidth / 2; |
|||
x4 = x3 + tempWidth; |
|||
|
|||
// the entire point is within the neck
|
|||
if (y1 > neckY) { |
|||
x1 = x3 = centerX - neckWidth / 2; |
|||
x2 = x4 = centerX + neckWidth / 2; |
|||
|
|||
// the base of the neck
|
|||
} else if (y3 > neckY) { |
|||
y5 = y3; |
|||
|
|||
tempWidth = getWidthAt(neckY); |
|||
x3 = centerX - tempWidth / 2; |
|||
x4 = x3 + tempWidth; |
|||
|
|||
y3 = neckY; |
|||
} |
|||
|
|||
// save the path
|
|||
path = [ |
|||
'M', |
|||
x1, y1, |
|||
'L', |
|||
x2, y1, |
|||
x4, y3 |
|||
]; |
|||
if (y5) { |
|||
path.push(x4, y5, x3, y5); |
|||
} |
|||
path.push(x3, y3, 'Z'); |
|||
|
|||
// prepare for using shared dr
|
|||
point.shapeType = 'path'; |
|||
point.shapeArgs = { d: path }; |
|||
|
|||
|
|||
// for tooltips and data labels
|
|||
point.percentage = fraction * 100; |
|||
point.plotX = centerX; |
|||
point.plotY = (y1 + (y5 || y3)) / 2; |
|||
|
|||
// Placement of tooltips and data labels
|
|||
point.tooltipPos = [ |
|||
centerX, |
|||
point.plotY |
|||
]; |
|||
|
|||
// Slice is a noop on funnel points
|
|||
point.slice = noop; |
|||
|
|||
// Mimicking pie data label placement logic
|
|||
point.half = half; |
|||
|
|||
cumulative += fraction; |
|||
}); |
|||
|
|||
|
|||
series.setTooltipPoints(); |
|||
}, |
|||
/** |
|||
* Draw a single point (wedge) |
|||
* @param {Object} point The point object |
|||
* @param {Object} color The color of the point |
|||
* @param {Number} brightness The brightness relative to the color |
|||
*/ |
|||
drawPoints: function () { |
|||
var series = this, |
|||
options = series.options, |
|||
chart = series.chart, |
|||
renderer = chart.renderer; |
|||
|
|||
each(series.data, function (point) { |
|||
|
|||
var graphic = point.graphic, |
|||
shapeArgs = point.shapeArgs; |
|||
|
|||
if (!graphic) { // Create the shapes
|
|||
point.graphic = renderer.path(shapeArgs). |
|||
attr({ |
|||
fill: point.color, |
|||
stroke: options.borderColor, |
|||
'stroke-width': options.borderWidth |
|||
}). |
|||
add(series.group); |
|||
|
|||
} else { // Update the shapes
|
|||
graphic.animate(shapeArgs); |
|||
} |
|||
}); |
|||
}, |
|||
|
|||
/** |
|||
* Funnel items don't have angles (#2289) |
|||
*/ |
|||
sortByAngle: noop, |
|||
|
|||
/** |
|||
* Extend the pie data label method |
|||
*/ |
|||
drawDataLabels: function () { |
|||
var data = this.data, |
|||
labelDistance = this.options.dataLabels.distance, |
|||
leftSide, |
|||
sign, |
|||
point, |
|||
i = data.length, |
|||
x, |
|||
y; |
|||
|
|||
// In the original pie label anticollision logic, the slots are distributed
|
|||
// from one labelDistance above to one labelDistance below the pie. In funnels
|
|||
// we don't want this.
|
|||
this.center[2] -= 2 * labelDistance; |
|||
|
|||
// Set the label position array for each point.
|
|||
while (i--) { |
|||
point = data[i]; |
|||
leftSide = point.half; |
|||
sign = leftSide ? 1 : -1; |
|||
y = point.plotY; |
|||
x = this.getX(y, leftSide); |
|||
|
|||
// set the anchor point for data labels
|
|||
point.labelPos = [ |
|||
0, // first break of connector
|
|||
y, // a/a
|
|||
x + (labelDistance - 5) * sign, // second break, right outside point shape
|
|||
y, // a/a
|
|||
x + labelDistance * sign, // landing point for connector
|
|||
y, // a/a
|
|||
leftSide ? 'right' : 'left', // alignment
|
|||
0 // center angle
|
|||
]; |
|||
} |
|||
|
|||
seriesTypes.pie.prototype.drawDataLabels.call(this); |
|||
} |
|||
|
|||
}); |
|||
|
|||
|
|||
}(Highcharts)); |
|||
@ -0,0 +1 @@ |
|||
(function(b){var k=b.seriesTypes,l=b.each;k.heatmap=b.extendClass(k.map,{colorKey:"z",useMapGeometry:!1,pointArrayMap:["y","z"],translate:function(){var c=this,b=c.options,i=Number.MAX_VALUE,j=Number.MIN_VALUE;c.generatePoints();l(c.data,function(a){var e=a.x,f=a.y,d=a.z,g=(b.colsize||1)/2,h=(b.rowsize||1)/2;a.path=["M",e-g,f-h,"L",e+g,f-h,"L",e+g,f+h,"L",e-g,f+h,"Z"];a.shapeType="path";a.shapeArgs={d:c.translatePath(a.path)};typeof d==="number"&&(d>j?j=d:d<i&&(i=d))});c.translateColors(i,j)},getBox:function(){}})})(Highcharts); |
|||
@ -0,0 +1,53 @@ |
|||
(function (Highcharts) { |
|||
var seriesTypes = Highcharts.seriesTypes, |
|||
each = Highcharts.each; |
|||
|
|||
seriesTypes.heatmap = Highcharts.extendClass(seriesTypes.map, { |
|||
colorKey: 'z', |
|||
useMapGeometry: false, |
|||
pointArrayMap: ['y', 'z'], |
|||
translate: function () { |
|||
var series = this, |
|||
options = series.options, |
|||
dataMin = Number.MAX_VALUE, |
|||
dataMax = Number.MIN_VALUE; |
|||
|
|||
series.generatePoints(); |
|||
|
|||
each(series.data, function (point) { |
|||
var x = point.x, |
|||
y = point.y, |
|||
value = point.z, |
|||
xPad = (options.colsize || 1) / 2, |
|||
yPad = (options.rowsize || 1) / 2; |
|||
|
|||
point.path = [ |
|||
'M', x - xPad, y - yPad, |
|||
'L', x + xPad, y - yPad, |
|||
'L', x + xPad, y + yPad, |
|||
'L', x - xPad, y + yPad, |
|||
'Z' |
|||
]; |
|||
|
|||
point.shapeType = 'path'; |
|||
point.shapeArgs = { |
|||
d: series.translatePath(point.path) |
|||
}; |
|||
|
|||
if (typeof value === 'number') { |
|||
if (value > dataMax) { |
|||
dataMax = value; |
|||
} else if (value < dataMin) { |
|||
dataMin = value; |
|||
} |
|||
} |
|||
}); |
|||
|
|||
series.translateColors(dataMin, dataMax); |
|||
}, |
|||
|
|||
getBox: function () {} |
|||
|
|||
}); |
|||
|
|||
}(Highcharts)); |
|||
@ -0,0 +1,257 @@ |
|||
/** |
|||
* Gray theme for Highcharts JS |
|||
* @author Torstein Hønsi |
|||
*/ |
|||
|
|||
Highcharts.theme = { |
|||
colors: ["#DDDF0D", "#7798BF", "#55BF3B", "#DF5353", "#aaeeee", "#ff0066", "#eeaaee", |
|||
"#55BF3B", "#DF5353", "#7798BF", "#aaeeee"], |
|||
chart: { |
|||
backgroundColor: { |
|||
linearGradient: { x1: 0, y1: 0, x2: 0, y2: 1 }, |
|||
stops: [ |
|||
[0, 'rgb(96, 96, 96)'], |
|||
[1, 'rgb(16, 16, 16)'] |
|||
] |
|||
}, |
|||
borderWidth: 0, |
|||
borderRadius: 15, |
|||
plotBackgroundColor: null, |
|||
plotShadow: false, |
|||
plotBorderWidth: 0 |
|||
}, |
|||
title: { |
|||
style: { |
|||
color: '#FFF', |
|||
font: '16px Lucida Grande, Lucida Sans Unicode, Verdana, Arial, Helvetica, sans-serif' |
|||
} |
|||
}, |
|||
subtitle: { |
|||
style: { |
|||
color: '#DDD', |
|||
font: '12px Lucida Grande, Lucida Sans Unicode, Verdana, Arial, Helvetica, sans-serif' |
|||
} |
|||
}, |
|||
xAxis: { |
|||
gridLineWidth: 0, |
|||
lineColor: '#999', |
|||
tickColor: '#999', |
|||
labels: { |
|||
style: { |
|||
color: '#999', |
|||
fontWeight: 'bold' |
|||
} |
|||
}, |
|||
title: { |
|||
style: { |
|||
color: '#AAA', |
|||
font: 'bold 12px Lucida Grande, Lucida Sans Unicode, Verdana, Arial, Helvetica, sans-serif' |
|||
} |
|||
} |
|||
}, |
|||
yAxis: { |
|||
alternateGridColor: null, |
|||
minorTickInterval: null, |
|||
gridLineColor: 'rgba(255, 255, 255, .1)', |
|||
minorGridLineColor: 'rgba(255,255,255,0.07)', |
|||
lineWidth: 0, |
|||
tickWidth: 0, |
|||
labels: { |
|||
style: { |
|||
color: '#999', |
|||
fontWeight: 'bold' |
|||
} |
|||
}, |
|||
title: { |
|||
style: { |
|||
color: '#AAA', |
|||
font: 'bold 12px Lucida Grande, Lucida Sans Unicode, Verdana, Arial, Helvetica, sans-serif' |
|||
} |
|||
} |
|||
}, |
|||
legend: { |
|||
itemStyle: { |
|||
color: '#CCC' |
|||
}, |
|||
itemHoverStyle: { |
|||
color: '#FFF' |
|||
}, |
|||
itemHiddenStyle: { |
|||
color: '#333' |
|||
} |
|||
}, |
|||
labels: { |
|||
style: { |
|||
color: '#CCC' |
|||
} |
|||
}, |
|||
tooltip: { |
|||
backgroundColor: { |
|||
linearGradient: { x1: 0, y1: 0, x2: 0, y2: 1 }, |
|||
stops: [ |
|||
[0, 'rgba(96, 96, 96, .8)'], |
|||
[1, 'rgba(16, 16, 16, .8)'] |
|||
] |
|||
}, |
|||
borderWidth: 0, |
|||
style: { |
|||
color: '#FFF' |
|||
} |
|||
}, |
|||
|
|||
|
|||
plotOptions: { |
|||
series: { |
|||
shadow: true |
|||
}, |
|||
line: { |
|||
dataLabels: { |
|||
color: '#CCC' |
|||
}, |
|||
marker: { |
|||
lineColor: '#333' |
|||
} |
|||
}, |
|||
spline: { |
|||
marker: { |
|||
lineColor: '#333' |
|||
} |
|||
}, |
|||
scatter: { |
|||
marker: { |
|||
lineColor: '#333' |
|||
} |
|||
}, |
|||
candlestick: { |
|||
lineColor: 'white' |
|||
} |
|||
}, |
|||
|
|||
toolbar: { |
|||
itemStyle: { |
|||
color: '#CCC' |
|||
} |
|||
}, |
|||
|
|||
navigation: { |
|||
buttonOptions: { |
|||
symbolStroke: '#DDDDDD', |
|||
hoverSymbolStroke: '#FFFFFF', |
|||
theme: { |
|||
fill: { |
|||
linearGradient: { x1: 0, y1: 0, x2: 0, y2: 1 }, |
|||
stops: [ |
|||
[0.4, '#606060'], |
|||
[0.6, '#333333'] |
|||
] |
|||
}, |
|||
stroke: '#000000' |
|||
} |
|||
} |
|||
}, |
|||
|
|||
// scroll charts
|
|||
rangeSelector: { |
|||
buttonTheme: { |
|||
fill: { |
|||
linearGradient: { x1: 0, y1: 0, x2: 0, y2: 1 }, |
|||
stops: [ |
|||
[0.4, '#888'], |
|||
[0.6, '#555'] |
|||
] |
|||
}, |
|||
stroke: '#000000', |
|||
style: { |
|||
color: '#CCC', |
|||
fontWeight: 'bold' |
|||
}, |
|||
states: { |
|||
hover: { |
|||
fill: { |
|||
linearGradient: { x1: 0, y1: 0, x2: 0, y2: 1 }, |
|||
stops: [ |
|||
[0.4, '#BBB'], |
|||
[0.6, '#888'] |
|||
] |
|||
}, |
|||
stroke: '#000000', |
|||
style: { |
|||
color: 'white' |
|||
} |
|||
}, |
|||
select: { |
|||
fill: { |
|||
linearGradient: { x1: 0, y1: 0, x2: 0, y2: 1 }, |
|||
stops: [ |
|||
[0.1, '#000'], |
|||
[0.3, '#333'] |
|||
] |
|||
}, |
|||
stroke: '#000000', |
|||
style: { |
|||
color: 'yellow' |
|||
} |
|||
} |
|||
} |
|||
}, |
|||
inputStyle: { |
|||
backgroundColor: '#333', |
|||
color: 'silver' |
|||
}, |
|||
labelStyle: { |
|||
color: 'silver' |
|||
} |
|||
}, |
|||
|
|||
navigator: { |
|||
handles: { |
|||
backgroundColor: '#666', |
|||
borderColor: '#AAA' |
|||
}, |
|||
outlineColor: '#CCC', |
|||
maskFill: 'rgba(16, 16, 16, 0.5)', |
|||
series: { |
|||
color: '#7798BF', |
|||
lineColor: '#A6C7ED' |
|||
} |
|||
}, |
|||
|
|||
scrollbar: { |
|||
barBackgroundColor: { |
|||
linearGradient: { x1: 0, y1: 0, x2: 0, y2: 1 }, |
|||
stops: [ |
|||
[0.4, '#888'], |
|||
[0.6, '#555'] |
|||
] |
|||
}, |
|||
barBorderColor: '#CCC', |
|||
buttonArrowColor: '#CCC', |
|||
buttonBackgroundColor: { |
|||
linearGradient: { x1: 0, y1: 0, x2: 0, y2: 1 }, |
|||
stops: [ |
|||
[0.4, '#888'], |
|||
[0.6, '#555'] |
|||
] |
|||
}, |
|||
buttonBorderColor: '#CCC', |
|||
rifleColor: '#FFF', |
|||
trackBackgroundColor: { |
|||
linearGradient: { x1: 0, y1: 0, x2: 0, y2: 1 }, |
|||
stops: [ |
|||
[0, '#000'], |
|||
[1, '#333'] |
|||
] |
|||
}, |
|||
trackBorderColor: '#666' |
|||
}, |
|||
|
|||
// special colors for some of the demo examples
|
|||
legendBackgroundColor: 'rgba(48, 48, 48, 0.8)', |
|||
legendBackgroundColorSolid: 'rgb(70, 70, 70)', |
|||
dataLabelsColor: '#444', |
|||
textColor: '#E0E0E0', |
|||
maskColor: 'rgba(255,255,255,0.3)' |
|||
}; |
|||
|
|||
// Apply the theme
|
|||
var highchartsOptions = Highcharts.setOptions(Highcharts.theme); |
|||
@ -0,0 +1,103 @@ |
|||
/** |
|||
* Grid theme for Highcharts JS |
|||
* @author Torstein Hønsi |
|||
*/ |
|||
|
|||
Highcharts.theme = { |
|||
colors: ['#058DC7', '#50B432', '#ED561B', '#DDDF00', '#24CBE5', '#64E572', '#FF9655', '#FFF263', '#6AF9C4'], |
|||
chart: { |
|||
backgroundColor: { |
|||
linearGradient: { x1: 0, y1: 0, x2: 1, y2: 1 }, |
|||
stops: [ |
|||
[0, 'rgb(255, 255, 255)'], |
|||
[1, 'rgb(240, 240, 255)'] |
|||
] |
|||
}, |
|||
borderWidth: 2, |
|||
plotBackgroundColor: 'rgba(255, 255, 255, .9)', |
|||
plotShadow: true, |
|||
plotBorderWidth: 1 |
|||
}, |
|||
title: { |
|||
style: { |
|||
color: '#000', |
|||
font: 'bold 16px "Trebuchet MS", Verdana, sans-serif' |
|||
} |
|||
}, |
|||
subtitle: { |
|||
style: { |
|||
color: '#666666', |
|||
font: 'bold 12px "Trebuchet MS", Verdana, sans-serif' |
|||
} |
|||
}, |
|||
xAxis: { |
|||
gridLineWidth: 1, |
|||
lineColor: '#000', |
|||
tickColor: '#000', |
|||
labels: { |
|||
style: { |
|||
color: '#000', |
|||
font: '11px Trebuchet MS, Verdana, sans-serif' |
|||
} |
|||
}, |
|||
title: { |
|||
style: { |
|||
color: '#333', |
|||
fontWeight: 'bold', |
|||
fontSize: '12px', |
|||
fontFamily: 'Trebuchet MS, Verdana, sans-serif' |
|||
|
|||
} |
|||
} |
|||
}, |
|||
yAxis: { |
|||
minorTickInterval: 'auto', |
|||
lineColor: '#000', |
|||
lineWidth: 1, |
|||
tickWidth: 1, |
|||
tickColor: '#000', |
|||
labels: { |
|||
style: { |
|||
color: '#000', |
|||
font: '11px Trebuchet MS, Verdana, sans-serif' |
|||
} |
|||
}, |
|||
title: { |
|||
style: { |
|||
color: '#333', |
|||
fontWeight: 'bold', |
|||
fontSize: '12px', |
|||
fontFamily: 'Trebuchet MS, Verdana, sans-serif' |
|||
} |
|||
} |
|||
}, |
|||
legend: { |
|||
itemStyle: { |
|||
font: '9pt Trebuchet MS, Verdana, sans-serif', |
|||
color: 'black' |
|||
|
|||
}, |
|||
itemHoverStyle: { |
|||
color: '#039' |
|||
}, |
|||
itemHiddenStyle: { |
|||
color: 'gray' |
|||
} |
|||
}, |
|||
labels: { |
|||
style: { |
|||
color: '#99b' |
|||
} |
|||
}, |
|||
|
|||
navigation: { |
|||
buttonOptions: { |
|||
theme: { |
|||
stroke: '#CCCCCC' |
|||
} |
|||
} |
|||
} |
|||
}; |
|||
|
|||
// Apply the theme
|
|||
var highchartsOptions = Highcharts.setOptions(Highcharts.theme); |
|||
|
After Width: | Height: | Size: 306 KiB |
|
After Width: | Height: | Size: 62 KiB |
|
After Width: | Height: | Size: 7.9 KiB |
|
After Width: | Height: | Size: 1.8 KiB |
|
After Width: | Height: | Size: 1.9 KiB |
|
After Width: | Height: | Size: 32 KiB |
|
After Width: | Height: | Size: 301 B |