From 0c73c707f63f4251c68b5a526633a776ae56b01e Mon Sep 17 00:00:00 2001 From: Simon Asika Date: Thu, 18 Sep 2014 15:40:47 +0800 Subject: [PATCH 01/33] Add zh-TW folder --- manual/zh-TW/_old/README.md | 28 + manual/zh-TW/_old/basic-guidelines.md | 33 ++ manual/zh-TW/_old/comments.md | 106 ++++ manual/zh-TW/_old/php.md | 477 ++++++++++++++++++ manual/zh-TW/_old/preface.md | 8 + manual/zh-TW/appendices/analysis.md | 37 ++ manual/zh-TW/appendices/examples.md | 1 + .../chapters/basic-guidelines.md | 33 ++ manual/zh-TW/coding-standards/chapters/css.md | 220 ++++++++ .../coding-standards/chapters/docblocks.md | 129 +++++ .../zh-TW/coding-standards/chapters/html.md | 342 +++++++++++++ .../chapters/inline-comments.md | 110 ++++ .../coding-standards/chapters/javascript.md | 475 +++++++++++++++++ manual/zh-TW/coding-standards/chapters/php.md | 477 ++++++++++++++++++ .../chapters/source-code-management.md | 24 + manual/zh-TW/coding-standards/chapters/xml.md | 57 +++ manual/zh-TW/coding-standards/introduction.md | 19 + manual/zh-TW/menu.md | 15 + manual/zh-TW/version.md | 1 + 19 files changed, 2592 insertions(+) create mode 100644 manual/zh-TW/_old/README.md create mode 100644 manual/zh-TW/_old/basic-guidelines.md create mode 100644 manual/zh-TW/_old/comments.md create mode 100644 manual/zh-TW/_old/php.md create mode 100644 manual/zh-TW/_old/preface.md create mode 100644 manual/zh-TW/appendices/analysis.md create mode 100644 manual/zh-TW/appendices/examples.md create mode 100644 manual/zh-TW/coding-standards/chapters/basic-guidelines.md create mode 100644 manual/zh-TW/coding-standards/chapters/css.md create mode 100644 manual/zh-TW/coding-standards/chapters/docblocks.md create mode 100644 manual/zh-TW/coding-standards/chapters/html.md create mode 100644 manual/zh-TW/coding-standards/chapters/inline-comments.md create mode 100644 manual/zh-TW/coding-standards/chapters/javascript.md create mode 100644 manual/zh-TW/coding-standards/chapters/php.md create mode 100644 manual/zh-TW/coding-standards/chapters/source-code-management.md create mode 100644 manual/zh-TW/coding-standards/chapters/xml.md create mode 100644 manual/zh-TW/coding-standards/introduction.md create mode 100644 manual/zh-TW/menu.md create mode 100644 manual/zh-TW/version.md diff --git a/manual/zh-TW/_old/README.md b/manual/zh-TW/_old/README.md new file mode 100644 index 00000000..6154079b --- /dev/null +++ b/manual/zh-TW/_old/README.md @@ -0,0 +1,28 @@ +Joomla 編碼標準中文版 +============================= + +The Joomla coding standard Chinese version. + +1. [前言 - Preface](preface.md) (完成) +2. [基礎導覽 - Basic Guidelines](basic-guidelines.md) (完成) +3. [註解 - Comments](comments.md) (未完成) +4. [編碼標準 - PHP](php.md) (完成) + +----- + +讓一個軟體變得更好的因素,並不只在於其提供了多少優異的功能,而在於他的原始碼品質有多優良。為了在競爭激烈的開源環境與專有軟體中佔有一席之地,原始碼不只需要優美的結構設計,更需要在閱讀上看起來同樣美麗而優雅。 + +可讀性高的代碼也是易於維護的,且能夠指引我們實現依賴深思熟慮的標準設計來讓許多不同程式語言專案的工程師一同維護專案的目標。Joomla! 有著堅實的傳統與努力過程來實現一個偉大的產品與美觀的代碼。這份文件彙整過去和現在許多貢獻者的集體智慧,形成一個權威的標準,無論是核心Joomla!框架還是CMS的擴充套件。而這份文件也可以成為一座能安全指引開發者編寫漂亮、乾淨代碼的燈塔,以避開懶惰所造成的陷阱。 + +Joomla 的編碼標準大量的借鑑 PEAR 標準,並在這之上做了一定程度被認為是明智的增加與擴充。 + +----- + +## 貢獻者 + +* Asika - @asika32764 +* Michael - @michael520 +* Tim - @skylying +* Leo - @gourrymk2 +* Lewis - @AEdesWeb +* Benson - @bblurock diff --git a/manual/zh-TW/_old/basic-guidelines.md b/manual/zh-TW/_old/basic-guidelines.md new file mode 100644 index 00000000..90852462 --- /dev/null +++ b/manual/zh-TW/_old/basic-guidelines.md @@ -0,0 +1,33 @@ +## 基礎大綱 + +本章節旨在說明基礎的檔案規則 + +## 檔案格式 + +所有針對 Joomla 開發的檔案格式都必須存為 ASCII text、使用 UTF-8 編碼字型並且經過 Unix 格式化。以行為單位的程式碼必須使用換行字元(LF)作為結尾。換行字元的表示法為:10(序數)、012(八進位)、0A(十六進位)。不要使用純CR回車符(例如蘋果電腦)或是CRLF組合(例如windows電腦)。 + +## 拼字 + +所有使用在程式碼註解、類別、函式、變數、常數的命名原則都必須根據英式英文(en_GB)原則。但有些例外是可允許的,例如某些已內建在 PHP API 中常見的程式用語,或其他慣例用語如 "color" 這樣已制定的用法便可沿用美式英文 + +## 縮排 + +縮排一律使用 Tab 鈕(根據國際 PEAR 準則)。編碼時使用的 IDE 如 Eclipse 需設定 Tab 為4個空白字元長度。 + +## 行寬 + +原則上每行程式碼並沒有最大長度限制,但根據國際標準值,150字元能夠在不需要水平滾動的狀況下達到最好的可讀性。若遇到換行會影響輸出結果的情況(例如 PHP/HTML 混合的結構檔案),更長的程式碼也是被允許的。 + +## 優良範例 + +以下提供一些外部資源,讓大家可以參考這些資源以及相關寫法: + +* [Joomla 開發者網路](http://developer.joomla.org/) - 所有開發相關資源都可由此尋找 +* [Joomla 開發教學文件](http://docs.joomla.org/Developers) - 官方完整的開發教學 Wiki +* [PEAR 編碼標準](http://pear.php.net/manual/en/standards.php) +* [Allman 縮排風格 (Wiki)](http://en.wikipedia.org/wiki/Indent_style#Allman_style) +* [Joomla Coding Standards Github](https://github.com/joomla/coding-standards) - 儲存 PHP Codesniffer 設定檔等等 +* [Joomla CodeSniffer](http://docs.joomla.org/Joomla_CodeSniffer) - Joomla 開發過程與 IDE 的整合 +* [Secure coding guidelines](http://docs.joomla.org/Secure_coding_guidelines) - 安全性編碼導覽 + +本清單將隨時補充~~~ diff --git a/manual/zh-TW/_old/comments.md b/manual/zh-TW/_old/comments.md new file mode 100644 index 00000000..4482e7ef --- /dev/null +++ b/manual/zh-TW/_old/comments.md @@ -0,0 +1,106 @@ +## 註解 + +此章節將告訴您在程式碼中寫入詳細的文字註解。而在程式碼中的註解文字並不能加以插入文件區塊。為該程式碼下註解的目的就是解釋該段的程式碼的運作跟用途。 + +註解能用可人為且易閱讀的方式去述敘該程式碼中複雜的運算,幫助瞭解程式碼之間的運作關係,下註解是值德鼓勵去實行的美德。 + +註解盡可能的用一句話解釋完畢,應該是說,它們應該是有完整的思思並可以完全理解的,而不是只有太簡短而帶過。 + +註解是不能代替詳細的文檔區塊。它是用來說明代碼本身的羅輯結構,而不是去使用程式碼。 + +## 註解的格式 + +註解一個區塊的程式碼或是超過兩行者應該使用(c)風格的'/**/',並應與同一空間/標籤規則文檔塊的每一行使用'*'。 如果你需要一個大的引進考慮這個塊是否應被分為一個方法來降低複雜性並因此提供了一個完整的文檔塊。 + +註解必需要處於一個優先的地位來解釋程式碼運作的方式。像是要做為一個參考或引用,註解的位置就應該不必跟程式碼置於同一行(與它們放在程式碼的後方做為一個引用)。它們必需跟自己同一行來放置。 + +不要在每行的註解跟每行的程式碼之間插入空白行。(在註解的區塊中不要有空白行) + +應該是要用一個區塊的方式,也就是說程式碼一個區塊註解一個區塊,然後各個區塊間用一行空白行區隔。 + +註解應該跟程式碼的縮排對齊以便優於參考,使用同縮排方式跟隨註解之後。 + +註解應該要用(tab)來縮排。(跟程式碼一樣,而不是與文件區塊同排)。 + +## 註解的內容表達 + +註解的語系必需要是en-GB (請參考下方範例)。 + +必需要在//與開頭之間有空隔。 + +下一個新行的註解必需大寫以開頭,除非這個新行是延續上一個註解的句子。然而,程式碼是有分大小寫的。 + +程式碼所含了特別的相容性去保證其它軟體的正常運作(例如一個特定的瀏覽器或特定的內容管理軟體或需要向下相容往後版本的理由)而必需要特別標明。如果有個不明確的未來或由理要移除這一段程式碼,則讓它處於一個不會去用到的舊程式碼或暫時的去做一個版本的發佈。 + +在所有註解中檢查拼字跟語法。(請參考下方範例)。 + +只使用一行來完整整個句子。 + +而不是使用文件區塊,如果有適合下註解的方式可使用 See:、 Link: 和 Note: 這些標籤。 + +除此之外有特別的關係去解釋該內容,則不要使用 HTML 於解註中。 + +不要留下註解過的程式碼,除非有明確解釋這樣做的理由,在這樣的情況下,註解說明“程式碼需要被註解”則將不會意外移除。 + +註釋可能包括一些程式碼可能在未來會有延展性來修改程式碼,表示了這個程式碼是不完整的或是要用來準備有前瞻性的陳述,也是不一個待辦事項。 + +請記住幽默和諷剌是很難翻譯。 + +## 縮寫字 + +大寫首字母縮寫詞,如HTML,XML,SQL,GMT和UTC的所有字母。這些都是例外,一般使用EN-GB的規則。 + +## 常見的拼寫和語法錯誤檢查。 + +Joomla的貢獻者包括許多非母語的EN-GB,有時會有拼寫和語法錯誤,這使得它可以理解的。同時,有些人解讀評論也都是非母語,甚至可能使用自動翻譯理解的註釋。這使得它非常重要的意見應遵循正確的EN-GB的拼寫和語法規則。不幸的是,這可能會非常棘手。 + +維基百科提供在en-US和en-GB之間很常見的差異做了一個很好的詮釋。http://en.wikipedia.org/wiki/American_and_British_English_spelling_differences 請留意有某些情況下EN-GB的常見用法(而不是實際的規則)略高於EN-AU不相同,使用EN-AU被認為是可以接受的。 + +### S 跟 Z 的對決 + +EN-GB最常使用``ISE其中的en-US將使用`IZE`,比如`正常化,而不是'正常化'`。 (請注意,有一些例外情況和 en-GB 之間和 en-AU 共同使用一些差別。) + +使用單引號是英文的棘手的部分之一。 + +### Lets 與 let’s + +Lets means permits or allows to: +讓我們準許這樣做 : + +```php +// This lets the user enter data +// 這裡讓我們給使用者輸入一些資料 +``` + +Let’s is a contraction for let us and means we are going to do this now: +讓`我們的縮短為我們和這樣的意思來做: + +```php +// Let's validate the field +// 讓`我們檢查這個欄位 +``` + +### Its versus it’s +### 它是 和 它`是 + +Its is the possessive form of it: +它是它的所有格形式 + +```php +// Get its ID +// 取得它的唉滴,俊郎.... +``` + +It’s is a contraction of it is +它`是它的一個縮寫 + +```php +// It's time to save +// 它`是時候去解救了...俊郎郎郎 +``` + +### 在 Joomla 下所拼寫一些常用的單詞。 + +- 依賴的 + + diff --git a/manual/zh-TW/_old/php.md b/manual/zh-TW/_old/php.md new file mode 100644 index 00000000..eae76d4a --- /dev/null +++ b/manual/zh-TW/_old/php.md @@ -0,0 +1,477 @@ +## 語言結構 + +### PHP 標籤 + +永遠使用長標籤: `` 來包裹 PHP 程式碼,不使用短標籤 ``。這可以確保您的程式碼可執行在大多數未經設定的主機環境。 + +如果檔案中只包含PHP程式碼,則不應該包含結尾標籤 `?>`。這個標籤在 PHP 中不是必要的。這樣子可以避免在系統輸出前,不小心讓任何空白預先送出 header ,這會造成 Joomla 的 Session 功能錯誤 (參見 PHP 手冊的說明 [Instruction separation](http://php.net/basic-syntax.instruction-separation))。 + +檔案結尾必須永遠由一個空行結束。 + +### 引入程式 + +當您想要無條件引入一個檔案時,應使用 `require_once`。當您要有條件的引入一個檔案(例如 factory 類別與其方法),則用 `include_once`。這兩者都可以確保檔案不被二次載入。兩種用法共享檔案清單,所以混用不會有任何問題。被 `require_once` 引入的檔案不會再被 `include_once` 引入一次。 + +> **注意** +> +> `include_once` 與 `require_once` 是 PHP 關鍵字,不是函式,寫法應該如下: +> +> +> `require_once JPATH_COMPONENT . ’/helpers/helper.php’;` + +您不應該把檔案路徑用括號包起來。 + +### 兼容 E_STRICT 的 PHP 程式 + +我們必須秉持並實踐 PHP 5.3 以上所支持的物件導向設計模式。Joomla! 一直致力於讓原始碼符合 E_STRICT 標準。 + +## 全域變數 + +盡量減少使用全域變數或超全域變數,用物件導向或工廠(Factory)模式替代之。 + +## 控制結構 + +所有的控制結構必須在關鍵字與起始括號之間放置一個空白字元,而開頭、結尾括號與邏輯判斷式之間無空格。這是為了區隔控制結構與函式以方便辨認,而括號內必須要包含邏輯。 + +所有的控制結構關鍵字,如: `if`, `else`, `do`, `for`, `foreach`, `try`, `catch`, `switch` 與 `while` 皆採 [Allman](http://en.wikipedia.org/wiki/Indent_style#Allman_style) 風格,關鍵字本身必須在一個新行,而語言區塊(大括號)的開頭與結束也接需再一個新行中。 + +### _if-else_ 範例 + +```php +if ($test) +{ + echo 'True'; +} + +// 註解可寫在此 +// 要注意的是 "elseif" 採用單一單字而非拆開成 "else if" + +elseif ($test === false) +{ + echo 'Really false'; +} +else +{ + echo 'A white lie'; +} +``` + +如果控制結構的判斷式需要多行,則第二行開始需要一個 Tab 縮排,結尾括號需要再同一行上。 + +```php +if ($test1 + && $test2) +{ + echo 'True'; +} +``` + +### _do-while_ 範例 + + +```php +do +{ + $i++; +} +while ($i < 10); +``` + +### _for_ 範例 + +```php +for ($i = 0; $i < $n; $i++) +{ + echo 'Increment = ' . $i; +} +``` + +### _foreach_ 範例 + +```php +foreach ($rows as $index => $row) +{ + echo 'Index = ' . $id . ', Value = ' . $row; +} +``` + +### _while_ 範例 + +```php +while (!$done) +{ + $done = true; +} +``` + +### _switch_ 範例 + +當使用 `switch` 時, `case` 關鍵字必須縮排一次,而 `break` 關鍵字必須獨立在新的一行,且相較於 `case` 再縮排一次。 + +```php +switch ($value) +{ + case 'a': + echo 'A'; + break; + + default: + echo 'I give up'; + break; +} +``` + +## 參照 + +當使用變數參照時,參照符號應該距離等號一個空白字元,且跟後面的變數緊鄰,沒有空白。 + +範例: + +```php +$ref1 = &$this->sql; +``` + +> **注意** +> +> 在 PHP 5 ,物件不再需要參照符號,所有物件皆是參照。 + +## 陣列 + +陣列元素的指派可稍微排版,當多行時,可用 Tab 縮排。每行跟隨一個都逗號結尾,最後一行可包含逗號,這是 PHP 允許的寫法,對於程式碼 diff 比對時也有所幫助。 + +範例: + +```php +$options = array( + 'foo' => 'foo', + 'spam' => 'spam', +); +``` + +## 註解 + +行內註解可用 C 語言風格的 `/* ... */` 或 C++ 的單行註解 `// ...`。 C 風格的註解通常被用在文件開頭、類別、函式等等的文件標頭。而 C++ 風格單行註解則常用在程式解釋與提醒。註解對於幫助其他開發人員理解程式碼的目的有非常大的幫助,甚至包含您自己也能受惠。當程式碼開始進行複雜操作時,永遠記得要加上註解。至於 Perl 與 Shell 的井號 (`#`)註解則不建議使用,目前在 PHP 中也不再允許此類註解。 + +您可以在某些情況下藉由註解掉整段程式碼或類別函式以用於調整程式功能,但應該在最終提交到核心前去除這些註解或不再需要的程式區塊。 + +例如,不要在提交的程式碼中包含以下片段: + +```php +// 這段程式碼未來需要修復 +//$code = broken($fixme); +``` + +### 文件區塊註解 + +在 PHP、Javascript、檔案中的所有類別、成員屬性、方法與函式,皆需要區塊註解,並遵循 JavaDoc 或 phpDoc 的約定。 + +這些 "區塊註解 (DocBlocks)" 從 PEAR 引用而來,但也為了 Joomla Framework 做了一點改變。 + +雖然一般的縮排皆使用標準 Tab 來縮進,但區塊註解中,我們使用空格來排版,這提供了原始碼更優良的可讀性。任何文字元素,如標籤、變數的類型、變數名稱與標籤描述的最小距離必須是兩個空格。變數類型和標籤說明應分別按照最長的標籤和變數類型、變數描述對齊。 + +如果使用了 `@package` 標籤,必須是 "Joomla.Platform"。 + +除果使用了 `@subpackage` ,必須是 /joomla/ 資料夾下的頂層目錄名稱,例如: Application, Database, Html 等等。 + +> 註: 在 Joomla Framework 中,不再使用 `@package` 與 `@subpackage`。 + +貢獻給 Joomla 的程式碼,將成為專案的資產,不允許擁有 `@author` 標籤。你應該在 CREDITS.php 更新貢獻紀錄。Joomla 的理念是這樣的,所有的程式是一起發展編寫出來的,並沒有任何一個人擁有任何代碼中的一個部分。不過 `@author` 標籤允許使用在被包含進核心函式庫的第三方函式庫。 + +從第三方函式庫引入的檔案,其區塊註解必須完好無損。Layout 的檔案使用跟其他 PHP 檔案一樣的區塊註解。 + +### 檔案文件標頭註解 + +文件標頭註解有以下內容且按照順序 + +- 簡易說明 (選填, 除非超過兩個以上類別或方法) 結束空一行. +- 完整說明 (選填) 結束空一行. +- `@category` (選填) +- `@package` (通常是選填, 但如果檔案只包含程序邏輯(無類別)則必填) +- `@subpackage` (選填) +- `@author` (選填, 但只允許在非的Joomla源文件,例如,包括第三方函式庫例如 Geshi) +- `@copyright` (必填) +- `@license` (必填且必須是相容於 Joomla 所使用的授權條款) +- `@deprecated` (選填) +- `@link` (選填) +- `@see` (選填) +- `@since` (通常是選填,但如果檔案只包含程序邏輯(無類別)則必填) + +``` +/** + * @package Joomla.Platform + * @subpackage Database + * @copyright Copyright 2005 - 2010 Open Source Matters. All rights re-served. + * @license GNU General Public License version 2 or later; see LICENSE.txt + */ +``` + +## 函式呼叫 + +呼叫函式時, 函式名稱跟參數括號中不能有空白, 而第一個帶入參數也不得有空白; 每個參數逗點後一個空白隔開 (如果有的話), 最後一個參數跟括號沒有空格. 參數帶值等號前後需有空白. 可以多行對齊. + +```php +// 單函式呼叫 +$foo = bar($var1, $var2); + +// 多函式呼叫 +$short = bar('short'); +$medium = bar('medium'); +$long = bar('long'); +``` + +## 函式定義 + +函式定義需開始並獨立於一新行,開始與結束的括號也需分別被放置於一新行。在負責處理回傳值的程式碼前應插入一空行。 + +函數定義必須包含註解說明,根據本文件中的註解章節所規範之規則予以撰寫。 + +- 簡易說明 (必要,結束需空一行) +- 完整說明 (選填,結束需空一行) +- `@param` (若函式有參數則此欄位為必要,並於最後一個`@param`標簽之後新增一空行) +- `@return` (必要,結束需空一行) +- 其餘標簽依據字母順序排列,需注意 @since 標籤永遠為必要。 + +```php +/** + * An utility class. + * + * @package Joomla.Platform + * @subpackage XBase + * + * @param string $path The library path in dot notation. + * + * @return void + * + * @since 1.6 + */ +function jimport($path) +{ + // Body of method. +} +``` + +如果一個函數定義橫跨數行,第二行起的每一行皆需以一個 tab 作縮排,結束括號需與最後一個參數存在於同一行。 + +```php +function fooBar($param1, $param2, + $param3, $param4) +{ + // Body of method. +} +``` + +## 類別定義 + +類別定義需開始並獨立於一新行,開始與結束的括號也需被分別放置於一新行。類別方法(Class Methods)需根據函數定義標準來撰寫。類別的屬性及方法需根據物件導向(OOP)標準適當宣告(使用適合的 public, protected, private 和 static 等屬性) + +類別的定義、屬性及方法皆需撰寫對應的註解區塊(DocBlock),根據接下來的準則規範。 + +### 類別註解區塊標頭 + +類別註解區塊包含以下必要及非必要欄位,並依照下列順序排列。 + +- 簡易說明(必要,除非該檔案擁有兩個以上之類別或函數) +- 完整說明(選填,結束需空一行) +- `@category` (選填,很少用到) +- `@package` (必要) +- `@subpackage` (選填) +- `@author` (選填,但只允許在非joomla的程式碼中,舉例來說,如:使用第三方函式庫如Geshi) +- `@copyright` (選填,除非與檔案文件註解表頭(file Docblock)不同) +- `@license` (選填,除非與檔案文件註解表頭(file Docblock)不同) +- `@deprecated` (選填) +- `@link` (選填) +- `@see` (選填) +- `@since` (必填, 根據類別第一次出現時的程式版本號) + +### 類別屬性註解區塊 + +類別屬性註解區塊包含以下必要及非必要欄位,並依照下列順序排列。 + +- 簡易說明(必要,除非該檔案擁有兩個以上之類別或函數) +- `@var` (必要,於該屬性後其後註明屬性種類(property type)) +- `@deprecated` (選填) +- `@since` (必填) + +### 類別方法註解區塊 + +類別方法註解區塊是依據PHP函式之規則做撰寫(如上述)。 + +```php +/** + * An utility class. + * + * @package Joomla.Platform + * @subpackage XBase + * @since 1.6 + */ +class JClass extends JObject +{ + /** + * Human readable name + * + * @var string + * @since 1.6 + */ + public $name; + + /** + * Method to get the name of the class. + * + * @param string $case Optionally return in upper/lower case. + * + * @return boolean True if successfully loaded, false otherwise. + * + * @since 1.6 + */ + public function getName($case = null) + { + // Body of method. + + return $this->name; + } +} +``` + +## 命名慣例 + +### 類別 + +類別應給予描述性的名稱。在可能的情況下應避免縮寫。類別名稱總是以一個大寫字母開頭,且採用駝峰式 (CamelCase) 命名法則,即便名字中包含傳統上常用大寫的字彙(如 HTML, XML)。唯一例外是必須由 J 開頭的核心類別後面可接上一個大寫字母。 + +範例: + +- JHtmlHelper +- JXmlParser +- JModel + +### 函式與方法 + +函式與方法採用 "studly caps" 風格 (也稱作 "bumpy case" 或 "camel caps")。 名稱起始的字母必須是小寫,而每個新單字的首個字母為大寫。而在 Joomla 框架中的函式必須由小寫字母 'j' 開頭。 + +範例: + +- connect(); +- getData(); +- buildSomeWidget(); +- jImport(); +- jDoSomething(); + +類別的私有成員屬性 (就是說只被用在他所宣告出來的類別內部的成員屬性) ,開頭有一個底線。屬性名稱採用底線命名風格 (也就是說,單字被底線區 隔開來),且應該全部小寫。 + +範例: + +```php +class JFooHelper +{ + protected $field_name = null; + + private $_status = null; + + protected function sort() + { + } +} +``` + +### 常數 + +常數應永遠為大寫,並用底線分隔單字。總是在常數前加上 `J` 且運用一些眾人常識和慣例來避免常數名稱太長。你 *應該* 使用類別或封包 (package) 中已經使用的名稱。例如在 'Joomla\Application\Web\Router' 中的常數,以 `JRoute_` 開頭。 + +### 全域變數 + +不要使用全域變數。採用靜態類別與屬性或常數替代。 + +### 一般情況下的變數與類別屬性 + +一般情況下的變數,遵循函式的慣例。 + +類別的屬性應該設為 null 或其他適當的預設值。 + +## 例外處理 + +例外處理應當只用於錯誤處理上。 + +下面的章節將指出如何照語意使用 [PHP 標準函式庫 (SPL) 的 Exceptions](http://php.net/manual/en/spl.exceptions.php)。 + +### 邏輯例外 LogicException + +在 API 的使用方式上發生的明確問題會丟出 LogicException 的例外。例如:如果有個依賴參數失效時(你試圖操作一個未被載入的物件)。 + +下方的子類別也可被用於適當的情境下: + +#### BadFunctionCallException + +如果一個 callback 參照到一個未定義的函式(function) 或是缺少了一些參數時可以丟出該例外。例如:如果 `is_callable()` 或其他類似的函式用在一個函式(function)上時得到失敗的結果。 + +#### BadMethodCallException + +如果一個 callback 參照到一個未定義的方法(method) 或是缺少了一些參數時可以丟出該例外。例如:如果 `is_callable()` 或其他類似的函式用在一個方法(method)上時得到失敗的結果。 另一個例子可能是找不到某些使用魔術方法的參數。 + +#### InvalidArgumentException + +當有不合規格的輸入發生時丟出該例外。 + +#### DomainException + +該例外和 InvalidArgumentException 類似,但會在一數值未依附在一已定義的有效資料群集的情形下丟出該例外。例如:試圖載入一個"mongodb"的資料庫引擎,但該引擎尚未在 API 中實作。 + +#### LengthException + +當作一參數的長度檢查失敗時丟出該例外。例如:一個檔案的雜湊值不是一個指定長度的字串。 + +#### OutOfRangeException + +該例外較少被實際的應用,但可在存取一個非法的索引值時丟出該例外。 + +### 執行期例外 RuntimeException + +當外部實體或環境造成你無法控制的問題因而產生錯誤時,便丟出 RuntimeException 的例外。當一個錯誤的產生不能明確地被判斷出來時,預設丟出該例外。例如:你試圖連到資料庫但資料庫卻無法使用 (伺服器掛掉之類的)。另一個例子可能為 SQL 查詢語句的錯誤。 + +#### UnexpectedValueException + +當一個非預期的結果發生時應當丟出該種類的例外。例如:當一個函式預期是要回傳布林值卻回傳字串時。 + +#### OutOfBoundsException + +該例外較少實際的應用,但也許當某個值不為合法的索引值時丟出該例外。 + +#### OverflowException + +該例外較少實際的應用,但也許當你加入一個元素到已經滿載的容器物件時丟出該例外。 + +#### RangeException + +該例外較少實際的應用,但也許在程式執行期間丟出該例外以指出一個範圍的錯誤。通常這是指除了運算虧位/溢位之外的錯誤。該例外為 DomainException 的 runtime 版本。 + +#### UnderflowException + +該例外較少實際的應用,但也許當你從一個空的容器物件中移除一個元素時丟出該例外。 + +### 例外處理的文件撰寫 + +每個函式(function)或方法(method)必須要註解使用到的例外,用 @throws 的標籤和丟出例外的物件名稱作註解。每種例外只須備被註解一次。註解的說明非必須。 + +## SQL 查詢語句 + +SQL 的保留字要全用大寫,其他的文字符號 (當然被引號包起來的文字為例外) 為小寫。 + +全部的 table 名稱必須要用 `#__` 的前綴字而不是用 `jos_` 去讀取 Joomla 的內容,並允許替換為使用者定義的資料庫前綴字。查詢語句也必須使用 JDatabaseQuery API。 + +```php +// Get the database connector. +$db = JFactory::getDBO(); + +// Get the query from the database connector. +$query = $db->getQuery(true); + +// Build the query programatically (using chaining if desired). +$query->select('u.*') + // Use the qn alias for the quoteName method to quote table names. + ->from($db->qn('#__users').' AS u')); + +// Tell the database connector what query to run. +$db->setQuery($query); + +// Invoke the query or data retrieval helper. +$users = $db->loadObjectList(); +``` diff --git a/manual/zh-TW/_old/preface.md b/manual/zh-TW/_old/preface.md new file mode 100644 index 00000000..16575742 --- /dev/null +++ b/manual/zh-TW/_old/preface.md @@ -0,0 +1,8 @@ +# Preface - 前言 + +讓一個軟體變得更好的因素,並不只在於其提供了多少優異的功能,而在於他的原始碼品質有多優良。為了在競爭激烈的開源環境與專有軟體中佔有一席之地,原始碼不只需要優美的結構設計,更需要在閱讀上看起來同樣美麗而優雅。 + +可讀性高的代碼也是易於維護的,且能夠指引我們實現依賴深思熟慮的標準設計來讓許多不同程式語言專案的工程師一同維護專案的目標。Joomla! 有著堅實的傳統與努力過程來實現一個偉大的產品與美觀的代碼。這份文件彙整過去和現在許多貢獻者的集體智慧,形成一個權威的標準,無論是核心Joomla!框架還是CMS的擴充套件。而這份文件也可以成為一座能安全指引開發者編寫漂亮、乾淨代碼的燈塔,以避開懶惰所造成的陷阱。 + +Joomla 的編碼標準大量的借鑑 PEAR 標準,並在這之上做了一定程度被認為是明智的增加與擴充。 + diff --git a/manual/zh-TW/appendices/analysis.md b/manual/zh-TW/appendices/analysis.md new file mode 100644 index 00000000..a534f7da --- /dev/null +++ b/manual/zh-TW/appendices/analysis.md @@ -0,0 +1,37 @@ +## Coding Standards Analysis + +For new contributions we are going to be enforcing coding standards to ensure that the coding style in the source code is consistent. Ensuring that your code meets these standards will make the process of code contribution smoother. + +## Configuring Code Analysis Tools + +In order to improve the consistency and readability of the source code, the Joomla project runs a coding style analysis tool, CodeSniffer, everytime changes are pushed to a Joomla project's repository. + +### Running CodeSniffer + +The Joomla Coding Standards sniffer rules are written to be used with a tool called PHP CodeSniffer. Please see the [PHP CodeSniffer Pear +Page](http://pear.php.net/package/PHP_CodeSniffer) for information on +installing PHP CodeSniffer on your system. + +You can run the CodeSniffer by going to the CMS, Framework, or Issue Tracker's root directory and executing + +``` +phpcs --report=checkstyle --report-file=build/logs/checkstyle.xml --standard=/path/to//build/phpcs/Joomla /path/to/ +``` + +Alternatively, if you have Ant installed on your system, you may run the CodeSniffer by going to the `` of the Joomla project's code you want to test and executing + +``` +ant phpcs +``` + +#### Known Issues + +- There is currently an issue with running the Code Sniffer on the + Simplepie library. Pointing the sniffs at the libraries/joomla + directory or below will avoid the issue. + +## Other Tools + +Here are some other tools available to developers who are planning to submit source code to the project. + +### PhpStorm Code Style Scheme diff --git a/manual/zh-TW/appendices/examples.md b/manual/zh-TW/appendices/examples.md new file mode 100644 index 00000000..7fda47f1 --- /dev/null +++ b/manual/zh-TW/appendices/examples.md @@ -0,0 +1 @@ +## Code Examples \ No newline at end of file diff --git a/manual/zh-TW/coding-standards/chapters/basic-guidelines.md b/manual/zh-TW/coding-standards/chapters/basic-guidelines.md new file mode 100644 index 00000000..90852462 --- /dev/null +++ b/manual/zh-TW/coding-standards/chapters/basic-guidelines.md @@ -0,0 +1,33 @@ +## 基礎大綱 + +本章節旨在說明基礎的檔案規則 + +## 檔案格式 + +所有針對 Joomla 開發的檔案格式都必須存為 ASCII text、使用 UTF-8 編碼字型並且經過 Unix 格式化。以行為單位的程式碼必須使用換行字元(LF)作為結尾。換行字元的表示法為:10(序數)、012(八進位)、0A(十六進位)。不要使用純CR回車符(例如蘋果電腦)或是CRLF組合(例如windows電腦)。 + +## 拼字 + +所有使用在程式碼註解、類別、函式、變數、常數的命名原則都必須根據英式英文(en_GB)原則。但有些例外是可允許的,例如某些已內建在 PHP API 中常見的程式用語,或其他慣例用語如 "color" 這樣已制定的用法便可沿用美式英文 + +## 縮排 + +縮排一律使用 Tab 鈕(根據國際 PEAR 準則)。編碼時使用的 IDE 如 Eclipse 需設定 Tab 為4個空白字元長度。 + +## 行寬 + +原則上每行程式碼並沒有最大長度限制,但根據國際標準值,150字元能夠在不需要水平滾動的狀況下達到最好的可讀性。若遇到換行會影響輸出結果的情況(例如 PHP/HTML 混合的結構檔案),更長的程式碼也是被允許的。 + +## 優良範例 + +以下提供一些外部資源,讓大家可以參考這些資源以及相關寫法: + +* [Joomla 開發者網路](http://developer.joomla.org/) - 所有開發相關資源都可由此尋找 +* [Joomla 開發教學文件](http://docs.joomla.org/Developers) - 官方完整的開發教學 Wiki +* [PEAR 編碼標準](http://pear.php.net/manual/en/standards.php) +* [Allman 縮排風格 (Wiki)](http://en.wikipedia.org/wiki/Indent_style#Allman_style) +* [Joomla Coding Standards Github](https://github.com/joomla/coding-standards) - 儲存 PHP Codesniffer 設定檔等等 +* [Joomla CodeSniffer](http://docs.joomla.org/Joomla_CodeSniffer) - Joomla 開發過程與 IDE 的整合 +* [Secure coding guidelines](http://docs.joomla.org/Secure_coding_guidelines) - 安全性編碼導覽 + +本清單將隨時補充~~~ diff --git a/manual/zh-TW/coding-standards/chapters/css.md b/manual/zh-TW/coding-standards/chapters/css.md new file mode 100644 index 00000000..91979236 --- /dev/null +++ b/manual/zh-TW/coding-standards/chapters/css.md @@ -0,0 +1,220 @@ +## CSS +These guidelines have been assembled following an examination of emerging practices, ideas and existing styleguides, namely: + +1. [OOCSS Code Standards](https://github.com/stubbornella/oocss-code-standards) +2. [Oneweb Style Guide](https://github.com/nternetinspired/OneWeb/blob/master/STYLEGUIDE.md) +3. [Idiomatic CSS](https://github.com/necolas/idiomatic-css) + + +## Commenting + +### Major sections +Major code sections should be named in caps and within a full comment block, eg: +```css +/* ========================================================================== + PRIMARY NAVIGATION + ========================================================================== */ +``` + +### Sub sections +Subsections should be normally cased and within an open comment block. +```css +/* Mobile navigation + ========================================================================== */ +``` + +### Verbose comments +```css +/** + * Short description using Doxygen-style comment format + * + * The first sentence of the long description starts here and continues on this + * line for a while finally concluding here at the end of this paragraph. + * + * The long description is ideal for more detailed explanations and + * documentation. It can include example HTML, URLs, or any other information + * that is deemed necessary or useful. + * + * @tag This is a tag named 'tag' + * + * TODO: This is a todo statement that describes an atomic task to be completed + * at a later date. It wraps after 80 characters and following lines are + * indented by 2 spaces. + */ + ``` + +### Basic comments +```css +/* Basic comment */ +``` + +### Uncompiled LESS/Scss comments +```css +// These are stripped on compile. +``` + +## Class naming +Use dashes to create compound class names: + +```css +/* Good - use dashes */ +.compound-class-name {…} + +/* Bad - uses underscores */ +.compound_class_name {…} + +/* Bad - uses camelCase */ +.compoundClassName {…} + +/* Bad - does not use seperators */ +.compoundclassname {…} +``` + +### Indentation +Rules should be indented one tab (equal to 4 spaces): + +```css +/* Good */ +.example { + color: #000; + visibility: hidden; +} + +/* Bad - all on one line */ +.example {color: #000; visibility: hidden;} +``` + +LESS/Scss should also be nested , with child selectors and rules indented again. Nested rules should also be spaced by one line: + +```css +/* Good */ +.example { + + > li { + float: none; + + + li { + margin-top: 2px; + margin-left: 0; + } + + } + +} +/* Bad - nested rules not indented */ +.example { + + > li { + float: none; + + + li { + margin-top: 2px; + margin-left: 0; + } + + } + +} +/* Bad - nested rules not spaced */ +.example { + > li { + float: none; + + li { + margin-top: 2px; + margin-left: 0; + } + } +} +``` + +### Alignment +The opening brace must be on the same line as the last selector and preceded by a space. The closing brace must be on its own line after the last property and be indented to the same level as the opening brace. + +```css +/* Good */ +.example { + color: #fff; +} + +/* Bad - closing brace is in the wrong place */ +.example { + color: #fff; + } + +/* Bad - opening brace missing space */ +.example{ + color: #fff; +} +``` + +### Property Format +Each property must be on its own line and indented one level. There should be no space before the colon and one space after. All properties must end with a semicolon. + +```css +/* Good */ +.example { + background: black; + color: #fff; +} + +/* Bad - missing spaces after colons */ +.example { + background:black; + color:#fff; +} + +/* Bad - missing last semicolon */ +.example { + background: black; + color: #fff +} +``` + +### HEX values +HEX values must be declared in lowercase and shorthand: +```css +/* Good */ +.example { + color: #eee; +} + +/* Bad */ +.example { + color: #EEEEEE; +} +``` + +### Attribute selectors +Always use double quotes around attribute selectors. + +```css +/* Good */ +input[type="button"] { + ... +} + +/* Bad - missing quotes */ +input[type=button] { + ... +} + +/* Bad - using single quote */ +input[type='button'] { + ... +} +``` + +### Zero value units +Zero values should not carry units. + +```css +/* Good */ +.example { + padding: 0; +} + +/* Bad - uses units */ +.example { + padding: 0px; +} +``` diff --git a/manual/zh-TW/coding-standards/chapters/docblocks.md b/manual/zh-TW/coding-standards/chapters/docblocks.md new file mode 100644 index 00000000..74965f46 --- /dev/null +++ b/manual/zh-TW/coding-standards/chapters/docblocks.md @@ -0,0 +1,129 @@ +## DocBlocks + +Documentation headers for PHP code in: files, classes, class properties, methods and functions, called the docblocks, follow a convention similar to JavaDoc or phpDOC. + +These "DocBlocks" borrow from the PEAR standard but have some variations specific for Joomla and the Joomla projects. + +Whereas normal code indenting uses real tabs, all whitespace in a Docblock uses real spaces. This provides better readability in source code browsers. The minimum whitespace between any text elements, such as tags, variable types, variable names and tag descriptions, is two real spaces. Variable types and tag descriptions should be aligned according to the longest Docblock tag and type-plus-variable respectively. + +Code contributed to the Joomla project that will become the copyright of the project is not allowed to include @author tags. You should update the contribution log in CREDITS.php. Joomla's philosophy is that the code is written "all together" and there is no notion of any one person "owning" any section of code. The @author tags are permitted in third-party libraries that are included in the core libraries. + +Files included from third party sources must leave DocBlocks intact. Layout files use the same DocBlocks as other PHP files. + +### File DocBlock Headers +The file header DocBlock consists of the following required and optional elements in the following order: +Short description (optional unless the file contains more than two classes or functions), followed by a blank line). Long description (optional, followed by a blank line). + +* @category (optional and rarely used) +* @package (generally optional but required when files contain only procedural code) +* @subpackage (optional) +* @author (optional but only permitted in non-Joomla source files, for example, included third-party libraries like Geshi) +* @copyright (required) +* @license (required and must be compatible with the Joomla license) +* @deprecated (optional) +* @link (optional) +* @see (optional) +* @since (generally optional but required when files contain only procedural code) + +Example of a DocBlock Header: + +```php +/** + * @package Joomla.Installation + * @subpackage Controller + * + * @copyright Copyright (C) 2005 - 2014 Open Source Matters, Inc. All rights reserved. + * @license GNU General Public License version 2 or later; see LICENSE.txt + */ +``` + +### Class Definitions +Class definitions start on a new line and the opening and closing braces are also placed on new lines. Class methods must follow the guidelines for Function Definitions. Properties and methods must follow OOP standards and be declared appropriately (using public, protected, private and static as applicable). +Class definitions, properties and methods must each be provided with a DocBlock in accordance with the following sections. + +#### Class DocBlock Headers +The class Docblock consists of the following required and optional elements in the fol-lowing order. +Short description (required, unless the file contains more than two classes or functions), followed by a blank line). Long description (optional, followed by a blank line). +* @category (optional and rarely used) +* @package (required) +* @subpackage (optional) +* @author (optional but only permitted in non-Joomla source files, for example, included third-party libraries like Geshi) +* @copyright (optional unless different from the file Docblock) +* @license (optional unless different from the file Docblock) +* @deprecated (optional) +* @link (optional) +* @see (optional) +* @since (required, being the version of the software the class was introduced) + +Example of a Class file DocBlock header: +```php +/** + * Controller class to initialise the database for the Joomla Installer. + * + * @package Joomla.Installation + * @subpackage Controller + * @since 3.1 + */ +``` + +#### Class Property DocBlocks +The class property Docblock consists of the following required and optional elements in the following order. +Short description (required, followed by a blank line) + +* @var (required, followed by the property type) +* @deprecated (optional) +* @since (required) + +Example of Class property DocBlock: + +```php + /** + * The generated user ID + * + * @var integer + * @since 3.1 + */ + protected static $userId = 0; +``` + + + +#### Class Method DocBlocks and Functions DocBlocks +Function definitions start on a new line and the opening and closing braces are also placed on new lines. An empty line should precede lines specifying the return value. + +Function definitions must include a documentation comment in accordance with the Commenting section of this document. + +* Short description (required, followed by a blank line) +* Long description (optional, followed by a blank line) +* @param (required if there are method or function arguments, the last @param tag is followed by a blank line) +* @return (required, followed by a blank line) +* All other tags in alphabetical order, however @since is always required. + +Example of Method DocBlock: +```php + /** + * Set a controller class suffix for a given HTTP method. + * + * @package Joomla.Framework + * @subpackage Router + * + * + * @param string $method The HTTP method for which to set the class suffix. + * @param string $suffix The class suffix to use when fetching the controller name for a given request. + * + * @return Router Returns itself to support chaining. + * + * @since 1.0 + */ + public function setHttpMethodSuffix($method, $suffix) +``` + +If a function definition goes over multiple lines, all lines must be indented with one tab and the closing brace must go on the same line as the last parameter. + +```php +function fooBar($param1, $param2, + $param3, $param4) +{ + // Body of method. +} +``` diff --git a/manual/zh-TW/coding-standards/chapters/html.md b/manual/zh-TW/coding-standards/chapters/html.md new file mode 100644 index 00000000..9a7a641f --- /dev/null +++ b/manual/zh-TW/coding-standards/chapters/html.md @@ -0,0 +1,342 @@ +## html + +These guidelines have been assembled following an examination of emerging practices, ideas and existing styleguides, and include items from: + +1. [Google's html styleguide](http://google-styleguide.googlecode.com/svn/trunk/htmlcssguide.xml) +2. [JQuery's HTML Styleguide](http://contribute.jquery.org/style-guide/html/) +3. [Nicolas Ghallager's "Principles of writing consistent, idiomatic HTML"](https://github.com/necolas/idiomatic-html) +4. [Harry Robert's "My HTML/CSS coding style"](http://csswizardry.com/2012/04/my-html-css-coding-style/) +4. [The BBC's Media Standards and Guidelines](http://www.bbc.co.uk/guidelines/futuremedia/technical/semantic_markup.shtml) + + +### Doctype + +Always use the minimal, versionless doctype. + +```html + +``` + +### Language + +Always define which language the page is written in. + +```html + +``` + +### Encoding +Always define the character encoding. The encoding should be defined as early as possible. +Make sure your editor uses UTF-8 as character encoding, without a byte order mark (UTF-8, no BOM). +Do not specify the encoding of style sheets as these assume UTF-8. + +```html + +``` + +[More on encodings and when and how to specify them can be found in Handling character encodings in HTML and CSS](http://www.w3.org/International/tutorials/tutorial-char-enc/) + + +### Capitalisation +All html should be lowercase; element names, attributes, attribute values (unless text/CDATA), CSS selectors, properties, and property values (with the exception of strings). Additionally, there is no need to use CDATA to escape inline JavaScript, formerly a requirement to meet XML strictness in XHTML. + +```html + +Joomla + + +Home +``` + +```html + +a { + color: #a3a3a3; +} + + +a { + color: #A3A3A3; +} +``` + +### Protocol + +Omit the protocol portion (http:, https:) from URLs pointing to images and other media files, style sheets, and scripts unless they are not available over both protocols. + +This prevents mixed content issues and results in minor file size savings. + +```html + + + + + +``` + +### Elements and Attributes + +Always include html, head, and body tags. + +### Type attributes +Do not use type or attributes for style sheets (unless not using CSS) and scripts (unless not using JavaScript). +```html + + + + + +``` + +### Language attributes +Do not use language attributes on script tags. +```html + + + + +``` + +Use attribute/value pairs for boolean attributes +```html + + + + +``` + +HTML attributes should be listed in an order that reflects the fact that class names are the primary interface through which CSS and JavaScript select elements. + +1. class +2. id +3. data-* +4. Everything else +```html + +Text + +Text +``` + +Elements with multiple attributes can have attributes arranged across multiple lines in an effort to improve readability and produce more useful diffs: + +```html + + Text + +``` + +### Elements +Optional closing tags may not be omitted. +```html + +

