diff --git a/CHANGELOG.md b/CHANGELOG.md
index fa752fa..6d2d599 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,6 +1,12 @@
ChangeLog
=========
+## Version 1.2.2 (2013-06-14)
+
+Doc:
+
+ - Add API documentation generated by [ApiGen](http://apigen.org/).
+
## Version 1.2.1 (2013-06-05)
Doc :
diff --git a/README.md b/README.md
index a428ca0..23bf087 100644
--- a/README.md
+++ b/README.md
@@ -277,6 +277,14 @@ and run `php composer.phar install` from the terminal into the root folder of yo
…
```
+## Documentation
+[API documentation](http://htmlpreview.github.io/?https://github.com/geoffroy-aubry/Helpers/blob/stable/doc/api/index.html)
+is generated by [ApiGen](http://apigen.org/) in the `doc/api` folder.
+
+```bash
+$ php vendor/bin/apigen.php -c apigen.neon
+```
+
## Copyrights & licensing
Licensed under the GNU Lesser General Public License v3 (LGPL version 3).
See [LICENSE](LICENSE) file for details.
diff --git a/apigen.neon b/apigen.neon
new file mode 100644
index 0000000..c1d693d
--- /dev/null
+++ b/apigen.neon
@@ -0,0 +1,49 @@
+source: [src]
+
+destination: doc/api
+
+extensions: [php]
+
+exclude: [*/tests/*, */Test/*, */vendor/composer]
+
+charset: UTF-8
+
+main: GAubry\Helpers
+
+title: Helpers
+
+groups: namespaces
+
+allowedHtml: [b, i, a, ul, ol, li, p, br, var, samp, kbd, tt]
+
+autocomplete: [classes, constants, functions, methods, properties, classconstants]
+
+accessLevels: [public, protected, private]
+
+internal: No
+
+php: No
+
+tree: Yes
+
+deprecated: Yes
+
+todo: Yes
+
+sourceCode: Yes
+
+download: No
+
+report:
+
+wipeout: Yes
+
+quiet: No
+
+progressbar: No
+
+colors: Yes
+
+updateCheck: No
+
+debug: No
diff --git a/composer.json b/composer.json
index 2543e66..581b782 100644
--- a/composer.json
+++ b/composer.json
@@ -17,7 +17,8 @@
"phpunit/phpunit": ">=3.7",
"phpmd/phpmd": "1.4.*",
"squizlabs/php_codesniffer": "1.4.*",
- "satooshi/php-coveralls": "dev-master"
+ "satooshi/php-coveralls": "dev-master",
+ "apigen/apigen": "2.8.0"
},
"autoload": {
"psr-0": {"GAubry\\Helpers": "src/"}
diff --git a/composer.lock b/composer.lock
index 9abe461..9012ea0 100644
--- a/composer.lock
+++ b/composer.lock
@@ -3,23 +3,187 @@
"This file locks the dependencies of your project to a known state",
"Read more about it at http://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file"
],
- "hash": "477c13bf740db89640283ee2052c644c",
+ "hash": "3ea2d3f710c7537a4568c22def20de7e",
"packages": [
],
"packages-dev": [
+ {
+ "name": "andrewsville/php-token-reflection",
+ "version": "1.3.1",
+ "source": {
+ "type": "git",
+ "url": "git://github.com/Andrewsville/PHP-Token-Reflection.git",
+ "reference": "1.3.1"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://github.com/Andrewsville/PHP-Token-Reflection/zipball/1.3.1",
+ "reference": "1.3.1",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-0": {
+ "TokenReflection": "./"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3"
+ ],
+ "authors": [
+ {
+ "name": "Ondřej Nešpor",
+ "homepage": "https://github.com/Andrewsville"
+ },
+ {
+ "name": "Jaroslav Hanslík",
+ "homepage": "https://github.com/kukulich"
+ }
+ ],
+ "description": "Library emulating the PHP internal reflection using just the tokenized source code.",
+ "homepage": "http://andrewsville.github.com/PHP-Token-Reflection/",
+ "keywords": [
+ "library",
+ "reflection",
+ "tokenizer"
+ ],
+ "time": "2012-08-25 14:26:44"
+ },
+ {
+ "name": "apigen/apigen",
+ "version": "2.8.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/apigen/apigen",
+ "reference": "2.8.0"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://github.com/apigen/apigen/zipball/2.8.0",
+ "reference": "2.8.0",
+ "shasum": ""
+ },
+ "require": {
+ "andrewsville/php-token-reflection": ">=1.3.1",
+ "dg/texy": ">=2.1.0",
+ "kukulich/fshl": ">=2.1.0",
+ "nette/nette": ">=2.0.5",
+ "php": ">=5.3.0"
+ },
+ "suggest": {
+ "ext-bz2": "*",
+ "ext-phar": "*",
+ "ext-zip": "*",
+ "ext-zlib": "*"
+ },
+ "bin": [
+ "apigen.php"
+ ],
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-develop": "3.0.0-dev"
+ }
+ },
+ "autoload": {
+ "psr-0": {
+ "ApiGen": "./"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "David Grudl",
+ "homepage": "http://davidgrudl.com"
+ },
+ {
+ "name": "Ondřej Nešpor",
+ "homepage": "https://github.com/Andrewsville"
+ },
+ {
+ "name": "Jaroslav Hanslík",
+ "homepage": "https://github.com/kukulich"
+ }
+ ],
+ "description": "API documentation generator for PHP 5.3+",
+ "homepage": "http://apigen.org/",
+ "keywords": [
+ "api",
+ "docblock",
+ "documentation",
+ "generator",
+ "phpDocumentor",
+ "phpdoc"
+ ],
+ "time": "2012-09-29 10:34:02"
+ },
+ {
+ "name": "dg/texy",
+ "version": "v2.2.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/dg/texy.git",
+ "reference": "v2.2.0"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/dg/texy/zipball/v2.2.0",
+ "reference": "v2.2.0",
+ "shasum": ""
+ },
+ "type": "library",
+ "autoload": {
+ "classmap": [
+ "Texy/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3",
+ "GPLv2",
+ "GPLv3"
+ ],
+ "authors": [
+ {
+ "name": "David Grudl",
+ "homepage": "http://davidgrudl.com"
+ }
+ ],
+ "description": "Texy converts plain text in easy to read Texy syntax into structurally valid (X)HTML. It supports adding of images, links, nested lists, tables and has full support for CSS. Texy supports hyphenation of long words (which reflects language rules), clickable emails and URL (emails are obfuscated against spambots), national typographic single and double quotation marks, ellipses, em dashes, dimension sign, nonbreakable spaces (e.g. in phone numbers), acronyms, arrows and many others. Texy code can optionally contain HTML tags.",
+ "homepage": "http://texy.info",
+ "keywords": [
+ "html",
+ "markdown",
+ "markup language",
+ "plain text",
+ "text",
+ "textile",
+ "texy",
+ "wiki",
+ "xhtml"
+ ],
+ "time": "2012-03-30 21:57:36"
+ },
{
"name": "guzzle/guzzle",
- "version": "v3.6.0",
+ "version": "v3.7.0",
"source": {
"type": "git",
"url": "https://github.com/guzzle/guzzle.git",
- "reference": "v3.6.0"
+ "reference": "v3.7.0"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/guzzle/guzzle/zipball/v3.6.0",
- "reference": "v3.6.0",
+ "url": "https://api.github.com/repos/guzzle/guzzle/zipball/v3.7.0",
+ "reference": "v3.7.0",
"shasum": ""
},
"require": {
@@ -63,7 +227,7 @@
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "3.6-dev"
+ "dev-master": "3.7-dev"
}
},
"autoload": {
@@ -98,7 +262,123 @@
"rest",
"web service"
],
- "time": "2013-05-30 07:01:25"
+ "time": "2013-06-11 00:24:07"
+ },
+ {
+ "name": "kukulich/fshl",
+ "version": "2.1.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/kukulich/fshl",
+ "reference": "2.1.0"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://github.com/kukulich/fshl/zipball/2.1.0",
+ "reference": "2.1.0",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-0": {
+ "FSHL": "./"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "GPL-2.0+"
+ ],
+ "authors": [
+ {
+ "name": "Jaroslav Hanslík",
+ "homepage": "https://github.com/kukulich"
+ }
+ ],
+ "description": "FSHL is a free, open source, universal, fast syntax highlighter written in PHP.",
+ "homepage": "http://fshl.kukulich.cz/",
+ "keywords": [
+ "highlight",
+ "library",
+ "syntax"
+ ],
+ "time": "2012-09-08 12:00:07"
+ },
+ {
+ "name": "nette/nette",
+ "version": "v2.0.10",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/nette/nette.git",
+ "reference": "v2.0.10"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/nette/nette/zipball/v2.0.10",
+ "reference": "v2.0.10",
+ "shasum": ""
+ },
+ "require": {
+ "ext-iconv": "*",
+ "ext-tokenizer": "*",
+ "php": ">=5.3.0"
+ },
+ "require-dev": {
+ "nette/tester": "@dev"
+ },
+ "suggest": {
+ "ext-fileinfo": "*",
+ "ext-gd": "*",
+ "ext-mbstring": "*",
+ "ext-memcache": "*",
+ "ext-pdo": "*"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.1-dev"
+ }
+ },
+ "autoload": {
+ "files": [
+ "Nette/loader.php"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause",
+ "GPL-2.0",
+ "GPL-3.0"
+ ],
+ "authors": [
+ {
+ "name": "David Grudl",
+ "homepage": "http://davidgrudl.com"
+ },
+ {
+ "name": "Nette Community",
+ "homepage": "http://nette.org/contributors"
+ }
+ ],
+ "description": "Nette Framework - innovative framework for fast and easy development of secured web applications in PHP. Write less, have cleaner code and your work will bring you joy.",
+ "homepage": "http://nette.org",
+ "keywords": [
+ "Forms",
+ "database",
+ "dbal",
+ "debugging",
+ "framework",
+ "images",
+ "latte",
+ "mailing",
+ "micro",
+ "mvc",
+ "neon",
+ "templating"
+ ],
+ "time": "2013-03-08 15:44:35"
},
{
"name": "pdepend/pdepend",
@@ -689,26 +969,27 @@
},
{
"name": "symfony/config",
- "version": "v2.2.2",
+ "version": "v2.3.1",
"target-dir": "Symfony/Component/Config",
"source": {
"type": "git",
"url": "https://github.com/symfony/Config.git",
- "reference": "v2.2.2"
+ "reference": "v2.3.1"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/Config/zipball/v2.2.2",
- "reference": "v2.2.2",
+ "url": "https://api.github.com/repos/symfony/Config/zipball/v2.3.1",
+ "reference": "v2.3.1",
"shasum": ""
},
"require": {
- "php": ">=5.3.3"
+ "php": ">=5.3.3",
+ "symfony/filesystem": ">=2.3,<3.0"
},
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "2.2-dev"
+ "dev-master": "2.3-dev"
}
},
"autoload": {
@@ -732,21 +1013,21 @@
],
"description": "Symfony Config Component",
"homepage": "http://symfony.com",
- "time": "2013-05-10 18:08:31"
+ "time": "2013-06-03 00:18:25"
},
{
"name": "symfony/console",
- "version": "v2.3.0",
+ "version": "v2.3.1",
"target-dir": "Symfony/Component/Console",
"source": {
"type": "git",
"url": "https://github.com/symfony/Console.git",
- "reference": "v2.3.0"
+ "reference": "v2.3.1"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/Console/zipball/v2.3.0",
- "reference": "v2.3.0",
+ "url": "https://api.github.com/repos/symfony/Console/zipball/v2.3.1",
+ "reference": "v2.3.1",
"shasum": ""
},
"require": {
@@ -785,7 +1066,7 @@
],
"description": "Symfony Console Component",
"homepage": "http://symfony.com",
- "time": "2013-05-30 05:11:26"
+ "time": "2013-06-11 07:15:14"
},
{
"name": "symfony/event-dispatcher",
@@ -841,19 +1122,66 @@
"homepage": "http://symfony.com",
"time": "2013-05-13 14:36:40"
},
+ {
+ "name": "symfony/filesystem",
+ "version": "v2.3.1",
+ "target-dir": "Symfony/Component/Filesystem",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/Filesystem.git",
+ "reference": "v2.3.1"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/Filesystem/zipball/v2.3.1",
+ "reference": "v2.3.1",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.3"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.3-dev"
+ }
+ },
+ "autoload": {
+ "psr-0": {
+ "Symfony\\Component\\Filesystem\\": ""
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "http://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony Filesystem Component",
+ "homepage": "http://symfony.com",
+ "time": "2013-06-04 15:02:05"
+ },
{
"name": "symfony/stopwatch",
- "version": "v2.2.1",
+ "version": "v2.3.1",
"target-dir": "Symfony/Component/Stopwatch",
"source": {
"type": "git",
"url": "https://github.com/symfony/Stopwatch.git",
- "reference": "v2.2.1"
+ "reference": "v2.3.1"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/Stopwatch/zipball/v2.2.1",
- "reference": "v2.2.1",
+ "url": "https://api.github.com/repos/symfony/Stopwatch/zipball/v2.3.1",
+ "reference": "v2.3.1",
"shasum": ""
},
"require": {
@@ -862,7 +1190,7 @@
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "2.2-dev"
+ "dev-master": "2.3-dev"
}
},
"autoload": {
@@ -886,21 +1214,21 @@
],
"description": "Symfony Stopwatch Component",
"homepage": "http://symfony.com",
- "time": "2013-01-04 16:58:00"
+ "time": "2013-04-17 07:17:10"
},
{
"name": "symfony/yaml",
- "version": "v2.2.2",
+ "version": "v2.3.1",
"target-dir": "Symfony/Component/Yaml",
"source": {
"type": "git",
"url": "https://github.com/symfony/Yaml.git",
- "reference": "v2.2.2"
+ "reference": "v2.3.1"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/Yaml/zipball/v2.2.2",
- "reference": "v2.2.2",
+ "url": "https://api.github.com/repos/symfony/Yaml/zipball/v2.3.1",
+ "reference": "v2.3.1",
"shasum": ""
},
"require": {
@@ -909,7 +1237,7 @@
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "2.2-dev"
+ "dev-master": "2.3-dev"
}
},
"autoload": {
@@ -933,7 +1261,7 @@
],
"description": "Symfony Yaml Component",
"homepage": "http://symfony.com",
- "time": "2013-05-10 18:08:31"
+ "time": "2013-05-10 18:12:13"
}
],
"aliases": [
diff --git a/doc/api/404.html b/doc/api/404.html
new file mode 100644
index 0000000..380e4b3
--- /dev/null
+++ b/doc/api/404.html
@@ -0,0 +1,99 @@
+
+
+
+
+
+
+
+ Page not found | Helpers
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Page not found
+
The requested page could not be found.
+
You have probably clicked on a link that is outdated and points to a page that does not exist any more or you have made an typing error in the address.
+
To continue please try to find requested page in the menu, take a look at the tree view of the whole project or use search field on the top.
+
+
+
+
+
+
+
diff --git a/doc/api/class-GAubry.Helpers.Helpers.html b/doc/api/class-GAubry.Helpers.Helpers.html
new file mode 100644
index 0000000..3da8496
--- /dev/null
+++ b/doc/api/class-GAubry.Helpers.Helpers.html
@@ -0,0 +1,746 @@
+
+
+
+
+
+
+ Class GAubry\Helpers\Helpers | Helpers
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Class Helpers
+
+
+
+
+
Some helpers used in several personal packages.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Methods summary
+
+
+
+ private
+
+
+
+
+
+
+
#
+
__construct ( )
+
+
+
+
+
+
+
+
+
+
+
+
+
CodeCoverageIgnore
+
+
+
+
+
+
+
+
+
+
+ public static
+ array
+
+
+
+
+
+
#
+
flattenArray ( array $aArray )
+
+
+
+
Flatten a multidimensional array (keys are ignored).
+
+
+
+
+
+
Flatten a multidimensional array (keys are ignored).
+
+
+
+
Parameters
+
+ $aArray
+ array
$aArray
+
+
+
Returns
+
+ array
a one dimensional array.
+
+
+
+
See
+
+
+
+
+
+
+
+
+
+ public static
+ string
+
+
+
+
+
+
#
+
utf8Encode ( string $str )
+
+
+
+
Returns the UTF-8 translation of the specified string, only if not already in
+UTF-8.
+
+
+
+
+
+
Returns the UTF-8 translation of the specified string, only if not already in
+UTF-8.
+
+
+
+
Parameters
+
+
+
Returns
+
+ string
the UTF-8 translation of the specified string, only if not already in UTF-8.
+
+
+
+
+
+
+
+
+
+
+
+ public static
+ array
+
+
+
+
+
+
#
+
exec ( string $sCmd , string $sOutputPath = '' , string $sErrorPath = '' , boolean $bAppend = false )
+
+
+
+
Executes the given shell command and returns an array filled with every line
+of output from the command. Trailing whitespace, such as \n, is not included in
+this array. On shell error (exit code <> 0), throws a \RuntimeException
+with error message..
+
+
+
+
+
+
Executes the given shell command and returns an array filled with every line
+of output from the command. Trailing whitespace, such as \n, is not included in
+this array. On shell error (exit code <> 0), throws a \RuntimeException
+with error message..
+
+
+
+
Parameters
+
+ $sCmd
+ string
$sCmd shell command
+ $sOutputPath
+ string
$sOutputPath optional redirection of standard output
+ $sErrorPath
+ string
$sErrorPath optional redirection of standard error
+ $bAppend
+ boolean
$bAppend true to append to specified files
+
+
+
Returns
+
+ array
array filled with every line of output from the command
+
+
+
Throws
+
+ RuntimeException
if shell error
+
+
+
+
+
+
+
+
+
+
+ public static
+ string
+
+
+
+
+
+
#
+
stripBashColors ( string $sMsg )
+
+
+
+
Remove all Bash color sequences from the specified string.
+
+
+
+
+
+
Remove all Bash color sequences from the specified string.
+
+
+
+
Parameters
+
+
+
Returns
+
+ string
specified string without any Bash color sequence.
+
+
+
+
+
+
+
+
+
+
+
+ public static
+ string
+
+
+
+
+
+
#
+
round ( float $fValue , integer $iPrecision = 0 )
+
+
+
+
Rounds specified value with precision $iPrecision as native round() function,
+but keep trailing zeros.
+
+
+
+
+
+
Rounds specified value with precision $iPrecision as native round() function,
+but keep trailing zeros.
+
+
+
+
Parameters
+
+ $fValue
+ float
$fValue value to round
+ $iPrecision
+ integer
$iPrecision the optional number of decimal digits to round to (can also be
+negative)
+
+
+
Returns
+
+ string
+
+
+
+
+
+
+
+
+
+
+
+ public static
+ string
+
+
+
+
+
+
#
+
ucwordWithDelimiters ( string $sString , array $aDelimiters = array () )
+
+
+
+
Returns a string with the first character of each word in specified string
+capitalized, if that character is alphabetic. Additionally, each character that
+is immediately after one of $aDelimiters will be capitalized too.
+
+
+
+
+
+
Returns a string with the first character of each word in specified string
+capitalized, if that character is alphabetic. Additionally, each character that
+is immediately after one of $aDelimiters will be capitalized too.
+
+
+
+
Parameters
+
+ $sString
+ string
$sString
+ $aDelimiters
+ array
$aDelimiters
+
+
+
Returns
+
+ string
+
+
+
+
+
+
+
+
+
+
+
+ public static
+ array
+
+
+
+
+
+
#
+
intToMultiple ( integer $iValue , boolean $bBinaryPrefix = false )
+
+
+
+
Returns specified value in the most appropriate unit, with that unit. If
+$bBinaryPrefix is FALSE then use SI units (i.e. k, M, G, T), else use IED units
+(i.e. Ki, Mi, Gi, Ti).
+
+
+
+
+
+
Returns specified value in the most appropriate unit, with that unit. If
+$bBinaryPrefix is FALSE then use SI units (i.e. k, M, G, T), else use IED units
+(i.e. Ki, Mi, Gi, Ti).
+
+
+
+
Parameters
+
+ $iValue
+ integer
$iValue
+ $bBinaryPrefix
+ boolean
$bBinaryPrefix
+
+
+
Returns
+
+ array
a pair constituted by specified value in the most appropriate unit and that unit
+
+
+
+
See
+
+
+
+
+
+
+
+
+
+ public static
+ string
+
+
+
+
+
+
#
+
numberFormat ( float $fNumber , string $sDecPoint = '.' , string $sThousandsSep = ',' , integer $iDecimals = null )
+
+
+
+
Format a number with grouped thousands. It is an extended version of
+number_format() that allows do not specify $decimals.
+
+
+
+
+
+
Format a number with grouped thousands. It is an extended version of
+number_format() that allows do not specify $decimals.
+
+
+
+
Parameters
+
+ $fNumber
+ float
$fNumber The number being formatted.
+ $sDecPoint
+ string
$sDecPoint Sets the separator for the decimal point.
+ $sThousandsSep
+ string
$sThousandsSep Sets the thousands separator. Only the first character of
+$thousands_sep is used.
+ $iDecimals
+ integer
$iDecimals Sets the number of decimal points.
+
+
+
Returns
+
+ string
A formatted version of $number.
+
+
+
+
+
+
+
+
+
+
+
+ public static
+ string
+
+
+
+
+
+
#
+
strPutCSV ( array $aInput , string $sDelimiter = ',' , string $sEnclosure = '"' )
+
+
+
+
+
+
Formats a line passed as a fields array as CSV and return it, without the
+trailing newline. Inspiration: http://www.php.net/manual/en/function.str-getcsv.php#88773
+
+
+
+
Parameters
+
+ $aInput
+ array
$aInput
+ $sDelimiter
+ string
$sDelimiter
+ $sEnclosure
+ string
$sEnclosure
+
+
+
Returns
+
+ string
specified array converted into CSV format string
+
+
+
+
+
+
+
+
+
+
+
+ public static
+ array
+
+
+
+
+
+
#
+
arrayMergeRecursiveDistinct ( array $aArray1 , array $aArray2 )
+
+
+
+
array_merge_recursive() does indeed merge arrays, but it converts values with
+duplicate keys to arrays rather than overwriting the value in the first array
+with the duplicate value in the second array, as array_merge does. I.e., with
+array_merge_recursive(), this happens (documented behavior):
+
+
+
+
+
+
array_merge_recursive() does indeed merge arrays, but it converts values with
+duplicate keys to arrays rather than overwriting the value in the first array
+with the duplicate value in the second array, as array_merge does. I.e., with
+array_merge_recursive(), this happens (documented behavior):
+
+
array_merge_recursive(array('key' => 'org value'), array('key' => 'new
+value')); ⇒ array('key' => array('org value', 'new value'));
+
+
arrayMergeRecursiveDistinct() does not change the datatypes of the values in
+the arrays. Matching keys' values in the second array overwrite those in the
+first array, as is the case with array_merge, i.e.:
+
+
arrayMergeRecursiveDistinct(array('key' => 'org value'), array('key' =>
+'new value')); ⇒ array('key' => array('new value'));
+
+
EVO on indexed arrays: Before: arrayMergeRecursiveDistinct(array('a', 'b'),
+array('c')) ⇒ array('c', 'b') Now: ⇒ array('c')
+
+
+
+
Parameters
+
+ $aArray1
+ array
$aArray1
+ $aArray2
+ array
$aArray2
+
+
+
Returns
+
+ array
An array of values resulted from strictly merging the arguments together.
+
+
+
+
Author
+
+ Daniel <daniel (at) danielsmedegaardbuus (dot) dk>
+ Gabriel Sobrinho <gabriel (dot) sobrinho (at) gmail (dot) com>
+ Geoffroy Aubry
+
+
See
+
+
+
+
+
+
+
+
+
+ public static
+ boolean
+
+
+
+
+
+
#
+
isAssociativeArray ( array $aArray )
+
+
+
+
Returns TRUE iff the specified array is associative. If the specified array
+is empty, then return FALSE.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/doc/api/deprecated.html b/doc/api/deprecated.html
new file mode 100644
index 0000000..10fe61c
--- /dev/null
+++ b/doc/api/deprecated.html
@@ -0,0 +1,103 @@
+
+
+
+
+
+
+ Deprecated | Helpers
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Deprecated
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/doc/api/elementlist.js b/doc/api/elementlist.js
new file mode 100644
index 0000000..b903d76
--- /dev/null
+++ b/doc/api/elementlist.js
@@ -0,0 +1,3 @@
+
+var ApiGen = ApiGen || {};
+ApiGen.elements = [["c","GAubry\\Helpers\\Helpers"],["m","GAubry\\Helpers\\Helpers::__construct()"],["m","GAubry\\Helpers\\Helpers::arrayMergeRecursiveDistinct()"],["m","GAubry\\Helpers\\Helpers::exec()"],["m","GAubry\\Helpers\\Helpers::flattenArray()"],["m","GAubry\\Helpers\\Helpers::intToMultiple()"],["m","GAubry\\Helpers\\Helpers::isAssociativeArray()"],["m","GAubry\\Helpers\\Helpers::numberFormat()"],["m","GAubry\\Helpers\\Helpers::round()"],["m","GAubry\\Helpers\\Helpers::stripBashColors()"],["m","GAubry\\Helpers\\Helpers::strPutCSV()"],["m","GAubry\\Helpers\\Helpers::ucwordWithDelimiters()"],["m","GAubry\\Helpers\\Helpers::utf8Encode()"]];
diff --git a/doc/api/index.html b/doc/api/index.html
new file mode 100644
index 0000000..4dd6ba4
--- /dev/null
+++ b/doc/api/index.html
@@ -0,0 +1,103 @@
+
+
+
+
+
+
+ Helpers
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Overview
+
+Namespace
+
+Class
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/doc/api/namespace-GAubry.Helpers.html b/doc/api/namespace-GAubry.Helpers.html
new file mode 100644
index 0000000..fed063f
--- /dev/null
+++ b/doc/api/namespace-GAubry.Helpers.html
@@ -0,0 +1,111 @@
+
+
+
+
+
+
+ Namespace GAubry\Helpers | Helpers
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Namespace GAubry \Helpers
+
+
+
+
+Classes summary
+
+ Helpers
+ Some helpers used in several personal packages.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/doc/api/namespace-GAubry.html b/doc/api/namespace-GAubry.html
new file mode 100644
index 0000000..e6e0e99
--- /dev/null
+++ b/doc/api/namespace-GAubry.html
@@ -0,0 +1,104 @@
+
+
+
+
+
+
+ Namespace GAubry | Helpers
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Namespace GAubry
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/doc/api/resources/collapsed.png b/doc/api/resources/collapsed.png
new file mode 100644
index 0000000..56e7323
Binary files /dev/null and b/doc/api/resources/collapsed.png differ
diff --git a/doc/api/resources/combined.js b/doc/api/resources/combined.js
new file mode 100644
index 0000000..513b883
--- /dev/null
+++ b/doc/api/resources/combined.js
@@ -0,0 +1,1264 @@
+
+var ApiGen = ApiGen || {};
+ApiGen.config = {"require":{"min":"2.8.0"},"resources":{"resources":"resources"},"templates":{"common":{"overview.latte":"index.html","combined.js.latte":"resources\/combined.js","elementlist.js.latte":"elementlist.js","404.latte":"404.html"},"optional":{"sitemap":{"filename":"sitemap.xml","template":"sitemap.xml.latte"},"opensearch":{"filename":"opensearch.xml","template":"opensearch.xml.latte"},"robots":{"filename":"robots.txt","template":"robots.txt.latte"}},"main":{"package":{"filename":"package-%s.html","template":"package.latte"},"namespace":{"filename":"namespace-%s.html","template":"namespace.latte"},"class":{"filename":"class-%s.html","template":"class.latte"},"constant":{"filename":"constant-%s.html","template":"constant.latte"},"function":{"filename":"function-%s.html","template":"function.latte"},"source":{"filename":"source-%s.html","template":"source.latte"},"tree":{"filename":"tree.html","template":"tree.latte"},"deprecated":{"filename":"deprecated.html","template":"deprecated.latte"},"todo":{"filename":"todo.html","template":"todo.latte"}}},"options":{"elementDetailsCollapsed":true,"elementsOrder":"natural"},"config":"\/home\/geoffroy\/eclipse-workspace-4.2\/github.perso.Helpers\/vendor\/apigen\/apigen\/templates\/default\/config.neon"};
+
+
+/*! jQuery v1.7 jquery.com | jquery.org/license */
+(function(a,b){function cA(a){return f.isWindow(a)?a:a.nodeType===9?a.defaultView||a.parentWindow:!1}function cx(a){if(!cm[a]){var b=c.body,d=f("<"+a+">").appendTo(b),e=d.css("display");d.remove();if(e==="none"||e===""){cn||(cn=c.createElement("iframe"),cn.frameBorder=cn.width=cn.height=0),b.appendChild(cn);if(!co||!cn.createElement)co=(cn.contentWindow||cn.contentDocument).document,co.write((c.compatMode==="CSS1Compat"?"":"")+""),co.close();d=co.createElement(a),co.body.appendChild(d),e=f.css(d,"display"),b.removeChild(cn)}cm[a]=e}return cm[a]}function cw(a,b){var c={};f.each(cs.concat.apply([],cs.slice(0,b)),function(){c[this]=a});return c}function cv(){ct=b}function cu(){setTimeout(cv,0);return ct=f.now()}function cl(){try{return new a.ActiveXObject("Microsoft.XMLHTTP")}catch(b){}}function ck(){try{return new a.XMLHttpRequest}catch(b){}}function ce(a,c){a.dataFilter&&(c=a.dataFilter(c,a.dataType));var d=a.dataTypes,e={},g,h,i=d.length,j,k=d[0],l,m,n,o,p;for(g=1;g0){c!=="border"&&f.each(e,function(){c||(d-=parseFloat(f.css(a,"padding"+this))||0),c==="margin"?d+=parseFloat(f.css(a,c+this))||0:d-=parseFloat(f.css(a,"border"+this+"Width"))||0});return d+"px"}d=bB(a,b,b);if(d<0||d==null)d=a.style[b]||0;d=parseFloat(d)||0,c&&f.each(e,function(){d+=parseFloat(f.css(a,"padding"+this))||0,c!=="padding"&&(d+=parseFloat(f.css(a,"border"+this+"Width"))||0),c==="margin"&&(d+=parseFloat(f.css(a,c+this))||0)});return d+"px"}function br(a,b){b.src?f.ajax({url:b.src,async:!1,dataType:"script"}):f.globalEval((b.text||b.textContent||b.innerHTML||"").replace(bi,"/*$0*/")),b.parentNode&&b.parentNode.removeChild(b)}function bq(a){var b=(a.nodeName||"").toLowerCase();b==="input"?bp(a):b!=="script"&&typeof a.getElementsByTagName!="undefined"&&f.grep(a.getElementsByTagName("input"),bp)}function bp(a){if(a.type==="checkbox"||a.type==="radio")a.defaultChecked=a.checked}function bo(a){return typeof a.getElementsByTagName!="undefined"?a.getElementsByTagName("*"):typeof a.querySelectorAll!="undefined"?a.querySelectorAll("*"):[]}function bn(a,b){var c;if(b.nodeType===1){b.clearAttributes&&b.clearAttributes(),b.mergeAttributes&&b.mergeAttributes(a),c=b.nodeName.toLowerCase();if(c==="object")b.outerHTML=a.outerHTML;else if(c!=="input"||a.type!=="checkbox"&&a.type!=="radio"){if(c==="option")b.selected=a.defaultSelected;else if(c==="input"||c==="textarea")b.defaultValue=a.defaultValue}else a.checked&&(b.defaultChecked=b.checked=a.checked),b.value!==a.value&&(b.value=a.value);b.removeAttribute(f.expando)}}function bm(a,b){if(b.nodeType===1&&!!f.hasData(a)){var c,d,e,g=f._data(a),h=f._data(b,g),i=g.events;if(i){delete h.handle,h.events={};for(c in i)for(d=0,e=i[c].length;d=0===c})}function V(a){return!a||!a.parentNode||a.parentNode.nodeType===11}function N(){return!0}function M(){return!1}function n(a,b,c){var d=b+"defer",e=b+"queue",g=b+"mark",h=f._data(a,d);h&&(c==="queue"||!f._data(a,e))&&(c==="mark"||!f._data(a,g))&&setTimeout(function(){!f._data(a,e)&&!f._data(a,g)&&(f.removeData(a,d,!0),h.fire())},0)}function m(a){for(var b in a){if(b==="data"&&f.isEmptyObject(a[b]))continue;if(b!=="toJSON")return!1}return!0}function l(a,c,d){if(d===b&&a.nodeType===1){var e="data-"+c.replace(k,"-$1").toLowerCase();d=a.getAttribute(e);if(typeof d=="string"){try{d=d==="true"?!0:d==="false"?!1:d==="null"?null:f.isNumeric(d)?parseFloat(d):j.test(d)?f.parseJSON(d):d}catch(g){}f.data(a,c,d)}else d=b}return d}function h(a){var b=g[a]={},c,d;a=a.split(/\s+/);for(c=0,d=a.length;c)[^>]*$|#([\w\-]*)$)/,j=/\S/,k=/^\s+/,l=/\s+$/,m=/\d/,n=/^<(\w+)\s*\/?>(?:<\/\1>)?$/,o=/^[\],:{}\s]*$/,p=/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,q=/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,r=/(?:^|:|,)(?:\s*\[)+/g,s=/(webkit)[ \/]([\w.]+)/,t=/(opera)(?:.*version)?[ \/]([\w.]+)/,u=/(msie) ([\w.]+)/,v=/(mozilla)(?:.*? rv:([\w.]+))?/,w=/-([a-z]|[0-9])/ig,x=/^-ms-/,y=function(a,b){return(b+"").toUpperCase()},z=d.userAgent,A,B,C,D=Object.prototype.toString,E=Object.prototype.hasOwnProperty,F=Array.prototype.push,G=Array.prototype.slice,H=String.prototype.trim,I=Array.prototype.indexOf,J={};e.fn=e.prototype={constructor:e,init:function(a,d,f){var g,h,j,k;if(!a)return this;if(a.nodeType){this.context=this[0]=a,this.length=1;return this}if(a==="body"&&!d&&c.body){this.context=c,this[0]=c.body,this.selector=a,this.length=1;return this}if(typeof a=="string"){a.charAt(0)!=="<"||a.charAt(a.length-1)!==">"||a.length<3?g=i.exec(a):g=[null,a,null];if(g&&(g[1]||!d)){if(g[1]){d=d instanceof e?d[0]:d,k=d?d.ownerDocument||d:c,j=n.exec(a),j?e.isPlainObject(d)?(a=[c.createElement(j[1])],e.fn.attr.call(a,d,!0)):a=[k.createElement(j[1])]:(j=e.buildFragment([g[1]],[k]),a=(j.cacheable?e.clone(j.fragment):j.fragment).childNodes);return e.merge(this,a)}h=c.getElementById(g[2]);if(h&&h.parentNode){if(h.id!==g[2])return f.find(a);this.length=1,this[0]=h}this.context=c,this.selector=a;return this}return!d||d.jquery?(d||f).find(a):this.constructor(d).find(a)}if(e.isFunction(a))return f.ready(a);a.selector!==b&&(this.selector=a.selector,this.context=a.context);return e.makeArray(a,this)},selector:"",jquery:"1.7",length:0,size:function(){return this.length},toArray:function(){return G.call(this,0)},get:function(a){return a==null?this.toArray():a<0?this[this.length+a]:this[a]},pushStack:function(a,b,c){var d=this.constructor();e.isArray(a)?F.apply(d,a):e.merge(d,a),d.prevObject=this,d.context=this.context,b==="find"?d.selector=this.selector+(this.selector?" ":"")+c:b&&(d.selector=this.selector+"."+b+"("+c+")");return d},each:function(a,b){return e.each(this,a,b)},ready:function(a){e.bindReady(),B.add(a);return this},eq:function(a){return a===-1?this.slice(a):this.slice(a,+a+1)},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},slice:function(){return this.pushStack(G.apply(this,arguments),"slice",G.call(arguments).join(","))},map:function(a){return this.pushStack(e.map(this,function(b,c){return a.call(b,c,b)}))},end:function(){return this.prevObject||this.constructor(null)},push:F,sort:[].sort,splice:[].splice},e.fn.init.prototype=e.fn,e.extend=e.fn.extend=function(){var a,c,d,f,g,h,i=arguments[0]||{},j=1,k=arguments.length,l=!1;typeof i=="boolean"&&(l=i,i=arguments[1]||{},j=2),typeof i!="object"&&!e.isFunction(i)&&(i={}),k===j&&(i=this,--j);for(;j0)return;B.fireWith(c,[e]),e.fn.trigger&&e(c).trigger("ready").unbind("ready")}},bindReady:function(){if(!B){B=e.Callbacks("once memory");if(c.readyState==="complete")return setTimeout(e.ready,1);if(c.addEventListener)c.addEventListener("DOMContentLoaded",C,!1),a.addEventListener("load",e.ready,!1);else if(c.attachEvent){c.attachEvent("onreadystatechange",C),a.attachEvent("onload",e.ready);var b=!1;try{b=a.frameElement==null}catch(d){}c.documentElement.doScroll&&b&&K()}}},isFunction:function(a){return e.type(a)==="function"},isArray:Array.isArray||function(a){return e.type(a)==="array"},isWindow:function(a){return a&&typeof a=="object"&&"setInterval"in a},isNumeric:function(a){return a!=null&&m.test(a)&&!isNaN(a)},type:function(a){return a==null?String(a):J[D.call(a)]||"object"},isPlainObject:function(a){if(!a||e.type(a)!=="object"||a.nodeType||e.isWindow(a))return!1;try{if(a.constructor&&!E.call(a,"constructor")&&!E.call(a.constructor.prototype,"isPrototypeOf"))return!1}catch(c){return!1}var d;for(d in a);return d===b||E.call(a,d)},isEmptyObject:function(a){for(var b in a)return!1;return!0},error:function(a){throw a},parseJSON:function(b){if(typeof b!="string"||!b)return null;b=e.trim(b);if(a.JSON&&a.JSON.parse)return a.JSON.parse(b);if(o.test(b.replace(p,"@").replace(q,"]").replace(r,"")))return(new Function("return "+b))();e.error("Invalid JSON: "+b)},parseXML:function(c){var d,f;try{a.DOMParser?(f=new DOMParser,d=f.parseFromString(c,"text/xml")):(d=new ActiveXObject("Microsoft.XMLDOM"),d.async="false",d.loadXML(c))}catch(g){d=b}(!d||!d.documentElement||d.getElementsByTagName("parsererror").length)&&e.error("Invalid XML: "+c);return d},noop:function(){},globalEval:function(b){b&&j.test(b)&&(a.execScript||function(b){a.eval.call(a,b)})(b)},camelCase:function(a){return a.replace(x,"ms-").replace(w,y)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toUpperCase()===b.toUpperCase()},each:function(a,c,d){var f,g=0,h=a.length,i=h===b||e.isFunction(a);if(d){if(i){for(f in a)if(c.apply(a[f],d)===!1)break}else for(;g0&&a[0]&&a[j-1]||j===0||e.isArray(a));if(k)for(;i1?i.call(arguments,0):b,j.notifyWith(k,e)}}function l(a){return function(c){b[a]=arguments.length>1?i.call(arguments,0):c,--g||j.resolveWith(j,b)}}var b=i.call(arguments,0),c=0,d=b.length,e=Array(d),g=d,h=d,j=d<=1&&a&&f.isFunction(a.promise)?a:f.Deferred(),k=j.promise();if(d>1){for(;ca ",d=a.getElementsByTagName("*"),e=a.getElementsByTagName("a")[0];if(!d||!d.length||!e)return{};g=c.createElement("select"),h=g.appendChild(c.createElement("option")),i=a.getElementsByTagName("input")[0],k={leadingWhitespace:a.firstChild.nodeType===3,tbody:!a.getElementsByTagName("tbody").length,htmlSerialize:!!a.getElementsByTagName("link").length,style:/top/.test(e.getAttribute("style")),hrefNormalized:e.getAttribute("href")==="/a",opacity:/^0.55/.test(e.style.opacity),cssFloat:!!e.style.cssFloat,unknownElems:!!a.getElementsByTagName("nav").length,checkOn:i.value==="on",optSelected:h.selected,getSetAttribute:a.className!=="t",enctype:!!c.createElement("form").enctype,submitBubbles:!0,changeBubbles:!0,focusinBubbles:!1,deleteExpando:!0,noCloneEvent:!0,inlineBlockNeedsLayout:!1,shrinkWrapBlocks:!1,reliableMarginRight:!0},i.checked=!0,k.noCloneChecked=i.cloneNode(!0).checked,g.disabled=!0,k.optDisabled=!h.disabled;try{delete a.test}catch(v){k.deleteExpando=!1}!a.addEventListener&&a.attachEvent&&a.fireEvent&&(a.attachEvent("onclick",function(){k.noCloneEvent=!1}),a.cloneNode(!0).fireEvent("onclick")),i=c.createElement("input"),i.value="t",i.setAttribute("type","radio"),k.radioValue=i.value==="t",i.setAttribute("checked","checked"),a.appendChild(i),l=c.createDocumentFragment(),l.appendChild(a.lastChild),k.checkClone=l.cloneNode(!0).cloneNode(!0).lastChild.checked,a.innerHTML="",a.style.width=a.style.paddingLeft="1px",m=c.getElementsByTagName("body")[0],o=c.createElement(m?"div":"body"),p={visibility:"hidden",width:0,height:0,border:0,margin:0,background:"none"},m&&f.extend(p,{position:"absolute",left:"-999px",top:"-999px"});for(t in p)o.style[t]=p[t];o.appendChild(a),n=m||b,n.insertBefore(o,n.firstChild),k.appendChecked=i.checked,k.boxModel=a.offsetWidth===2,"zoom"in a.style&&(a.style.display="inline",a.style.zoom=1,k.inlineBlockNeedsLayout=a.offsetWidth===2,a.style.display="",a.innerHTML="
",k.shrinkWrapBlocks=a.offsetWidth!==2),a.innerHTML="",q=a.getElementsByTagName("td"),u=q[0].offsetHeight===0,q[0].style.display="",q[1].style.display="none",k.reliableHiddenOffsets=u&&q[0].offsetHeight===0,a.innerHTML="",c.defaultView&&c.defaultView.getComputedStyle&&(j=c.createElement("div"),j.style.width="0",j.style.marginRight="0",a.appendChild(j),k.reliableMarginRight=(parseInt((c.defaultView.getComputedStyle(j,null)||{marginRight:0}).marginRight,10)||0)===0);if(a.attachEvent)for(t in{submit:1,change:1,focusin:1})s="on"+t,u=s in a,u||(a.setAttribute(s,"return;"),u=typeof a[s]=="function"),k[t+"Bubbles"]=u;f(function(){var a,b,d,e,g,h,i=1,j="position:absolute;top:0;left:0;width:1px;height:1px;margin:0;",l="visibility:hidden;border:0;",n="style='"+j+"border:5px solid #000;padding:0;'",p=""+"";m=c.getElementsByTagName("body")[0];!m||(a=c.createElement("div"),a.style.cssText=l+"width:0;height:0;position:static;top:0;margin-top:"+i+"px",m.insertBefore(a,m.firstChild),o=c.createElement("div"),o.style.cssText=j+l,o.innerHTML=p,a.appendChild(o),b=o.firstChild,d=b.firstChild,g=b.nextSibling.firstChild.firstChild,h={doesNotAddBorder:d.offsetTop!==5,doesAddBorderForTableAndCells:g.offsetTop===5},d.style.position="fixed",d.style.top="20px",h.fixedPosition=d.offsetTop===20||d.offsetTop===15,d.style.position=d.style.top="",b.style.overflow="hidden",b.style.position="relative",h.subtractsBorderForOverflowNotVisible=d.offsetTop===-5,h.doesNotIncludeMarginInBodyOffset=m.offsetTop!==i,m.removeChild(a),o=a=null,f.extend(k,h))}),o.innerHTML="",n.removeChild(o),o=l=g=h=m=j=a=i=null;return k}(),f.boxModel=f.support.boxModel;var j=/^(?:\{.*\}|\[.*\])$/,k=/([A-Z])/g;f.extend({cache:{},uuid:0,expando:"jQuery"+(f.fn.jquery+Math.random()).replace(/\D/g,""),noData:{embed:!0,object:"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",applet:!0},hasData:function(a){a=a.nodeType?f.cache[a[f.expando]]:a[f.expando];return!!a&&!m(a)},data:function(a,c,d,e){if(!!f.acceptData(a)){var g,h,i,j=f.expando,k=typeof c=="string",l=a.nodeType,m=l?f.cache:a,n=l?a[f.expando]:a[f.expando]&&f.expando,o=c==="events";if((!n||!m[n]||!o&&!e&&!m[n].data)&&k&&d===b)return;n||(l?a[f.expando]=n=++f.uuid:n=f.expando),m[n]||(m[n]={},l||(m[n].toJSON=f.noop));if(typeof c=="object"||typeof c=="function")e?m[n]=f.extend(m[n],c):m[n].data=f.extend(m[n].data,c);g=h=m[n],e||(h.data||(h.data={}),h=h.data),d!==b&&(h[f.camelCase(c)]=d);if(o&&!h[c])return g.events;k?(i=h[c],i==null&&(i=h[f.camelCase(c)])):i=h;return i}},removeData:function(a,b,c){if(!!f.acceptData(a)){var d,e,g,h=f.expando,i=a.nodeType,j=i?f.cache:a,k=i?a[f.expando]:f.expando;if(!j[k])return;if(b){d=c?j[k]:j[k].data;if(d){f.isArray(b)?b=b:b in d?b=[b]:(b=f.camelCase(b),b in d?b=[b]:b=b.split(" "));for(e=0,g=b.length;e-1)return!0;return!1},val:function(a){var c,d,e,g=this[0];if(!arguments.length){if(g){c=f.valHooks[g.nodeName.toLowerCase()]||f.valHooks[g.type];if(c&&"get"in c&&(d=c.get(g,"value"))!==b)return d;d=g.value;return typeof d=="string"?d.replace(q,""):d==null?"":d}return b}e=f.isFunction(a);return this.each(function(d){var g=f(this),h;if(this.nodeType===1){e?h=a.call(this,d,g.val()):h=a,h==null?h="":typeof h=="number"?h+="":f.isArray(h)&&(h=f.map(h,function(a){return a==null?"":a+""})),c=f.valHooks[this.nodeName.toLowerCase()]||f.valHooks[this.type];if(!c||!("set"in c)||c.set(this,h,"value")===b)this.value=h}})}}),f.extend({valHooks:{option:{get:function(a){var b=a.attributes.value;return!b||b.specified?a.value:a.text}},select:{get:function(a){var b,c,d,e,g=a.selectedIndex,h=[],i=a.options,j=a.type==="select-one";if(g<0)return null;c=j?g:0,d=j?g+1:i.length;for(;c=0}),c.length||(a.selectedIndex=-1);return c}}},attrFn:{val:!0,css:!0,html:!0,text:!0,data:!0,width:!0,height:!0,offset:!0},attr:function(a,c,d,e){var g,h,i,j=a.nodeType;if(!a||j===3||j===8||j===2)return b;if(e&&c in f.attrFn)return f(a)[c](d);if(!("getAttribute"in a))return f.prop(a,c,d);i=j!==1||!f.isXMLDoc(a),i&&(c=c.toLowerCase(),h=f.attrHooks[c]||(u.test(c)?x:w));if(d!==b){if(d===null){f.removeAttr(a,c);return b}if(h&&"set"in h&&i&&(g=h.set(a,d,c))!==b)return g;a.setAttribute(c,""+d);return d}if(h&&"get"in h&&i&&(g=h.get(a,c))!==null)return g;g=a.getAttribute(c);return g===null?b:g},removeAttr:function(a,b){var c,d,e,g,h=0;if(a.nodeType===1){d=(b||"").split(p),g=d.length;for(;h=0}})});var z=/\.(.*)$/,A=/^(?:textarea|input|select)$/i,B=/\./g,C=/ /g,D=/[^\w\s.|`]/g,E=/^([^\.]*)?(?:\.(.+))?$/,F=/\bhover(\.\S+)?/,G=/^key/,H=/^(?:mouse|contextmenu)|click/,I=/^(\w*)(?:#([\w\-]+))?(?:\.([\w\-]+))?$/,J=function(a){var b=I.exec(a);b&&
+(b[1]=(b[1]||"").toLowerCase(),b[3]=b[3]&&new RegExp("(?:^|\\s)"+b[3]+"(?:\\s|$)"));return b},K=function(a,b){return(!b[1]||a.nodeName.toLowerCase()===b[1])&&(!b[2]||a.id===b[2])&&(!b[3]||b[3].test(a.className))},L=function(a){return f.event.special.hover?a:a.replace(F,"mouseenter$1 mouseleave$1")};f.event={add:function(a,c,d,e,g){var h,i,j,k,l,m,n,o,p,q,r,s;if(!(a.nodeType===3||a.nodeType===8||!c||!d||!(h=f._data(a)))){d.handler&&(p=d,d=p.handler),d.guid||(d.guid=f.guid++),j=h.events,j||(h.events=j={}),i=h.handle,i||(h.handle=i=function(a){return typeof f!="undefined"&&(!a||f.event.triggered!==a.type)?f.event.dispatch.apply(i.elem,arguments):b},i.elem=a),c=L(c).split(" ");for(k=0;k=0&&(h=h.slice(0,-1),k=!0),h.indexOf(".")>=0&&(i=h.split("."),h=i.shift(),i.sort());if((!e||f.event.customEvent[h])&&!f.event.global[h])return;c=typeof c=="object"?c[f.expando]?c:new f.Event(h,c):new f.Event(h),c.type=h,c.isTrigger=!0,c.exclusive=k,c.namespace=i.join("."),c.namespace_re=c.namespace?new RegExp("(^|\\.)"+i.join("\\.(?:.*\\.)?")+"(\\.|$)"):null,o=h.indexOf(":")<0?"on"+h:"",(g||!e)&&c.preventDefault();if(!e){j=f.cache;for(l in j)j[l].events&&j[l].events[h]&&f.event.trigger(c,d,j[l].handle.elem,!0);return}c.result=b,c.target||(c.target=e),d=d!=null?f.makeArray(d):[],d.unshift(c),p=f.event.special[h]||{};if(p.trigger&&p.trigger.apply(e,d)===!1)return;r=[[e,p.bindType||h]];if(!g&&!p.noBubble&&!f.isWindow(e)){s=p.delegateType||h,n=null;for(m=e.parentNode;m;m=m.parentNode)r.push([m,s]),n=m;n&&n===e.ownerDocument&&r.push([n.defaultView||n.parentWindow||a,s])}for(l=0;l=0:t===b&&(t=o[s]=r.quick?K(m,r.quick):f(m).is(s)),t&&q.push(r);q.length&&j.push({elem:m,matches:q})}d.length>e&&j.push({elem:this,matches:d.slice(e)});for(k=0;k0?this.bind(b,a,c):this.trigger(b)},f.attrFn&&(f.attrFn[b]=!0),G.test(b)&&(f.event.fixHooks[b]=f.event.keyHooks),H.test(b)&&(f.event.fixHooks[b]=f.event.mouseHooks)}),function(){function x(a,b,c,e,f,g){for(var h=0,i=e.length;h0){k=j;break}}j=j[a]}e[h]=k}}}function w(a,b,c,e,f,g){for(var h=0,i=e.length;h+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,d="sizcache"+(Math.random()+"").replace(".",""),e=0,g=Object.prototype.toString,h=!1,i=!0,j=/\\/g,k=/\r\n/g,l=/\W/;[0,0].sort(function(){i=!1;return 0});var m=function(b,d,e,f){e=e||[],d=d||c;var h=d;if(d.nodeType!==1&&d.nodeType!==9)return[];if(!b||typeof b!="string")return e;var i,j,k,l,n,q,r,t,u=!0,v=m.isXML(d),w=[],x=b;do{a.exec(""),i=a.exec(x);if(i){x=i[3],w.push(i[1]);if(i[2]){l=i[3];break}}}while(i);if(w.length>1&&p.exec(b))if(w.length===2&&o.relative[w[0]])j=y(w[0]+w[1],d,f);else{j=o.relative[w[0]]?[d]:m(w.shift(),d);while(w.length)b=w.shift(),o.relative[b]&&(b+=w.shift()),j=y(b,j,f)}else{!f&&w.length>1&&d.nodeType===9&&!v&&o.match.ID.test(w[0])&&!o.match.ID.test(w[w.length-1])&&(n=m.find(w.shift(),d,v),d=n.expr?m.filter(n.expr,n.set)[0]:n.set[0]);if(d){n=f?{expr:w.pop(),set:s(f)}:m.find(w.pop(),w.length===1&&(w[0]==="~"||w[0]==="+")&&d.parentNode?d.parentNode:d,v),j=n.expr?m.filter(n.expr,n.set):n.set,w.length>0?k=s(j):u=!1;while(w.length)q=w.pop(),r=q,o.relative[q]?r=w.pop():q="",r==null&&(r=d),o.relative[q](k,r,v)}else k=w=[]}k||(k=j),k||m.error(q||b);if(g.call(k)==="[object Array]")if(!u)e.push.apply(e,k);else if(d&&d.nodeType===1)for(t=0;k[t]!=null;t++)k[t]&&(k[t]===!0||k[t].nodeType===1&&m.contains(d,k[t]))&&e.push(j[t]);else for(t=0;k[t]!=null;t++)k[t]&&k[t].nodeType===1&&e.push(j[t]);else s(k,e);l&&(m(l,h,e,f),m.uniqueSort(e));return e};m.uniqueSort=function(a){if(u){h=i,a.sort(u);if(h)for(var b=1;b0},m.find=function(a,b,c){var d,e,f,g,h,i;if(!a)return[];for(e=0,f=o.order.length;e":function(a,b){var c,d=typeof b=="string",e=0,f=a.length;if(d&&!l.test(b)){b=b.toLowerCase();for(;e=0)?c||d.push(h):c&&(b[g]=!1));return!1},ID:function(a){return a[1].replace(j,"")},TAG:function(a,b){return a[1].replace(j,"").toLowerCase()},CHILD:function(a){if(a[1]==="nth"){a[2]||m.error(a[0]),a[2]=a[2].replace(/^\+|\s*/g,"");var b=/(-?)(\d*)(?:n([+\-]?\d*))?/.exec(a[2]==="even"&&"2n"||a[2]==="odd"&&"2n+1"||!/\D/.test(a[2])&&"0n+"+a[2]||a[2]);a[2]=b[1]+(b[2]||1)-0,a[3]=b[3]-0}else a[2]&&m.error(a[0]);a[0]=e++;return a},ATTR:function(a,b,c,d,e,f){var g=a[1]=a[1].replace(j,"");!f&&o.attrMap[g]&&(a[1]=o.attrMap[g]),a[4]=(a[4]||a[5]||"").replace(j,""),a[2]==="~="&&(a[4]=" "+a[4]+" ");return a},PSEUDO:function(b,c,d,e,f){if(b[1]==="not")if((a.exec(b[3])||"").length>1||/^\w/.test(b[3]))b[3]=m(b[3],null,null,c);else{var g=m.filter(b[3],c,d,!0^f);d||e.push.apply(e,g);return!1}else if(o.match.POS.test(b[0])||o.match.CHILD.test(b[0]))return!0;return b},POS:function(a){a.unshift(!0);return a}},filters:{enabled:function(a){return a.disabled===!1&&a.type!=="hidden"},disabled:function(a){return a.disabled===!0},checked:function(a){return a.checked===!0},selected:function(a){a.parentNode&&a.parentNode.selectedIndex;return a.selected===!0},parent:function(a){return!!a.firstChild},empty:function(a){return!a.firstChild},has:function(a,b,c){return!!m(c[3],a).length},header:function(a){return/h\d/i.test(a.nodeName)},text:function(a){var b=a.getAttribute("type"),c=a.type;return a.nodeName.toLowerCase()==="input"&&"text"===c&&(b===c||b===null)},radio:function(a){return a.nodeName.toLowerCase()==="input"&&"radio"===a.type},checkbox:function(a){return a.nodeName.toLowerCase()==="input"&&"checkbox"===a.type},file:function(a){return a.nodeName.toLowerCase()==="input"&&"file"===a.type},password:function(a){return a.nodeName.toLowerCase()==="input"&&"password"===a.type},submit:function(a){var b=a.nodeName.toLowerCase();return(b==="input"||b==="button")&&"submit"===a.type},image:function(a){return a.nodeName.toLowerCase()==="input"&&"image"===a.type},reset:function(a){var b=a.nodeName.toLowerCase();return(b==="input"||b==="button")&&"reset"===a.type},button:function(a){var b=a.nodeName.toLowerCase();return b==="input"&&"button"===a.type||b==="button"},input:function(a){return/input|select|textarea|button/i.test(a.nodeName)},focus:function(a){return a===a.ownerDocument.activeElement}},setFilters:{first:function(a,b){return b===0},last:function(a,b,c,d){return b===d.length-1},even:function(a,b){return b%2===0},odd:function(a,b){return b%2===1},lt:function(a,b,c){return bc[3]-0},nth:function(a,b,c){return c[3]-0===b},eq:function(a,b,c){return c[3]-0===b}},filter:{PSEUDO:function(a,b,c,d){var e=b[1],f=o.filters[e];if(f)return f(a,c,b,d);if(e==="contains")return(a.textContent||a.innerText||n([a])||"").indexOf(b[3])>=0;if(e==="not"){var g=b[3];for(var h=0,i=g.length;h=0}},ID:function(a,b){return a.nodeType===1&&a.getAttribute("id")===b},TAG:function(a,b){return b==="*"&&a.nodeType===1||!!a.nodeName&&a.nodeName.toLowerCase()===b},CLASS:function(a,b){return(" "+(a.className||a.getAttribute("class"))+" ").indexOf(b)>-1},ATTR:function(a,b){var c=b[1],d=m.attr?m.attr(a,c):o.attrHandle[c]?o.attrHandle[c](a):a[c]!=null?a[c]:a.getAttribute(c),e=d+"",f=b[2],g=b[4];return d==null?f==="!=":!f&&m.attr?d!=null:f==="="?e===g:f==="*="?e.indexOf(g)>=0:f==="~="?(" "+e+" ").indexOf(g)>=0:g?f==="!="?e!==g:f==="^="?e.indexOf(g)===0:f==="$="?e.substr(e.length-g.length)===g:f==="|="?e===g||e.substr(0,g.length+1)===g+"-":!1:e&&d!==!1},POS:function(a,b,c,d){var e=b[2],f=o.setFilters[e];if(f)return f(a,c,b,d)}}},p=o.match.POS,q=function(a,b){return"\\"+(b-0+1)};for(var r in o.match)o.match[r]=new RegExp(o.match[r].source+/(?![^\[]*\])(?![^\(]*\))/.source),o.leftMatch[r]=new RegExp(/(^(?:.|\r|\n)*?)/.source+o.match[r].source.replace(/\\(\d+)/g,q));var s=function(a,b){a=Array.prototype.slice.call(a,0);if(b){b.push.apply(b,a);return b}return a};try{Array.prototype.slice.call(c.documentElement.childNodes,0)[0].nodeType}catch(t){s=function(a,b){var c=0,d=b||[];if(g.call(a)==="[object Array]")Array.prototype.push.apply(d,a);else if(typeof a.length=="number")for(var e=a.length;c ",e.insertBefore(a,e.firstChild),c.getElementById(d)&&(o.find.ID=function(a,c,d){if(typeof c.getElementById!="undefined"&&!d){var e=c.getElementById(a[1]);return e?e.id===a[1]||typeof e.getAttributeNode!="undefined"&&e.getAttributeNode("id").nodeValue===a[1]?[e]:b:[]}},o.filter.ID=function(a,b){var c=typeof a.getAttributeNode!="undefined"&&a.getAttributeNode("id");return a.nodeType===1&&c&&c.nodeValue===b}),e.removeChild(a),e=a=null}(),function(){var a=c.createElement("div");a.appendChild(c.createComment("")),a.getElementsByTagName("*").length>0&&(o.find.TAG=function(a,b){var c=b.getElementsByTagName(a[1]);if(a[1]==="*"){var d=[];for(var e=0;c[e];e++)c[e].nodeType===1&&d.push(c[e]);c=d}return c}),a.innerHTML=" ",a.firstChild&&typeof a.firstChild.getAttribute!="undefined"&&a.firstChild.getAttribute("href")!=="#"&&(o.attrHandle.href=function(a){return a.getAttribute("href",2)}),a=null}(),c.querySelectorAll&&function(){var a=m,b=c.createElement("div"),d="__sizzle__";b.innerHTML="
";if(!b.querySelectorAll||b.querySelectorAll(".TEST").length!==0){m=function(b,e,f,g){e=e||c;if(!g&&!m.isXML(e)){var h=/^(\w+$)|^\.([\w\-]+$)|^#([\w\-]+$)/.exec(b);if(h&&(e.nodeType===1||e.nodeType===9)){if(h[1])return s(e.getElementsByTagName(b),f);if(h[2]&&o.find.CLASS&&e.getElementsByClassName)return s(e.getElementsByClassName(h[2]),f)}if(e.nodeType===9){if(b==="body"&&e.body)return s([e.body],f);if(h&&h[3]){var i=e.getElementById(h[3]);if(!i||!i.parentNode)return s([],f);if(i.id===h[3])return s([i],f)}try{return s(e.querySelectorAll(b),f)}catch(j){}}else if(e.nodeType===1&&e.nodeName.toLowerCase()!=="object"){var k=e,l=e.getAttribute("id"),n=l||d,p=e.parentNode,q=/^\s*[+~]/.test(b);l?n=n.replace(/'/g,"\\$&"):e.setAttribute("id",n),q&&p&&(e=e.parentNode);try{if(!q||p)return s(e.querySelectorAll("[id='"+n+"'] "+b),f)}catch(r){}finally{l||k.removeAttribute("id")}}}return a(b,e,f,g)};for(var e in a)m[e]=a[e];b=null}}(),function(){var a=c.documentElement,b=a.matchesSelector||a.mozMatchesSelector||a.webkitMatchesSelector||a.msMatchesSelector;if(b){var d=!b.call(c.createElement("div"),"div"),e=!1;try{b.call(c.documentElement,"[test!='']:sizzle")}catch(f){e=!0}m.matchesSelector=function(a,c){c=c.replace(/\=\s*([^'"\]]*)\s*\]/g,"='$1']");if(!m.isXML(a))try{if(e||!o.match.PSEUDO.test(c)&&!/!=/.test(c)){var f=b.call(a,c);if(f||!d||a.document&&a.document.nodeType!==11)return f}}catch(g){}return m(c,null,null,[a]).length>0}}}(),function(){var a=c.createElement("div");a.innerHTML="
";if(!!a.getElementsByClassName&&a.getElementsByClassName("e").length!==0){a.lastChild.className="e";if(a.getElementsByClassName("e").length===1)return;o.order.splice(1,0,"CLASS"),o.find.CLASS=function(a,b,c){if(typeof b.getElementsByClassName!="undefined"&&!c)return b.getElementsByClassName(a[1])},a=null}}(),c.documentElement.contains?m.contains=function(a,b){return a!==b&&(a.contains?a.contains(b):!0)}:c.documentElement.compareDocumentPosition?m.contains=function(a,b){return!!(a.compareDocumentPosition(b)&16)}:m.contains=function(){return!1},m.isXML=function(a){var b=(a?a.ownerDocument||a:0).documentElement;return b?b.nodeName!=="HTML":!1};var y=function(a,b,c){var d,e=[],f="",g=b.nodeType?[b]:b;while(d=o.match.PSEUDO.exec(a))f+=d[0],a=a.replace(o.match.PSEUDO,"");a=o.relative[a]?a+"*":a;for(var h=0,i=g.length;h0)for(h=g;h=0:f.filter(a,this).length>0:this.filter(a).length>0)},closest:function(a,b){var c=[],d,e,g=this[0];if(f.isArray(a)){var h=1;while(g&&g.ownerDocument&&g!==b){for(d=0;d-1:f.find.matchesSelector(g,a)){c.push(g);break}g=g.parentNode;if(!g||!g.ownerDocument||g===b||g.nodeType===11)break}}c=c.length>1?f.unique(c):c;return this.pushStack(c,"closest",a)},index:function(a){if(!a)return this[0]&&this[0].parentNode?this.prevAll().length:-1;if(typeof a=="string")return f.inArray(this[0],f(a));return f.inArray(a.jquery?a[0]:a,this)},add:function(a,b){var c=typeof a=="string"?f(a,b):f.makeArray(a&&a.nodeType?[a]:a),d=f.merge(this.get(),c);return this.pushStack(V(c[0])||V(d[0])?d:f.unique(d))},andSelf:function(){return this.add(this.prevObject)}}),f.each({parent:function(a){var b=a.parentNode;return b&&b.nodeType!==11?b:null},parents:function(a){return f.dir(a,"parentNode")},parentsUntil:function(a,b,c){return f.dir(a,"parentNode",c)},next:function(a){return f.nth(a,2,"nextSibling")},prev:function(a){return f.nth(a,2,"previousSibling")},nextAll:function(a){return f.dir(a,"nextSibling")},prevAll:function(a){return f.dir(a,"previousSibling")},nextUntil:function(a,b,c){return f.dir(a,"nextSibling",c)},prevUntil:function(a,b,c){return f.dir(a,"previousSibling",c)},siblings:function(a){return f.sibling(a.parentNode.firstChild,a)},children:function(a){return f.sibling(a.firstChild)},contents:function(a){return f.nodeName(a,"iframe")?a.contentDocument||a.contentWindow.document:f.makeArray(a.childNodes)}},function(a,b){f.fn[a]=function(c,d){var e=f.map(this,b,c),g=S.call(arguments);O.test(a)||(d=c),d&&typeof d=="string"&&(e=f.filter(d,e)),e=this.length>1&&!U[a]?f.unique(e):e,(this.length>1||Q.test(d))&&P.test(a)&&(e=e.reverse());return this.pushStack(e,a,g.join(","))}}),f.extend({filter:function(a,b,c){c&&(a=":not("+a+")");return b.length===1?f.find.matchesSelector(b[0],a)?[b[0]]:[]:f.find.matches(a,b)},dir:function(a,c,d){var e=[],g=a[c];while(g&&g.nodeType!==9&&(d===b||g.nodeType!==1||!f(g).is(d)))g.nodeType===1&&e.push(g),g=g[c];return e},nth:function(a,b,c,d){b=b||1;var e=0;for(;a;a=a[c])if(a.nodeType===1&&++e===b)break;return a},sibling:function(a,b){var c=[];for(;a;a=a.nextSibling)a.nodeType===1&&a!==b&&c.push(a);return c}});var Y="abbr article aside audio canvas datalist details figcaption figure footer header hgroup mark meter nav output progress section summary time video",Z=/ jQuery\d+="(?:\d+|null)"/g,$=/^\s+/,_=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig,ba=/<([\w:]+)/,bb=/",""],legend:[1,""," "],thead:[1,""],tr:[2,""],td:[3,""],col:[2,""],area:[1,""," "],_default:[0,"",""]},bk=X(c);bj.optgroup=bj.option,bj.tbody=bj.tfoot=bj.colgroup=bj.caption=bj.thead,bj.th=bj.td,f.support.htmlSerialize||(bj._default=[1,"div","
"]),f.fn.extend({text:function(a){if(f.isFunction(a))return this.each(function(b){var c=f(this);c.text(a.call(this,b,c.text()))});if(typeof a!="object"&&a!==b)return this.empty().append((this[0]&&this[0].ownerDocument||c).createTextNode(a));return f.text(this)},wrapAll:function(a){if(f.isFunction(a))return this.each(function(b){f(this).wrapAll(a.call(this,b))});if(this[0]){var b=f(a,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&b.insertBefore(this[0]),b.map(function(){var a=this;while(a.firstChild&&a.firstChild.nodeType===1)a=a.firstChild;return a}).append(this)}return this},wrapInner:function(a){if(f.isFunction(a))return this.each(function(b){f(this).wrapInner(a.call(this,b))});return this.each(function(){var b=f(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){return this.each(function(){f(this).wrapAll(a)})},unwrap:function(){return this.parent().each(function(){f.nodeName(this,"body")||f(this).replaceWith(this.childNodes)}).end()},append:function(){return this.domManip(arguments,!0,function(a){this.nodeType===1&&this.appendChild(a)})},prepend:function(){return this.domManip(arguments,!0,function(a){this.nodeType===1&&this.insertBefore(a,this.firstChild)})},before:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this)});if(arguments.length){var a=f(arguments[0]);a.push.apply(a,this.toArray());return this.pushStack(a,"before",arguments)}},after:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this.nextSibling)});if(arguments.length){var a=this.pushStack(this,"after"
+,arguments);a.push.apply(a,f(arguments[0]).toArray());return a}},remove:function(a,b){for(var c=0,d;(d=this[c])!=null;c++)if(!a||f.filter(a,[d]).length)!b&&d.nodeType===1&&(f.cleanData(d.getElementsByTagName("*")),f.cleanData([d])),d.parentNode&&d.parentNode.removeChild(d);return this},empty:function(){for(var a=0,b;(b=this[a])!=null;a++){b.nodeType===1&&f.cleanData(b.getElementsByTagName("*"));while(b.firstChild)b.removeChild(b.firstChild)}return this},clone:function(a,b){a=a==null?!1:a,b=b==null?a:b;return this.map(function(){return f.clone(this,a,b)})},html:function(a){if(a===b)return this[0]&&this[0].nodeType===1?this[0].innerHTML.replace(Z,""):null;if(typeof a=="string"&&!bd.test(a)&&(f.support.leadingWhitespace||!$.test(a))&&!bj[(ba.exec(a)||["",""])[1].toLowerCase()]){a=a.replace(_,"<$1>$2>");try{for(var c=0,d=this.length;c1&&l0?this.clone(!0):this).get();f(e[h])[b](j),d=d.concat(j)}return this.pushStack(d,a,e.selector)}}),f.extend({clone:function(a,b,c){var d=a.cloneNode(!0),e,g,h;if((!f.support.noCloneEvent||!f.support.noCloneChecked)&&(a.nodeType===1||a.nodeType===11)&&!f.isXMLDoc(a)){bn(a,d),e=bo(a),g=bo(d);for(h=0;e[h];++h)g[h]&&bn(e[h],g[h])}if(b){bm(a,d);if(c){e=bo(a),g=bo(d);for(h=0;e[h];++h)bm(e[h],g[h])}}e=g=null;return d},clean:function(a,b,d,e){var g;b=b||c,typeof b.createElement=="undefined"&&(b=b.ownerDocument||b[0]&&b[0].ownerDocument||c);var h=[],i;for(var j=0,k;(k=a[j])!=null;j++){typeof k=="number"&&(k+="");if(!k)continue;if(typeof k=="string")if(!bc.test(k))k=b.createTextNode(k);else{k=k.replace(_,"<$1>$2>");var l=(ba.exec(k)||["",""])[1].toLowerCase(),m=bj[l]||bj._default,n=m[0],o=b.createElement("div");b===c?bk.appendChild(o):X(b).appendChild(o),o.innerHTML=m[1]+k+m[2];while(n--)o=o.lastChild;if(!f.support.tbody){var p=bb.test(k),q=l==="table"&&!p?o.firstChild&&o.firstChild.childNodes:m[1]===""&&!p?o.childNodes:[];for(i=q.length-1;i>=0;--i)f.nodeName(q[i],"tbody")&&!q[i].childNodes.length&&q[i].parentNode.removeChild(q[i])}!f.support.leadingWhitespace&&$.test(k)&&o.insertBefore(b.createTextNode($.exec(k)[0]),o.firstChild),k=o.childNodes}var r;if(!f.support.appendChecked)if(k[0]&&typeof (r=k.length)=="number")for(i=0;i=0)return b+"px"}}}),f.support.opacity||(f.cssHooks.opacity={get:function(a,b){return bt.test((b&&a.currentStyle?a.currentStyle.filter:a.style.filter)||"")?parseFloat(RegExp.$1)/100+"":b?"1":""},set:function(a,b){var c=a.style,d=a.currentStyle,e=f.isNumeric(b)?"alpha(opacity="+b*100+")":"",g=d&&d.filter||c.filter||"";c.zoom=1;if(b>=1&&f.trim(g.replace(bs,""))===""){c.removeAttribute("filter");if(d&&!d.filter)return}c.filter=bs.test(g)?g.replace(bs,e):g+" "+e}}),f(function(){f.support.reliableMarginRight||(f.cssHooks.marginRight={get:function(a,b){var c;f.swap(a,{display:"inline-block"},function(){b?c=bB(a,"margin-right","marginRight"):c=a.style.marginRight});return c}})}),c.defaultView&&c.defaultView.getComputedStyle&&(bC=function(a,c){var d,e,g;c=c.replace(bu,"-$1").toLowerCase();if(!(e=a.ownerDocument.defaultView))return b;if(g=e.getComputedStyle(a,null))d=g.getPropertyValue(c),d===""&&!f.contains(a.ownerDocument.documentElement,a)&&(d=f.style(a,c));return d}),c.documentElement.currentStyle&&(bD=function(a,b){var c,d,e,f=a.currentStyle&&a.currentStyle[b],g=a.style;f===null&&g&&(e=g[b])&&(f=e),!bv.test(f)&&bw.test(f)&&(c=g.left,d=a.runtimeStyle&&a.runtimeStyle.left,d&&(a.runtimeStyle.left=a.currentStyle.left),g.left=b==="fontSize"?"1em":f||0,f=g.pixelLeft+"px",g.left=c,d&&(a.runtimeStyle.left=d));return f===""?"auto":f}),bB=bC||bD,f.expr&&f.expr.filters&&(f.expr.filters.hidden=function(a){var b=a.offsetWidth,c=a.offsetHeight;return b===0&&c===0||!f.support.reliableHiddenOffsets&&(a.style&&a.style.display||f.css(a,"display"))==="none"},f.expr.filters.visible=function(a){return!f.expr.filters.hidden(a)});var bF=/%20/g,bG=/\[\]$/,bH=/\r?\n/g,bI=/#.*$/,bJ=/^(.*?):[ \t]*([^\r\n]*)\r?$/mg,bK=/^(?:color|date|datetime|datetime-local|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,bL=/^(?:about|app|app\-storage|.+\-extension|file|res|widget):$/,bM=/^(?:GET|HEAD)$/,bN=/^\/\//,bO=/\?/,bP=/
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
1: <?php
+ 2:
+ 3: namespace GAubry\Helpers;
+ 4:
+ 5: 6: 7: 8: 9: 10: 11: 12: 13: 14:
+ 15: class Helpers
+ 16: {
+ 17: 18: 19:
+ 20: private function __construct ()
+ 21: {
+ 22: }
+ 23:
+ 24: 25: 26: 27: 28: 29: 30:
+ 31: public static function flattenArray (array $aArray )
+ 32: {
+ 33: $aFlattened = array ();
+ 34: array_walk_recursive (
+ 35: $aArray ,
+ 36: function ($mValue ) use (&$aFlattened ) {
+ 37: $aFlattened [] = $mValue ;
+ 38: }
+ 39: );
+ 40: return $aFlattened ;
+ 41: }
+ 42:
+ 43: 44: 45: 46: 47: 48:
+ 49: public static function utf8Encode ($str )
+ 50: {
+ 51: return (utf8_encode (utf8_decode ($str )) == $str ? $str : utf8_encode ($str ));
+ 52: }
+ 53:
+ 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65:
+ 66: public static function exec ($sCmd , $sOutputPath = '' , $sErrorPath = '' , $bAppend = false )
+ 67: {
+ 68:
+ 69: $sAppending = ($bAppend ? '>>' : '>' );
+ 70: if (empty ($sOutputPath )) {
+ 71: if (empty ($sErrorPath )) {
+ 72: $sStreams = '2>&1' ;
+ 73: } else {
+ 74: $sStreams = "2 $sAppending$sErrorPath " ;
+ 75: }
+ 76: } elseif (empty ($sErrorPath )) {
+ 77: $sStreams = "2>&1 1 $sAppending$sOutputPath " ;
+ 78: } else {
+ 79: $sStreams = "1 $sAppending$sOutputPath 2 $sAppending$sErrorPath " ;
+ 80: }
+ 81:
+ 82:
+ 83: $sFullCmd = "( $sCmd ) $sStreams " ;
+ 84: exec ($sFullCmd , $aResult , $iReturnCode );
+ 85:
+ 86:
+ 87: if (empty ($sOutputPath )) {
+ 88: $aOutput = $aResult ;
+ 89: if (empty ($sErrorPath )) {
+ 90: $aError = $aResult ;
+ 91: } else {
+ 92: $aError = file ($sErrorPath , FILE_IGNORE_NEW_LINES);
+ 93: }
+ 94: } elseif (empty ($sErrorPath )) {
+ 95: $aOutput = file ($sOutputPath , FILE_IGNORE_NEW_LINES);
+ 96: $aError = $aResult ;
+ 97: } else {
+ 98: $aOutput = file ($sOutputPath , FILE_IGNORE_NEW_LINES);
+ 99: $aError = file ($sErrorPath , FILE_IGNORE_NEW_LINES);
+100: }
+101:
+102:
+103: if ($iReturnCode !== 0 ) {
+104: throw new \RuntimeException(
+105: "Exit code not null: $iReturnCode . Result: '" . implode ("\n" , $aError ) . "'" ,
+106: $iReturnCode
+107: );
+108: }
+109: return $aOutput ;
+110: }
+111:
+112: 113: 114: 115: 116: 117:
+118: public static function stripBashColors ($sMsg )
+119: {
+120: return preg_replace ('/\x1B\[([0-9]{1,2}(;[0-9]{1,2}){0,2})?[m|K]/' , '' , $sMsg );
+121: }
+122:
+123: 124: 125: 126: 127: 128: 129:
+130: public static function round ($fValue , $iPrecision = 0 )
+131: {
+132: $sPrintfPrecision = max (0 , $iPrecision );
+133: return sprintf ("%01. {$sPrintfPrecision} f" , round ($fValue , $iPrecision ));
+134: }
+135:
+136: 137: 138: 139: 140: 141: 142: 143: 144:
+145: public static function ucwordWithDelimiters ($sString , array $aDelimiters = array ())
+146: {
+147: $sReturn = ucwords ($sString );
+148: foreach ($aDelimiters as $sDelimiter ) {
+149: if (strpos ($sReturn , $sDelimiter ) !== false ) {
+150: $sReturn = implode ($sDelimiter , array_map ('ucfirst' , explode ($sDelimiter , $sReturn )));
+151: }
+152: }
+153: return $sReturn ;
+154: }
+155:
+156: 157: 158: 159: 160: 161: 162: 163: 164: 165:
+166: public static function intToMultiple ($iValue , $bBinaryPrefix = false )
+167: {
+168: static $aAllPrefixes = array (
+169: 10 => array (12 => 'T' , 9 => 'G' , 6 => 'M' , 3 => 'k' , 0 => '' ),
+170: 2 => array (40 => 'Ti' , 30 => 'Gi' , 20 => 'Mi' , 10 => 'Ki' , 0 => '' ),
+171: );
+172:
+173: $iBase = ($bBinaryPrefix ? 2 : 10 );
+174: $aPrefixes = $aAllPrefixes [$iBase ];
+175: $iMaxMultiple = 0 ;
+176: foreach (array_keys ($aPrefixes ) as $iMultiple ) {
+177: if ($iValue >= pow ($iBase , $iMultiple )) {
+178: $iMaxMultiple = $iMultiple ;
+179: break ;
+180: }
+181: }
+182:
+183: return array ($iValue / pow ($iBase , $iMaxMultiple ), $aPrefixes [$iMaxMultiple ]);
+184: }
+185:
+186: 187: 188: 189: 190: 191: 192: 193: 194: 195:
+196: public static function numberFormat ($fNumber , $sDecPoint = '.' , $sThousandsSep = ',' , $iDecimals = null )
+197: {
+198: if ($iDecimals !== null ) {
+199: return number_format ($fNumber , $iDecimals , $sDecPoint , $sThousandsSep );
+200: } else {
+201: $tmp = explode ('.' , $fNumber );
+202: $out = number_format ($tmp [0 ], 0 , $sDecPoint , $sThousandsSep );
+203: if (isset ($tmp [1 ])) {
+204: $out .= $sDecPoint .$tmp [1 ];
+205: }
+206: return $out ;
+207: }
+208: }
+209:
+210: 211: 212: 213: 214: 215: 216: 217: 218:
+219: public static function strPutCSV ($aInput , $sDelimiter = ',' , $sEnclosure = '"' )
+220: {
+221:
+222: $hTmpFile = fopen ('php://temp' , 'r+' );
+223: fputcsv ($hTmpFile , $aInput , $sDelimiter , $sEnclosure );
+224:
+225: rewind ($hTmpFile );
+226: $sData = fgets ($hTmpFile );
+227: fclose ($hTmpFile );
+228:
+229: return rtrim ($sData , "\n" );
+230: }
+231:
+232: 233: 234: 235: 236: 237: 238: 239: 240: 241: 242: 243: 244: 245: 246: 247: 248: 249: 250: 251: 252: 253: 254: 255: 256: 257: 258: 259: 260: 261:
+262: public static function arrayMergeRecursiveDistinct (array $aArray1 , array $aArray2 )
+263: {
+264: $aMerged = $aArray1 ;
+265: if (self::isAssociativeArray($aMerged )) {
+266: foreach ($aArray2 as $key => &$value ) {
+267: if (is_array ($value ) && isset ($aMerged [$key ]) && is_array ($aMerged [$key ])) {
+268: $aMerged [$key ] = self::arrayMergeRecursiveDistinct($aMerged [$key ], $value );
+269: } else {
+270: $aMerged [$key ] = $value ;
+271: }
+272: }
+273: } else {
+274: $aMerged = $aArray2 ;
+275: }
+276: return $aMerged ;
+277: }
+278:
+279: 280: 281: 282: 283: 284: 285: 286: 287:
+288: public static function isAssociativeArray (array $aArray )
+289: {
+290: foreach (array_keys ($aArray ) as $key ) {
+291: if (! is_int ($key )) {
+292: return true ;
+293: }
+294: }
+295: return false ;
+296: }
+297: }
+298:
+
+
+
+
+
+
diff --git a/doc/api/todo.html b/doc/api/todo.html
new file mode 100644
index 0000000..044f2e9
--- /dev/null
+++ b/doc/api/todo.html
@@ -0,0 +1,103 @@
+
+
+
+
+
+
+ Todo | Helpers
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Todo
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/doc/api/tree.html b/doc/api/tree.html
new file mode 100644
index 0000000..1125909
--- /dev/null
+++ b/doc/api/tree.html
@@ -0,0 +1,111 @@
+
+
+
+
+
+
+ Tree | Helpers
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Tree
+
+
Classes
+
+
+
+
+
+
+
+
+
+
+