The quick brown fox jumps over the lazy dog.

+ +

The quick brown fox jumps over the lazy dog. +``` + +Self-closing (void) elements should not be closed. Trailing forward slashes and spaces should be omitted. +```html + + + + +``` + + +### Formatting +Use a new line for every block, list, or table element, and indent every such child element. + +```html + +

+
    +
  • Home
  • +
  • Blog
  • +
+
+ + +
    +
  • Home
  • +
  • Blog
  • +
+``` + +We prefer readability over file-size savings when it comes to maintaining existing files. Plenty of whitespace is encouraged. Use whitespace to visually separate groups of related markup and to improve the readability and maintainability of your HTML. Use two empty lines between larger blocks, and use a single empty line between child blocks of larger blocks. Be consistent. (If you are worried about your document's size, spaces (as well as repeated use of the same strings - for instance class names) are excellent candidates for compression. Also, you may use a markup minifier to decrease your document's file size.) + +Keep line-length to a sensible maximum, e.g., 80 columns. + +Tip: configure your editor to "show invisibles". This will allow you to eliminate end of line whitespace, eliminate unintended blank line whitespace, and avoid polluting commits. + +```html +
+

Space, the final frontier.

+
+ + +
    +
  • Moe
  • +
  • Larry
  • +
  • Curly
  • +
+ + + + + + + + + + + + + +
IncomeTaxes
$ 5.00$ 4.50
+``` + +### Indentation +Don't indent inside html, body, script, or style. Indent inside head and all other elements. +Indent by four spaces at a time. Don’t use tabs or mix tabs and spaces for indentation. + + +```html + + + + + + Sample Page + + + + + + + + + +

Joomla! is awesome!

+ + + +``` + +### Trailing Whitespace +Remove trailing white spaces. Trailing white spaces are unnecessary and can complicate diffs. + +```html + +

Yes please.

+ + +

No, thank you.

+``` + + +### Entity References +Do not use entity references. There is no need to use entity references like —, ”, or ☺, assuming the same encoding (UTF-8) is used for files and editors as well as among teams. + +The only exceptions apply to characters with special meaning in HTML (like < and &) as well as control or “invisible” characters (like no-break spaces). +```html + +

The currency symbol for the Euro is “€”.

+ + +

The currency symbol for the Euro is “&eur;”.

+``` + +### Inline CSS + +Inline CSS must be avoided. When altering states using JavaScript, use CSS to define your states, and only use onobtrusive JavaScript to alter class names whenever possible. +```html + +Home + + +Home +``` + +@todo more meaningful example. + +### Style Attributes +You should not use border, align, valign, or clear attributes. Avoid use of style attributes, except where using syndicated content or internal syndicating systems. + + +### Semantics +Use HTML according to its purpose. For example, use heading elements for headings, p elements for paragraphs, a elements for anchors, etc. + +Using HTML according to its purpose is important for accessibility, reuse, and code efficiency reasons. +```html + +View subscriptions + + +
View subscriptions
+``` + + + +### Markup + +#### Image Tags +Image elements () must have an alt attribute. Height and width attributes are optional and may be omitted. + + +@todo add examples from here http://www.bbc.co.uk/guidelines/futuremedia/technical/semantic_markup.shtml + +### Comments +@todo: comment styles in JS, CSS, HTML +For more complex blocks of HTML, it may be useful to add a comment to the closing tag: +```html +
+ +
+
+ +
+``` + + + +### Mark todos +Highlight todos by using the keyword TODO, eg: + +```html + +
    +
  • Home
  • +
  • Blog
  • +
+``` + + + +### Markup validation tools +@todo: list various testing tools: +* http://validator.w3.org/nu/ +* http://csslint.net/ diff --git a/manual/zh-TW/coding-standards/chapters/inline-comments.md b/manual/zh-TW/coding-standards/chapters/inline-comments.md new file mode 100644 index 00000000..9bbecfb8 --- /dev/null +++ b/manual/zh-TW/coding-standards/chapters/inline-comments.md @@ -0,0 +1,110 @@ +## Inline Code Comments + +This chapter covers inline code commenting in more detail. Inline comments are all comments not included in doc blocs. The goal of in line commenting is to explain code in context. Such explanation may take many different forms. + +Comments that are written in a readable and narrative style, especially when explaining a complex process, are encouraged. In general they should be placed close to the code explained rather than before the entire block of code. + +Comments should be as sentence like as possible, which is to say that they should be complete and readable, not in short hand. + +Comments are not a replacement for detailed doc blocks. Comments serve to explain the logic and structure of code itself rather than the use of code. + +### Formatting of Comments + +Comment blocks that introduce large sections of code and are more than 2 lines long should use `/* */` (C) style and should use `*` on each line with the same space/tab rules as doc blocks. If you need a large introduction consider whether this block should be separated into a method to reduce complexity and therefore providing a full docblock. + +Comments should precede the code they refer to. As a corollary, comments should not be on the same line as the code to which they refer (which puts them after the code they reference). They should be on their own lines. + +Don’t use a blank line between comments and the code they refer to (no space underneath a comment block). + +Always have a single blank line before a comment or block of comments unless the comment (or block) is at the beginning of a code structure. ( You should not have a blank line after a '{' line ) + +For example in the following case there is no new line before the first comment (because it follows a '{' line) but we do want a new line before the second comment: + +```php + while (!$done) + { + // We don't want an infinite loop here. + $done = true; + } + + //Now let's do something interesting. + $result = somethingInteresting(); +``` + +Comments should align with the code they refer to, using the same indenting as the line that follows the comment. + +Comments should be indented with tabs (like code, not like doc blocks). + +### Content of comments + +Comments should use en-GB (See below). + +Always have a space between // and the start of comment text. + +New lines should always start with an upper case letter unless The line is a continuation of a complete sentence The term is code and is case sensitive. + +Code that is included specifically to assure compatibility with other software (for example specific browsers or a specific version of the CMS or for backward compatibility reasons) should be clearly marked as such. If there is the intention to remove specific code at a future point, state that but do not use a deprecation tag or specify a release (this can be hard to predict). + +Check spelling and grammar on all comments (see below). + +Only end a line with a period if it is a full sentence. + +Rather than use docblock tags use See:, Link: and Note: for comments if appropriate. + +Do not use HTML in comments unless specifically related to the comment content. + +Do not leave commented code unless there is a clearly explained reason for doing so. In such a case, a comment saying "Code intentionally commented" will prevent accidental removal. + +Comments may include forward looking statements of how something will be extended or modified in the future, but not todos indicating that code is not complete or ready to use. + +Remember that humor and sarcasm are difficult to translate. + +### Acronyms + +Capitalise all letters of acronyms such as HTML, XML, SQL, GMT, and UTC. This is an exception to the general use of en-GB rules. + +### Common spelling and grammar errors for which to check. + +Joomla contributors include many non-native speakers of en-GB which makes it understandable that there are sometimes spelling and grammar errors. At the same time, some people reading comments also are non native speakers and may even use automated translation to understand comments. This makes it very important that comments should follow proper en-GB spelling and grammar rules. Unfortunately, these can be tricky. + +Wikipedia provides a good summary of [common differences between en-US and en-GB](http://en.wikipedia.org/wiki/American_and_British_English_spelling_differences). Note that there are some instances where en-GB common usage (but not actual rules) varies slightly from en-AU and using en-AU is considered acceptable. + +#### S vs Z + +en-GB most commonly uses `ise` where en-US would use `ize`, such as `normalise` instead of `normalize`. (Note that there are some exceptions to this rule and some differences between en-GB and en-AU in common usage.) + +Use of apostrophes is one of the trickier parts of English. + +#### Lets versus let’s + +Lets means permits or allows to: + +```php +// This lets the user enter data +``` + +Let’s is a contraction for let us and means we are going to do this now: + +```php +// Let's validate the field +``` + +#### Its versus it’s + +Its is the possessive form of it: + +```php +// Get its ID +``` + +It’s is a contraction of it is + +```php +// It's time to save +``` + +#### The correct Joomla spelling of some commonly used words. + +- dependant +- deprecated + diff --git a/manual/zh-TW/coding-standards/chapters/javascript.md b/manual/zh-TW/coding-standards/chapters/javascript.md new file mode 100644 index 00000000..b27fde09 --- /dev/null +++ b/manual/zh-TW/coding-standards/chapters/javascript.md @@ -0,0 +1,475 @@ +## JavaScript + +### Contents + +1. [Naming Conventions](#naming-conventions) + - [Variables](#naming-conventions-variables) + - [Functions](#naming-conventions-functions) + - [Reserved Words](#naming-conventions-reserved) +2. [Syntax Style](#syntax-style) + - [Indentation](#syntax-indentation) + - [Spacing](#syntax-spacing) + - [Commas](#syntax-commas) + - [Semicolons](#syntax-semicolons) + - [Quotes](#syntax-quotes) +3. [Types](#types) +4. [Functions](#functions) +5. [Conditional Statements](#conditional-statements) +6. [Blocks & Multi-line Statements](#blocks) +7. [Comments](#comments) + + +## Naming Conventions + +Use descriptive words or terse phrases for names. + +Variables and Functions should be camel case, starting with a lowercase letter: `likeThis` + + +### Variables + +**Use names that describe what the variable is:** + +`var element = document.getElementById('elementId');` + +**Iterators are the exception** + +Use i for index in a loop (and subsequent letters when necessary for nested iteration). + + +### Functions + +**Use names that describe what the function does:** + +``` +function getSomeData() { + // statements +} +``` + +### Reserved Words + +Do not use reserved words for anything other than their intended use. The list of: [Reserved Words](http://es5.github.io/#x7.6.1) + +--- + + +## Syntax Style + + +### Indentation +- Don't mix tabs and spaces. +- Tabs, 4 spaces + + +### Spacing +- No whitespace at the end of line or on blank lines. +- Unary special-character operators (e.g., !, ++) must not have space next to their operand. +- Any , and ; must not have preceding space. +- Any ; used as a statement terminator must be at the end of the line. +- Any : after a property name in an object definition must not have preceding space. +- The ? and : in a ternary conditional must have space on both sides. +- No filler spaces in empty constructs (e.g., {}, [], fn()) +- New line at the end of each file. + +**Array:** + +``` +var array = [ 'foo', 'bar' ]; +``` + +**Function call:** + +``` +foo( arg ); +``` + +**Function call with multiple arguments:** + +``` +foo( 'string', object ); +``` + +**Conditional Statements** + +``` +if ( condition ) { + // statements +} else { + // statements +} +``` + +``` +while ( condition ) { + // statements +} +``` + +``` +for ( prop in object ) { + // statements +} +``` + + +#### Exceptions + +**First or only argument is an object, array or callback function.** + +**No space before the first argument:** + +``` +foo({ + a: 'bar', + b: 'baz' +}); +``` + +``` +foo(function() { + // statements +}, options ); // space after options argument +``` + +**Function with a callback, object, or array as the last argument:** + +No space after the last argument. + +``` +foo( data, function() { + // statements +}); +``` + + +### Commas + +**Place commas after:** + +- variable declarations +- key/value pairs + +#### Arrays + +Do not include a trailing comma, this will add 1 to your array's length. + +**No:** + +``` +array = [ 'foo', 'bar', ]; +``` + +**Yes:** + +``` +array = [ 'foo', 'bar' ]; +``` + + +### Semicolons + +Use them where expected. + +Semicolons should be included at the end of function expressions, but not at the end of function declarations. + +**Function Expression:** + +``` +var foo = function() { + return true; +}; +``` + +**Function Declaration:** + +``` +function foo() { + return true; +} +``` + + +### Quotes + +Use ' instead of " + + +--- + + +## Variables + +### Avoid Global Variables + +**No:** + +``` +foo = 'bar'; +``` + +**No: implied global** + +``` +function() { + foo = 'bar'; +} +``` + +**Yes:** + +``` +var foo = 'bar'; +``` + +### Multiple Variable Declarations + +Use one `var` declaration and separate each variable on a newline ending with a comma. + +**No:** + +``` +var foo = 'bar'; +var bar = 'baz'; +var baz = 'qux'; +``` + +**Yes:** + +``` +var foo = 'bar', + bar = 'baz', + baz = 'qux'; +``` + + +## Types + +### String + +- Concatenate long strings. +- Place space before closing quote at the end of each string. +- Concatenation operator at the end of each subsequent string. + +``` +var longString = 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. ' + + 'Sed placerat, tellus eget egestas tincidunt, lectus dui ' + + 'sagittis massa, id mollis est tortor a enim. In hac ' + + 'habitasse platea dictumst. Duis erat justo, tincidunt ac ' + + 'enim iaculis, malesuada condimentum mauris. Vestibulum vel ' + + 'cursus mauris.'; +``` + +### Number + +Use `parseInt()` or `parseFloat()` instead of unary plus, for readability. + +**No:** + +``` +var count = +document.getElementById('inputId').value; +``` + +**Yes:** + +``` +var count = parseInt(document.getElementById('inputId').value); +``` + +### Type Checks + +- String: `typeof object === 'string'` +- Number: `typeof object === 'number'` +- Boolean: `typeof object === 'boolean'` +- Object: `typeof object === 'object'` +- Plain Object: `jQuery.isPlainObject( object )` +- Function: `jQuery.isFunction( object )` +- Array: `jQuery.isArray( object )` +- Element: `object.nodeType` +- null: `object === null` +- null or undefined: `object == null` + +**Undefined:** + +- Global Variables: `typeof variable === 'undefined'` +- Local Variables: `variable === undefined` +- Properties: `object.prop === undefined` + +### Objects + +Use the literal, not constructor, syntax. + +**No:** + +``` +var myObj = new Object(); +``` +**Yes:** + +``` +var myObj = {}; +``` + +If an object contains more than one key/value pair or an array as a value, each key/value pair should be on its own line. + +``` +var myObj = { + foo: 'bar', + bar: 'baz', + baz: 'qux' +}; +``` + +### Arrays + +Use the literal, not constructor, syntax + +**No:** + +``` +var myArr = new Array(); +``` +**Yes:** + +``` +var myArr = []; +``` + +If you don't know array length use push method. This will replace the current array. + +``` +var myArr = []; +myArr.push('foo'); +``` + + +## Functions + +### Chaining Method Calls + +``` +$('.someElement') + .hide() + .delay(1000) + .fadeIn(); +``` + + +## Conditional Statements + +Use ternary syntax if: + +- One condition +- Result of either evaluation is one operation. + +``` +joomlaRocks ? 'This is true' : 'else it is false'; +``` + +Otherwise, use standard syntax: + +``` +if ( condition ) { + // statements +} else { + // statements +} +``` + +**Cache length in variable for performance:** + +``` +var i, + j = myArr.length; + +for ( i = 0; i < j; i++ ) { + // statements +} +``` + +**With more than one condition:** + +``` +if ( condition && + condition2 && + condition3 ) { + // statements +} else { + // statements +} +``` + +### Equality + +Use strict equality operator === so that type is considered in comparison. Using == can produce false positives. + + +``` +// evaluates true +1 == "1" +``` + +``` +// evaluates false +1 === "1" +``` + + +## Blocks & Multi-line Statements + +Use curly braces on blocks that have more than one statement. + +**Block with one statement:** + +``` +if ( test ) return false; +``` + +**Block with more than one statement:** + +``` +if ( test ) { + var foo = 'some string'; + return foo; +} +``` + + +## Comments + +**Single Line** + +- Place above the code it refers to. +- A space between double forward slashes and comment text. + +``` +// I am a single line comment. +``` + + +**Multiline** + +- Place above the code it refers to. +- Opening token placed on the line above first comment line, closing placed below last comment line. +- Each comment line begins with two astericks followed by a space. + +``` +/* +** I am a multiline comment. +** Line two +** Line three +*/ +``` + +--- + +#### TODO + +- Switch Statements vs other methods like Objects +- Add jQuery examples +- Double check accuracy of all examples + +**With help from:** + +- [jQuery JS Style Guide](https://contribute.jquery.org/style-guide/js) +- [Idiomatic JS](https://github.com/rwaldron/idiomatic.js) diff --git a/manual/zh-TW/coding-standards/chapters/php.md b/manual/zh-TW/coding-standards/chapters/php.md new file mode 100644 index 00000000..eae76d4a --- /dev/null +++ b/manual/zh-TW/coding-standards/chapters/php.md @@ -0,0 +1,477 @@ +## 語言結構 + +### PHP 標籤 + +永遠使用長標籤: `` 來包裹 PHP 程式碼,不使用短標籤 ``。這可以確保您的程式碼可執行在大多數未經設定的主機環境。 + +如果檔案中只包含PHP程式碼,則不應該包含結尾標籤 `?>`。這個標籤在 PHP 中不是必要的。這樣子可以避免在系統輸出前,不小心讓任何空白預先送出 header ,這會造成 Joomla 的 Session 功能錯誤 (參見 PHP 手冊的說明 [Instruction separation](http://php.net/basic-syntax.instruction-separation))。 + +檔案結尾必須永遠由一個空行結束。 + +### 引入程式 + +當您想要無條件引入一個檔案時,應使用 `require_once`。當您要有條件的引入一個檔案(例如 factory 類別與其方法),則用 `include_once`。這兩者都可以確保檔案不被二次載入。兩種用法共享檔案清單,所以混用不會有任何問題。被 `require_once` 引入的檔案不會再被 `include_once` 引入一次。 + +> **注意** +> +> `include_once` 與 `require_once` 是 PHP 關鍵字,不是函式,寫法應該如下: +> +> +> `require_once JPATH_COMPONENT . ’/helpers/helper.php’;` + +您不應該把檔案路徑用括號包起來。 + +### 兼容 E_STRICT 的 PHP 程式 + +我們必須秉持並實踐 PHP 5.3 以上所支持的物件導向設計模式。Joomla! 一直致力於讓原始碼符合 E_STRICT 標準。 + +## 全域變數 + +盡量減少使用全域變數或超全域變數,用物件導向或工廠(Factory)模式替代之。 + +## 控制結構 + +所有的控制結構必須在關鍵字與起始括號之間放置一個空白字元,而開頭、結尾括號與邏輯判斷式之間無空格。這是為了區隔控制結構與函式以方便辨認,而括號內必須要包含邏輯。 + +所有的控制結構關鍵字,如: `if`, `else`, `do`, `for`, `foreach`, `try`, `catch`, `switch` 與 `while` 皆採 [Allman](http://en.wikipedia.org/wiki/Indent_style#Allman_style) 風格,關鍵字本身必須在一個新行,而語言區塊(大括號)的開頭與結束也接需再一個新行中。 + +### _if-else_ 範例 + +```php +if ($test) +{ + echo 'True'; +} + +// 註解可寫在此 +// 要注意的是 "elseif" 採用單一單字而非拆開成 "else if" + +elseif ($test === false) +{ + echo 'Really false'; +} +else +{ + echo 'A white lie'; +} +``` + +如果控制結構的判斷式需要多行,則第二行開始需要一個 Tab 縮排,結尾括號需要再同一行上。 + +```php +if ($test1 + && $test2) +{ + echo 'True'; +} +``` + +### _do-while_ 範例 + + +```php +do +{ + $i++; +} +while ($i < 10); +``` + +### _for_ 範例 + +```php +for ($i = 0; $i < $n; $i++) +{ + echo 'Increment = ' . $i; +} +``` + +### _foreach_ 範例 + +```php +foreach ($rows as $index => $row) +{ + echo 'Index = ' . $id . ', Value = ' . $row; +} +``` + +### _while_ 範例 + +```php +while (!$done) +{ + $done = true; +} +``` + +### _switch_ 範例 + +當使用 `switch` 時, `case` 關鍵字必須縮排一次,而 `break` 關鍵字必須獨立在新的一行,且相較於 `case` 再縮排一次。 + +```php +switch ($value) +{ + case 'a': + echo 'A'; + break; + + default: + echo 'I give up'; + break; +} +``` + +## 參照 + +當使用變數參照時,參照符號應該距離等號一個空白字元,且跟後面的變數緊鄰,沒有空白。 + +範例: + +```php +$ref1 = &$this->sql; +``` + +> **注意** +> +> 在 PHP 5 ,物件不再需要參照符號,所有物件皆是參照。 + +## 陣列 + +陣列元素的指派可稍微排版,當多行時,可用 Tab 縮排。每行跟隨一個都逗號結尾,最後一行可包含逗號,這是 PHP 允許的寫法,對於程式碼 diff 比對時也有所幫助。 + +範例: + +```php +$options = array( + 'foo' => 'foo', + 'spam' => 'spam', +); +``` + +## 註解 + +行內註解可用 C 語言風格的 `/* ... */` 或 C++ 的單行註解 `// ...`。 C 風格的註解通常被用在文件開頭、類別、函式等等的文件標頭。而 C++ 風格單行註解則常用在程式解釋與提醒。註解對於幫助其他開發人員理解程式碼的目的有非常大的幫助,甚至包含您自己也能受惠。當程式碼開始進行複雜操作時,永遠記得要加上註解。至於 Perl 與 Shell 的井號 (`#`)註解則不建議使用,目前在 PHP 中也不再允許此類註解。 + +您可以在某些情況下藉由註解掉整段程式碼或類別函式以用於調整程式功能,但應該在最終提交到核心前去除這些註解或不再需要的程式區塊。 + +例如,不要在提交的程式碼中包含以下片段: + +```php +// 這段程式碼未來需要修復 +//$code = broken($fixme); +``` + +### 文件區塊註解 + +在 PHP、Javascript、檔案中的所有類別、成員屬性、方法與函式,皆需要區塊註解,並遵循 JavaDoc 或 phpDoc 的約定。 + +這些 "區塊註解 (DocBlocks)" 從 PEAR 引用而來,但也為了 Joomla Framework 做了一點改變。 + +雖然一般的縮排皆使用標準 Tab 來縮進,但區塊註解中,我們使用空格來排版,這提供了原始碼更優良的可讀性。任何文字元素,如標籤、變數的類型、變數名稱與標籤描述的最小距離必須是兩個空格。變數類型和標籤說明應分別按照最長的標籤和變數類型、變數描述對齊。 + +如果使用了 `@package` 標籤,必須是 "Joomla.Platform"。 + +除果使用了 `@subpackage` ,必須是 /joomla/ 資料夾下的頂層目錄名稱,例如: Application, Database, Html 等等。 + +> 註: 在 Joomla Framework 中,不再使用 `@package` 與 `@subpackage`。 + +貢獻給 Joomla 的程式碼,將成為專案的資產,不允許擁有 `@author` 標籤。你應該在 CREDITS.php 更新貢獻紀錄。Joomla 的理念是這樣的,所有的程式是一起發展編寫出來的,並沒有任何一個人擁有任何代碼中的一個部分。不過 `@author` 標籤允許使用在被包含進核心函式庫的第三方函式庫。 + +從第三方函式庫引入的檔案,其區塊註解必須完好無損。Layout 的檔案使用跟其他 PHP 檔案一樣的區塊註解。 + +### 檔案文件標頭註解 + +文件標頭註解有以下內容且按照順序 + +- 簡易說明 (選填, 除非超過兩個以上類別或方法) 結束空一行. +- 完整說明 (選填) 結束空一行. +- `@category` (選填) +- `@package` (通常是選填, 但如果檔案只包含程序邏輯(無類別)則必填) +- `@subpackage` (選填) +- `@author` (選填, 但只允許在非的Joomla源文件,例如,包括第三方函式庫例如 Geshi) +- `@copyright` (必填) +- `@license` (必填且必須是相容於 Joomla 所使用的授權條款) +- `@deprecated` (選填) +- `@link` (選填) +- `@see` (選填) +- `@since` (通常是選填,但如果檔案只包含程序邏輯(無類別)則必填) + +``` +/** + * @package Joomla.Platform + * @subpackage Database + * @copyright Copyright 2005 - 2010 Open Source Matters. All rights re-served. + * @license GNU General Public License version 2 or later; see LICENSE.txt + */ +``` + +## 函式呼叫 + +呼叫函式時, 函式名稱跟參數括號中不能有空白, 而第一個帶入參數也不得有空白; 每個參數逗點後一個空白隔開 (如果有的話), 最後一個參數跟括號沒有空格. 參數帶值等號前後需有空白. 可以多行對齊. + +```php +// 單函式呼叫 +$foo = bar($var1, $var2); + +// 多函式呼叫 +$short = bar('short'); +$medium = bar('medium'); +$long = bar('long'); +``` + +## 函式定義 + +函式定義需開始並獨立於一新行,開始與結束的括號也需分別被放置於一新行。在負責處理回傳值的程式碼前應插入一空行。 + +函數定義必須包含註解說明,根據本文件中的註解章節所規範之規則予以撰寫。 + +- 簡易說明 (必要,結束需空一行) +- 完整說明 (選填,結束需空一行) +- `@param` (若函式有參數則此欄位為必要,並於最後一個`@param`標簽之後新增一空行) +- `@return` (必要,結束需空一行) +- 其餘標簽依據字母順序排列,需注意 @since 標籤永遠為必要。 + +```php +/** + * An utility class. + * + * @package Joomla.Platform + * @subpackage XBase + * + * @param string $path The library path in dot notation. + * + * @return void + * + * @since 1.6 + */ +function jimport($path) +{ + // Body of method. +} +``` + +如果一個函數定義橫跨數行,第二行起的每一行皆需以一個 tab 作縮排,結束括號需與最後一個參數存在於同一行。 + +```php +function fooBar($param1, $param2, + $param3, $param4) +{ + // Body of method. +} +``` + +## 類別定義 + +類別定義需開始並獨立於一新行,開始與結束的括號也需被分別放置於一新行。類別方法(Class Methods)需根據函數定義標準來撰寫。類別的屬性及方法需根據物件導向(OOP)標準適當宣告(使用適合的 public, protected, private 和 static 等屬性) + +類別的定義、屬性及方法皆需撰寫對應的註解區塊(DocBlock),根據接下來的準則規範。 + +### 類別註解區塊標頭 + +類別註解區塊包含以下必要及非必要欄位,並依照下列順序排列。 + +- 簡易說明(必要,除非該檔案擁有兩個以上之類別或函數) +- 完整說明(選填,結束需空一行) +- `@category` (選填,很少用到) +- `@package` (必要) +- `@subpackage` (選填) +- `@author` (選填,但只允許在非joomla的程式碼中,舉例來說,如:使用第三方函式庫如Geshi) +- `@copyright` (選填,除非與檔案文件註解表頭(file Docblock)不同) +- `@license` (選填,除非與檔案文件註解表頭(file Docblock)不同) +- `@deprecated` (選填) +- `@link` (選填) +- `@see` (選填) +- `@since` (必填, 根據類別第一次出現時的程式版本號) + +### 類別屬性註解區塊 + +類別屬性註解區塊包含以下必要及非必要欄位,並依照下列順序排列。 + +- 簡易說明(必要,除非該檔案擁有兩個以上之類別或函數) +- `@var` (必要,於該屬性後其後註明屬性種類(property type)) +- `@deprecated` (選填) +- `@since` (必填) + +### 類別方法註解區塊 + +類別方法註解區塊是依據PHP函式之規則做撰寫(如上述)。 + +```php +/** + * An utility class. + * + * @package Joomla.Platform + * @subpackage XBase + * @since 1.6 + */ +class JClass extends JObject +{ + /** + * Human readable name + * + * @var string + * @since 1.6 + */ + public $name; + + /** + * Method to get the name of the class. + * + * @param string $case Optionally return in upper/lower case. + * + * @return boolean True if successfully loaded, false otherwise. + * + * @since 1.6 + */ + public function getName($case = null) + { + // Body of method. + + return $this->name; + } +} +``` + +## 命名慣例 + +### 類別 + +類別應給予描述性的名稱。在可能的情況下應避免縮寫。類別名稱總是以一個大寫字母開頭,且採用駝峰式 (CamelCase) 命名法則,即便名字中包含傳統上常用大寫的字彙(如 HTML, XML)。唯一例外是必須由 J 開頭的核心類別後面可接上一個大寫字母。 + +範例: + +- JHtmlHelper +- JXmlParser +- JModel + +### 函式與方法 + +函式與方法採用 "studly caps" 風格 (也稱作 "bumpy case" 或 "camel caps")。 名稱起始的字母必須是小寫,而每個新單字的首個字母為大寫。而在 Joomla 框架中的函式必須由小寫字母 'j' 開頭。 + +範例: + +- connect(); +- getData(); +- buildSomeWidget(); +- jImport(); +- jDoSomething(); + +類別的私有成員屬性 (就是說只被用在他所宣告出來的類別內部的成員屬性) ,開頭有一個底線。屬性名稱採用底線命名風格 (也就是說,單字被底線區 隔開來),且應該全部小寫。 + +範例: + +```php +class JFooHelper +{ + protected $field_name = null; + + private $_status = null; + + protected function sort() + { + } +} +``` + +### 常數 + +常數應永遠為大寫,並用底線分隔單字。總是在常數前加上 `J` 且運用一些眾人常識和慣例來避免常數名稱太長。你 *應該* 使用類別或封包 (package) 中已經使用的名稱。例如在 'Joomla\Application\Web\Router' 中的常數,以 `JRoute_` 開頭。 + +### 全域變數 + +不要使用全域變數。採用靜態類別與屬性或常數替代。 + +### 一般情況下的變數與類別屬性 + +一般情況下的變數,遵循函式的慣例。 + +類別的屬性應該設為 null 或其他適當的預設值。 + +## 例外處理 + +例外處理應當只用於錯誤處理上。 + +下面的章節將指出如何照語意使用 [PHP 標準函式庫 (SPL) 的 Exceptions](http://php.net/manual/en/spl.exceptions.php)。 + +### 邏輯例外 LogicException + +在 API 的使用方式上發生的明確問題會丟出 LogicException 的例外。例如:如果有個依賴參數失效時(你試圖操作一個未被載入的物件)。 + +下方的子類別也可被用於適當的情境下: + +#### BadFunctionCallException + +如果一個 callback 參照到一個未定義的函式(function) 或是缺少了一些參數時可以丟出該例外。例如:如果 `is_callable()` 或其他類似的函式用在一個函式(function)上時得到失敗的結果。 + +#### BadMethodCallException + +如果一個 callback 參照到一個未定義的方法(method) 或是缺少了一些參數時可以丟出該例外。例如:如果 `is_callable()` 或其他類似的函式用在一個方法(method)上時得到失敗的結果。 另一個例子可能是找不到某些使用魔術方法的參數。 + +#### InvalidArgumentException + +當有不合規格的輸入發生時丟出該例外。 + +#### DomainException + +該例外和 InvalidArgumentException 類似,但會在一數值未依附在一已定義的有效資料群集的情形下丟出該例外。例如:試圖載入一個"mongodb"的資料庫引擎,但該引擎尚未在 API 中實作。 + +#### LengthException + +當作一參數的長度檢查失敗時丟出該例外。例如:一個檔案的雜湊值不是一個指定長度的字串。 + +#### OutOfRangeException + +該例外較少被實際的應用,但可在存取一個非法的索引值時丟出該例外。 + +### 執行期例外 RuntimeException + +當外部實體或環境造成你無法控制的問題因而產生錯誤時,便丟出 RuntimeException 的例外。當一個錯誤的產生不能明確地被判斷出來時,預設丟出該例外。例如:你試圖連到資料庫但資料庫卻無法使用 (伺服器掛掉之類的)。另一個例子可能為 SQL 查詢語句的錯誤。 + +#### UnexpectedValueException + +當一個非預期的結果發生時應當丟出該種類的例外。例如:當一個函式預期是要回傳布林值卻回傳字串時。 + +#### OutOfBoundsException + +該例外較少實際的應用,但也許當某個值不為合法的索引值時丟出該例外。 + +#### OverflowException + +該例外較少實際的應用,但也許當你加入一個元素到已經滿載的容器物件時丟出該例外。 + +#### RangeException + +該例外較少實際的應用,但也許在程式執行期間丟出該例外以指出一個範圍的錯誤。通常這是指除了運算虧位/溢位之外的錯誤。該例外為 DomainException 的 runtime 版本。 + +#### UnderflowException + +該例外較少實際的應用,但也許當你從一個空的容器物件中移除一個元素時丟出該例外。 + +### 例外處理的文件撰寫 + +每個函式(function)或方法(method)必須要註解使用到的例外,用 @throws 的標籤和丟出例外的物件名稱作註解。每種例外只須備被註解一次。註解的說明非必須。 + +## SQL 查詢語句 + +SQL 的保留字要全用大寫,其他的文字符號 (當然被引號包起來的文字為例外) 為小寫。 + +全部的 table 名稱必須要用 `#__` 的前綴字而不是用 `jos_` 去讀取 Joomla 的內容,並允許替換為使用者定義的資料庫前綴字。查詢語句也必須使用 JDatabaseQuery API。 + +```php +// Get the database connector. +$db = JFactory::getDBO(); + +// Get the query from the database connector. +$query = $db->getQuery(true); + +// Build the query programatically (using chaining if desired). +$query->select('u.*') + // Use the qn alias for the quoteName method to quote table names. + ->from($db->qn('#__users').' AS u')); + +// Tell the database connector what query to run. +$db->setQuery($query); + +// Invoke the query or data retrieval helper. +$users = $db->loadObjectList(); +``` diff --git a/manual/zh-TW/coding-standards/chapters/source-code-management.md b/manual/zh-TW/coding-standards/chapters/source-code-management.md new file mode 100644 index 00000000..7ee0a55c --- /dev/null +++ b/manual/zh-TW/coding-standards/chapters/source-code-management.md @@ -0,0 +1,24 @@ +## Source Code Management + +Before we start talking about what Joomla! code should look like, it is appropriate to look at how and where the source code is stored. All serious software projects, whether driven by an Open Source community or developed within a company for proprietary purposes will manage the source code is some sort of source or version management system. The Joomla project uses a Distributed Version Control System (DVCS) called Git hosted at [GitHub.com](http://github.com). + +### The Joomla Framework + +The [Joomla Framework](https://github.com/joomla/joomla-framework) is a PHP framework that is designed to serve as a foundation for not only web applications (like a CMS) but other types of software such as command line applications. The files that form the Joomla Framework are stored in a Distributed Version Control System (DVCS) called Git hosted at github.com + +You can learn about how to get the Joomla Framework source code from the Git repository, https://github.com/joomla/joomla-framework. + +Because Git treats the concepts of file revision numbers differently than Subversion, the repository revision number is not required in files (that is, the `@version` tag is not necessary). + +### The Joomla CMS +The [Joomla! CMS](https://github.com/joomla/joomla-cms) is a Content Management System (CMS) which enables you to build Web sites and powerful online applications. It's a free and OpenSource software, distributed under the GNU General Public License version 2 or later. The files that form the Joomla CMS are stored in a Distributed Version Control System (DVCS) called Git hosted at github.com + +You can learn about how to get the Joomla CMS source code from the Git repository, https://github.com/joomla/joomla-cms. + +Because Git treats the concepts of file revision numbers differently than Subversion, the repository revision number is not required in files (that is, the `@version` tag is not necessary). + +## Compliance Tool + +The standards in this manual have been adopted across the Joomla project, including the [Joomla Framework](https://github.com/joomla/joomla-framework), the [Joomla! CMS](https://github.com/joomla/joomla-cms) and any other applications maintained by the project. These standards apply to source code, tests and (where applicable) documentation. + +A custom Joomla sniff standard for PHP files is maintained by the Joomla project and available from the code repository. The Sniff is based on the standard outlined in this document. For more information about how code standards are enforced see the analysis appendix of the manual. For information on using the Sniff see the documentation stored in its repository. diff --git a/manual/zh-TW/coding-standards/chapters/xml.md b/manual/zh-TW/coding-standards/chapters/xml.md new file mode 100644 index 00000000..3c90cb85 --- /dev/null +++ b/manual/zh-TW/coding-standards/chapters/xml.md @@ -0,0 +1,57 @@ +## XML Files + +### Attributes + +* Each attribute is on its own line. +* The four attributes `name`, `type`, `label` and `description` should be written in this order and at the top of the element definition. + +### Closing Elements + +Elements should be closed with the closing tag on a new line. + +### Exception + +When the element only has few attributes, then the whole element can stay on the same line. +A max line length of 100 characters is recommended for good reading. + +#### Examples + +Element is **empty**: +```xml + +``` + +Element is **not empty**: +```xml + + + + + + + + + +``` diff --git a/manual/zh-TW/coding-standards/introduction.md b/manual/zh-TW/coding-standards/introduction.md new file mode 100644 index 00000000..7c11c059 --- /dev/null +++ b/manual/zh-TW/coding-standards/introduction.md @@ -0,0 +1,19 @@ +## Introduction + +Good coding standards are important in any software development project. These standards are even more important when a large, diverse and worldwide community of developers are contributing to a project. One of the things that sets good software apart from great software is not only the features or the actual function the software performs, but the quality of its source code. + +In order to perform in the highly competitive Open Source and proprietary software industries, source code not only needs to be beautifully designed, it also needs to be beautiful and elegant to look at. The Joomla Coding Standards Manual is to help ensure our code is the highest quality which will make it easy to read, debug, and maintain. + +## Guiding Principles + +Since readable code is more maintainable, the compass that guides us in achieving that goal is a set of well thought out coding standards for the different software languages that are employed in the Joomla software project. Joomla has a solid heritage of striving to support a great looking product with great looking code. + +This manual compiles the collective wisdom of past and present contributors to the project to form the definitive standard for coding in Joomla, whether that is for the core Joomla Framework or an extension that forms part of the stack of the Joomla CMS. This manual also serves as a lighthouse to the Joomla developer community, to safely guide developers around the pitfalls of becoming lackadaisical with respect to writing clean, beautiful code. + +The Joomla Coding Standards borrows heavily from the PEAR coding standard for PHP files, augmenting and diverging where it is deemed sensible to do so. + +There are [tools available](appendices/analysis.md) to help your code conform to our standards. + +## Contributing to this manual + +If you want to contribute and improve this manual, you can find the source files at [https://github.com/joomla/coding-standards/tree/gh-pages](https://github.com/joomla/coding-standards/tree/gh-pages). \ No newline at end of file diff --git a/manual/zh-TW/menu.md b/manual/zh-TW/menu.md new file mode 100644 index 00000000..ce266484 --- /dev/null +++ b/manual/zh-TW/menu.md @@ -0,0 +1,15 @@ +- [Introduction](coding-standards/introduction.md) +- [Source Code Management](coding-standards/chapters/source-code-management.md) +- **Coding Standards** + - [Basic Guidelines](coding-standards/chapters/basic-guidelines.md) + - [Inline Code Comments](coding-standards/chapters/inline-comments.md) + - [DocBlocks](coding-standards/chapters/docblocks.md) + - [PHP Code](coding-standards/chapters/php.md) + - [XML](coding-standards/chapters/xml.md) +- **Clientside Syntax Styleguides** + - [HTML](coding-standards/chapters/html.md) + - [CSS](coding-standards/chapters/css.md) + - [JavaScript](coding-standards/chapters/javascript.md) +- **Appendices** + - [Code Analysis Tools](appendices/analysis.md) + - [Examples](appendices/examples.md) \ No newline at end of file diff --git a/manual/zh-TW/version.md b/manual/zh-TW/version.md new file mode 100644 index 00000000..170de3a3 --- /dev/null +++ b/manual/zh-TW/version.md @@ -0,0 +1 @@ +Version 1.0 \ No newline at end of file From f90d26844f76dc01f79d0b7ad217d40811bf41d5 Mon Sep 17 00:00:00 2001 From: bblurock Date: Tue, 23 Sep 2014 00:11:39 +0800 Subject: [PATCH 02/33] Added Immediately Invoked Function Expression for Mootools --- assets/js/manual.js | 186 ++++++++++++++++++++++---------------------- 1 file changed, 94 insertions(+), 92 deletions(-) diff --git a/assets/js/manual.js b/assets/js/manual.js index e98fe855..de5e58e7 100644 --- a/assets/js/manual.js +++ b/assets/js/manual.js @@ -1,101 +1,103 @@ -var populateWindow = function(link) { - var markdownRequest = new Request({ - "url": here + 'manual/en-US/' + link, - "method": "get", - "onSuccess": function(response) { - $('docwin').set('html', marked(response)); - } - }).send(); +;(function($) { + var populateWindow = function(link) { + var markdownRequest = new Request({ + "url": here + 'manual/en-US/' + link, + "method": "get", + "onSuccess": function(response) { + $('docwin').set('html', marked(response)); + } + }).send(); - $$('.nav-list li').each( - function(item) { - if (item.getElements('a').length == 0) { - item.addClass('nav-header'); - } - } - ); + $$('.nav-list li').each( + function(item) { + if (item.getElements('a').length == 0) { + item.addClass('nav-header'); + } + } + ); - $$('.nav-list a').each( - function(item, index) - { - if (link == item.get('href')) - { - item.getParent('li').addClass('active'); - } - else - { - item.getParent('li').removeClass('active'); - } - }.bind(this) - ); -} + $$('.nav-list a').each( + function(item, index) + { + if (link == item.get('href')) + { + item.getParent('li').addClass('active'); + } + else + { + item.getParent('li').removeClass('active'); + } + }.bind(this) + ); + } -var populateMenu = function() { - var markdownRequest = new Request({ - "url": here + 'manual/en-US/menu.md', - "method": "get", - "onSuccess": function (response) { - $('doc-menu').set('html', marked(response)); - $$('#doc-menu ul').each(function(el) { - el.addClass('nav'); - el.addClass('nav-list'); - }); + var populateMenu = function() { + var markdownRequest = new Request({ + "url": here + 'manual/en-US/menu.md', + "method": "get", + "onSuccess": function (response) { + $('doc-menu').set('html', marked(response)); + $$('#doc-menu ul').each(function(el) { + el.addClass('nav'); + el.addClass('nav-list'); + }); - $$('.nav-list li').each( - function(item) { - if (item.getElements('a').length == 0) { - item.addClass('nav-header'); - } - } - ); - } - }).send(); -} + $$('.nav-list li').each( + function(item) { + if (item.getElements('a').length == 0) { + item.addClass('nav-header'); + } + } + ); + } + }).send(); + } -var populateVersion = function() { - var versionRequest = new Request({ - "url": here + 'manual/en-US/version.md', - "method": "get", - "onSuccess": function(response) { - $('version').set('html', marked(response)); - } - }).send(); -} + var populateVersion = function() { + var versionRequest = new Request({ + "url": here + 'manual/en-US/version.md', + "method": "get", + "onSuccess": function(response) { + $('version').set('html', marked(response)); + } + }).send(); + } -window.addEvent('domready', function() { - var urlParts = document.URL.split('?', 2); - state = {}; - here = urlParts[0]; + window.addEvent('domready', function() { + var urlParts = document.URL.split('?', 2); + state = {}; + here = urlParts[0]; - if (urlParts.length > 1) - { - var currentDoc = urlParts[1]; - } - else - { - var currentDoc = "coding-standards/introduction.md"; - } + if (urlParts.length > 1) + { + var currentDoc = urlParts[1]; + } + else + { + var currentDoc = "coding-standards/introduction.md"; + } - marked.setOptions({ - gfm: true, - pedantic: false, - sanitize: false, - highlight: function(code, lang) { - var that; - Rainbow.color(code, lang, function(hl_code) { that = hl_code; }); - return that; - } - }) - populateMenu(); - populateWindow(currentDoc); - populateVersion(); + marked.setOptions({ + gfm: true, + pedantic: false, + sanitize: false, + highlight: function(code, lang) { + var that; + Rainbow.color(code, lang, function(hl_code) { that = hl_code; }); + return that; + } + }) + populateMenu(); + populateWindow(currentDoc); + populateVersion(); - document.id('main').addEvent('click:relay(a)', function (event, target) { - if (target.get('href').substring(0, 4) != 'http' && target.get('href').substring(0, 1) != '#') - { - populateWindow(target.get('href')); - event.preventDefault(); - history.pushState(state, target.get('href'), "?" + target.get('href')); - } - }); -}); + document.id('main').addEvent('click:relay(a)', function (event, target) { + if (target.get('href').substring(0, 4) != 'http' && target.get('href').substring(0, 1) != '#') + { + populateWindow(target.get('href')); + event.preventDefault(); + history.pushState(state, target.get('href'), "?" + target.get('href')); + } + }); + }); +})(document.id) From c21626e288e5621b9e3fc05c6e5eab1c0fbb5bf5 Mon Sep 17 00:00:00 2001 From: bblurock Date: Tue, 23 Sep 2014 00:12:15 +0800 Subject: [PATCH 03/33] Added jQuery ver 1.11.1 --- assets/js/jquery-1.11.1.min.js | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 assets/js/jquery-1.11.1.min.js diff --git a/assets/js/jquery-1.11.1.min.js b/assets/js/jquery-1.11.1.min.js new file mode 100644 index 00000000..7ac04f5b --- /dev/null +++ b/assets/js/jquery-1.11.1.min.js @@ -0,0 +1,4 @@ +/*! jQuery v1.11.1 | (c) 2005, 2014 jQuery Foundation, Inc. | jquery.org/license */ +!function(a,b){"object"==typeof module&&"object"==typeof module.exports?module.exports=a.document?b(a,!0):function(a){if(!a.document)throw new Error("jQuery requires a window with a document");return b(a)}:b(a)}("undefined"!=typeof window?window:this,function(a,b){var c=[],d=c.slice,e=c.concat,f=c.push,g=c.indexOf,h={},i=h.toString,j=h.hasOwnProperty,k={},l="1.11.1",m=function(a,b){return new m.fn.init(a,b)},n=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,o=/^-ms-/,p=/-([\da-z])/gi,q=function(a,b){return b.toUpperCase()};m.fn=m.prototype={jquery:l,constructor:m,selector:"",length:0,toArray:function(){return d.call(this)},get:function(a){return null!=a?0>a?this[a+this.length]:this[a]:d.call(this)},pushStack:function(a){var b=m.merge(this.constructor(),a);return b.prevObject=this,b.context=this.context,b},each:function(a,b){return m.each(this,a,b)},map:function(a){return this.pushStack(m.map(this,function(b,c){return a.call(b,c,b)}))},slice:function(){return this.pushStack(d.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(a){var b=this.length,c=+a+(0>a?b:0);return this.pushStack(c>=0&&b>c?[this[c]]:[])},end:function(){return this.prevObject||this.constructor(null)},push:f,sort:c.sort,splice:c.splice},m.extend=m.fn.extend=function(){var a,b,c,d,e,f,g=arguments[0]||{},h=1,i=arguments.length,j=!1;for("boolean"==typeof g&&(j=g,g=arguments[h]||{},h++),"object"==typeof g||m.isFunction(g)||(g={}),h===i&&(g=this,h--);i>h;h++)if(null!=(e=arguments[h]))for(d in e)a=g[d],c=e[d],g!==c&&(j&&c&&(m.isPlainObject(c)||(b=m.isArray(c)))?(b?(b=!1,f=a&&m.isArray(a)?a:[]):f=a&&m.isPlainObject(a)?a:{},g[d]=m.extend(j,f,c)):void 0!==c&&(g[d]=c));return g},m.extend({expando:"jQuery"+(l+Math.random()).replace(/\D/g,""),isReady:!0,error:function(a){throw new Error(a)},noop:function(){},isFunction:function(a){return"function"===m.type(a)},isArray:Array.isArray||function(a){return"array"===m.type(a)},isWindow:function(a){return null!=a&&a==a.window},isNumeric:function(a){return!m.isArray(a)&&a-parseFloat(a)>=0},isEmptyObject:function(a){var b;for(b in a)return!1;return!0},isPlainObject:function(a){var b;if(!a||"object"!==m.type(a)||a.nodeType||m.isWindow(a))return!1;try{if(a.constructor&&!j.call(a,"constructor")&&!j.call(a.constructor.prototype,"isPrototypeOf"))return!1}catch(c){return!1}if(k.ownLast)for(b in a)return j.call(a,b);for(b in a);return void 0===b||j.call(a,b)},type:function(a){return null==a?a+"":"object"==typeof a||"function"==typeof a?h[i.call(a)]||"object":typeof a},globalEval:function(b){b&&m.trim(b)&&(a.execScript||function(b){a.eval.call(a,b)})(b)},camelCase:function(a){return a.replace(o,"ms-").replace(p,q)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toLowerCase()===b.toLowerCase()},each:function(a,b,c){var d,e=0,f=a.length,g=r(a);if(c){if(g){for(;f>e;e++)if(d=b.apply(a[e],c),d===!1)break}else for(e in a)if(d=b.apply(a[e],c),d===!1)break}else if(g){for(;f>e;e++)if(d=b.call(a[e],e,a[e]),d===!1)break}else for(e in a)if(d=b.call(a[e],e,a[e]),d===!1)break;return a},trim:function(a){return null==a?"":(a+"").replace(n,"")},makeArray:function(a,b){var c=b||[];return null!=a&&(r(Object(a))?m.merge(c,"string"==typeof a?[a]:a):f.call(c,a)),c},inArray:function(a,b,c){var d;if(b){if(g)return g.call(b,a,c);for(d=b.length,c=c?0>c?Math.max(0,d+c):c:0;d>c;c++)if(c in b&&b[c]===a)return c}return-1},merge:function(a,b){var c=+b.length,d=0,e=a.length;while(c>d)a[e++]=b[d++];if(c!==c)while(void 0!==b[d])a[e++]=b[d++];return a.length=e,a},grep:function(a,b,c){for(var d,e=[],f=0,g=a.length,h=!c;g>f;f++)d=!b(a[f],f),d!==h&&e.push(a[f]);return e},map:function(a,b,c){var d,f=0,g=a.length,h=r(a),i=[];if(h)for(;g>f;f++)d=b(a[f],f,c),null!=d&&i.push(d);else for(f in a)d=b(a[f],f,c),null!=d&&i.push(d);return e.apply([],i)},guid:1,proxy:function(a,b){var c,e,f;return"string"==typeof b&&(f=a[b],b=a,a=f),m.isFunction(a)?(c=d.call(arguments,2),e=function(){return a.apply(b||this,c.concat(d.call(arguments)))},e.guid=a.guid=a.guid||m.guid++,e):void 0},now:function(){return+new Date},support:k}),m.each("Boolean Number String Function Array Date RegExp Object Error".split(" "),function(a,b){h["[object "+b+"]"]=b.toLowerCase()});function r(a){var b=a.length,c=m.type(a);return"function"===c||m.isWindow(a)?!1:1===a.nodeType&&b?!0:"array"===c||0===b||"number"==typeof b&&b>0&&b-1 in a}var s=function(a){var b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u="sizzle"+-new Date,v=a.document,w=0,x=0,y=gb(),z=gb(),A=gb(),B=function(a,b){return a===b&&(l=!0),0},C="undefined",D=1<<31,E={}.hasOwnProperty,F=[],G=F.pop,H=F.push,I=F.push,J=F.slice,K=F.indexOf||function(a){for(var b=0,c=this.length;c>b;b++)if(this[b]===a)return b;return-1},L="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",M="[\\x20\\t\\r\\n\\f]",N="(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",O=N.replace("w","w#"),P="\\["+M+"*("+N+")(?:"+M+"*([*^$|!~]?=)"+M+"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|("+O+"))|)"+M+"*\\]",Q=":("+N+")(?:\\((('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|((?:\\\\.|[^\\\\()[\\]]|"+P+")*)|.*)\\)|)",R=new RegExp("^"+M+"+|((?:^|[^\\\\])(?:\\\\.)*)"+M+"+$","g"),S=new RegExp("^"+M+"*,"+M+"*"),T=new RegExp("^"+M+"*([>+~]|"+M+")"+M+"*"),U=new RegExp("="+M+"*([^\\]'\"]*?)"+M+"*\\]","g"),V=new RegExp(Q),W=new RegExp("^"+O+"$"),X={ID:new RegExp("^#("+N+")"),CLASS:new RegExp("^\\.("+N+")"),TAG:new RegExp("^("+N.replace("w","w*")+")"),ATTR:new RegExp("^"+P),PSEUDO:new RegExp("^"+Q),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+L+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Y=/^(?:input|select|textarea|button)$/i,Z=/^h\d$/i,$=/^[^{]+\{\s*\[native \w/,_=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ab=/[+~]/,bb=/'|\\/g,cb=new RegExp("\\\\([\\da-f]{1,6}"+M+"?|("+M+")|.)","ig"),db=function(a,b,c){var d="0x"+b-65536;return d!==d||c?b:0>d?String.fromCharCode(d+65536):String.fromCharCode(d>>10|55296,1023&d|56320)};try{I.apply(F=J.call(v.childNodes),v.childNodes),F[v.childNodes.length].nodeType}catch(eb){I={apply:F.length?function(a,b){H.apply(a,J.call(b))}:function(a,b){var c=a.length,d=0;while(a[c++]=b[d++]);a.length=c-1}}}function fb(a,b,d,e){var f,h,j,k,l,o,r,s,w,x;if((b?b.ownerDocument||b:v)!==n&&m(b),b=b||n,d=d||[],!a||"string"!=typeof a)return d;if(1!==(k=b.nodeType)&&9!==k)return[];if(p&&!e){if(f=_.exec(a))if(j=f[1]){if(9===k){if(h=b.getElementById(j),!h||!h.parentNode)return d;if(h.id===j)return d.push(h),d}else if(b.ownerDocument&&(h=b.ownerDocument.getElementById(j))&&t(b,h)&&h.id===j)return d.push(h),d}else{if(f[2])return I.apply(d,b.getElementsByTagName(a)),d;if((j=f[3])&&c.getElementsByClassName&&b.getElementsByClassName)return I.apply(d,b.getElementsByClassName(j)),d}if(c.qsa&&(!q||!q.test(a))){if(s=r=u,w=b,x=9===k&&a,1===k&&"object"!==b.nodeName.toLowerCase()){o=g(a),(r=b.getAttribute("id"))?s=r.replace(bb,"\\$&"):b.setAttribute("id",s),s="[id='"+s+"'] ",l=o.length;while(l--)o[l]=s+qb(o[l]);w=ab.test(a)&&ob(b.parentNode)||b,x=o.join(",")}if(x)try{return I.apply(d,w.querySelectorAll(x)),d}catch(y){}finally{r||b.removeAttribute("id")}}}return i(a.replace(R,"$1"),b,d,e)}function gb(){var a=[];function b(c,e){return a.push(c+" ")>d.cacheLength&&delete b[a.shift()],b[c+" "]=e}return b}function hb(a){return a[u]=!0,a}function ib(a){var b=n.createElement("div");try{return!!a(b)}catch(c){return!1}finally{b.parentNode&&b.parentNode.removeChild(b),b=null}}function jb(a,b){var c=a.split("|"),e=a.length;while(e--)d.attrHandle[c[e]]=b}function kb(a,b){var c=b&&a,d=c&&1===a.nodeType&&1===b.nodeType&&(~b.sourceIndex||D)-(~a.sourceIndex||D);if(d)return d;if(c)while(c=c.nextSibling)if(c===b)return-1;return a?1:-1}function lb(a){return function(b){var c=b.nodeName.toLowerCase();return"input"===c&&b.type===a}}function mb(a){return function(b){var c=b.nodeName.toLowerCase();return("input"===c||"button"===c)&&b.type===a}}function nb(a){return hb(function(b){return b=+b,hb(function(c,d){var e,f=a([],c.length,b),g=f.length;while(g--)c[e=f[g]]&&(c[e]=!(d[e]=c[e]))})})}function ob(a){return a&&typeof a.getElementsByTagName!==C&&a}c=fb.support={},f=fb.isXML=function(a){var b=a&&(a.ownerDocument||a).documentElement;return b?"HTML"!==b.nodeName:!1},m=fb.setDocument=function(a){var b,e=a?a.ownerDocument||a:v,g=e.defaultView;return e!==n&&9===e.nodeType&&e.documentElement?(n=e,o=e.documentElement,p=!f(e),g&&g!==g.top&&(g.addEventListener?g.addEventListener("unload",function(){m()},!1):g.attachEvent&&g.attachEvent("onunload",function(){m()})),c.attributes=ib(function(a){return a.className="i",!a.getAttribute("className")}),c.getElementsByTagName=ib(function(a){return a.appendChild(e.createComment("")),!a.getElementsByTagName("*").length}),c.getElementsByClassName=$.test(e.getElementsByClassName)&&ib(function(a){return a.innerHTML="
",a.firstChild.className="i",2===a.getElementsByClassName("i").length}),c.getById=ib(function(a){return o.appendChild(a).id=u,!e.getElementsByName||!e.getElementsByName(u).length}),c.getById?(d.find.ID=function(a,b){if(typeof b.getElementById!==C&&p){var c=b.getElementById(a);return c&&c.parentNode?[c]:[]}},d.filter.ID=function(a){var b=a.replace(cb,db);return function(a){return a.getAttribute("id")===b}}):(delete d.find.ID,d.filter.ID=function(a){var b=a.replace(cb,db);return function(a){var c=typeof a.getAttributeNode!==C&&a.getAttributeNode("id");return c&&c.value===b}}),d.find.TAG=c.getElementsByTagName?function(a,b){return typeof b.getElementsByTagName!==C?b.getElementsByTagName(a):void 0}:function(a,b){var c,d=[],e=0,f=b.getElementsByTagName(a);if("*"===a){while(c=f[e++])1===c.nodeType&&d.push(c);return d}return f},d.find.CLASS=c.getElementsByClassName&&function(a,b){return typeof b.getElementsByClassName!==C&&p?b.getElementsByClassName(a):void 0},r=[],q=[],(c.qsa=$.test(e.querySelectorAll))&&(ib(function(a){a.innerHTML="",a.querySelectorAll("[msallowclip^='']").length&&q.push("[*^$]="+M+"*(?:''|\"\")"),a.querySelectorAll("[selected]").length||q.push("\\["+M+"*(?:value|"+L+")"),a.querySelectorAll(":checked").length||q.push(":checked")}),ib(function(a){var b=e.createElement("input");b.setAttribute("type","hidden"),a.appendChild(b).setAttribute("name","D"),a.querySelectorAll("[name=d]").length&&q.push("name"+M+"*[*^$|!~]?="),a.querySelectorAll(":enabled").length||q.push(":enabled",":disabled"),a.querySelectorAll("*,:x"),q.push(",.*:")})),(c.matchesSelector=$.test(s=o.matches||o.webkitMatchesSelector||o.mozMatchesSelector||o.oMatchesSelector||o.msMatchesSelector))&&ib(function(a){c.disconnectedMatch=s.call(a,"div"),s.call(a,"[s!='']:x"),r.push("!=",Q)}),q=q.length&&new RegExp(q.join("|")),r=r.length&&new RegExp(r.join("|")),b=$.test(o.compareDocumentPosition),t=b||$.test(o.contains)?function(a,b){var c=9===a.nodeType?a.documentElement:a,d=b&&b.parentNode;return a===d||!(!d||1!==d.nodeType||!(c.contains?c.contains(d):a.compareDocumentPosition&&16&a.compareDocumentPosition(d)))}:function(a,b){if(b)while(b=b.parentNode)if(b===a)return!0;return!1},B=b?function(a,b){if(a===b)return l=!0,0;var d=!a.compareDocumentPosition-!b.compareDocumentPosition;return d?d:(d=(a.ownerDocument||a)===(b.ownerDocument||b)?a.compareDocumentPosition(b):1,1&d||!c.sortDetached&&b.compareDocumentPosition(a)===d?a===e||a.ownerDocument===v&&t(v,a)?-1:b===e||b.ownerDocument===v&&t(v,b)?1:k?K.call(k,a)-K.call(k,b):0:4&d?-1:1)}:function(a,b){if(a===b)return l=!0,0;var c,d=0,f=a.parentNode,g=b.parentNode,h=[a],i=[b];if(!f||!g)return a===e?-1:b===e?1:f?-1:g?1:k?K.call(k,a)-K.call(k,b):0;if(f===g)return kb(a,b);c=a;while(c=c.parentNode)h.unshift(c);c=b;while(c=c.parentNode)i.unshift(c);while(h[d]===i[d])d++;return d?kb(h[d],i[d]):h[d]===v?-1:i[d]===v?1:0},e):n},fb.matches=function(a,b){return fb(a,null,null,b)},fb.matchesSelector=function(a,b){if((a.ownerDocument||a)!==n&&m(a),b=b.replace(U,"='$1']"),!(!c.matchesSelector||!p||r&&r.test(b)||q&&q.test(b)))try{var d=s.call(a,b);if(d||c.disconnectedMatch||a.document&&11!==a.document.nodeType)return d}catch(e){}return fb(b,n,null,[a]).length>0},fb.contains=function(a,b){return(a.ownerDocument||a)!==n&&m(a),t(a,b)},fb.attr=function(a,b){(a.ownerDocument||a)!==n&&m(a);var e=d.attrHandle[b.toLowerCase()],f=e&&E.call(d.attrHandle,b.toLowerCase())?e(a,b,!p):void 0;return void 0!==f?f:c.attributes||!p?a.getAttribute(b):(f=a.getAttributeNode(b))&&f.specified?f.value:null},fb.error=function(a){throw new Error("Syntax error, unrecognized expression: "+a)},fb.uniqueSort=function(a){var b,d=[],e=0,f=0;if(l=!c.detectDuplicates,k=!c.sortStable&&a.slice(0),a.sort(B),l){while(b=a[f++])b===a[f]&&(e=d.push(f));while(e--)a.splice(d[e],1)}return k=null,a},e=fb.getText=function(a){var b,c="",d=0,f=a.nodeType;if(f){if(1===f||9===f||11===f){if("string"==typeof a.textContent)return a.textContent;for(a=a.firstChild;a;a=a.nextSibling)c+=e(a)}else if(3===f||4===f)return a.nodeValue}else while(b=a[d++])c+=e(b);return c},d=fb.selectors={cacheLength:50,createPseudo:hb,match:X,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(a){return a[1]=a[1].replace(cb,db),a[3]=(a[3]||a[4]||a[5]||"").replace(cb,db),"~="===a[2]&&(a[3]=" "+a[3]+" "),a.slice(0,4)},CHILD:function(a){return a[1]=a[1].toLowerCase(),"nth"===a[1].slice(0,3)?(a[3]||fb.error(a[0]),a[4]=+(a[4]?a[5]+(a[6]||1):2*("even"===a[3]||"odd"===a[3])),a[5]=+(a[7]+a[8]||"odd"===a[3])):a[3]&&fb.error(a[0]),a},PSEUDO:function(a){var b,c=!a[6]&&a[2];return X.CHILD.test(a[0])?null:(a[3]?a[2]=a[4]||a[5]||"":c&&V.test(c)&&(b=g(c,!0))&&(b=c.indexOf(")",c.length-b)-c.length)&&(a[0]=a[0].slice(0,b),a[2]=c.slice(0,b)),a.slice(0,3))}},filter:{TAG:function(a){var b=a.replace(cb,db).toLowerCase();return"*"===a?function(){return!0}:function(a){return a.nodeName&&a.nodeName.toLowerCase()===b}},CLASS:function(a){var b=y[a+" "];return b||(b=new RegExp("(^|"+M+")"+a+"("+M+"|$)"))&&y(a,function(a){return b.test("string"==typeof a.className&&a.className||typeof a.getAttribute!==C&&a.getAttribute("class")||"")})},ATTR:function(a,b,c){return function(d){var e=fb.attr(d,a);return null==e?"!="===b:b?(e+="","="===b?e===c:"!="===b?e!==c:"^="===b?c&&0===e.indexOf(c):"*="===b?c&&e.indexOf(c)>-1:"$="===b?c&&e.slice(-c.length)===c:"~="===b?(" "+e+" ").indexOf(c)>-1:"|="===b?e===c||e.slice(0,c.length+1)===c+"-":!1):!0}},CHILD:function(a,b,c,d,e){var f="nth"!==a.slice(0,3),g="last"!==a.slice(-4),h="of-type"===b;return 1===d&&0===e?function(a){return!!a.parentNode}:function(b,c,i){var j,k,l,m,n,o,p=f!==g?"nextSibling":"previousSibling",q=b.parentNode,r=h&&b.nodeName.toLowerCase(),s=!i&&!h;if(q){if(f){while(p){l=b;while(l=l[p])if(h?l.nodeName.toLowerCase()===r:1===l.nodeType)return!1;o=p="only"===a&&!o&&"nextSibling"}return!0}if(o=[g?q.firstChild:q.lastChild],g&&s){k=q[u]||(q[u]={}),j=k[a]||[],n=j[0]===w&&j[1],m=j[0]===w&&j[2],l=n&&q.childNodes[n];while(l=++n&&l&&l[p]||(m=n=0)||o.pop())if(1===l.nodeType&&++m&&l===b){k[a]=[w,n,m];break}}else if(s&&(j=(b[u]||(b[u]={}))[a])&&j[0]===w)m=j[1];else while(l=++n&&l&&l[p]||(m=n=0)||o.pop())if((h?l.nodeName.toLowerCase()===r:1===l.nodeType)&&++m&&(s&&((l[u]||(l[u]={}))[a]=[w,m]),l===b))break;return m-=e,m===d||m%d===0&&m/d>=0}}},PSEUDO:function(a,b){var c,e=d.pseudos[a]||d.setFilters[a.toLowerCase()]||fb.error("unsupported pseudo: "+a);return e[u]?e(b):e.length>1?(c=[a,a,"",b],d.setFilters.hasOwnProperty(a.toLowerCase())?hb(function(a,c){var d,f=e(a,b),g=f.length;while(g--)d=K.call(a,f[g]),a[d]=!(c[d]=f[g])}):function(a){return e(a,0,c)}):e}},pseudos:{not:hb(function(a){var b=[],c=[],d=h(a.replace(R,"$1"));return d[u]?hb(function(a,b,c,e){var f,g=d(a,null,e,[]),h=a.length;while(h--)(f=g[h])&&(a[h]=!(b[h]=f))}):function(a,e,f){return b[0]=a,d(b,null,f,c),!c.pop()}}),has:hb(function(a){return function(b){return fb(a,b).length>0}}),contains:hb(function(a){return function(b){return(b.textContent||b.innerText||e(b)).indexOf(a)>-1}}),lang:hb(function(a){return W.test(a||"")||fb.error("unsupported lang: "+a),a=a.replace(cb,db).toLowerCase(),function(b){var c;do if(c=p?b.lang:b.getAttribute("xml:lang")||b.getAttribute("lang"))return c=c.toLowerCase(),c===a||0===c.indexOf(a+"-");while((b=b.parentNode)&&1===b.nodeType);return!1}}),target:function(b){var c=a.location&&a.location.hash;return c&&c.slice(1)===b.id},root:function(a){return a===o},focus:function(a){return a===n.activeElement&&(!n.hasFocus||n.hasFocus())&&!!(a.type||a.href||~a.tabIndex)},enabled:function(a){return a.disabled===!1},disabled:function(a){return a.disabled===!0},checked:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&!!a.checked||"option"===b&&!!a.selected},selected:function(a){return a.parentNode&&a.parentNode.selectedIndex,a.selected===!0},empty:function(a){for(a=a.firstChild;a;a=a.nextSibling)if(a.nodeType<6)return!1;return!0},parent:function(a){return!d.pseudos.empty(a)},header:function(a){return Z.test(a.nodeName)},input:function(a){return Y.test(a.nodeName)},button:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&"button"===a.type||"button"===b},text:function(a){var b;return"input"===a.nodeName.toLowerCase()&&"text"===a.type&&(null==(b=a.getAttribute("type"))||"text"===b.toLowerCase())},first:nb(function(){return[0]}),last:nb(function(a,b){return[b-1]}),eq:nb(function(a,b,c){return[0>c?c+b:c]}),even:nb(function(a,b){for(var c=0;b>c;c+=2)a.push(c);return a}),odd:nb(function(a,b){for(var c=1;b>c;c+=2)a.push(c);return a}),lt:nb(function(a,b,c){for(var d=0>c?c+b:c;--d>=0;)a.push(d);return a}),gt:nb(function(a,b,c){for(var d=0>c?c+b:c;++db;b++)d+=a[b].value;return d}function rb(a,b,c){var d=b.dir,e=c&&"parentNode"===d,f=x++;return b.first?function(b,c,f){while(b=b[d])if(1===b.nodeType||e)return a(b,c,f)}:function(b,c,g){var h,i,j=[w,f];if(g){while(b=b[d])if((1===b.nodeType||e)&&a(b,c,g))return!0}else while(b=b[d])if(1===b.nodeType||e){if(i=b[u]||(b[u]={}),(h=i[d])&&h[0]===w&&h[1]===f)return j[2]=h[2];if(i[d]=j,j[2]=a(b,c,g))return!0}}}function sb(a){return a.length>1?function(b,c,d){var e=a.length;while(e--)if(!a[e](b,c,d))return!1;return!0}:a[0]}function tb(a,b,c){for(var d=0,e=b.length;e>d;d++)fb(a,b[d],c);return c}function ub(a,b,c,d,e){for(var f,g=[],h=0,i=a.length,j=null!=b;i>h;h++)(f=a[h])&&(!c||c(f,d,e))&&(g.push(f),j&&b.push(h));return g}function vb(a,b,c,d,e,f){return d&&!d[u]&&(d=vb(d)),e&&!e[u]&&(e=vb(e,f)),hb(function(f,g,h,i){var j,k,l,m=[],n=[],o=g.length,p=f||tb(b||"*",h.nodeType?[h]:h,[]),q=!a||!f&&b?p:ub(p,m,a,h,i),r=c?e||(f?a:o||d)?[]:g:q;if(c&&c(q,r,h,i),d){j=ub(r,n),d(j,[],h,i),k=j.length;while(k--)(l=j[k])&&(r[n[k]]=!(q[n[k]]=l))}if(f){if(e||a){if(e){j=[],k=r.length;while(k--)(l=r[k])&&j.push(q[k]=l);e(null,r=[],j,i)}k=r.length;while(k--)(l=r[k])&&(j=e?K.call(f,l):m[k])>-1&&(f[j]=!(g[j]=l))}}else r=ub(r===g?r.splice(o,r.length):r),e?e(null,g,r,i):I.apply(g,r)})}function wb(a){for(var b,c,e,f=a.length,g=d.relative[a[0].type],h=g||d.relative[" "],i=g?1:0,k=rb(function(a){return a===b},h,!0),l=rb(function(a){return K.call(b,a)>-1},h,!0),m=[function(a,c,d){return!g&&(d||c!==j)||((b=c).nodeType?k(a,c,d):l(a,c,d))}];f>i;i++)if(c=d.relative[a[i].type])m=[rb(sb(m),c)];else{if(c=d.filter[a[i].type].apply(null,a[i].matches),c[u]){for(e=++i;f>e;e++)if(d.relative[a[e].type])break;return vb(i>1&&sb(m),i>1&&qb(a.slice(0,i-1).concat({value:" "===a[i-2].type?"*":""})).replace(R,"$1"),c,e>i&&wb(a.slice(i,e)),f>e&&wb(a=a.slice(e)),f>e&&qb(a))}m.push(c)}return sb(m)}function xb(a,b){var c=b.length>0,e=a.length>0,f=function(f,g,h,i,k){var l,m,o,p=0,q="0",r=f&&[],s=[],t=j,u=f||e&&d.find.TAG("*",k),v=w+=null==t?1:Math.random()||.1,x=u.length;for(k&&(j=g!==n&&g);q!==x&&null!=(l=u[q]);q++){if(e&&l){m=0;while(o=a[m++])if(o(l,g,h)){i.push(l);break}k&&(w=v)}c&&((l=!o&&l)&&p--,f&&r.push(l))}if(p+=q,c&&q!==p){m=0;while(o=b[m++])o(r,s,g,h);if(f){if(p>0)while(q--)r[q]||s[q]||(s[q]=G.call(i));s=ub(s)}I.apply(i,s),k&&!f&&s.length>0&&p+b.length>1&&fb.uniqueSort(i)}return k&&(w=v,j=t),r};return c?hb(f):f}return h=fb.compile=function(a,b){var c,d=[],e=[],f=A[a+" "];if(!f){b||(b=g(a)),c=b.length;while(c--)f=wb(b[c]),f[u]?d.push(f):e.push(f);f=A(a,xb(e,d)),f.selector=a}return f},i=fb.select=function(a,b,e,f){var i,j,k,l,m,n="function"==typeof a&&a,o=!f&&g(a=n.selector||a);if(e=e||[],1===o.length){if(j=o[0]=o[0].slice(0),j.length>2&&"ID"===(k=j[0]).type&&c.getById&&9===b.nodeType&&p&&d.relative[j[1].type]){if(b=(d.find.ID(k.matches[0].replace(cb,db),b)||[])[0],!b)return e;n&&(b=b.parentNode),a=a.slice(j.shift().value.length)}i=X.needsContext.test(a)?0:j.length;while(i--){if(k=j[i],d.relative[l=k.type])break;if((m=d.find[l])&&(f=m(k.matches[0].replace(cb,db),ab.test(j[0].type)&&ob(b.parentNode)||b))){if(j.splice(i,1),a=f.length&&qb(j),!a)return I.apply(e,f),e;break}}}return(n||h(a,o))(f,b,!p,e,ab.test(a)&&ob(b.parentNode)||b),e},c.sortStable=u.split("").sort(B).join("")===u,c.detectDuplicates=!!l,m(),c.sortDetached=ib(function(a){return 1&a.compareDocumentPosition(n.createElement("div"))}),ib(function(a){return a.innerHTML="","#"===a.firstChild.getAttribute("href")})||jb("type|href|height|width",function(a,b,c){return c?void 0:a.getAttribute(b,"type"===b.toLowerCase()?1:2)}),c.attributes&&ib(function(a){return a.innerHTML="",a.firstChild.setAttribute("value",""),""===a.firstChild.getAttribute("value")})||jb("value",function(a,b,c){return c||"input"!==a.nodeName.toLowerCase()?void 0:a.defaultValue}),ib(function(a){return null==a.getAttribute("disabled")})||jb(L,function(a,b,c){var d;return c?void 0:a[b]===!0?b.toLowerCase():(d=a.getAttributeNode(b))&&d.specified?d.value:null}),fb}(a);m.find=s,m.expr=s.selectors,m.expr[":"]=m.expr.pseudos,m.unique=s.uniqueSort,m.text=s.getText,m.isXMLDoc=s.isXML,m.contains=s.contains;var t=m.expr.match.needsContext,u=/^<(\w+)\s*\/?>(?:<\/\1>|)$/,v=/^.[^:#\[\.,]*$/;function w(a,b,c){if(m.isFunction(b))return m.grep(a,function(a,d){return!!b.call(a,d,a)!==c});if(b.nodeType)return m.grep(a,function(a){return a===b!==c});if("string"==typeof b){if(v.test(b))return m.filter(b,a,c);b=m.filter(b,a)}return m.grep(a,function(a){return m.inArray(a,b)>=0!==c})}m.filter=function(a,b,c){var d=b[0];return c&&(a=":not("+a+")"),1===b.length&&1===d.nodeType?m.find.matchesSelector(d,a)?[d]:[]:m.find.matches(a,m.grep(b,function(a){return 1===a.nodeType}))},m.fn.extend({find:function(a){var b,c=[],d=this,e=d.length;if("string"!=typeof a)return this.pushStack(m(a).filter(function(){for(b=0;e>b;b++)if(m.contains(d[b],this))return!0}));for(b=0;e>b;b++)m.find(a,d[b],c);return c=this.pushStack(e>1?m.unique(c):c),c.selector=this.selector?this.selector+" "+a:a,c},filter:function(a){return this.pushStack(w(this,a||[],!1))},not:function(a){return this.pushStack(w(this,a||[],!0))},is:function(a){return!!w(this,"string"==typeof a&&t.test(a)?m(a):a||[],!1).length}});var x,y=a.document,z=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,A=m.fn.init=function(a,b){var c,d;if(!a)return this;if("string"==typeof a){if(c="<"===a.charAt(0)&&">"===a.charAt(a.length-1)&&a.length>=3?[null,a,null]:z.exec(a),!c||!c[1]&&b)return!b||b.jquery?(b||x).find(a):this.constructor(b).find(a);if(c[1]){if(b=b instanceof m?b[0]:b,m.merge(this,m.parseHTML(c[1],b&&b.nodeType?b.ownerDocument||b:y,!0)),u.test(c[1])&&m.isPlainObject(b))for(c in b)m.isFunction(this[c])?this[c](b[c]):this.attr(c,b[c]);return this}if(d=y.getElementById(c[2]),d&&d.parentNode){if(d.id!==c[2])return x.find(a);this.length=1,this[0]=d}return this.context=y,this.selector=a,this}return a.nodeType?(this.context=this[0]=a,this.length=1,this):m.isFunction(a)?"undefined"!=typeof x.ready?x.ready(a):a(m):(void 0!==a.selector&&(this.selector=a.selector,this.context=a.context),m.makeArray(a,this))};A.prototype=m.fn,x=m(y);var B=/^(?:parents|prev(?:Until|All))/,C={children:!0,contents:!0,next:!0,prev:!0};m.extend({dir:function(a,b,c){var d=[],e=a[b];while(e&&9!==e.nodeType&&(void 0===c||1!==e.nodeType||!m(e).is(c)))1===e.nodeType&&d.push(e),e=e[b];return d},sibling:function(a,b){for(var c=[];a;a=a.nextSibling)1===a.nodeType&&a!==b&&c.push(a);return c}}),m.fn.extend({has:function(a){var b,c=m(a,this),d=c.length;return this.filter(function(){for(b=0;d>b;b++)if(m.contains(this,c[b]))return!0})},closest:function(a,b){for(var c,d=0,e=this.length,f=[],g=t.test(a)||"string"!=typeof a?m(a,b||this.context):0;e>d;d++)for(c=this[d];c&&c!==b;c=c.parentNode)if(c.nodeType<11&&(g?g.index(c)>-1:1===c.nodeType&&m.find.matchesSelector(c,a))){f.push(c);break}return this.pushStack(f.length>1?m.unique(f):f)},index:function(a){return a?"string"==typeof a?m.inArray(this[0],m(a)):m.inArray(a.jquery?a[0]:a,this):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(a,b){return this.pushStack(m.unique(m.merge(this.get(),m(a,b))))},addBack:function(a){return this.add(null==a?this.prevObject:this.prevObject.filter(a))}});function D(a,b){do a=a[b];while(a&&1!==a.nodeType);return a}m.each({parent:function(a){var b=a.parentNode;return b&&11!==b.nodeType?b:null},parents:function(a){return m.dir(a,"parentNode")},parentsUntil:function(a,b,c){return m.dir(a,"parentNode",c)},next:function(a){return D(a,"nextSibling")},prev:function(a){return D(a,"previousSibling")},nextAll:function(a){return m.dir(a,"nextSibling")},prevAll:function(a){return m.dir(a,"previousSibling")},nextUntil:function(a,b,c){return m.dir(a,"nextSibling",c)},prevUntil:function(a,b,c){return m.dir(a,"previousSibling",c)},siblings:function(a){return m.sibling((a.parentNode||{}).firstChild,a)},children:function(a){return m.sibling(a.firstChild)},contents:function(a){return m.nodeName(a,"iframe")?a.contentDocument||a.contentWindow.document:m.merge([],a.childNodes)}},function(a,b){m.fn[a]=function(c,d){var e=m.map(this,b,c);return"Until"!==a.slice(-5)&&(d=c),d&&"string"==typeof d&&(e=m.filter(d,e)),this.length>1&&(C[a]||(e=m.unique(e)),B.test(a)&&(e=e.reverse())),this.pushStack(e)}});var E=/\S+/g,F={};function G(a){var b=F[a]={};return m.each(a.match(E)||[],function(a,c){b[c]=!0}),b}m.Callbacks=function(a){a="string"==typeof a?F[a]||G(a):m.extend({},a);var b,c,d,e,f,g,h=[],i=!a.once&&[],j=function(l){for(c=a.memory&&l,d=!0,f=g||0,g=0,e=h.length,b=!0;h&&e>f;f++)if(h[f].apply(l[0],l[1])===!1&&a.stopOnFalse){c=!1;break}b=!1,h&&(i?i.length&&j(i.shift()):c?h=[]:k.disable())},k={add:function(){if(h){var d=h.length;!function f(b){m.each(b,function(b,c){var d=m.type(c);"function"===d?a.unique&&k.has(c)||h.push(c):c&&c.length&&"string"!==d&&f(c)})}(arguments),b?e=h.length:c&&(g=d,j(c))}return this},remove:function(){return h&&m.each(arguments,function(a,c){var d;while((d=m.inArray(c,h,d))>-1)h.splice(d,1),b&&(e>=d&&e--,f>=d&&f--)}),this},has:function(a){return a?m.inArray(a,h)>-1:!(!h||!h.length)},empty:function(){return h=[],e=0,this},disable:function(){return h=i=c=void 0,this},disabled:function(){return!h},lock:function(){return i=void 0,c||k.disable(),this},locked:function(){return!i},fireWith:function(a,c){return!h||d&&!i||(c=c||[],c=[a,c.slice?c.slice():c],b?i.push(c):j(c)),this},fire:function(){return k.fireWith(this,arguments),this},fired:function(){return!!d}};return k},m.extend({Deferred:function(a){var b=[["resolve","done",m.Callbacks("once memory"),"resolved"],["reject","fail",m.Callbacks("once memory"),"rejected"],["notify","progress",m.Callbacks("memory")]],c="pending",d={state:function(){return c},always:function(){return e.done(arguments).fail(arguments),this},then:function(){var a=arguments;return m.Deferred(function(c){m.each(b,function(b,f){var g=m.isFunction(a[b])&&a[b];e[f[1]](function(){var a=g&&g.apply(this,arguments);a&&m.isFunction(a.promise)?a.promise().done(c.resolve).fail(c.reject).progress(c.notify):c[f[0]+"With"](this===d?c.promise():this,g?[a]:arguments)})}),a=null}).promise()},promise:function(a){return null!=a?m.extend(a,d):d}},e={};return d.pipe=d.then,m.each(b,function(a,f){var g=f[2],h=f[3];d[f[1]]=g.add,h&&g.add(function(){c=h},b[1^a][2].disable,b[2][2].lock),e[f[0]]=function(){return e[f[0]+"With"](this===e?d:this,arguments),this},e[f[0]+"With"]=g.fireWith}),d.promise(e),a&&a.call(e,e),e},when:function(a){var b=0,c=d.call(arguments),e=c.length,f=1!==e||a&&m.isFunction(a.promise)?e:0,g=1===f?a:m.Deferred(),h=function(a,b,c){return function(e){b[a]=this,c[a]=arguments.length>1?d.call(arguments):e,c===i?g.notifyWith(b,c):--f||g.resolveWith(b,c)}},i,j,k;if(e>1)for(i=new Array(e),j=new Array(e),k=new Array(e);e>b;b++)c[b]&&m.isFunction(c[b].promise)?c[b].promise().done(h(b,k,c)).fail(g.reject).progress(h(b,j,i)):--f;return f||g.resolveWith(k,c),g.promise()}});var H;m.fn.ready=function(a){return m.ready.promise().done(a),this},m.extend({isReady:!1,readyWait:1,holdReady:function(a){a?m.readyWait++:m.ready(!0)},ready:function(a){if(a===!0?!--m.readyWait:!m.isReady){if(!y.body)return setTimeout(m.ready);m.isReady=!0,a!==!0&&--m.readyWait>0||(H.resolveWith(y,[m]),m.fn.triggerHandler&&(m(y).triggerHandler("ready"),m(y).off("ready")))}}});function I(){y.addEventListener?(y.removeEventListener("DOMContentLoaded",J,!1),a.removeEventListener("load",J,!1)):(y.detachEvent("onreadystatechange",J),a.detachEvent("onload",J))}function J(){(y.addEventListener||"load"===event.type||"complete"===y.readyState)&&(I(),m.ready())}m.ready.promise=function(b){if(!H)if(H=m.Deferred(),"complete"===y.readyState)setTimeout(m.ready);else if(y.addEventListener)y.addEventListener("DOMContentLoaded",J,!1),a.addEventListener("load",J,!1);else{y.attachEvent("onreadystatechange",J),a.attachEvent("onload",J);var c=!1;try{c=null==a.frameElement&&y.documentElement}catch(d){}c&&c.doScroll&&!function e(){if(!m.isReady){try{c.doScroll("left")}catch(a){return setTimeout(e,50)}I(),m.ready()}}()}return H.promise(b)};var K="undefined",L;for(L in m(k))break;k.ownLast="0"!==L,k.inlineBlockNeedsLayout=!1,m(function(){var a,b,c,d;c=y.getElementsByTagName("body")[0],c&&c.style&&(b=y.createElement("div"),d=y.createElement("div"),d.style.cssText="position:absolute;border:0;width:0;height:0;top:0;left:-9999px",c.appendChild(d).appendChild(b),typeof b.style.zoom!==K&&(b.style.cssText="display:inline;margin:0;border:0;padding:1px;width:1px;zoom:1",k.inlineBlockNeedsLayout=a=3===b.offsetWidth,a&&(c.style.zoom=1)),c.removeChild(d))}),function(){var a=y.createElement("div");if(null==k.deleteExpando){k.deleteExpando=!0;try{delete a.test}catch(b){k.deleteExpando=!1}}a=null}(),m.acceptData=function(a){var b=m.noData[(a.nodeName+" ").toLowerCase()],c=+a.nodeType||1;return 1!==c&&9!==c?!1:!b||b!==!0&&a.getAttribute("classid")===b};var M=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,N=/([A-Z])/g;function O(a,b,c){if(void 0===c&&1===a.nodeType){var d="data-"+b.replace(N,"-$1").toLowerCase();if(c=a.getAttribute(d),"string"==typeof c){try{c="true"===c?!0:"false"===c?!1:"null"===c?null:+c+""===c?+c:M.test(c)?m.parseJSON(c):c}catch(e){}m.data(a,b,c)}else c=void 0}return c}function P(a){var b;for(b in a)if(("data"!==b||!m.isEmptyObject(a[b]))&&"toJSON"!==b)return!1;return!0}function Q(a,b,d,e){if(m.acceptData(a)){var f,g,h=m.expando,i=a.nodeType,j=i?m.cache:a,k=i?a[h]:a[h]&&h; + if(k&&j[k]&&(e||j[k].data)||void 0!==d||"string"!=typeof b)return k||(k=i?a[h]=c.pop()||m.guid++:h),j[k]||(j[k]=i?{}:{toJSON:m.noop}),("object"==typeof b||"function"==typeof b)&&(e?j[k]=m.extend(j[k],b):j[k].data=m.extend(j[k].data,b)),g=j[k],e||(g.data||(g.data={}),g=g.data),void 0!==d&&(g[m.camelCase(b)]=d),"string"==typeof b?(f=g[b],null==f&&(f=g[m.camelCase(b)])):f=g,f}}function R(a,b,c){if(m.acceptData(a)){var d,e,f=a.nodeType,g=f?m.cache:a,h=f?a[m.expando]:m.expando;if(g[h]){if(b&&(d=c?g[h]:g[h].data)){m.isArray(b)?b=b.concat(m.map(b,m.camelCase)):b in d?b=[b]:(b=m.camelCase(b),b=b in d?[b]:b.split(" ")),e=b.length;while(e--)delete d[b[e]];if(c?!P(d):!m.isEmptyObject(d))return}(c||(delete g[h].data,P(g[h])))&&(f?m.cleanData([a],!0):k.deleteExpando||g!=g.window?delete g[h]:g[h]=null)}}}m.extend({cache:{},noData:{"applet ":!0,"embed ":!0,"object ":"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"},hasData:function(a){return a=a.nodeType?m.cache[a[m.expando]]:a[m.expando],!!a&&!P(a)},data:function(a,b,c){return Q(a,b,c)},removeData:function(a,b){return R(a,b)},_data:function(a,b,c){return Q(a,b,c,!0)},_removeData:function(a,b){return R(a,b,!0)}}),m.fn.extend({data:function(a,b){var c,d,e,f=this[0],g=f&&f.attributes;if(void 0===a){if(this.length&&(e=m.data(f),1===f.nodeType&&!m._data(f,"parsedAttrs"))){c=g.length;while(c--)g[c]&&(d=g[c].name,0===d.indexOf("data-")&&(d=m.camelCase(d.slice(5)),O(f,d,e[d])));m._data(f,"parsedAttrs",!0)}return e}return"object"==typeof a?this.each(function(){m.data(this,a)}):arguments.length>1?this.each(function(){m.data(this,a,b)}):f?O(f,a,m.data(f,a)):void 0},removeData:function(a){return this.each(function(){m.removeData(this,a)})}}),m.extend({queue:function(a,b,c){var d;return a?(b=(b||"fx")+"queue",d=m._data(a,b),c&&(!d||m.isArray(c)?d=m._data(a,b,m.makeArray(c)):d.push(c)),d||[]):void 0},dequeue:function(a,b){b=b||"fx";var c=m.queue(a,b),d=c.length,e=c.shift(),f=m._queueHooks(a,b),g=function(){m.dequeue(a,b)};"inprogress"===e&&(e=c.shift(),d--),e&&("fx"===b&&c.unshift("inprogress"),delete f.stop,e.call(a,g,f)),!d&&f&&f.empty.fire()},_queueHooks:function(a,b){var c=b+"queueHooks";return m._data(a,c)||m._data(a,c,{empty:m.Callbacks("once memory").add(function(){m._removeData(a,b+"queue"),m._removeData(a,c)})})}}),m.fn.extend({queue:function(a,b){var c=2;return"string"!=typeof a&&(b=a,a="fx",c--),arguments.lengthh;h++)b(a[h],c,g?d:d.call(a[h],h,b(a[h],c)));return e?a:j?b.call(a):i?b(a[0],c):f},W=/^(?:checkbox|radio)$/i;!function(){var a=y.createElement("input"),b=y.createElement("div"),c=y.createDocumentFragment();if(b.innerHTML="
a",k.leadingWhitespace=3===b.firstChild.nodeType,k.tbody=!b.getElementsByTagName("tbody").length,k.htmlSerialize=!!b.getElementsByTagName("link").length,k.html5Clone="<:nav>"!==y.createElement("nav").cloneNode(!0).outerHTML,a.type="checkbox",a.checked=!0,c.appendChild(a),k.appendChecked=a.checked,b.innerHTML="",k.noCloneChecked=!!b.cloneNode(!0).lastChild.defaultValue,c.appendChild(b),b.innerHTML="",k.checkClone=b.cloneNode(!0).cloneNode(!0).lastChild.checked,k.noCloneEvent=!0,b.attachEvent&&(b.attachEvent("onclick",function(){k.noCloneEvent=!1}),b.cloneNode(!0).click()),null==k.deleteExpando){k.deleteExpando=!0;try{delete b.test}catch(d){k.deleteExpando=!1}}}(),function(){var b,c,d=y.createElement("div");for(b in{submit:!0,change:!0,focusin:!0})c="on"+b,(k[b+"Bubbles"]=c in a)||(d.setAttribute(c,"t"),k[b+"Bubbles"]=d.attributes[c].expando===!1);d=null}();var X=/^(?:input|select|textarea)$/i,Y=/^key/,Z=/^(?:mouse|pointer|contextmenu)|click/,$=/^(?:focusinfocus|focusoutblur)$/,_=/^([^.]*)(?:\.(.+)|)$/;function ab(){return!0}function bb(){return!1}function cb(){try{return y.activeElement}catch(a){}}m.event={global:{},add:function(a,b,c,d,e){var f,g,h,i,j,k,l,n,o,p,q,r=m._data(a);if(r){c.handler&&(i=c,c=i.handler,e=i.selector),c.guid||(c.guid=m.guid++),(g=r.events)||(g=r.events={}),(k=r.handle)||(k=r.handle=function(a){return typeof m===K||a&&m.event.triggered===a.type?void 0:m.event.dispatch.apply(k.elem,arguments)},k.elem=a),b=(b||"").match(E)||[""],h=b.length;while(h--)f=_.exec(b[h])||[],o=q=f[1],p=(f[2]||"").split(".").sort(),o&&(j=m.event.special[o]||{},o=(e?j.delegateType:j.bindType)||o,j=m.event.special[o]||{},l=m.extend({type:o,origType:q,data:d,handler:c,guid:c.guid,selector:e,needsContext:e&&m.expr.match.needsContext.test(e),namespace:p.join(".")},i),(n=g[o])||(n=g[o]=[],n.delegateCount=0,j.setup&&j.setup.call(a,d,p,k)!==!1||(a.addEventListener?a.addEventListener(o,k,!1):a.attachEvent&&a.attachEvent("on"+o,k))),j.add&&(j.add.call(a,l),l.handler.guid||(l.handler.guid=c.guid)),e?n.splice(n.delegateCount++,0,l):n.push(l),m.event.global[o]=!0);a=null}},remove:function(a,b,c,d,e){var f,g,h,i,j,k,l,n,o,p,q,r=m.hasData(a)&&m._data(a);if(r&&(k=r.events)){b=(b||"").match(E)||[""],j=b.length;while(j--)if(h=_.exec(b[j])||[],o=q=h[1],p=(h[2]||"").split(".").sort(),o){l=m.event.special[o]||{},o=(d?l.delegateType:l.bindType)||o,n=k[o]||[],h=h[2]&&new RegExp("(^|\\.)"+p.join("\\.(?:.*\\.|)")+"(\\.|$)"),i=f=n.length;while(f--)g=n[f],!e&&q!==g.origType||c&&c.guid!==g.guid||h&&!h.test(g.namespace)||d&&d!==g.selector&&("**"!==d||!g.selector)||(n.splice(f,1),g.selector&&n.delegateCount--,l.remove&&l.remove.call(a,g));i&&!n.length&&(l.teardown&&l.teardown.call(a,p,r.handle)!==!1||m.removeEvent(a,o,r.handle),delete k[o])}else for(o in k)m.event.remove(a,o+b[j],c,d,!0);m.isEmptyObject(k)&&(delete r.handle,m._removeData(a,"events"))}},trigger:function(b,c,d,e){var f,g,h,i,k,l,n,o=[d||y],p=j.call(b,"type")?b.type:b,q=j.call(b,"namespace")?b.namespace.split("."):[];if(h=l=d=d||y,3!==d.nodeType&&8!==d.nodeType&&!$.test(p+m.event.triggered)&&(p.indexOf(".")>=0&&(q=p.split("."),p=q.shift(),q.sort()),g=p.indexOf(":")<0&&"on"+p,b=b[m.expando]?b:new m.Event(p,"object"==typeof b&&b),b.isTrigger=e?2:3,b.namespace=q.join("."),b.namespace_re=b.namespace?new RegExp("(^|\\.)"+q.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,b.result=void 0,b.target||(b.target=d),c=null==c?[b]:m.makeArray(c,[b]),k=m.event.special[p]||{},e||!k.trigger||k.trigger.apply(d,c)!==!1)){if(!e&&!k.noBubble&&!m.isWindow(d)){for(i=k.delegateType||p,$.test(i+p)||(h=h.parentNode);h;h=h.parentNode)o.push(h),l=h;l===(d.ownerDocument||y)&&o.push(l.defaultView||l.parentWindow||a)}n=0;while((h=o[n++])&&!b.isPropagationStopped())b.type=n>1?i:k.bindType||p,f=(m._data(h,"events")||{})[b.type]&&m._data(h,"handle"),f&&f.apply(h,c),f=g&&h[g],f&&f.apply&&m.acceptData(h)&&(b.result=f.apply(h,c),b.result===!1&&b.preventDefault());if(b.type=p,!e&&!b.isDefaultPrevented()&&(!k._default||k._default.apply(o.pop(),c)===!1)&&m.acceptData(d)&&g&&d[p]&&!m.isWindow(d)){l=d[g],l&&(d[g]=null),m.event.triggered=p;try{d[p]()}catch(r){}m.event.triggered=void 0,l&&(d[g]=l)}return b.result}},dispatch:function(a){a=m.event.fix(a);var b,c,e,f,g,h=[],i=d.call(arguments),j=(m._data(this,"events")||{})[a.type]||[],k=m.event.special[a.type]||{};if(i[0]=a,a.delegateTarget=this,!k.preDispatch||k.preDispatch.call(this,a)!==!1){h=m.event.handlers.call(this,a,j),b=0;while((f=h[b++])&&!a.isPropagationStopped()){a.currentTarget=f.elem,g=0;while((e=f.handlers[g++])&&!a.isImmediatePropagationStopped())(!a.namespace_re||a.namespace_re.test(e.namespace))&&(a.handleObj=e,a.data=e.data,c=((m.event.special[e.origType]||{}).handle||e.handler).apply(f.elem,i),void 0!==c&&(a.result=c)===!1&&(a.preventDefault(),a.stopPropagation()))}return k.postDispatch&&k.postDispatch.call(this,a),a.result}},handlers:function(a,b){var c,d,e,f,g=[],h=b.delegateCount,i=a.target;if(h&&i.nodeType&&(!a.button||"click"!==a.type))for(;i!=this;i=i.parentNode||this)if(1===i.nodeType&&(i.disabled!==!0||"click"!==a.type)){for(e=[],f=0;h>f;f++)d=b[f],c=d.selector+" ",void 0===e[c]&&(e[c]=d.needsContext?m(c,this).index(i)>=0:m.find(c,this,null,[i]).length),e[c]&&e.push(d);e.length&&g.push({elem:i,handlers:e})}return h]","i"),hb=/^\s+/,ib=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,jb=/<([\w:]+)/,kb=/\s*$/g,rb={option:[1,""],legend:[1,"
","
"],area:[1,"",""],param:[1,"",""],thead:[1,"","
"],tr:[2,"","
"],col:[2,"","
"],td:[3,"","
"],_default:k.htmlSerialize?[0,"",""]:[1,"X
","
"]},sb=db(y),tb=sb.appendChild(y.createElement("div"));rb.optgroup=rb.option,rb.tbody=rb.tfoot=rb.colgroup=rb.caption=rb.thead,rb.th=rb.td;function ub(a,b){var c,d,e=0,f=typeof a.getElementsByTagName!==K?a.getElementsByTagName(b||"*"):typeof a.querySelectorAll!==K?a.querySelectorAll(b||"*"):void 0;if(!f)for(f=[],c=a.childNodes||a;null!=(d=c[e]);e++)!b||m.nodeName(d,b)?f.push(d):m.merge(f,ub(d,b));return void 0===b||b&&m.nodeName(a,b)?m.merge([a],f):f}function vb(a){W.test(a.type)&&(a.defaultChecked=a.checked)}function wb(a,b){return m.nodeName(a,"table")&&m.nodeName(11!==b.nodeType?b:b.firstChild,"tr")?a.getElementsByTagName("tbody")[0]||a.appendChild(a.ownerDocument.createElement("tbody")):a}function xb(a){return a.type=(null!==m.find.attr(a,"type"))+"/"+a.type,a}function yb(a){var b=pb.exec(a.type);return b?a.type=b[1]:a.removeAttribute("type"),a}function zb(a,b){for(var c,d=0;null!=(c=a[d]);d++)m._data(c,"globalEval",!b||m._data(b[d],"globalEval"))}function Ab(a,b){if(1===b.nodeType&&m.hasData(a)){var c,d,e,f=m._data(a),g=m._data(b,f),h=f.events;if(h){delete g.handle,g.events={};for(c in h)for(d=0,e=h[c].length;e>d;d++)m.event.add(b,c,h[c][d])}g.data&&(g.data=m.extend({},g.data))}}function Bb(a,b){var c,d,e;if(1===b.nodeType){if(c=b.nodeName.toLowerCase(),!k.noCloneEvent&&b[m.expando]){e=m._data(b);for(d in e.events)m.removeEvent(b,d,e.handle);b.removeAttribute(m.expando)}"script"===c&&b.text!==a.text?(xb(b).text=a.text,yb(b)):"object"===c?(b.parentNode&&(b.outerHTML=a.outerHTML),k.html5Clone&&a.innerHTML&&!m.trim(b.innerHTML)&&(b.innerHTML=a.innerHTML)):"input"===c&&W.test(a.type)?(b.defaultChecked=b.checked=a.checked,b.value!==a.value&&(b.value=a.value)):"option"===c?b.defaultSelected=b.selected=a.defaultSelected:("input"===c||"textarea"===c)&&(b.defaultValue=a.defaultValue)}}m.extend({clone:function(a,b,c){var d,e,f,g,h,i=m.contains(a.ownerDocument,a);if(k.html5Clone||m.isXMLDoc(a)||!gb.test("<"+a.nodeName+">")?f=a.cloneNode(!0):(tb.innerHTML=a.outerHTML,tb.removeChild(f=tb.firstChild)),!(k.noCloneEvent&&k.noCloneChecked||1!==a.nodeType&&11!==a.nodeType||m.isXMLDoc(a)))for(d=ub(f),h=ub(a),g=0;null!=(e=h[g]);++g)d[g]&&Bb(e,d[g]);if(b)if(c)for(h=h||ub(a),d=d||ub(f),g=0;null!=(e=h[g]);g++)Ab(e,d[g]);else Ab(a,f);return d=ub(f,"script"),d.length>0&&zb(d,!i&&ub(a,"script")),d=h=e=null,f},buildFragment:function(a,b,c,d){for(var e,f,g,h,i,j,l,n=a.length,o=db(b),p=[],q=0;n>q;q++)if(f=a[q],f||0===f)if("object"===m.type(f))m.merge(p,f.nodeType?[f]:f);else if(lb.test(f)){h=h||o.appendChild(b.createElement("div")),i=(jb.exec(f)||["",""])[1].toLowerCase(),l=rb[i]||rb._default,h.innerHTML=l[1]+f.replace(ib,"<$1>")+l[2],e=l[0];while(e--)h=h.lastChild;if(!k.leadingWhitespace&&hb.test(f)&&p.push(b.createTextNode(hb.exec(f)[0])),!k.tbody){f="table"!==i||kb.test(f)?""!==l[1]||kb.test(f)?0:h:h.firstChild,e=f&&f.childNodes.length;while(e--)m.nodeName(j=f.childNodes[e],"tbody")&&!j.childNodes.length&&f.removeChild(j)}m.merge(p,h.childNodes),h.textContent="";while(h.firstChild)h.removeChild(h.firstChild);h=o.lastChild}else p.push(b.createTextNode(f));h&&o.removeChild(h),k.appendChecked||m.grep(ub(p,"input"),vb),q=0;while(f=p[q++])if((!d||-1===m.inArray(f,d))&&(g=m.contains(f.ownerDocument,f),h=ub(o.appendChild(f),"script"),g&&zb(h),c)){e=0;while(f=h[e++])ob.test(f.type||"")&&c.push(f)}return h=null,o},cleanData:function(a,b){for(var d,e,f,g,h=0,i=m.expando,j=m.cache,l=k.deleteExpando,n=m.event.special;null!=(d=a[h]);h++)if((b||m.acceptData(d))&&(f=d[i],g=f&&j[f])){if(g.events)for(e in g.events)n[e]?m.event.remove(d,e):m.removeEvent(d,e,g.handle);j[f]&&(delete j[f],l?delete d[i]:typeof d.removeAttribute!==K?d.removeAttribute(i):d[i]=null,c.push(f))}}}),m.fn.extend({text:function(a){return V(this,function(a){return void 0===a?m.text(this):this.empty().append((this[0]&&this[0].ownerDocument||y).createTextNode(a))},null,a,arguments.length)},append:function(){return this.domManip(arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=wb(this,a);b.appendChild(a)}})},prepend:function(){return this.domManip(arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=wb(this,a);b.insertBefore(a,b.firstChild)}})},before:function(){return this.domManip(arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this)})},after:function(){return this.domManip(arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this.nextSibling)})},remove:function(a,b){for(var c,d=a?m.filter(a,this):this,e=0;null!=(c=d[e]);e++)b||1!==c.nodeType||m.cleanData(ub(c)),c.parentNode&&(b&&m.contains(c.ownerDocument,c)&&zb(ub(c,"script")),c.parentNode.removeChild(c));return this},empty:function(){for(var a,b=0;null!=(a=this[b]);b++){1===a.nodeType&&m.cleanData(ub(a,!1));while(a.firstChild)a.removeChild(a.firstChild);a.options&&m.nodeName(a,"select")&&(a.options.length=0)}return this},clone:function(a,b){return a=null==a?!1:a,b=null==b?a:b,this.map(function(){return m.clone(this,a,b)})},html:function(a){return V(this,function(a){var b=this[0]||{},c=0,d=this.length;if(void 0===a)return 1===b.nodeType?b.innerHTML.replace(fb,""):void 0;if(!("string"!=typeof a||mb.test(a)||!k.htmlSerialize&&gb.test(a)||!k.leadingWhitespace&&hb.test(a)||rb[(jb.exec(a)||["",""])[1].toLowerCase()])){a=a.replace(ib,"<$1>");try{for(;d>c;c++)b=this[c]||{},1===b.nodeType&&(m.cleanData(ub(b,!1)),b.innerHTML=a);b=0}catch(e){}}b&&this.empty().append(a)},null,a,arguments.length)},replaceWith:function(){var a=arguments[0];return this.domManip(arguments,function(b){a=this.parentNode,m.cleanData(ub(this)),a&&a.replaceChild(b,this)}),a&&(a.length||a.nodeType)?this:this.remove()},detach:function(a){return this.remove(a,!0)},domManip:function(a,b){a=e.apply([],a);var c,d,f,g,h,i,j=0,l=this.length,n=this,o=l-1,p=a[0],q=m.isFunction(p);if(q||l>1&&"string"==typeof p&&!k.checkClone&&nb.test(p))return this.each(function(c){var d=n.eq(c);q&&(a[0]=p.call(this,c,d.html())),d.domManip(a,b)});if(l&&(i=m.buildFragment(a,this[0].ownerDocument,!1,this),c=i.firstChild,1===i.childNodes.length&&(i=c),c)){for(g=m.map(ub(i,"script"),xb),f=g.length;l>j;j++)d=i,j!==o&&(d=m.clone(d,!0,!0),f&&m.merge(g,ub(d,"script"))),b.call(this[j],d,j);if(f)for(h=g[g.length-1].ownerDocument,m.map(g,yb),j=0;f>j;j++)d=g[j],ob.test(d.type||"")&&!m._data(d,"globalEval")&&m.contains(h,d)&&(d.src?m._evalUrl&&m._evalUrl(d.src):m.globalEval((d.text||d.textContent||d.innerHTML||"").replace(qb,"")));i=c=null}return this}}),m.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){m.fn[a]=function(a){for(var c,d=0,e=[],g=m(a),h=g.length-1;h>=d;d++)c=d===h?this:this.clone(!0),m(g[d])[b](c),f.apply(e,c.get());return this.pushStack(e)}});var Cb,Db={};function Eb(b,c){var d,e=m(c.createElement(b)).appendTo(c.body),f=a.getDefaultComputedStyle&&(d=a.getDefaultComputedStyle(e[0]))?d.display:m.css(e[0],"display");return e.detach(),f}function Fb(a){var b=y,c=Db[a];return c||(c=Eb(a,b),"none"!==c&&c||(Cb=(Cb||m("