From 8dc4ff6dd22b1603f33537ff03994cc63e658768 Mon Sep 17 00:00:00 2001 From: Dimitri van Heesch Date: Sun, 12 May 2013 13:04:34 +0000 Subject: Release-1.8.3.1-20130512 --- INSTALL | 4 +- Makefile.in | 2 +- README | 4 +- addon/doxywizard/expert.cpp | 9 +- addon/doxywizard/inputbool.cpp | 4 +- addon/doxywizard/inputint.cpp | 21 +- addon/doxywizard/inputint.h | 1 + addon/doxywizard/inputstring.cpp | 21 +- addon/doxywizard/inputstring.h | 1 + addon/doxywizard/inputstrlist.cpp | 3 +- configure | 24 +- doc/Doxyfile | 2 +- doc/changelog.doc | 1743 +++++++ doc/commands.doc | 6 +- doc/config.doc | 53 +- doc/doxygen.1 | 8 +- doc/doxygen_manual.tex | 2 +- doc/extsearch.doc | 7 - doc/language.doc | 4 +- doc/searching.doc | 3 +- doc/translator_report.txt | 30 +- jquery/Makefile | 42 + jquery/README | 16 + jquery/jquery-1.7.1.js | 9266 ++++++++++++++++++++++++++++++++++ jquery/jquery.ba-1.3-hashchange.js | 390 ++ jquery/jquery.scrollTo-1.4.2.js | 215 + jquery/jquery.ui-1.8.18.core.js | 319 ++ jquery/jquery.ui-1.8.18.mouse.js | 162 + jquery/jquery.ui-1.8.18.resizable.js | 808 +++ jquery/jquery.ui-1.8.18.widget.js | 272 + jquery/split_jquery.pl | 25 + qtools/Doxyfile | 9 +- src/cite.cpp | 12 +- src/clangparser.cpp | 315 +- src/clangparser.h | 44 +- src/classdef.cpp | 44 +- src/code.l | 97 +- src/commentscan.l | 81 +- src/condparser.cpp | 2 +- src/config.h | 30 +- src/config.l | 117 +- src/config.xml | 34 +- src/configgen.py | 2 + src/configoptions.cpp | 42 +- src/constexp.y | 2 +- src/dbusxmlscanner.cpp | 4 +- src/dbusxmlscanner.h | 6 +- src/defgen.cpp | 16 +- src/definition.cpp | 204 +- src/definition.h | 23 +- src/diagram.cpp | 2 +- src/dirdef.cpp | 53 +- src/docbookgen.cpp | 18 +- src/docbookvisitor.cpp | 2 +- src/docparser.cpp | 547 +- src/docparser.h | 6 +- src/doctokenizer.l | 10 +- src/dot.cpp | 64 +- src/dot.h | 2 - src/doxygen.cpp | 654 ++- src/doxygen.css | 5 +- src/doxygen.h | 1 - src/doxygen_css.h | 5 +- src/filedef.cpp | 424 +- src/filedef.h | 130 +- src/filename.cpp | 14 +- src/formula.cpp | 6 +- src/fortrancode.l | 3 + src/fortranscanner.h | 6 +- src/fortranscanner.l | 14 +- src/groupdef.cpp | 83 +- src/htags.cpp | 6 +- src/htmldocvisitor.cpp | 39 +- src/htmlgen.cpp | 2 +- src/htmlhelp.cpp | 2 +- src/index.cpp | 24 +- src/jquery_fx.js | 12 +- src/jquery_fx_js.h | 12 +- src/jquery_p1.js | 21 +- src/jquery_p1_js.h | 21 +- src/jquery_p2.js | 13 +- src/jquery_p2_js.h | 13 +- src/jquery_p3.js | 5 +- src/jquery_p3_js.h | 5 +- src/jquery_ui.js | 28 +- src/jquery_ui_js.h | 26 +- src/language.cpp | 4 +- src/latexdocvisitor.cpp | 10 +- src/latexgen.cpp | 14 +- src/layout.cpp | 16 +- src/libdoxygen.pro.in | 1 - src/libdoxygen.t.in | 3 + src/markdown.cpp | 46 +- src/markdown.h | 6 +- src/memberdef.cpp | 707 +-- src/memberdef.h | 18 +- src/memberlist.cpp | 39 +- src/message.cpp | 30 +- src/message.h | 1 + src/msc.cpp | 4 +- src/namespacedef.cpp | 54 +- src/outputgen.h | 2 +- src/outputlist.cpp | 48 +- src/outputlist.h | 12 +- src/pagedef.cpp | 8 +- src/parserintf.h | 25 +- src/perlmodgen.cpp | 28 +- src/pre.l | 75 +- src/printdocvisitor.h | 224 +- src/pycode.l | 2 + src/pyscanner.h | 6 +- src/pyscanner.l | 6 +- src/resize.js | 2 +- src/resize_js.h | 2 +- src/rtfdocvisitor.cpp | 2 +- src/rtfgen.cpp | 18 +- src/scanner.h | 6 +- src/scanner.l | 166 +- src/searchindex.cpp | 33 +- src/sqlite3gen.cpp | 2 +- src/tagreader.cpp | 80 +- src/tclscanner.h | 6 +- src/tclscanner.l | 10 +- src/textdocvisitor.cpp | 2 +- src/translator_adapter.h | 2 +- src/translator_ar.h | 392 +- src/translator_fi.h | 2 +- src/translator_kr.h | 119 + src/types.h | 13 + src/util.cpp | 98 +- src/util.h | 2 + src/vhdlcode.l | 2 +- src/vhdldocgen.cpp | 36 +- src/vhdlscanner.h | 6 +- src/vhdlscanner.l | 6 +- src/xmldocvisitor.cpp | 2 +- src/xmlgen.cpp | 30 +- 137 files changed, 16399 insertions(+), 2858 deletions(-) create mode 100644 doc/changelog.doc create mode 100644 jquery/Makefile create mode 100644 jquery/README create mode 100644 jquery/jquery-1.7.1.js create mode 100644 jquery/jquery.ba-1.3-hashchange.js create mode 100644 jquery/jquery.scrollTo-1.4.2.js create mode 100644 jquery/jquery.ui-1.8.18.core.js create mode 100644 jquery/jquery.ui-1.8.18.mouse.js create mode 100644 jquery/jquery.ui-1.8.18.resizable.js create mode 100644 jquery/jquery.ui-1.8.18.widget.js create mode 100644 jquery/split_jquery.pl diff --git a/INSTALL b/INSTALL index 54ef1f1..02f3338 100644 --- a/INSTALL +++ b/INSTALL @@ -1,7 +1,7 @@ -DOXYGEN Version 1.8.3.1-20130402 +DOXYGEN Version 1.8.3.1-20130512 Please read the installation section of the manual (http://www.doxygen.org/install.html) for instructions. -------- -Dimitri van Heesch (02 April 2013) +Dimitri van Heesch (12 May 2013) diff --git a/Makefile.in b/Makefile.in index 9183aec..606804f 100644 --- a/Makefile.in +++ b/Makefile.in @@ -82,7 +82,7 @@ pdf: docs DISTFILES = Doxyfile libmd5 addon tmake doc examples bin lib objects \ qtools src configure configure.bin Makefile.in Makefile.win_nmake.in \ Makefile.win_make.in INSTALL LANGUAGE.HOWTO LICENSE PLATFORMS \ - VERSION packages winbuild + VERSION packages winbuild jquery archive: clean tar zcvf dx`date +%y%m%d`.tgz $(DISTFILES) diff --git a/README b/README index e0063f7..a002402 100644 --- a/README +++ b/README @@ -1,4 +1,4 @@ -DOXYGEN Version 1.8.3.1_20130402 +DOXYGEN Version 1.8.3.1_20130512 Please read INSTALL for compilation instructions. @@ -26,4 +26,4 @@ forum. Enjoy, -Dimitri van Heesch (dimitri@stack.nl) (02 April 2013) +Dimitri van Heesch (dimitri@stack.nl) (12 May 2013) diff --git a/addon/doxywizard/expert.cpp b/addon/doxywizard/expert.cpp index cf33192..e7b7507 100644 --- a/addon/doxywizard/expert.cpp +++ b/addon/doxywizard/expert.cpp @@ -270,11 +270,18 @@ QWidget *Expert::createTopicWidget(QDomElement &elem) child = elem.firstChildElement(); while (!child.isNull()) { + QString setting = child.attribute(SA("setting")); QString dependsOn = child.attribute(SA("depends")); QString id = child.attribute(SA("id")); - if (!dependsOn.isEmpty()) + if (!dependsOn.isEmpty() && + (setting.isEmpty() || IS_SUPPORTED(setting.toAscii()))) { Input *parentOption = m_options[dependsOn]; + if (parentOption==0) + { + printf("%s has depends=%s that is not valid\n", + qPrintable(id),qPrintable(dependsOn)); + } Input *thisOption = m_options[id]; Q_ASSERT(parentOption); Q_ASSERT(thisOption); diff --git a/addon/doxywizard/inputbool.cpp b/addon/doxywizard/inputbool.cpp index 62fcf62..9e28852 100644 --- a/addon/doxywizard/inputbool.cpp +++ b/addon/doxywizard/inputbool.cpp @@ -43,6 +43,8 @@ void InputBool::setEnabled(bool b) { m_enabled = b; m_cb->setEnabled(b); + m_lab->setEnabled(b); + updateDefault(); updateDependencies(); } @@ -69,7 +71,7 @@ void InputBool::setValue( bool s ) void InputBool::updateDefault() { - if (m_state==m_default) + if (m_state==m_default || !m_lab->isEnabled()) { m_lab->setText(QString::fromAscii("")+m_id+QString::fromAscii(" +class NoWheelSpinBox : public QSpinBox +{ + protected: + void wheelEvent(QWheelEvent *e) + { + e->ignore(); + } +}; + InputInt::InputInt( QGridLayout *layout,int &row, const QString & id, int defVal, int minVal,int maxVal, @@ -24,7 +33,7 @@ InputInt::InputInt( QGridLayout *layout,int &row, : m_default(defVal), m_minVal(minVal), m_maxVal(maxVal), m_docs(docs), m_id(id) { m_lab = new HelpLabel(id); - m_sp = new QSpinBox; + m_sp = new NoWheelSpinBox; m_sp->setMinimum(minVal); m_sp->setMaximum(maxVal); m_sp->setSingleStep(1); @@ -56,7 +65,14 @@ void InputInt::setValue(int val) m_val = val; m_sp->setValue(val); m_value = m_val; - if (m_val==m_default) + updateDefault(); + } +} + +void InputInt::updateDefault() +{ + { + if (m_val==m_default || !m_lab->isEnabled()) { m_lab->setText(QString::fromAscii("")+m_id+QString::fromAscii("setEnabled(state); m_sp->setEnabled(state); + updateDefault(); } QVariant &InputInt::value() diff --git a/addon/doxywizard/inputint.h b/addon/doxywizard/inputint.h index a6a87ed..846b7c2 100644 --- a/addon/doxywizard/inputint.h +++ b/addon/doxywizard/inputint.h @@ -56,6 +56,7 @@ class InputInt : public QObject, public Input void showHelp(Input *); private: + void updateDefault(); QLabel *m_lab; QSpinBox *m_sp; int m_val; diff --git a/addon/doxywizard/inputstring.cpp b/addon/doxywizard/inputstring.cpp index 9e0a0e1..36fe319 100644 --- a/addon/doxywizard/inputstring.cpp +++ b/addon/doxywizard/inputstring.cpp @@ -19,6 +19,16 @@ #include +class NoWheelComboBox : public QComboBox +{ + protected: + void wheelEvent(QWheelEvent *e) + { + e->ignore(); + } +}; + + InputString::InputString( QGridLayout *layout,int &row, const QString & id, const QString &s, StringMode m, const QString &docs, @@ -30,7 +40,7 @@ InputString::InputString( QGridLayout *layout,int &row, if (m==StringFixed) { layout->addWidget( m_lab, row, 0 ); - m_com = new QComboBox; + m_com = new NoWheelComboBox; layout->addWidget( m_com, row, 1, 1, 3, Qt::AlignLeft ); m_le=0; m_br=0; @@ -95,7 +105,13 @@ void InputString::setValue(const QString &s) { m_str = s; m_value = m_str; - if (m_str==m_default) + updateDefault(); + } +} +void InputString::updateDefault() +{ + { + if (m_str==m_default || !m_lab->isEnabled()) { m_lab->setText(QString::fromAscii("")+m_id+QString::fromAscii("setEnabled(state); if (m_br) m_br->setEnabled(state); if (m_com) m_com->setEnabled(state); + updateDefault(); } void InputString::browse() diff --git a/addon/doxywizard/inputstring.h b/addon/doxywizard/inputstring.h index 741f55d..ab2c8e2 100644 --- a/addon/doxywizard/inputstring.h +++ b/addon/doxywizard/inputstring.h @@ -72,6 +72,7 @@ class InputString : public QObject, public Input void help(); private: + void updateDefault(); QLabel *m_lab; QLineEdit *m_le; QToolBar *m_br; diff --git a/addon/doxywizard/inputstrlist.cpp b/addon/doxywizard/inputstrlist.cpp index 2e6e624..23c20ff 100644 --- a/addon/doxywizard/inputstrlist.cpp +++ b/addon/doxywizard/inputstrlist.cpp @@ -141,6 +141,7 @@ void InputStrList::setEnabled(bool state) m_lb->setEnabled(state); if (m_brFile) m_brFile->setEnabled(state); if (m_brDir) m_brDir->setEnabled(state); + updateDefault(); } void InputStrList::browseFiles() @@ -222,7 +223,7 @@ void InputStrList::update() void InputStrList::updateDefault() { - if (m_strList==m_default) + if (m_strList==m_default || !m_lab->isEnabled()) { m_lab->setText(QString::fromAscii("")+m_id+QString::fromAscii("(release date 20-01-2013) + +

Changes

+
    +
  • Changed to way the search results for multiple projects can be linked + together. A project is now no longer identified by the tag files name but + via new option EXTERNAL_SEARCH_ID giving a bit more flexibility. +
  • Disabled the disk cache for member data. Allows removing quite some complexity + in doxygen and is not really needed now that 64bit systems with >4GB RAM + are becoming more common. Let me know if you think you benefit from this caching. +
  • id 691607: Using $relpath$ in a custom footer could lead to ambiguities + when followed by a name that could also be a marker, like 'search'. + Now $relpath^ should be used instead. $relpath$ is still supported for + backward compatibility. +
+

New features

+
    +
  • You can now use EXTENSION_MAPPING on files without any extension using + no_extension as placeholder (thanks to Jason Majors for the patch). +
  • To make navindex section inside a layout file that links to + a specific URL you can use usergroup with the url attribute. +
  • To make navindex section without any link inside a layout file you + can use usergroup with special title [none]. +
+

Bug fixes (ids refer to the bugzilla database)

+
    +
  • id 644350: Fortran: Included patch to improve parsing line continuation + characters. +
  • id 645423: Fortran: added support for protected attribute +
  • id 682550,691315: When using @copydoc, paragraphs breaks did not appear + in the copied documentation. +
  • id 686581: Fortran: handle single quotes in normal Fortran comment. +
  • id 686689, 691335: Scope of forwardly declared template class was lost + in the output. +
  • id 689713: Tcl: Inline source code was not rendered correctly. +
  • id 690787: Fixed case were a cyclic inheritance relation could crash + doxygen. +
  • id 690831: Using @subpage in a -# style list was not handled properly. +
  • id 691000: For a mainpage without title the project name is now shown as + the title in the XML output. +
  • id 691277: The generated list of citations is now no longer included in + the tag file. +
  • id 691073: Documenting strongly typed enum values outside of the enum + did not work. +
  • id 691310: Python: = was missing in the output for variable assignment. +
  • id 691323: Doxygen could crash when creating inline msc graphs. +
  • id 691340: Members didn't have a More.. link to jump to detailed docs. +
  • id 691602: Doxygen did not probably distinguish between two template +
  • id 691798: regression: C++ style comments that started with a line of + slashes did not get processed correctly anymore. +
  • id 692031: Fixed parse error when left shift operator occurred as a + default parameter. + members or functions that only differ in the return type. +
  • Setting SEARCH_INCLUDES to NO resulted in no include graphs and no + include files being listed in the output. +
  • Improved support for MinGW (thanks to a patch by Brecht Sanders). +
  • Removed the Graphviz/dot dependency when building the doxygen + documentation. +
  • Anchors to sub pages were wrong in the XML output. +
  • Included VHDL patch by Martin Kreis that improves the flow chart + generation. +
  • corrected several code pages and fontsets for proper RTF output for + a number of languages such as Greek. +
+\endhtmlonly +\subsection log_1_8_3 Release 1.8.3 +\htmlonly + +(release date 26-12-2012) +

Changes

+
    +
  • Expanding the tree in an index page of the HTML output, will now + expand only one level instead of the whole sub-tree (thanks to + Pez Cuckow for the patch). +
  • A blockquote in Markdown does no longer require a whitespace + after the last '>' if the '>' is followed by a newline. +
  • id 682718: Included patch to add version info to all generated + template files (headers, footers, stylesheets, layout files, etc). +
+

New features

+
    +
  • Added support for using external tools to index and search through + the HTML documentation. An example index tool is provided (doxyindexer) + and an example search engine (doxysearch.cgi). + To configure the external search engine the following new options + are added to the configuration file: EXTERNAL_SEARCH (to enable the + feature), SEARCHENGINE_URL (to specify the URL of the search engine), + SEARCHDATA_FILE (to specify the name of the raw search data to index), + EXTRA_SEARCH_MAPPINGS (for search through multiple projects). + See the manual for details. +
  • Added USE_MDFILE_AS_MAINPAGE config option to select a markdown page to + be used as the main page. +
  • id 630645: This patch (contributed by Albert) adds support for + simple logic expressions for \cond, \if, and friends, i.e. you can do + \if (SOME_SECTION_NAME && (!THIS_ALTERNATIVE || THAT_ALTERNATIVE)) +
  • id 684152: Patch (contributed by Albert) adds a new configuration + option MATHJAX_FORMAT to select the MathJax output format. Options are + HTML-CSS, NativeMML, or SVG. +
+

Bug fixes

+
    +
  • id 670853: Fixed compile issues with 0 to QCString cast for + old compilers. +
  • id 678139: A class A deriving from another class B inside a namespace + not known to doxygen, caused class B to appear in the global scope. +
  • id 681209: Fixed problem processing .bib files when they were located + in a path containing spaces. +
  • id 681830: Using \addindex in a page will now produce a link to the + word, instead of the start of the page. +
  • id 681831: The TREEVIEW_WIDTH option did not have any effect. +
  • id 681898: Jumping from a level 3 section to a level 1 section did + not appear correctly in the page TOC. +
  • id 681976: C++11: Improved handling of noexcept expressions, e.g.: + Test() noexcept ( noexcept(T::T()) ) = default; +
  • id 682048: Improved SIGINT handling when running multiple dot instances. +
  • id 682602: Fixed problem processing .bib files when using a non default + output directory. +
  • id 682713: Comment for IDL_PROPERTY_SUPPORT in the config file template + did not have line wrapping. +
  • id 682728: Setting SHOW_FILES to NO prevented call graphs from being + generated. +
  • id 682740: Fortran: In initialization statement the "=" was missing +
  • id 683284: Fortran: ALIASes where not replaced in !! and !< comments. +
  • id 683976: Added meta tag "generator" to HTML output (thanks to + Albert for the patch). +
  • id 684781: Sections of the main page did not appear in the + navigation tree until the main page had sub pages. + Also fixed bug in treeview that caused mainpage with title and + sections to appear at the same level as the sections. +
  • id 685125: Doxygen could select the wrong overloaded method when + the only difference in parameter types was the template type of + a typedef. +
  • id 685181: Inheriting member documentation did not work in combination + with Java interfaces. +
  • id 685623: Enum values did not appear in the detailed documentation + when using C++11 style enums. +
  • id 685879: Even though HIDE_UNDOC_MEMBERS was enabled, the navigation + still showed undocumented members. +
  • id 685940: Fixed back button behaviour when using the navigation tree. +
  • id 686284: Added anchors to refs in the index.qhp TOC. +
  • id 686826: Added XML declaration to index.qhp TOC. +
  • id 686956: When a class and its base class has the same nested class, + the collaboration diagram could point to the wrong class. +
  • id 686983: Comments inside a function macro parameter appeared before + the expanded macro, instead of being treated as part of the parameter. +
  • id 687301: Allow minus in the name of a HTML attribute. +
  • id 687572: Code fragments were wrapped too early in the latex output. +
  • id 688226: Fixed Qt version number in ./configure --help text. +
  • id 688463: Included patch to prevent processing identifiers starting + with _ or __ as markdown. +
  • id 688531: Horizontal ruler inside paragraph caused missing </p> +
  • id 688542: Using "usergroup" in the layout.xml caused missing <div> +
  • id 688739: Fixed problem with user defined entries in the eclipse help + index (thanks to Rene Papenhoven for the fix). +
  • id 688647: Fixed problem parsing initializer list with C++11 style + uniform types. +
  • id 689341: \if around list item preceded by whitespace caused wrong + list in the output. +
  • id 689461: Correct link in documentation of SIP_SUPPORT option. +
  • id 689720: Fixed bug that could prevent refman.tex from being generated. +
  • id 689833: Fixed missing space in Chinese translation. +
  • id 690093: Files added via HTML_EXTRA_STYLESHEET did not correct refer + to files that where placed in a subdirectory. +
  • id 690190: Searching for multibyte characters did not work with the + server based search engine. +
  • id 690250: Fixed case where line numbers got out of sync with the code. +
  • id 690341: First member of an anonymous C++11 style enum was not shown + properly. +
  • id 690385: Fixed case where _'s where falsely converted to Markdown + emphasis. +
  • id 690403: Title not used when \ref'ing to a \section imported via + a tag file. +
  • id 690418: Behavior of @cond was accidentally reversed by new expression + parser. +
  • id 690602: Fixed problems handling @cond inside /// comments. +
  • id 690629: Fixed case where doxygen would during preprocessing. +
  • id 690685: A file specified using HTML_EXTRA_STYLEHSHEET did not end + up in the Qt Help index. +
  • Improved the way enum's are rendered in the HTML output. +
  • When inlining structs (INLINE_SIMPLE_STRUCTS=YES) a <p> was missing + for members with a detailed description, causing invalid XHTML. +
  • Fixed problem loading the navigation tree when using .xhtml as the + file extension. +
  • The navigation tree was not always correctly positioned upon initial + load when using Chrome. +
  • HTML Navigation tree showed static members even when EXTRACT_STATIC was + set to NO. +
  • Same word could appear multiple times in the match list for an entry + in the search results when using server based search. +
+\endhtmlonly +\subsection log_1_8_2 Release 1.8.2 +\htmlonly + +(release date 11-08-2012) +

Changes

+
    +
  • Using a fenched block (~~~~) in Markdown without explicit extension will + now be interpreted as a @code..@endcode block instead + of @verbatim..@endverbatim. +
  • Classes inheriting from an class that is outside the scope of doxygen + are still shown in diagrams. This does not hold for usage relations. +
+

New features

+
    +
  • Added support for C++11: +
      +
    • strongly typed enums, e.g.: +
      enum class E
      +
    • enums with explicit type, e.g.: +
      enum E : unsigned int { ... }
      +
    • id 678097: added support for final keyword on classes and methods. +
    • support for override keyword for methods. +
    • nullptr is new a type keyword in code fragments. +
    • support for variables with initializer lists, + e.g.:
      const int var {10};
      +
    • support for trailing return types, + e.g.:
      auto foo() -> Bar;
      +
    • id 672372: added support for template aliases, + e.g.:
      template<typename T> using A = B<T>;
      +
    • support for C++11 variadic templates, + e.g.:
      template<typename... Values> class C;
      +
    • support for documenting template class declarations. +
    • id 680098: static_assert(...); inside a class is now ignored. +
    • id 679740: Add support parameters with default lambda functions, + e.g.:
      int foo(int i, std::function<int(int)> f = [](int x) -> int { return x / 2; })
      +
    • default initializers for non-static data members, + e.g.:
      class C { public: int x = 4; int y {6}; int z = y*func(); };
      +
    • support for decltype as a way selecting a type for a variable, + e.g.:
      int x; decltype(x) y;
      +
    • support for new string literals, + e.g.
      u8"utf8", u"utf-16", U"utf-32", L"wchar"
      +
    • support for raw string literals (with and without user defined + delimiter), + e.g.
      R"(some"thing)", u8R"raw(some)"thing)raw"
      +
    • support for explictly deleted and defaulted special members + (=default and =delete). +
    +
  • Made several improvements to the way Objective-C categories and protocols + are handled: +
      +
    • Class extensions are now treated as part of the class, whereas + categories are listed separately. +
    • Fixed parse problem where category had a { } section. +
    • Fixed parse problem for categories that implemented protocols. +
    • Fixed render bug for protocols in class diagrams. +
    • Attributes with the same name as a method are now no longer matched. +
    • Internal properties are now also marked with [implementation] +
    • Members of categories are shown in the class they extend as well, and + cross reference links are made between these members. +
    • Class extension implementing protocols are now shown as protocols + inherited by the class itself, including the "Implemented by" relation. +
    +
  • Added option HTML_EXTRA_STYLESHEET which allows adding an additional + stylesheet without completely replacing doxygen.css. +
  • Added option AUTOLINK_SUPPORT which can be used to enable/disable + autolinking globally. +
  • Included language updates for Czech, Spanish, Greek, Slovak, and + Esparanto. +
+

Bug fixes

+
    +
  • Fixed render glitch where template member of a base class was not + properly hidden in the derived class. +
  • Privately nested classes no longer appear in the declaration section + of their parent if EXTRACT_PRIVATE is disabled. +
  • In the declaration section the separator line was in between the + member and its brief description. +
  • Fixed a couple of compiler warning with the new XCode 4.4 compiler. +
  • Added compilation support for Mountain Lion (Mac OS X 10.8). +
  • id 679631: Nested namespaces did not appear in the namespace list if the + parent namespace was undocumented. +
  • id 680227: Fixed some spelling errors in the code comments. +
  • id 680398: Fortran: comma at begin of argument list description in + case of implicit type +
  • id 680405: Fortran: Entities on line with USE, ONLY were not hyperlinked + in code. +
  • id 680408: Fortran: handle carriage return in non terminated strings. +
  • id 680492: Using Markdown formatting in @todo/@bug/.. like descriptions + did not work. +
  • id 680575: Fixed potential crash when <code> appeared inside <summary> + for C# code. +
  • id 680697: \xrefitems of the same type are not grouped together under + the same heading (just like \todo and friends). +
  • Fixed case where full directory path was shown even though + FULL_PATH_NAMES was set to NO. +
  • id 680709: HTML output of template-derived classes contained unescaped + characters. +
  • id 679963: "Class Index" appeared twice in the PDF TOC, Index at the + end did not appear at all. +
  • In a declaration no link was created when referring to a class inside + an undocumented namespace imported via a tag file. +
  • id 681281: Make default for TAB_SIZE 4 and added remark in Markdown + section of the manual about the effect of TAB_SIZE on code block + processing when using tabs in the comment block. +
  • id 681023: Project logo was not included in the Qt help output. +
  • id 680992: Fixed a couple of typos in the comments. +
  • id 681350: Fixed a problem with Markdown processing of a @code block + inside an indented /// style comment. +
  • id 679928: Disabled section level correction for Markdown pages as + is was confusing. +
+\endhtmlonly +\subsection log_1_8_1_2 Release 1.8.1.2 +\htmlonly + +(release date 12-07-2012) +

Changes

+
    +
  • doxygen now strips the leading indentation shared by the lines in a + @code..@endcode block. +
  • id 678218: Changed title of the SVG graphs from 'G' to the root node + of the graph. +
+

New features

+
    +
  • Added button in the navigation tree to allow enabling/disabling + syncing the navigation tree with the content. +
  • Extended the number of HTML entities with Greek letters and other + symbols (thanks to Charles Karney for the patch). +
  • id 663645: Added support for C++11 strongly typed enums + (enum class E { ... }). +
+

Bug fixes

+
    +
  • id 590518: Added missing class member initialization to a + class in doxmlparser and made the library compile again. +
  • id 667678: Added support for Obj-C property attribute "unsafe_retained". +
  • id 674842,676984: Unmatched quote in a comment prevented alias expansion. +
  • id 676019: Fixed another case where local include path did not appear + correctly in the class documentation. +
  • id 676966: Fortran: Some keyword were not colored in the source view. +
  • id 676981: Fortran: Argument type was wrong type of in case of out of + place !> comment +
  • id 677935: Included patch to fix problem compiling for x86 release on + Windows. +
  • id 677992: Section without title could result in an invalid Qt Help + index. +
  • id 678022: Anonymous enum could result in an invalid Qt Help index. +
  • id 678102: Superfluous trailing comma in javascript + prevented navigation tree to load in IE7. +
  • id 678177: a + at the start of a line inside a <pre> block, + triggered the start of a list. Also -- and --- where not kept untouched + inside a <pre> block. +
  • id 678180: ndash (--) appearing in a brief description could lead + to invalid SVG images. +
  • id 678288: -- and --- inside a Markdown code block were not handled + properly. +
  • id 679331,675766: In body documentation with a different indentation then the + main documentation was not rendered correctly (MARKDOWN=YES). +
  • id 679436: Using an escaped pipe symbol in a Markdown table did not get + unescaped in the output. +
  • id 679533: Code fragments did not appear properly in the doxygen manual. +
  • id 679615: Added missing delete call in a piece of debugging code. +
  • id 679626: Fixed some navigation issues in the manual +
  • Not all inherited members appeared in the "Additional inherited members" + list. +
  • Link to call after "Inherited members" was not correct when + CREATE_SUBDIRS was enabled. +
  • New VHDL diagram was not generated if the path contained spaces. +
  • Fixed a couple of problems handling Objective-C categories. +
+\endhtmlonly +\subsection log_1_8_1_1 Release 1.8.1.1 +\htmlonly + +(release date 10-06-2012) +

Changes

+
    +
  • Integrated the root navigation tree in navtree.js for faster loading. +
  • When the navigation tree is enabled, clicking jump to a line in + the source code view will now highlight the line. +
+

New features

+
    +
  • VHDL code now has a new Design Overview page (thanks for Martin Kreis + for the patch). Requires HAVE_DOT=YES, and DOT_IMAGE_FORMAT=svg. +
  • id 677678: Added support for strong and weak attributes in Objective-C + properties. +
+

Bug fixes

+
    +
  • id 618462: Fortran: Appearance of comments in the HTML output + are now customizable via CSS again. +
  • id 673660: <code> inside a <summary> or <remarks> section is now treated + as @code (was already the code for C#). +
  • id 673921: When a comment started at indent >= 4 after a /** and + continued at the same indent without leading * after a blank line, + the continued part appeared at as a code block when Markdown was enabled. +
  • id 675036: If a file was not indexed, the navigation tree became empty. +
  • id 676019: Include path using quotes did not work as documented. +
  • id 676877: @warning did not end at blank line when followed by + a numbered list. +
  • id 676902: An anonymous namespace could introduce an invalid entry in + the navigation list. +
  • id 676948: Breadcrumb navigation path had wrong links when + CREATE_SUBDIRS was enabled. +
  • id 677315: Fixed case where function was incorrectly detected as a + variable. +
  • id 677589: Fixed typo in the documentation of the LAYOUT_FILE option. +
  • id 677771: Fixed visual misalignment for first argument. +
  • The "arrow out" button in interactive SVG did not work when + served from a web server, due to the use of an absolute path. +
  • If a declation was too wide for a page, the content in HTML spilled + over the boundary of its box, which looked ugly. +
  • Empty lines in a code fragment were collapsed. +
  • Navigation tree entries of the hierarchy appeared under class index as + well. +
  • Grouped globals and enum values were not added to the navigation index. +
  • Inlined class were not properly shows in the navigation index. +
  • Documented class in undocumented namespace did not show up in + class list and navigation tree. +
  • ALLEXTERNALS=YES did not show all external classes in the class list. +
  • External reference via URL did not work for new + "Additional Inherited Members" section + inherited from class link. +
  • Objective-C protocols and C# generics were not index and listed + properly in the navigation tree and indices. +
  • Undocumented files could produce a broken link in the navigation tree. +
  • Additional Inherited Members could turn up empty of all members of + the inherited class were grouped and SUBGROUPING was set to NO. +
+<\endhtmlonly +\subsection log_1_8_1 Release 1.8.1 +\htmlonly + +(release date 19-05-2012) +

Changes

+
    +
  • Changed the way indexes (Class,File,Namespace,Groups) are rendered: +

    + There are now shown in a uniform way in the HTML output as a tree. + Trees can be expanded and collapsed interactively + (this makes USE_INLINE_TREES obsolete). +

    + The class list now also shows namespaces and nested classes. + The file list now also shows directories (this makes SHOW_DIRECTORIES + obsolete). +

    + Member sections are now each rendered in a separate table. + This makes the HTML_ALIGN_MEMBERS option obsolete. +

    +Note: If you use a custom header for the HTML output (HTML_HEADER) +make sure you add the following: +

    +<script type="text/javascript" src="$relpath$jquery.js"></script>
    +<script type="text/javascript" src="$relpath$dynsections.js"></script>
    + Otherwise the interactivity of the trees does not work. +

    + +

  • Included a couple of performance improvements (thanks to Dirk Reiners) +
  • Changed the way member attributes (like protected, virtual, and static) + are rendered in the HTML output. +
  • Changed the look of the source code output. +
  • Included language updates for Chinese, Czech, German, Esperanto, + Italian, Slovak, Spanish, Hungarian, and Polish. +
  • Syntax highlighing in source code fragments is no longer dependent + on LATEX_SOURCE_CODE being set to YES. +
  • Added natural scrolling for tablet devices (like the iPad) + when using the treeview. +
  • For interactive SVGs the print button has been replaced by a + "arrow out" button that opens the original non-interactive SVG in a + new window for easy printing or saving. +
  • id 661499: Long names are now wrapped in the dot nodes to avoid + very wide graphs. +
+

New features

+
    +
  • id 666527: Added support for <inheritdoc/> C# XML command + (thanks to John Werner for the patch). +
  • id 670965, Added support for resolving environment variables of the + form $(PROGRAMFILES(X86)) inside the config file +
  • Doxygen now shows Objective-C properties in collaboration diagrams + (thanks to Sven Weidauer for the patch). +
  • Added ability to search for group or page titles. +
  • Inherited class members are now shown as expandable sections in the + member overview (default is collapsed). Each section is rendered as + a table. +
  • id 674349: Included build support for NetBSD. +
  • A -- will now be rendered as an 'en dash', similarly, --- will produce an + mdash. +
+

Bug fixes

+
    +
  • id 523156: Fortran: Prefix of routines got stripped. +
  • id 666088: Include VHDL patch (thanks to Martin Kreis). +
  • id 670235: Fixed include guard detection problem when using + #pragma once +
  • id 670805: A numbered list (1. 2. 3.) where each list item ended with + an empty line is no longer treated as a set of separate lists (all + starting with 1.). +
  • id 670889: Java: last enum value did not appear in the output unless it was + followed by a comma. +
  • id 671023, 671312: Regression: Autolist items starting on a new paragraph + at indent level larger than 0 were not processed correctly. +
  • id 671076: Sections could be missing from the navigation tree in + some situations. +
  • id 671158: @tableofcontents did not work for the main page (@mainpage) +
  • id 671159: Sections in a separate markdown page did not appear in the + table of contents. +
  • id 671166: Fortran: Fixed problem causing call/caller graphs not to be + generated. +
  • id 671171: RPM spec file was updated to make it work with RHEL 6.2 + (thanks to Peter Klotz for the patch) +
  • id 671240: Corrected line number of error message reported for + pages. +
  • id 671291: C# regression: enum values where not shown in the docs. +
  • id 671395: When #some_member appeared at the start of a line it was + seen as a level one header instead of a link to a member when + Markdown processing was enable. Now at least one space is required + after the # to make it a header. +
  • id 671426: Fixed case where doxygen could crash when a section and + subsection had the same label. +
  • id 671591: docset creating could fail due to invalid Nodes.xml +
  • id 671702: Using \internal in a group or member did not hide it + from the navigation tree if there was no documentation. +
  • id 671709: Backticks in C# comments did not appear as inline + fragments, like was the case for other languages. +
  • id 672119: PHP: defines are now shown as constants rather than enums. +
  • id 672662: File with .md or .markdown extension were not included + with the default setting of FILE_PATTERNS. +
  • id 672366: mailto style URLs did not work correctly in combination with + CREATE_SUBDIRS = YES. +
  • id 672472: Removed bogus </b> when using @par. +
  • id 672475: Added "warning:" prefix to "missing \endcode" message. +
  • id 672479: Doxygen comments after a macro definition were not + removed in the source browser view. +
  • id 672526: Removed black line in front of custom paragraphs. +
  • id 672536: PHP: use keyword was not handled correctly when importing + classes from another namespace. +
  • id 672620: Switched to using "Macro" in the output instead of "Define". +
  • id 672656: Using ![caption](filename.png) did not work correctly for + local images pointed to with IMAGE_PATH. +
  • id 673045: A block of ///'s inside a verbatim block inside a .md + file was replaced by /** .. */ +
  • id 673066: Doxygen now skips scanning files in directories starting with + a dot (e.g. .svn). +
  • id 673219: Included patch by Ryan Schmidt to make the Mac versions + in qglobal.h match that of Apple header files. +
  • id 673870: Added C++11 classes when BUILTIN_STL_SUPPORT is enabled. +
  • id 673983: Using a backslash in a section cause 026E30F to appear in the + latex TOC. +
  • id 674563: Fortran: case sensitiveness for routines and functions + did not work +
  • id 674583: Fortran: continuation by ampersand not placed in code output. +
  • id 675757: Fixed indenting issue after the end of a markdown code block + inside a list. +
  • id 676116: Use new index style for page index. +
  • id 676294: Fixed LaTeX error when backslash appeared in a hyperlinked + code fragment. +
  • Tag files had wrong character encoding set in the header. +
  • C# in/out did not appear in generics using covariance or contravariance. +
  • When marker of an alias appeared at the end of the alias text it was + not expanded. +
  • Aliases did not work in Markdown files. +
  • Fixed some problems with the navigation tree for IE9 and Opera. +
  • Included patch by Jake Colman to make the configgen.py work with older + Python version such as 2.4.3. +
  • Fixed problem parsing \code{.py}...\endcode +
  • UML_LIMIT_NUM_FIELDS did not work correctly in all cases. +
  • Setting SORT_GROUP_NAMES to YES, had no effect on child groups within + a group. +
+\endhtmlonly +\subsection log_1_8_0 Release 1.8.0 +\htmlonly + +(release date 25-02-2012) +

Changes

+
    +
  • Auto list items can now consist of multiple paragraphs. + The indentation of the (first line) of a new paragraph detemines + to which list item the paragraph belongs or if it marks the end of the + list. +
  • When UML_LOOK is enabled, relations shown on the edge of a graph + are not shown as attributes (conform to the UML notation) +
  • Updated the manual and improved the look. +
  • Made the contents in the navigation tree more consistent for + groups, pages with subpages, and grouped subpages. +
  • id 669079: Latex: made the margins of latex page layout smaller using + the geometry package. +
  • The tool doxytag has been declared obsolete and is removed + (it wasn't working properly anyway). Same goes for the installdox + script. +
  • Updated the copyright in source code and doxywizard "about" to 2012. +
  • id 668008: HTML version of the manual now has the treeview enabled + for easier navigation. +
+

New features

+
    +
  • Added support for + Markdown + formatting. + This is enabled by default, but can be disabled by + setting MARKDOWN_SUPPORT to NO. When enabled the following is + processed differently: +
      +
    • tabs are converted to spaces according to TAB_SIZE. +
    • blockquotes are created for lines that start with one or more >'s + (amount of >'s detemine the indentation level). +
    • emphasis using *emphasize this* or _emphasis this_ or + strong emphasis using **emphasis this**. Unlike classic + Markdown 'some_great_indentifier' is not touched. +
    • code spans can be created using back-ticks, i.e. `here's an example` +
    • Using three or more -'s or *'s alone on a line with only spaces + will produce a horizontal ruler. +
    • A header can be created by putting a ===== (for h1) or ----- (for h2) + on the next line or by using 1 to 6 #'s at the start of a line + for h1-h6. +
    • auto lists item can also start with + or * instead of only - +
    • ordered lists can be made using 1. 2. ... labels. +
    • verbatim blocks can be produced by indenting 4 additional spaces. + Note that doxygen uses a relative indent of 4 spaces, not an + absolute indent like Markdown does. +
    • Markdown style hyperlinks and hyperlink references. +
    • Simple tables can be created using the Markdown Extra format. +
    • Fenced code blocks are also supported, include language selection. +
    • files with extension .md or .markdown are converted to related pages. +
    + See the section about Markdown support in the manual for details. +
  • It is now possible to add user defined tabs or groups of tabs to + the navigation menu using the layout file (see the section of the manual + about customizing the output for details). +
  • Added new command \tableofcontents (or [TOC] if you prefer Markdown) + which can be used in a related page with sections to produce a + table of contents at the top of the HTML page (for other formats the + command has no effect). +
  • When using SVG images and INTERACTIVE_SVG is enabled, a print icon + will be visible along with the navigation controls to facilitate + printing of the part of the graph that is visible on screen. +
  • Added obfuscation of email addresses for the HTML output to make + email harvesting more difficult. +
  • Added build targets for 64 bit Windows (thanks to Vladimir Simonov). + The installer script is also updated to install a 64 bit version of + doxygen on 64 bit systems and the 32 bit version on 32 bit systems. +
  • Added support for using the HTML tag <blockquote> in comments. +
  • Included patch by Gauthier Haderer that fixes some issues with the + dbus XML parser. +
  • Added support for Markdown style fenced code blocks. +
  • Added option to @code command to force parsing and syntax highlighting + according to a particular language. +
  • Section of pages are now added to the navigation index. +
  • Added support for cell alignment and table header shading in + LaTeX and RTF output. +
  • Added -d filteroutput option to show the output of an input filter + (thanks to Albert for the patch). +
  • id 668010: Latex: for Windows doxygen new generates a makepdf.bat + file in the latex output dir to create the latex documentation. +
+

Bug fixes

+
    +
  • id 498703: Fixed encoding issue in CHM index file for group titles. +
  • id 510975: FORTRAN: Keywords like .GT. recognized as symbols for + cross ref. +
  • id 511906, 581303, 622749: \copydoc did copy the brief description + into the detailed section, causing a difference between the original + and the copy. +
  • id 555327: Using @ref for an example file, caused it to appear as + file::ext. +
  • id 567494: Fortran: Included patch for blockdata sub-programs. +
  • id 628417: Fortran: doxygen filter, preparsing fixed form of null +
  • id 662286: TCL: Inlcuded patch to fixed UTF-8 support. +
  • id 662289: TCL: Included patch to prevent ##### from appearing in the + output. +
  • id 646319: Using a file name with path for HTML_STYLESHEET caused the + path to appear in the HTML output. +
  • id 664826: Fixed one more problem with include guard detection. +
  • id 665629: Fixed parse problem when a #define appeared inside an enum. +
  • id 665855: Fixed problem parsing C++ template specialization of the + form A<func(T*)> such as used in boost::signal2 types. +
  • id 666047: A </p> followed by an htmlonly..endhtmlonly section + caused invalid XHTML output. +
  • id 666085: Fixed include handling in case the include guard was + documented. +
  • id 666124: Fixed problem loading the navigation tree in IE8 when + serving pages via a web server. +
  • id 666337: Included patch to avoid hypenation hints in front of the + first captial in a word. +
  • id 666568: When SHOW_FILES was NO, a grouped function did not appear + in the javascript based search index. +
  • id 666909: \copybrief introduced extra spacing in the HTML output. +
  • id 666986: Fixed case where search engine specific code appeared + twice in the HTML output. +
  • id 666993: Fixed bug in the generated makefile causing index not + to be generated when using pdflatex. +
  • id 667020: HTML output for example pages was not well-formed. +
  • id 667192: Include statements in latex output where placed all on + one line in the LaTeX output. +
  • id 667835: PHP: Fixed problem handling heredoc blocks +
  • id 667844: For aliases with a single argument it is no longer required + to escape commas that appear inside the argument text. +
  • id 668037: Latex: tables can now span multiple pages by using the xtab + package. +
  • id 668218: Doxygen will ignore the common prefix shared by all + directories when computing a names for the directory's output files. + This will make the names of the output more stable. +
  • id 668519: Added missing newline in man page output. +
  • id 669071, 669072: Fixed parse problem for Q_PROPERTY when a template + with a namespaced type was used. +
  • id 669078: Included patch which changes MATHJAX_RELPATH to use the + content delivery network by default. +
  • id 669138: Fortran: Fixed problem handling multiple definition + statements on one line. +
  • id 669406: Using -d Preprocessor now also works when QUIET is YES. +
  • id 669434: Latex: citations where only generated properly if the + bib files specified via CITE_BIB_FILES did not have a path. +
  • id 669758: Tcl: Same function in multiple Tcl namespaces not added. +
  • id 670289: Fixed case where doxygen would not correctly detect + >> as a termination of a nested template. +
  • id 670571: subpages generate empty pages in latex/rtf output and + broken links when SHORT_NAME was set to YES. +
  • Included VHDL fixes provided by Martin Kreis. +
  • The word "dummy" wrongly appeared before the first parameter type in + the LaTeX output for an Objective-C method. +
  • Fixed several small glitches in the tree view javascript code. +
  • Included a patch by Vladimir Simonov to make it possible to compile + doxygen with Visual Studio 2005. +
  • Fixed some typos in the manual (thanks Albert). +
+\endhtmlonly +\section log_1_7 Release 1.7 +\htmlonly + +

Doxygen Release 1.7.6.1

+

(release date 10-12-2011)

+

Changes

+
    +
  • Doxygen now reports its cache usage (for the symbol and the + lookup cache) at the end of a run (if QUIET=NO), and recommends + settings for SYMBOL_CACHE_SIZE and LOOKUP_CACHE_SIZE for your + project if either cache is too small. +
+

New features

+
    +
  • Added new option LOOKUP_CACHE_SIZE to control the internal cache + doxygen uses to find symbols given their name and a context. +
  • Python: added support for @staticmethod +
+

Bug fixes

+
    +
  • Python: scopes are now shown with . instead of :: +
  • id 665313: Space before @if was not preserved, causing problems + with inline @if .. @endif constructs. +
  • id 665583: Fixed XHTML validity problem when using mscgen graphs. +
  • id 665641: Fixed XHTML validity problem when GENERATE_TREEVIEW was + disabled. +
  • id 665720: Included patch to fix hang issue when non-empty + INCLUDE_PATH was used. +
  • id 665778: Fixed parse issue when a comma appeared as part of an + enum's value. +
+ +

Doxygen Release 1.7.6

+

(release date 03-12-2011)

+

Changes

+
    +
  • To improve the performance of loading the navigation tree, + the data is now split into multiple javascript files which + are loaded dynamically. +
  • The selected member is now briefly highlighted in the HTML output + (when GENERATE_TREEVIEW is enabled). +
  • The navigation tree (GENERATE_TREEVIEW) now shows the same information + as the index. +
  • The navindex section of layout now also controls what is shown in + the navigation tree. +
  • Improved HTML output support for IE9. +
  • Included redesigned VHDL parser (thanks to Martin Kreis for the patch) +
  • When a class/structs has many (>15) members of the same type, only + the first 10 are shown in the UML diagram. +
  • Made the output of the javascript based search engine more compact. +
+

New features

+
    +
  • Update of the French translation. +
  • id 607305: Added support for PHP heredoc and nowdoc constructs. +
  • Added support for cross-referencing in case of operator-> overloading. + This includes support for std::auto_ptr,std::smart_ptr,std::unique_ptr + and std::weak_ptr when BUILTIN_STL_SUPPORT is enabled. +
+

Bug fixes

+
    +
  • Regression: some information was no longer available for a class, + due to accidental deletion of a code block. +
  • Regression: fixed matching problem in the code parser. +
  • Included fixes for TCL to support commands with \ and command + definitions preceded by whitespace (thanks to Rene Zaumseil) +
  • When using "static int a,b" variable "b" incorrectly appeared in the + output even though EXTRACT_STATIC was set to NO. +
  • id 521717: .spec file was only updated after running ./configure +
  • id 656642: Fixed potential crash when using doxygen for large projects. +
  • id 656878: Fixed problem running bibtex with \cite command on Windows. +
  • id 657152: Fixed constant expression evaluation error in the + preprocessor. +
  • id 652277: Removed bogus ' from the man page output. +
  • id 659244: Quotes in the brief description could appear unescaped in + the tooltip. +
  • id 641336: #includes with ../ were not always processed correctly. +
  • Fixed potential crash when INLINE_GROUPED_CLASSES and INLINE_SIMPLE_STRUCTS + are set to YES. +
  • id 658896: Fixed preprocessor problem handling #defines whose value was + a constant string containing ///. +
  • id 660332: Using a \ at the end of a comment line could cause + parsing problems for C# as the \ was treated as a line continuation. +
  • id 658033: Fixed parser problem when using multiple member groups + inside a macro definition. +
  • id 503239: Fixed several issues related to \cite handling. +
  • id 658587: Improved the way macro definitions are collected. +
  • id 660501: Fixed LaTeX error when using \name with a description. +
  • id 661292: The documentation for \mainpage incorrectly mentioned that + one has to use \ref main in case GENERATE_TREEVIEW was set to YES, which + is no longer the case. +
  • id 659096: Nested aliases definitions where not always expanded properly + (regression w.r.t version 1.7.4) +
  • id 658038: Fixed preprocessor problem where the @ character inside a + macro definition could appear as @@. +
  • id 658646: Fixed problem running mscgen for LaTeX and RTF output. +
  • id 661723: Using ClassName%'s did not work anymore, and also + ClassName's wasn't autolinked. +
  • id 662044: Fixed potential printing of null pointer when using + a version filter that returned blanks. +
  • id 625518: Fortran: first problem where subroutine using results + variable appeared as a function. +
  • id 654153: If an URL appeared at the end of a sentence, the period + was included in the URL. +
  • id 656560: Fortran: Added support for the Double Complex type. +
  • id 663640: Included workaround for Solaris CC issue in index.cpp +
  • id 662190: Included patch to fix some TCL issues and add the TCL_SUBST + configuration option. +
  • id 661672: Fortran: Added support for ALIAS expansion in comment blocks. +
  • id 663101: Fixed case where a macro was not corrected found in the header + file when it could only be found via INCLUDE_PATH. +
  • id 664718: using multiple <para>'s inside a <summary> block caused + text to be joined without spacing. +
  • id 656556: Java enums are now parsed as classes. +
  • id 664826: Fixed problem in the preprocessor regarding the handling + of include guards. +
  • id 664893: Fixed typo in the docs for EXCLUDE_SYMLINKS. +
  • id 665466: Using a relative URL with <a href> did not work when + CREATE_SUBDIRS was enabled. +
  • id 665464: Using an absolute URL with <img> did not work when + CREATE_SUBDIRS was enabled. +
+ +

Doxygen Release 1.7.5.1

+

(release date 21-08-2011)

+

New features

+
    +
  • Update of the French translation. +
+

Bug fixes

+
    +
  • id 521717: .spec file was only updated after running ./configure +
  • id 656642: Fixed potential crash when using doxygen for large projects. +
  • id 656878: Fixed problem running bibtex with \cite command on Windows. +
  • Regression: some information was no longer available for a class, + due to accidental deletion of a code block. +
  • Regression: fixed matching problem in the code parser. +
+ +

Doxygen Release 1.7.5

+

(release date 14-08-2011)

+

Changes

+
    +
  • id 641904: Function in the call graphs are now shown based on first + appearance rather then alphabetical order. +
  • id 616213: When customizing the HTML header $title now only generates + the title excluding the project name (which can still be added using + $projectname) +
  • Improved the look of the class index: all items now have equal spacing. +
+

New features

+
    +
  • New option INTERACTIVE_SVG which when set to YES in combination + with DOT_IMAGE_FORMAT=svg will make doxygen + generate interactive SVG diagrams that support zooming and + panning via the mouse (only for large graphs). +
  • Added support for the Tcl programming language + (thanks to Rene Zaumseil and Samuel Bentley for the patch). +
  • Added @copyright command. +
  • added option MATHJAX_EXTENSIONS to provide additional extensions for + MathJax (thanks to David Munger for the patch). +
  • added option INLINE_SIMPLE_STRUCTS which when enabled shows the fields + of simple classes and structs (with only public data fields) as a table + and inline in context (file/group/namespace/class) provided this context + is documented. +
  • When using the server based search engine (SEARCHENGINE=YES and + SERVER_BASED_SEARCH=YES) doxygen now advertises a opensearch provider + for your project, that allows integrating the search directly in + the search field of the browser (thanks to Phil Lello for the patch). +
  • id 503239: Added new option CITE_BIB_FILES and LATEX_BIB_STYLE and a new + command \cite, allowing you to make references to literature (as defined + in one or more .bib files). This also works for output formats other + than LaTeX. The tool bibtex is required for this to work though. Thanks + to David Munger for the initial patch upon which this feature is based. +
  • PHP namespaces are now shown as A\B in the output. +
  • Added new \snippet command that can be used to include marked + sections from a source file. See + http://www.doxygen.org/commands.html#cmdsnippet for more info. +
  • Added translation support for Armenian, thank to Armen Tangamyan. + and included translation updates for a number of languages. +
+

Bug fixes

+
    +
  • Fixed a couple of potential race conditions found by Helgrind while + running dot from multiple threads. +
  • Graphs did not appear when enabling both INTERACTIVE_SVG and + HTML_DYNAMIC_SECTIONS. +
  • PDFs generated by newer versions of dot (i.e. 2.28) did not appear + in the output, because doxygen failed to extract the bounding box. +
  • Improved call graph and cross-reference support for Python. +
  • INTERACTIVE_SVG now also works with IE9 if the html file extension is + set to xhtml. +
  • Fixed several cases where the LaTeX output could produce too long + lines. +
  • id 318061: Putting two functions in the same group that only + different in the number of template arguments did not work. +
  • id 437346,564614: Fixed proper encoding of multibyte output in RTF + depending on the code page (thanks to Hirao for the patch). +
  • id 521717: The .spec file in the source distribution did not get + updated to the latest version. +
  • id 521861: Fortran: Continuation character was not recognised in + fixed format code. +
  • id 522496: Fortran: @param checking was not case insensitive. +
  • id 560105: Fixed problem combining @cond with preprocessor directives. +
  • id 577359: Using "struct A : C, D {};" showed a private inheritance + relation for D. +
  • id 584194: Some links to typedef where pointing to the typedef'ed + class instead. +
  • id 619560: Anonymous enums caused an invalid entry in the LaTeX TOC. +
  • id 622935: Deriving from an unknown template class could cause the + class to appear with a -g postfix in C# +
  • id 625731: Fortran: Fixed issue handling private subroutines. +
  • id 632946: LaTeX now starts a new page when starting a new module. +
  • id 634837: Fortran: Prefix of function was overwritten and the word + 'function' not specified. +
  • id 637099: Fortran: Included fix for using collaboration diagrams. +
  • id 642468: Added PHP support for namespace with curly braces. +
  • id 643219: Fortran: Improved handling of semicolons. +
  • id 643617: Fortran: Added support for "type is". +
  • id 643944: A macro added to a group appeared twice in the group + documentation if was also made related to a class using \relates. +
  • id 646321: Fixed problem were the search box was missing when using + a custom HTML header. +
  • id 646447: Fixed unterminated img tab in the XHTML output. +
  • id 646463: Fixed problem handling MSCFILE_DIRS option with multiple + paths. +
  • id 646533: Included patch to sort overloaded members by appearance in + the code. +
  • id 646747,646879: Putting an autolist inside a @todo, @bug or similar + section did not work anymore. +
  • id 646922: Referring to a logo with a relative path, caused + a broken image target when using a custom HTML header. +
  • id 647499: Fixed HTML rendering problem on older browsers when + GENERATE_TREEVIEW was enabled. +
  • id 647768: Linking to a section on the main page could result in a + broken link when GENERATE_TREEVIEW was enabled. +
  • id 647889: Fixed invalid warning when using @deparated method with + default values for parameters. +
  • id 648302: A function made related using @relates could end up in + the wrong class if there was already a method with a matching + argument list in that other class. +
  • id 649103: Return types containing multiple *'s ended up in the + output with only one * in some cases. +
  • id 650397: Fixed problem with alias substitution if the alias had + more then 9 parameters. +
  • id 650430: For nested anonymous structs @xx markers could appear in + the output. +
  • id 650463: Added compilation support for MacOSX 10.7 (aka Lion). +
  • id 650958: Fixed issue printing HTML pages when the + GENERATE_TREEVIEW option is set to YES. +
  • id 651611: Fixed broken link to an undocumented namespace. +
  • id 652138: Fixed potential crash while parsing Fortran code. +
  • id 652188: Fixed problem parsing comment which included + an unterminated alias within quotes (i.e. "\word{") +
  • id 652277: Lines starting with . did not appear in the man page output. +
  • id 652389: Fortran: Fixed text is detailed function section. +
  • id 652396: When enabling INTERACTIVE_SVG wide graphs are now also + fit to the screen width. +
  • id 652695: Added missing space between parameter type and name in + the RTF output. +
  • id 652741: Use background-color instead of background in doxygen.css. +
  • id 653344: Fixed potential segfault while creating man pages. +
  • id 653666: Fortran: add a space to "type" in argument list. +
  • id 653801: Fixed problem handling include guard when multiple + blocks guarded by the same guard were used in a header file. +
  • id 653963: Fortran: Unified handling of @params at various places. +
  • id 654108: make clean failed on a system without qmake. +
  • id 654244: Fixed compile issue for HP Itanium. +
  • id 654779: Fortran: Interface was seen as a class with constructor / + destructor. +
  • id 654869: Using the word "property" as a type in C caused wrong + results. +
  • id 654866: Fortran: fixed issue parsing function type that looked like + C function pointers. +
  • id 655178: Fortran: Fixed parse issue when using variable name + starting with the word interface. +
  • id 655591: Improved error handling for empty html style list. +
  • id 655935: Fixed case where %s could end up in a warning messge. +
  • id 656005: Methods of Objective-C categories defined in an .m file are + now marked as private. +
+ +

Doxygen Release 1.7.4

+

(release date 28-03-2011)

+

Changes

+
    +
  • doxygen -w html now reads the default Doxyfile even if not specified + explicitly +
  • doxygen -w html now produces a template header and footer that can + be used independent of the configuration options used. +
+

New features

+
    +
  • New option INLINE_GROUPED_CLASSES that when enabled shows grouped + classes inside the group documentation, instead of on a separate page. +
  • Included updates for the Italian and Russian translation. +
  • id 640875: Added option HTML_EXTRA_FILES which makes it easier to copy + additional files to the HTML output and also add them to the index files. +
  • id 642579: Included patch that adds new LATEX_FOOTER option to + customize the end of refman.tex in the LaTeX output. +
+

Bug fixes

+
    +
  • id 140259: Jumping to a @section did not work in the RTF output. +
  • id 521854: Fortran: included patch for supporting multiple argument + declarations on one line. +
  • id 521861: Fixed problem with line continuation in Fortran. +
  • id 566921: %A::B now prevents a link for A::B, instead of only for A + and generating a warning that ::B cannot be linked. +
  • id 598481: Fortran: Added support for extends keyword. +
  • id 618374: Added support for inlining code in the VHDL output. +
  • id 625519: Fortran: argument name starting with a reserved word was + not handled properly. +
  • id 634415: Fixed problem parsing an array of character literals. +
  • id 635537: Links to file members were not made when found in tag files. +
  • id 638637: The Doxyfile documentation contained some very long lines. +
  • id 638655: Double quote in page or group title broke treeview. +
  • id 638733: Improved documentation for DOT_IMAGE_FORMAT option. +
  • id 638829: Added documentation to warn for consequences of using + HTML_HEADER. +
  • id 638856: Fixed problem autolinking to struct field using #S::a +
  • id 639272: using @dot...@endot produced an image referenced with + absolute path. +
  • id 639521: \mscfile did not work properly for LaTeX output. +
  • id 639716: Fixed problem where #include's could cause phantom __pad__ + members to appear in the output (appeared on Windows only). +
  • id 640259: Options PROJECT_LOGO and PROJECT_BRIEF were missing + from the manual. +
  • id 640463: Fixed problem parsing PHP "use" statement when the argument + did not have a namespace scope. +
  • id 640588: Included fix for proper splitting of multiple arguments + given to the QHP_CUST_FILTER_ATTRS option. +
  • id 640646: Long error messages could cause memory corruption. +
  • id 640742: XML: switched indent option to no in the combine.xslt script. +
  • id 640754: Comment with XML style list of type table was not rendered + properly. +
  • id 640822: Added support for overloading of C# indexer operators. +
  • id 640828: Internal section marked with @internal was not shown as + such anymore in the XML output. +
  • id 640847: PHP: Fixed parse problem referring to class in global + namespace. +
  • id 640924: Included patch by Haffmans to make the custom header and + footer independent of the chosen config options. +
  • id 640927: Included fix to prevent a warning in the server side PHP + search script. +
  • id 641026: Included patch to fix broken hyperlink to page entry + in xreflists. +
  • id 641188: Header of \page was wrong in Man page output. +
  • id 641336: #include's to other directories were not always linked. +
  • id 641673: Using "use Foo\Foo;" in PHP could cause doxygen to hang. +
  • id 641814: In some cases the HTML output could contain an extra </p>. +
  • id 642030: Tooltips with HTML entities could be wrongly truncated. +
  • id 642475: Include graphs could be incomplete. +
  • id 643056: Fixed problem with macro expansion. +
  • id 643279: Fixed potential crash when generating a warning for + void f(int %x) style parameter, which is valid in C++/CLI. +
  • id 643280: Included patch to enabled LargeAddressAware for Windows + builds. +
  • id 643276: Fixed cases where FILE_VERSION_FILTER was called for + dummy files with name "generated". +
  • id 643655: Fixed argument matching issue when one of match candidates + was a typedef of a method pointer. +
  • id 645754: mscfile tag was closed with dotfile in the XML output. +
  • doxygen -w html now ignores the values for HTML_HEADER and HTML_FOOTER + found in the config file. +
  • Importing a group via a tag file could overrule a local group with + the same name even when EXTERNAL_GROUPS was disabled. +
+ +

Doxygen Release 1.7.3

+

(release date 03-01-2011)

+

Changes

+
    +
  • Added a header for each HTML page above the navigation menu, + showing the project name and logo and a short descriptin (all optional). + Disabling the index (with DISABLE_INDEX) still shows the new header + (you can still customize this using HTML_HEADER). This now works + nicely in combination with GENERATE_TREEVIEW = YES and/or + SEARCH_ENGINE = YES. +
  • Redesigned the treeview feature. Instead of using frames, the + navigation tree is now loaded on each page dynamically. This allows + bookmarking a page and always keeps the top menu visible. Also the + current item is automatically highlighted in the tree. + Also updated the icons in the treeview to match the overall look'n'feel. + Note: if you now use a custom HTML header, please update it using + doxygen with the -w and the edit the default header. +
+

New features

+
    +
  • id 499544: Added SVG support to doxygen's dot output + (setting DOT_IMAGE_FORMAT to svg now works as expected) +
  • Added control to the wizard to configure the color of the output + visually. +
  • Added options to specify project synopsis and select a + project logo to the wizard. +
  • Added option PROJECT_LOGO which can be used to specify an image + which will be shown in the header of each HTML page along with + the project name (PROJECT_NAME option). +
  • Added option PROJECT_BRIEF which can be used to specify a brief + description which will be shown in the header of each HTML page + just below the project name. +
  • Added new option FILTER_SOURCE_PATTERNS which can be used + in combination with FILTER_SOURCE_FILES to filter files used for + the source browser based on file extension, which can overwrite + the filter set by FILTER_PATTERNS and/or INPUT_FILTER. +
  • Added new option STRICT_PROTO_MATCHING which is disabled by default, + and makes the parameter matching to be less strict, resulting in + fewer "No matching class member found" warnings. +
+

Bug fixes

+
    +
  • id 306076: code blocks with using directives did not get hyperlinked. +
  • id 313527: enum values with bitfields did not get parsed correctly. +
  • id 565715,630582: Included a patch that fixes a couple of Fortran issues + (thanks to Albert). +
  • id 615507: Fixed problem handling @cond..@endcond in Fortran code. +
  • id 619040: Scope was missing in Tokens.xml when using docsets. +
  • id 625517,523156: Applied patch tp avoid stripping prefixes for Fortran + subroutines. +
  • id 626476: allow label before end statement in Fortran +
  • id 630901: </see> was not handled properly in comment block. +
  • id 632311: Fixed potential crash for empty verbatim section. +
  • id 632426: closing brace of a function with one parameter has wrong + color in HTML. +
  • id 632543: Added support for Fortan TYPEs with languge bindings. + (thanks to a patch by Daniel Franke) +
  • id 632879: An explicit link request such as #blah did not longer produce + a warning if no symbol named blah was found. +
  • id 633891: warnings in "inbody" documentation were shown with "unknown" + file name. +
  • id 634116: Titles customized via the layout file did not appear in + the title page and navigation tree, only in the top menu. +
  • id 634600: Fixed problem resolving typedef. +
  • id 634775: Fixed a problem were // inside a code block got removed. +
  • id 634857: Added support for escaping :: by using \:: (or @::) +
  • id 634962: #include with relative path to parent dir did not get + hyperlinked. +
  • id 634986: Removed double definition of docParamName in compound.xsd. +
  • id 635198: C++/CLI Finalizer methods were not parsed properly. +
  • id 636475: Objective-C method names can now be used as the + the first argument of \ref. +
  • id 636588: Fixed a couple of problems in the compound.xsd schema used + for XML output. +
  • id 636598: DISTRIBUTE_GROUP_DOC now works again for enum values. +
  • id 636947: Improved matching of typedef'ed array parameter and non + typedef'ed array parameter. +
  • id 637610: Added a number of fixed for Fortran interfaces. +
  • id 637712: Handle files with the .for extension as Fortran. +
  • id 637987: Fixed error in the grouping documentation. +
  • Fixed line number sync problem when using Objective-C #import + statements. +
  • Fixed problem handling /** @cond */ in the preprocessor. +
  • Member groups could get reordered in the output. +
+ +

Doxygen Release 1.7.2

+

(release date 09-10-2010)

+ +

Changes

+
    +
  • Changed the default font of the LaTeX output to helvetica. +
  • Changed the way parameters and return values are represented in the + LaTeX and RTF output. They are now listed using tables. +
+

New features

+
    +
  • added support for Apple's block object extension for C/Obj-C/C++. +
  • added support for detecting Python constructors and destructors. +
  • id 624575: Added \endinternal command that can be used to force + the end of a section started with \internal. +
  • id 552605: Added parsing support for PHP 5.3+ style namespaces. +
  • id 582532: added \mscfile command which can be used to insert a + message sequence chart given a .msc file. + Also added a new config option MSCFILE_DIRS to provide directories + were msc files are searched (Thanks to Adrien for the patch). +
  • Added support for type specifiers for documenting PHP parameters, + format: "@param type $paramname docs" +
  • Added support for rendering formulas in the HTML output + using MathJax instead of using prerendered bitmaps. + For this purpose the options USE_MATHJAX and MATHJAX_RELPATH were + added. +
+

Bug fixes

+
    +
  • id 306076: Fixed case where using of a namespace did not work inside + an example. +
  • id 336053,487871: /// were not stripped from formulas and \dot..\enddot +
  • id 563698: dropped support for a4wide paper format for LaTeX, since + it is on the LaTeX taboo list. +
  • id 571014: Behaviour of CLASS_DIAGRAM=NO in combination with + HAVE_DOT=YES, was not propely documented. +
  • id 576291: Python comments for next class or method could end up in + code of a method/class when enabling INLINE_SOURCES. +
  • id 611174: Fixed problem handling nestes classes in Python. +
  • id 621733: removed unexpected warnings about undocumented return types +
  • id 622737: Undefined function macros could cause constant expression + errors. +
  • id 622780: updated copyright statement in PDF docs. +
  • id 622935: C# generics appeared with -g extension in the output in + some situations. +
  • id 623023: Fixed parsing problem for "int &foo1(),&foo2();" +
  • id 623052: Link to destructor was wrong in the member index. +
  • id 623424: Fixed problem where struct description gets added to variable + of struct type. +
  • id 623673: Anchors were missing in the Qhp index for members. +
  • id 623733: Fixed potential crash due to uninitialized line number. +
  • id 623765: closed.png was wrongly linked when GENERATE_SUBDIRS and + HTML_DYNAMIC_SECTIONS were enabled. +
  • id 624014: Function macro was not handled properly when there was + a line continuation directly after the name. +
  • id 624095: Linking to a class via a tag file did not work if the class + was in an undocumented namespace. +
  • id 624104: Fixed a couple of typos in lodepng.h +
  • id 624323: Graph legend image was missing form the index files. +
  • Fixed a number of typos in the config file documentation + (thanks to Jens Schweikhardt) +
  • id 624514: Some enums were not cross-referenced. +
  • id 624829: Missing \endcond could cause preprocessor issues in + next file(s) to be parsed. +
  • id 625070: a function definition in a namespace, documented in the + header did not always get cross-referenced. +
  • id 625296: Removed superfluous <td></td> from parameter list in + HTML output. +
  • id 625317: Unterminated comment could crash doxygen. +
  • id 625531: Inherited documentation was only included for the + last derived class in case of multiple inheritance. +
  • id 625578: In the HTML output </div> was missing for built-in + class diagrams. +
  • id 625555: References in example files with underscores were wrong. +
  • id 625982: When using japanese characters mixed with ascii characters + doxygen incorrected ended the brief description with a dot. +
  • id 625952: setting MULTILINE_CPP_IS_BRIEF to YES, cause /// to appear + in the output. +
  • id 626033,567774: EXTENSION_MAPPING did not work if a the mapped + language was handled by the same parser as used for the original + extension. +
  • id 626175: Fixed bracket bug in LaTeX fancy headers. +
  • id 626508: Allow hyphen in key argument of \xrefitem. +
  • id 626647: \copydoc did not work for array type arguments (e.g. int[]). +
  • Use \dotfile did not produce the correct map file, so URLs in dot + files did not work. +
  • id 627371: #define's in files only found via INCLUDE_PATH were not + correctly handled. +
  • id 628065: auto brief description ending with .) cause the ) to + end up in the detailed part. +
  • id 628242: Fixed encoding issue for the Spanish translation. +
  • id 628678: Fixed segmentation fault in case of very long errors. +
  • id 629040: Fixed type in search page of the documentation. +
  • id 629182: Fixed problem detecting include guard. +
  • id 629270: Made file extension to parser mapping case insensitive. +
  • id 629485: Latex makefile clean target used rm command also for Windows. +
  • id 629942: the EXCLUDE_SYMBOLS option was missing form the online docs. +
  • id 631094: \htmlinclude and \verbinclude ended the brief description. +
  • id 631380: Inconsistent behaviour when a brief description was given + following by a detailed comment block with JAVADOC_AUTOBRIEF enabled. +
  • Fixed a number of typos in the documentation + (thanks to Albert van der Meer) +
  • Fixed potential hangup when scanning directories defined as + symlinks to absolute paths. +
  • HTML attributes other than src were not copied for the <img> tag. +
+ +

Doxygen Release 1.7.1

+

(release date 25-06-2010)

+

Changes

+
    +
  • id 621695: Made warning and error messages appear with lower case + "warning:" and "error:" prefix to make it easier to use the messages + from Visual Studio. +
+

New features

+
    +
  • id 621908: Added new config option FORMULA_TRANSPARENT which allows + selecting between transparent (YES) or non-transparent (NO) PNGs for + formulas in the HTML output. +
  • Update for Turkish translation. +
+

Bug fixes

+
    +
  • id 533821: Inheritance relation for a C# class deriving from + a generic class was not handled correctly. +
  • id 554638: Changing DOT_IMAGE_FORMAT did not cause the graphs to be + regenerated. +
  • id 576533: A field of the form "enum E *p" was ignore. +
  • id 597016: Hide scope name was not working properly for todo items + inside class members, where the class was inside a namespace. +
  • id 617761: In dot graphs now also @ref worked (previously only \ref was + supported). +
  • id 621653: Fixed error when compiling doxygen for Solaris 8. +
  • id 621733: Removed bogus warning about undocument return type for + define when WARN_NO_PARAMDOC was enabled. +
  • id 621780: Fixed parsing support for a function that returns a + struct definition. +
  • id 621785: Doxygen could hang when using \copydoc in a function with + \param. +
  • id 621805: Using //!< after a #define no longer worked. +
  • id 621854,622219,622593: html help compiler (and also the Qt + help compiler) was called before all dot images were generated. +
  • id 621984: Using a auto-list in combination with \subpage cause the + items to be inlined. +
  • id 622018: Fixed problem parsing a @param command where the + text part started with a formula. +
  • id 622019: Added some instructions how to document Fortran code. +
  • id 622041: Using \var multiple times in a comment block did not + work properly. +
  • id 622413: Tooltips could get wrongly truncated when multi-byte + UTF-8 characters were used. +
  • id 622471: Argument matching failed for typedef in another namespace. +
  • Fixed crash situation while handling commands inside a @ref section. +
  • Treeview icons were missing in the HTML output when setting + GENERATE_TREEVIEW to NO and USE_INLINE_TREES to YES. +
+ + +

Doxygen Release 1.7.0

+

(release date 15-06-2010)

+

Changes

+
    +
  • Changed the look of the HTML output. +
  • Made several internal changes that should have a positive effect on the + overall performance. +
+

New features

+
    +
  • The color of the HTML output can now easily be adjusted using three new + options: HTML_COLORSTYLE_HUE, HTML_COLORSTYLE_SAT, + and HTML_COLORSTYLE_GAMMA, which control respectively the hue, + saturation, and gamma of all elements in the HTML output. +
  • Moved dot invocations to the end of a doxygen run. Doxygen will now + run multiple instances of dot in parallel (for better CPU utilisation + on multi-core systems). The new config option DOT_NUM_THREADS + determines the number of threads used (were 0 is auto-detect). +
  • Added option EXT_LINKS_IN_WINDOW which controls whether or not + links to symbols imported via tag files will be opened in a new window. +
  • Included various language updates (thanks to Petr for coordinating). +
  • Included patch by Stefan Oberhumer that allows customizing the + way parameter lists are shown in the LaTeX output. +
+

Bug fixes

+
    +
  • id 306076: source browser could miss links for used namespaces. +
  • id 361476,620924: \if and \endif did not work properly inside auto lists. +
  • id 557164: No warning for missing return type documentation even though + WARN_NO_PARAMDOC was set to YES. +
  • id 577005: Handling of nesting \defgroup's was not always working + properly. +
  • id 578739: ø was not translated correctly in the LaTeX output. +
  • id 583526: Use relative paths for mscgen diagrams to avoid errors in the + LaTeX output. +
  • id 592991: The "Use current settings at startup" feature of Doxywizard + was broken. +
  • id 593679: Links in the search results were broken if they pointed to + symbols imported via tag files using an absolute path or URL. +
  • id 593760,615682: Fixed man page output problem when using @par. +
  • id 594021: A C comment before a #endif caused the preprocessor + statement to be ignored. +
  • id 597013: When HIDE_SCOPE_NAMES was enabled also the scope for + nested classes was stripped. Now only the namespace scope will be + stripped as before. +
  • id 600829: Autolinks to namespace members did not work if + an explicit # or :: was used. +
  • id 602732: Slashes inside strings in java annotations were not handled + properly. +
  • id 606335: Fixed the "show html output" button in doxywizard + for Windows when IE was set as the default browser. +
  • id 608292: Formatting was lost for section copied with \copydoc. +
  • id 608359: Fixed C++ parse issue for "class : public base {} var;" + construct. +
  • id 611056: Generated HTML footer file did not have UTF-8 encoding and + the relative path marker needed when using CREATE_SUBDIRS = YES. +
  • id 611193: Fixed parsing problem with try-functions having multiple + catch handlers. +
  • id 611642: Specialized private template member function appeared as + public. +
  • id 611888: Include dependency graphs were sometimes wrong. +
  • id 612170: Some lines in the generated Doxyfile where too long. +
  • id 612275: Fixed auto-link problem for certain URLs. +
  • id 612292: Improved handling of ellipsis inside brief description when + JAVADOC_AUTOBRIEF is enabled. +
  • id 612364: Accessibility of macros was not handled properly in all cases. +
  • id 612310: Enabling REFERENCED_BY_RELATION without SOURCE_BROWSER could + result in broken links. +
  • id 612458: Fixed problem handling @copydoc for function operators. +
  • id 612609: A raw C# string constant could end up in the next string. +
  • id 612969: subpages were not part of the XML output. +
  • id 613024: First list item in the paragraph after a @todo + item was not parsed properly. +
  • id 614204: Generated man page links were having a heading underscore. +
  • id 614443: Made include guard detect a bit more strict to avoid false + positives. +
  • id 614447: The labels of CVS tags were missing a colon. +
  • id 614438: Fixed problem parsing Q_PROPERTY with template type and + spaces. +
  • id 615165: Made the date string in the HTML footer translatable, + along with some other sentences on the directory pages. +
  • id 612858: Inline attribute was shown also for non-inline template + members. +
  • id 615583: Fixed problem handling @copy for operators with + const qualifier. +
  • id 615755: Fixed problem handling '"' inside comments. +
  • id 615957: Made the LaTeX output a bit less spatious using \input. +
  • id 615695: Fixed preprocessor issue where a macro that was redefined + was not resolved. +
  • Fixed character encoding issue on the search results page. +
  • id 615670: C# namespaces are now extracted also without comment block + (the language spec does not allow XML documentation). +
  • id 616209: included patch that fixes some typos in the code. +
  • id 616344,610604: Pages with an underscore in the label generated a + file name containing two underscores. +
  • id 616387: text of the form something.symbol got autolinked when + symbol had a global scope. +
  • id 616761: Call graph could be wrong when local variable has the same + name as a global function. +
  • id 616947: Added documentation patch on how to create URL links with + custom text. +
  • id 616988: Doxywizard now removes non-existant files from the + recent list and has an option to clear the list completely. +
  • id 617051: A macro defined via PREDEFINED did not always overrule a + macro definition in the code. +
  • id 617278: Enabling call graphs produced invalid XHTML output. +
  • id 617871: Non ascii characters in file or directory names + caused problems on Windows. +
  • id 618079: An ALIAS with parameters spanning multiple lines + caused problems with /// style comments. +
  • id 618632: Included patch to prevent image overflowing the page in + the LaTeX output. +
  • id 619728: Fixed problem using EXTENSION_MAPPING for C# (thanks to + Vsevolod Kukol for the patch). +
  • id 619978: Links to external files could be wrong when CREATE_SUBDIR + was enabled. +
  • id 620229: /* characters in a print broke parsing within an conditional + section. +
  • id 620926: \if and \endif did not work properly inside HTML tables. +
  • Using @include in combination with LATEX_SOURCE_CODE caused wrong + output. +
  • Included a patch by Guido Tack which adds two new options + for docsets (DOCSET_PUBLISHER_ID and DOCSET_PUBLISHER_NAME) and + fixes an issue with linking to docset members. +
  • Included patch by Stefan Oberhumer to support escaped {}'s in alias + definition and parameters. + +
+\endhtmlonly +\section log_1_6 Release 1.6 +\htmlonly + +

Doxygen Release 1.6.3

+

(release date 21-02-2010)

+

New features

+
    +
  • id 608480: Using \dir without argument will create directory + documentation for the directory in which the \dir command + was found. +
+

Bug fixes

+
    +
  • id 590161: perlmod output was wrong when using paragraph commands. +
  • id 600525: Included patch for VHDL. +
  • id 605698: Replaced size attribute of hr tag by class attribute in the + HTML output. +
  • id 606030,606192,607563: + Using \dot produced "Error opening map file" or + could even crash doxygen. +
  • id 606084: Loading a new config file in doxywizard did not reset all + values of a previously loaded config file. +
  • id 606104: Grouped members with todo-like items were shown with + "GlobalScope" prefix. +
  • id 606156: Fixed RTF rendering problem with group index. +
  • id 606206,610133: Added missing line break in LaTeX output. +
  • id 606330, 608056: The title of pages whose label had an underscore + was not shown +
  • id 606717: Include guard not starting with #ifndef SOME_GUARD_H were not + recognised as such. +
  • id 606718: Setting SEARCHENGINE to YES and GENERATE_HTML to NO caused + error that search results directory could not be created. +
  • id 606772,608493: typedef'ed enums or struct with the same as the + typedef did no longer show up. +
  • id 607088,607946: Related pages (manual and automatic like the todo page) + caused broken links when SHORT_NAMES was enabled. +
  • id 607432,608002: Automatically generated related pages (like the + todo page) caused broken links when CREATE_SUBDIR was enabled. +
  • id 607736: comments after #if could cause next function call not to be + cross-referenced. +
  • id 607743: \internal inside a conditional section caused warning. +
  • id 608016: Using \internal inside a \section did not end at the + next \section as documented. +
  • id 608018: \internal command produced message with .: in + the LaTeX output. +
  • id 608072: HTML Tables with custom attributes were not rendered + properly. +
  • id 608227: Man pages with underscore got double underscore in the name. +
  • id 608590: Buffer overflow when using non-ascii characters as class + name. +
  • id 608921: Macro definition had effect even if the definition was not + actually included. +
  • id 609504: config.h and config.l where missing from the SVN repository. +
  • id 609624: Todo items were merged for overloaded functions. +
  • id 609709: C# enum values with @todo items were missing from the todo + list. +
  • id 610437: Removed bogus warning when using <br/> tag. +
  • Fixed parsing problem for function pointer type starting with + "typedef enum". +
  • Preprocessor did not take EXCLUDE_PATTERNS into account, which + could cause parse issues when importing a .tlb file. +
+ + + +

Doxygen Release 1.6.2

+

(release date 30-12-2009)

+

Changes

+
    +
  • id 594787: Autolinking to all-lower case words has been disabled, + in accordance with the documentation. +
  • id 604543: Doxygen now allows any extension supported by dot via the + DOT_IMAGE_FORMAT option. +
  • Switched back to using PNGs for built-in diagrams and formulas using + the Lode Vandevenne's PNG encoder. +
+

New features

+
    +
  • Added new option SERVER_BASED_SEARCH to re-enable searching via a + PHP enabled web browser instead of only using javascript locally. + This method better scales to larger projects and allows full text + search. +
  • Added new options GENERATE_ECLIPSEHELP and ECLIPSE_DOC_ID + to generate an index file that can be used to embed doxygen's HTML + output into Eclipse as a help plugin + (thanks to a patch by Ondrej Starek). +
  • Wrote new documentation + regarding the methods of searching in the HTML output. +
  • Included patch by Ed Rosten to render formulas with + proper anti-aliasing on non-white backgrounds using transparency. +
  • Add new option FORCE_LOCAL_INCLUDES to make the default #include + appearance in class documentation with "" i.s.o sharp brackets. +
  • id 558457: Make \addindex put keywords into the .qhp file. +
  • id 595214: #cmakedefine is now treated the same was as #define + (for users of the CMake build system). +
  • Added compilation support for OSX 10.6 (aka Snow Leopard) +
  • Included language update for Brazilian. +
+

Bug fixes

+
    +
  • Doxywizard did not warn when it failed to save its config file. +
  • id 557035: Empty class definitions were not included in Tokens file + for docsets. +
  • id 563233: GENERATE_QHP details was considered even though it is + not defined. +
  • id 567346: Comment parser could get stuck in certain cases. +
  • id 570369: GENERATE_QHP should generate keywords for classes in + generated *.qhc. +
  • id 571964: Fixed two issues in the compound.xsd schema definition. +
  • id 592991: Fixed wrong default destination directory. +
  • id 593040: Fixed problem with distributing member group documentation + for anonymous member groups. +
  • id 593273: GENERATE_TODOLIST=NO and friends not longer worked. +
  • id 593928: Added support for UCS-2 encoded input files. +
  • id 594391: Fixed problem parsing fully-qualified java annotations. +
  • id 594592,596815: Fixed problem handling quotes. +
  • id 595191: Not all configuration options appeared in the index of + the documentation and some were not sorted correctly. +
  • id 595253: formulas had the .png extension while they were gifs. +
  • id 595833: Fixed recursive lockup while resolving template relations. +
  • id 595935: Doxygen's preprocessor got confused when /**/ appeared as + part of a macro definition. +
  • id 596085: Removed obsolete option USE_WINDOWS_ENCODING from the docs. +
  • id 596233: RTF output was missing a new paragraph for brief + member descriptions. +
  • id 596807,596819: Code reformatting done for the LaTeX output could + break multibyte UTF-8 characters causing invalid output. +
  • id 596809: Using multibyte characters in a page label caused invalid + output. +
  • id 596816: Documented the interaction between LATEX_CMD_NAME and + USE_PDFLATEX. +
  • id 597015: Todo items for two inner classes with the same name where + collapsed together in the todo list when HIDE_SCOPE_NAMES + was enabled. +
  • id 597016: Scope was not hidden for members in the todo list even + though HIDE_SCOPE_NAMES was set to YES. +
  • id 598497: Struct variable with explicit struct keyword got labelled + with [read] attribute. +
  • id 596902: PHP was not parsed properly when it appeared in a + <script language="php"> section. +
  • id 597415: Fixed problem matching base class member against the + member in the derived class. +
  • id 597518: Makefile for Docsets now honors DESTDIR. +
  • id 598298: Made browsing for HHC_LOCATION via the wizard + yield an absolute path. +
  • id 599128: Changed default for CHM_INDEX_ENCODING to CP1250 to avoid + issues in a Solaris environment. +
  • id 595931: Removed unnecessary paragraphs from HTML table cells. +
  • id 597541: referring to page labels of the form a-1 did not work. +
  • id 599224: Code generators could produce extra </span> tags. +
  • id 599974: Included the PHP search engine again (with new config + option SERVER_BASED_SEARCH to enable it) +
  • id 600544: Doxygen produced invalid Latex output for RCS tags. +
  • id 600563: Fixed issue with include dependency tracking that could + cause macro expansion not to work properly. +
  • id 600940: Fixed issue with VHDL call graph (thank to Martin Kreis + for the fix). +
  • id 601138: Fixed problem parsing C++ function-try-blocks. +
  • id 601222: #include inside a class could cause line numbers to be off. +
  • id 601223: Fixed parsing problem skipping over /**/ comment. +
  • id 601694: Fixed problem handling Javadoc style {@code ... } blocks. +
  • id 601771: Special commands did not work in the title of + the @mainpage. +
  • id 602818: Fixed problem parsing files that start with UTF-8 BOM. +
  • id 603001: Fixed problem parsing friend function with explicit scope. +
  • id 603238: Fixed perlmod generation issue. +
  • id 604948: Project number was not centered anymore in the HTML output. +
  • id 604503: Using %word in a page title incorrectly did show the %. +
+ + +

Doxygen Release 1.6.1

+

(release date 25-08-2009)

+

Bug fixes

+
    +
  • Fixed file handle leak when parsing include files. Also fixed + the logic that determines whether or not an include file need to be + parsed. +
  • Search result pages were not using UTF-8 character encoding. +
  • Search results pointing to external references were not linked correctly. +
  • id 133418: Multiline second argument of \ref caused unexpected " warning. +
  • id 592454: Feeding invalid XML could crash doxygen's DBus XML parser. +
  • id 592485: Include patch to fix problem with building rpms. +
  • id 592511,592625: Doxywizard problem with GENERATE_TREEVIEW. +
  • id 592650: SHOW_USED_FILES now works again. +
  • id 592808: xrefitems (like @todo) did not appear in the list when + found in comments marked with @enum or @name. +
+

Doxygen Release 1.6.0

+

(release date 20-08-2009)

+

Changes

+
    +
  • id 580924, 541234: Replaced the PHP based search engine by a + Javascript/DHTML based one. + As a result the search feature no longer requires a HTTP server + with PHP enabled to be usable. Searching is limited to symbols + though, but it is now possible to filter on symbol type. +
  • id 519886: Make the HTML output XHTML 1.0 compliant. +
  • id 579950: Objective-C categories are now merged with their base + class, unless there is no base class. +
  • Member groups with the same header within the same scope are now + merged. This also works for Objective-C categories. +
  • Changed the LaTeX style sheet such that more of the markup is + configurable. Please update your style sheet if you use a custom one. +
  • id 584844: Treat \details inside a brief description as a new paragraph + command. +
  • Split GENERATE_TREEVIEW into two separate options: + GENERATE_TREEVIEW and USE_INLINE_TREES. +
  • Removed the dependencies on libpng and libz, doxygen now generates + gifs again for internal class diagrams (like it did 7 years ago ;-) +
+

New features

+
    +
  • Added option SORT_MEMBERS_CTORS_1ST, which when enabled places the + constructors and destructors first in an otherwise sorted list. +
  • id 581518: Applied patch by Tobias Hunger that adds support for + documenting DBus XML interface descriptions. +
  • Included QtHelp patch by Karsten Heimrich which adds missing + reference and keyword for methods. +
  • Included updates for the Korean and Polish translation. +
+

Bug fixes

+
    +
  • id 131989: Fixed preprocessor handling for C# code. +
  • id 133418: -- was not rendered correctly for LaTeX output +
  • id 157485: Missing link in todo page. +
  • id 318061: Two template functions that only differed in the number + of template arguments were seen as the same function. +
  • id 443939: HIDE_UNDOC_CLASSES did not work properly. +
  • id 509348: Fixed problem with syncing the information of + declaration and definition in the presence of an extra forward + declaration in the source code. +
  • id 522193: For C# enum values were merged together if the same enum + name was used in different scopes. +
  • id 523167: Included patch to handle PROGRAM statement in Fortran as + subroutines/functions. +
  • id 554636: Remove spacing around brackets for Obj-C protocols. +
  • id 557026: Included patch for fixing wrongly labeled items in docsets. +
  • id 560512: Improved parser to better disambiguate + nested templates ending with >> from the bitshift right operator. +
  • id 570238: Fixed matching problem for method in nested class, where + the outer class is a template. +
  • id 581746: Segfault/realloc error when a very long path was used. +
  • id 582469: documented #define with guard caused wrong documentation. +
  • id 582276: Doxywizard could crash on exit in some cases. +
  • id 582676: Regression: a struct ivar in ObjC class screws up method + identification. +
  • id 583213: Included patch that avoids trailing spaces in the + generated Doxyfile template. +
  • id 584192: Included VHDL patch by Martin Klein +
  • id 585543: Fixed case where matching declaration and definition did + not work correctly. +
  • id 585260: The "more..." link for files was broken, since the anchor + was not generated. +
  • id 586925: Fixed parsing problem when an unpaired apostrophe + appeared in a Python comment. +
  • id 588291: Included fix for doxywizard makefile. +
  • id 588587: Added missing virtual destructor to CompAccept base class. +
  • id 588968: Fixed segmentation fault for specific case in PHP code. +
  • Fixed some issues building for Windows. +
  • id 589514: Fixed problem handling strings like a"\b" within a comment. +
  • id 589616: Fixed problem matching explicitly scoped parameter in a + template class. +
  • id 590712: A namespaced with name "internal" (C++/CLI keyword) + could confuse doxygen's C++ parser. +
  • id 591749: @optional/@required attributes for Objective-C were missing + from the XML output. +
+

Doxygen Release 1.5 and earlier

+

+


+

+Go back to the main page. + +\endhtmlonly +*/ diff --git a/doc/commands.doc b/doc/commands.doc index cb59feb..03c789f 100644 --- a/doc/commands.doc +++ b/doc/commands.doc @@ -2577,8 +2577,10 @@ class Receiver HTML-only block. \sa section \ref cmdmanonly "\\manonly", section - \ref cmdlatexonly "\\latexonly", and section - \ref cmdrtfonly "\\rtfonly". + \ref cmdlatexonly "\\latexonly", section + \ref cmdrtfonly "\\rtfonly", section + \ref cmdxmlonly "\\xmlonly", and + \ref cmddocbookonly "\\docbookonly".


\section cmdimage \\image ["caption"] [=] diff --git a/doc/config.doc b/doc/config.doc index c5aca26..a32f225 100644 --- a/doc/config.doc +++ b/doc/config.doc @@ -128,6 +128,7 @@ followed by the descriptions of the tags grouped by category. \refitem cfg_extract_anon_nspaces EXTRACT_ANON_NSPACES \refitem cfg_extract_local_classes EXTRACT_LOCAL_CLASSES \refitem cfg_extract_local_methods EXTRACT_LOCAL_METHODS +\refitem cfg_extract_package EXTRACT_PACKAGE \refitem cfg_extract_private EXTRACT_PRIVATE \refitem cfg_extract_static EXTRACT_STATIC \refitem cfg_file_patterns FILE_PATTERNS @@ -142,7 +143,7 @@ followed by the descriptions of the tags grouped by category. \refitem cfg_generate_autogen_def GENERATE_AUTOGEN_DEF \refitem cfg_generate_buglist GENERATE_BUGLIST \refitem cfg_generate_chi GENERATE_CHI -\refitem cfg_generate_deprecatedlist GENERATE_DEPRECIATEDLIST +\refitem cfg_generate_deprecatedlist GENERATE_DEPRECATEDLIST \refitem cfg_generate_docbook GENERATE_DOCBOOK \refitem cfg_generate_docset GENERATE_DOCSET \refitem cfg_generate_eclipsehelp GENERATE_ECLIPSEHELP @@ -282,13 +283,14 @@ followed by the descriptions of the tags grouped by category. \refitem cfg_sort_member_docs SORT_MEMBER_DOCS \refitem cfg_sort_members_constructors_first SORT_MEMBERS_CTORS_1ST \refitem cfg_source_browser SOURCE_BROWSER +\refitem cfg_strict_proto_matching STRICT_PROTO_MATCHING \refitem cfg_strip_code_comments STRIP_CODE_COMMENTS \refitem cfg_strip_from_inc_path STRIP_FROM_INC_PATH \refitem cfg_strip_from_path STRIP_FROM_PATH \refitem cfg_subgrouping SUBGROUPING -\refitem cfg_symbol_cache_size SYMBOL_CACHE_SIZE \refitem cfg_tab_size TAB_SIZE \refitem cfg_tagfiles TAGFILES +\refitem cfg_tcl_subst TCL_SUBST \refitem cfg_template_relations TEMPLATE_RELATIONS \refitem cfg_toc_expand TOC_EXPAND \refitem cfg_treeview_width TREEVIEW_WIDTH @@ -599,6 +601,14 @@ followed by the descriptions of the tags grouped by category. will result in a user-defined paragraph with heading "Side Effects:". You can put \\n's in the value part of an alias to insert newlines. +\anchor cfg_tcl_subst +
\c TCL_SUBST
+ \addindex TCL_SUBST + This tag can be used to specify a number of word-keyword mappings (TCL only). + A mapping has the form "name=value". For example adding + "class=itcl::class" will allow you to use the command class in the + itcl::class meaning. + \anchor cfg_optimize_output_for_c
\c OPTIMIZE_OUTPUT_FOR_C
\addindex OPTIMIZE_OUTPUT_FOR_C @@ -682,34 +692,19 @@ page (for HTML and Man pages) or section (for LaTeX and RTF). be useful for C code in case the coding convention dictates that all compound types are typedef'ed and only the typedef is referenced, never the tag name. -\anchor cfg_symbol_cache_size -
\c SYMBOL_CACHE_SIZE
- \addindex SYMBOL_CACHE_SIZE - The \c SYMBOL_CACHE_SIZE determines the size of the internal cache use to - determine which symbols to keep in memory and which to flush to disk. - When the cache is full, less often used symbols will be written to disk. - For small to medium size projects (<1000 input files) the default value is - probably good enough. For larger projects a too small cache size can cause - doxygen to be busy swapping symbols to and from disk most of the time - causing a significant performance penalty. - If the system has enough physical memory increasing the cache will improve the - performance by keeping more symbols in memory. Note that the value works on - a logarithmic scale so increasing the size by one will roughly double the - memory usage. The cache size is given by this formula: - \f$2^{(16+\mbox{SYMBOL\_CACHE\_SIZE})}\f$. The valid range is 0..9, the default is 0, - corresponding to a cache size of \f$2^{16} = 65536\f$ symbols. - \anchor cfg_lookup_cache_size
\c LOOKUP_CACHE_SIZE
\addindex LOOKUP_CACHE_SIZE - Similar to the \c SYMBOL_CACHE_SIZE the size of the symbol lookup cache can be + The size of the symbol lookup cache can be set using \c LOOKUP_CACHE_SIZE. This cache is used to resolve symbols given their name and scope. Since this can be an expensive process and often the - same symbol appear multiple times in the code, doxygen keeps a cache of + same symbol appears multiple times in the code, doxygen keeps a cache of pre-resolved symbols. If the cache is too small doxygen will become slower. If the cache is too large, memory is wasted. The cache size is given by this formula: \f$2^{(16+\mbox{LOOKUP\_CACHE\_SIZE})}\f$. The valid range is 0..9, the default is 0, corresponding to a cache size of \f$2^{16} = 65536\f$ symbols. + At the end of a run doxygen will report the cache usage and suggest the + optimal cache size from a speed point of view. @@ -734,6 +729,12 @@ page (for HTML and Man pages) or section (for LaTeX and RTF). If the \c EXTRACT_PRIVATE tag is set to \c YES all private members of a class will be included in the documentation. +\anchor cfg_extract_package +
\c EXTRACT_PACKAGE
+ \addindex EXTRACT_PACKAGE + If the \c EXTRACT_PACKAGE tag is set to \c YES all members with package + or internal scope will be included in the documentation. + \anchor cfg_extract_static
\c EXTRACT_STATIC
\addindex EXTRACT_STATIC @@ -878,6 +879,16 @@ function's detailed documentation block. @note This option applies only to the class list, not to the alphabetical list. +\anchor cfg_strict_proto_matching +
\c STRICT_PROTO_MATCHING
+ \addindex STRICT_PROTO_MATCHING + If the \c STRICT_PROTO_MATCHING option is enabled and doxygen fails to + do proper type resolution of all parameters of a function it will reject a + match between the prototype and the implementation of a member function even + if there is only one candidate or it is obvious which candidate to choose + by doing a simple string match. By disabling \c STRICT_PROTO_MATCHING doxygen + will still accept a match between prototype and implementation in such cases. + \anchor cfg_sort_members_constructors_first
\c SORT_MEMBERS_CTORS_1ST
\addindex SORT_MEMBERS_CTORS_1ST diff --git a/doc/doxygen.1 b/doc/doxygen.1 index 98f0df0..c227791 100644 --- a/doc/doxygen.1 +++ b/doc/doxygen.1 @@ -23,7 +23,11 @@ doxygen [configName] .IP If - is used for configName doxygen will read from standard input. .TP -4) Use doxygen to generate a template style sheet file for RTF, HTML or Latex. +4) Use doxygen to generate a template file controlling the layout of the generated documentation: +.IP +doxygen -l layoutFileName.xml +.TP +5) Use doxygen to generate a template style sheet file for RTF, HTML or Latex. .TP RTF: doxygen \fB\-w\fR rtf styleSheetFile @@ -33,7 +37,7 @@ doxygen \fB\-w\fR html headerFile footerFile styleSheetFile [configFile] .TP LaTeX: doxygen \fB\-w\fR latex headerFile footerFile styleSheetFile [configFile] .TP -5) Use doxygen to generate an rtf extensions file +6) Use doxygen to generate an rtf extensions file .TP RTF: doxygen \fB\-e\fR rtf extensionsFile diff --git a/doc/doxygen_manual.tex b/doc/doxygen_manual.tex index 9435280..51c2e47 100644 --- a/doc/doxygen_manual.tex +++ b/doc/doxygen_manual.tex @@ -83,6 +83,7 @@ Written by Dimitri van Heesch\\[2ex] \chapter{Getting Started}\label{starting}\hypertarget{starting}{}\input{starting} \chapter{Documenting the code}\label{docblocks}\hypertarget{docblocks}{}\input{docblocks} \chapter{Markdown}\label{markdown}\hypertarget{markdown}{}\input{markdown} +\chapter{Lists}\label{lists}\hypertarget{lists}{}\input{lists} \chapter{Grouping}\label{grouping}\hypertarget{grouping}{}\input{grouping} \chapter{Including Formulas}\label{formulas}\hypertarget{formulas}{}\input{formulas} \chapter{Graphs and diagrams}\label{diagrams}\hypertarget{diagrams}{}\input{diagrams} @@ -90,7 +91,6 @@ Written by Dimitri van Heesch\\[2ex] \chapter{Automatic link generation}\label{autolink}\hypertarget{autolink}{}\input{autolink} \chapter{Output Formats}\label{output}\hypertarget{output}{}\input{output} \chapter{Searching}\label{searching}\hypertarget{searching}{}\input{searching} -\chapter{External Indexing and Searching}\label{extsearch}\hypertarget{extsearch}{}\input{extsearch} \chapter{Customizing the Output}\label{customize}\hypertarget{customize}{}\input{customize} \chapter{Custom Commands}\label{custcmd}\hypertarget{custcmd}{}\input{custcmd} \chapter{Link to external documentation}\label{external}\hypertarget{external}{}\input{external} diff --git a/doc/extsearch.doc b/doc/extsearch.doc index e636b1a..bc937e4 100644 --- a/doc/extsearch.doc +++ b/doc/extsearch.doc @@ -303,11 +303,4 @@ The fields for such an item have the following meaning: - "fragments": an array with 0 or more fragments of text containing words that have been search for. These words should be wrapped in `` and `` tags to highlight them in the output. - - -\htmlonly -Go to the next section or return to the - index. -\endhtmlonly - */ diff --git a/doc/language.doc b/doc/language.doc index 70a0ace..7327e14 100644 --- a/doc/language.doc +++ b/doc/language.doc @@ -188,7 +188,7 @@ when the translator was updated. Korean Kim Taedong
SooYoung Jung
Richard Kim fly1004 at gmail dot com
jung5000 at gmail dot com
[unreachable] - 1.8.02 + up-to-date KoreanEn @@ -377,7 +377,7 @@ when the translator was updated. \hline JapaneseEn & see the Japanese language & {\tt\tiny ~} & English based \\ \hline - Korean & Kim Taedong & {\tt\tiny fly1004 at gmail dot com} & 1.8.02 \\ + Korean & Kim Taedong & {\tt\tiny fly1004 at gmail dot com} & up-to-date \\ ~ & SooYoung Jung & {\tt\tiny jung5000 at gmail dot com} & ~ \\ ~ & Richard Kim & {\tt\tiny [unreachable] ryk at dspwiz dot com} & ~ \\ \hline diff --git a/doc/searching.doc b/doc/searching.doc index 5a9c39e..1306a97 100644 --- a/doc/searching.doc +++ b/doc/searching.doc @@ -185,9 +185,8 @@ has its own advantages and disadvantages: Qt compressed help or CHM output, but it does require that Eclipse is installed and running. - \htmlonly -Go to the next section or return to the +Go to the next section or return to the index. \endhtmlonly diff --git a/doc/translator_report.txt b/doc/translator_report.txt index 0bba380..cbc0ba5 100644 --- a/doc/translator_report.txt +++ b/doc/translator_report.txt @@ -10,7 +10,7 @@ Macedonian, Norwegian, Persian, Polish, Portuguese, Romanian, Russian, Serbian, SerbianCyrilic, Slovak, Slovene, Spanish, Swedish, Turkish, Ukrainian, and Vietnamese. -Of them, 2 translators are up-to-date, 38 translators are based on +Of them, 3 translators are up-to-date, 37 translators are based on some adapter class, and 2 are English based. ---------------------------------------------------------------------- @@ -20,6 +20,7 @@ and they implement all 250 of the required methods. Anyway, there still may be some details listed even for them: TranslatorEnglish + TranslatorKorean -- Change the base class to Translator. TranslatorLatvian -- Reimplementation using UTF-8 suggested. ---------------------------------------------------------------------- @@ -53,9 +54,6 @@ must be implemented to become up-to-date: Note: Change the base class to TranslatorAdapter_1_8_4. TranslatorPolish 1.8.2 14 methods to implement (5 %) - TranslatorKorean 1.8.02 15 methods to implement (6 %) - Note: Change the base class to TranslatorAdapter_1_8_2. - TranslatorItalian 1.8.2 15 methods to implement (6 %) TranslatorCroatian 1.8.2 15 methods to implement (6 %) TranslatorChinese 1.8.2 15 methods to implement (6 %) @@ -112,8 +110,6 @@ must be implemented to become up-to-date: Note: Reimplementation using UTF-8 suggested. TranslatorArabic 1.4.6 56 methods to implement (22 %) - Note: Reimplementation using UTF-8 suggested. - ---------------------------------------------------------------------- The following translator classes derive directly from the @@ -816,28 +812,10 @@ TranslatorJapaneseEn (TranslatorEnglish) 245 methods to implement (98 %) virtual QCString latexLanguageSupportCommand() -TranslatorKorean (TranslatorAdapter_1_7_5) 15 methods to implement (6 %) +TranslatorKorean (TranslatorAdapter_1_7_5) ---------------- - Implements 235 of the required methods (94 %). - - Missing methods (should be implemented): - - virtual QCString trServices() - virtual QCString trClassMethods() - virtual QCString trProvidedByCategory() - virtual QCString trSingletonGeneratedFromFiles(bool single) - virtual QCString trServiceReference(const char * sName) - virtual QCString trDesignOverview() - virtual QCString trConstantGroups() - virtual QCString trMethodDocumentation() - virtual QCString trInterfaces() - virtual QCString trServiceGeneratedFromFiles(bool single) - virtual QCString trConstantGroupReference(const char * namespaceName) - virtual QCString trPanelSynchronisationTooltip(bool enable) - virtual QCString trExtendsClass() - virtual QCString trSingletonReference(const char * sName) - virtual QCString trInstanceMethods() + Implements 250 of the required methods (100 %). TranslatorKoreanEn (TranslatorEnglish) 245 methods to implement (98 %) diff --git a/jquery/Makefile b/jquery/Makefile new file mode 100644 index 0000000..83a302b --- /dev/null +++ b/jquery/Makefile @@ -0,0 +1,42 @@ +JQUERY_VERSION = 1.7.1 +JQUERY_UI_VERSION = 1.8.18 +HASHCHANGE_VERSION = 1.3 +SCROLL_VERSION = 1.4.2 +MINIFIER = /usr/local/bin/yuicompressor-2.4.7 +SCRIPTS = jquery-$(JQUERY_VERSION).js \ + jquery.ui-$(JQUERY_UI_VERSION).core.js \ + jquery.ui-$(JQUERY_UI_VERSION).widget.js \ + jquery.ui-$(JQUERY_UI_VERSION).mouse.js \ + jquery.ui-$(JQUERY_UI_VERSION).resizable.js \ + jquery.ba-$(HASHCHANGE_VERSION)-hashchange.js \ + jquery.scrollTo-$(SCROLL_VERSION).js +RESULTS = jquery_p1.js jquery_p2.js jquery_p3.js jquery_ui.js jquery_fx.js + +SCRIPTS_MIN = $(SCRIPTS:%.js=%-min.js) + +all: $(RESULTS) + +install: $(RESULTS) + cp $(RESULTS) ../src/ + +jquery_ui.js: scripts + cat jquery.ui-$(JQUERY_UI_VERSION).core-min.js \ + jquery.ui-$(JQUERY_UI_VERSION).widget-min.js \ + jquery.ui-$(JQUERY_UI_VERSION).mouse-min.js \ + jquery.ui-$(JQUERY_UI_VERSION).resizable-min.js \ + jquery.ba-$(HASHCHANGE_VERSION)-hashchange-min.js > jquery_ui.js + +jquery_fx.js: scripts + cat jquery.scrollTo-$(SCROLL_VERSION)-min.js > jquery_fx.js + +jquery_p1.js jquery_p2.js jquery_p3.js: scripts + perl split_jquery.pl jquery-$(JQUERY_VERSION)-min.js $@ + +scripts: $(SCRIPTS_MIN) + +clean: + rm -f $(SCRIPTS_MIN) $(RESULTS) + +%-min.js: %.js + java -jar $(MINIFIER).jar --line-break 13000 $^ > $@ + diff --git a/jquery/README b/jquery/README new file mode 100644 index 0000000..314c838 --- /dev/null +++ b/jquery/README @@ -0,0 +1,16 @@ +Doxygen's jquery.js script is composed of minified versions of the following +packages: +- jquery 1.7.1: http://jquery.com/download/ +- jquery.ui 1.8.18: https://code.google.com/p/jquery-ui/downloads/list + modules required: + - jquery.ui.core + - jquery.ui.widget + - jquery.ui.mouse + - jquery.ui.resizable +- jquery.hashchange: 1.3: http://benalman.com/projects/jquery-hashchange-plugin/ +- jquery.scrollTo: 1.4.2: https://github.com/flesler/jquery.scrollTo + +The Makefile will built the jquery_*.js files used by doxygen. +Some files are split into smaller parts to make sure Visual Studio can compile them +as strings. + diff --git a/jquery/jquery-1.7.1.js b/jquery/jquery-1.7.1.js new file mode 100644 index 0000000..8ccd0ea --- /dev/null +++ b/jquery/jquery-1.7.1.js @@ -0,0 +1,9266 @@ +/*! + * jQuery JavaScript Library v1.7.1 + * http://jquery.com/ + * + * Copyright 2011, John Resig + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * Includes Sizzle.js + * http://sizzlejs.com/ + * Copyright 2011, The Dojo Foundation + * Released under the MIT, BSD, and GPL Licenses. + * + * Date: Mon Nov 21 21:11:03 2011 -0500 + */ +(function( window, undefined ) { + +// Use the correct document accordingly with window argument (sandbox) +var document = window.document, + navigator = window.navigator, + location = window.location; +var jQuery = (function() { + +// Define a local copy of jQuery +var jQuery = function( selector, context ) { + // The jQuery object is actually just the init constructor 'enhanced' + return new jQuery.fn.init( selector, context, rootjQuery ); + }, + + // Map over jQuery in case of overwrite + _jQuery = window.jQuery, + + // Map over the $ in case of overwrite + _$ = window.$, + + // A central reference to the root jQuery(document) + rootjQuery, + + // A simple way to check for HTML strings or ID strings + // Prioritize #id over to avoid XSS via location.hash (#9521) + quickExpr = /^(?:[^#<]*(<[\w\W]+>)[^>]*$|#([\w\-]*)$)/, + + // Check if a string has a non-whitespace character in it + rnotwhite = /\S/, + + // Used for trimming whitespace + trimLeft = /^\s+/, + trimRight = /\s+$/, + + // Match a standalone tag + rsingleTag = /^<(\w+)\s*\/?>(?:<\/\1>)?$/, + + // JSON RegExp + rvalidchars = /^[\],:{}\s]*$/, + rvalidescape = /\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g, + rvalidtokens = /"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g, + rvalidbraces = /(?:^|:|,)(?:\s*\[)+/g, + + // Useragent RegExp + rwebkit = /(webkit)[ \/]([\w.]+)/, + ropera = /(opera)(?:.*version)?[ \/]([\w.]+)/, + rmsie = /(msie) ([\w.]+)/, + rmozilla = /(mozilla)(?:.*? rv:([\w.]+))?/, + + // Matches dashed string for camelizing + rdashAlpha = /-([a-z]|[0-9])/ig, + rmsPrefix = /^-ms-/, + + // Used by jQuery.camelCase as callback to replace() + fcamelCase = function( all, letter ) { + return ( letter + "" ).toUpperCase(); + }, + + // Keep a UserAgent string for use with jQuery.browser + userAgent = navigator.userAgent, + + // For matching the engine and version of the browser + browserMatch, + + // The deferred used on DOM ready + readyList, + + // The ready event handler + DOMContentLoaded, + + // Save a reference to some core methods + toString = Object.prototype.toString, + hasOwn = Object.prototype.hasOwnProperty, + push = Array.prototype.push, + slice = Array.prototype.slice, + trim = String.prototype.trim, + indexOf = Array.prototype.indexOf, + + // [[Class]] -> type pairs + class2type = {}; + +jQuery.fn = jQuery.prototype = { + constructor: jQuery, + init: function( selector, context, rootjQuery ) { + var match, elem, ret, doc; + + // Handle $(""), $(null), or $(undefined) + if ( !selector ) { + return this; + } + + // Handle $(DOMElement) + if ( selector.nodeType ) { + this.context = this[0] = selector; + this.length = 1; + return this; + } + + // The body element only exists once, optimize finding it + if ( selector === "body" && !context && document.body ) { + this.context = document; + this[0] = document.body; + this.selector = selector; + this.length = 1; + return this; + } + + // Handle HTML strings + if ( typeof selector === "string" ) { + // Are we dealing with HTML string or an ID? + if ( selector.charAt(0) === "<" && selector.charAt( selector.length - 1 ) === ">" && selector.length >= 3 ) { + // Assume that strings that start and end with <> are HTML and skip the regex check + match = [ null, selector, null ]; + + } else { + match = quickExpr.exec( selector ); + } + + // Verify a match, and that no context was specified for #id + if ( match && (match[1] || !context) ) { + + // HANDLE: $(html) -> $(array) + if ( match[1] ) { + context = context instanceof jQuery ? context[0] : context; + doc = ( context ? context.ownerDocument || context : document ); + + // If a single string is passed in and it's a single tag + // just do a createElement and skip the rest + ret = rsingleTag.exec( selector ); + + if ( ret ) { + if ( jQuery.isPlainObject( context ) ) { + selector = [ document.createElement( ret[1] ) ]; + jQuery.fn.attr.call( selector, context, true ); + + } else { + selector = [ doc.createElement( ret[1] ) ]; + } + + } else { + ret = jQuery.buildFragment( [ match[1] ], [ doc ] ); + selector = ( ret.cacheable ? jQuery.clone(ret.fragment) : ret.fragment ).childNodes; + } + + return jQuery.merge( this, selector ); + + // HANDLE: $("#id") + } else { + elem = document.getElementById( match[2] ); + + // Check parentNode to catch when Blackberry 4.6 returns + // nodes that are no longer in the document #6963 + if ( elem && elem.parentNode ) { + // Handle the case where IE and Opera return items + // by name instead of ID + if ( elem.id !== match[2] ) { + return rootjQuery.find( selector ); + } + + // Otherwise, we inject the element directly into the jQuery object + this.length = 1; + this[0] = elem; + } + + this.context = document; + this.selector = selector; + return this; + } + + // HANDLE: $(expr, $(...)) + } else if ( !context || context.jquery ) { + return ( context || rootjQuery ).find( selector ); + + // HANDLE: $(expr, context) + // (which is just equivalent to: $(context).find(expr) + } else { + return this.constructor( context ).find( selector ); + } + + // HANDLE: $(function) + // Shortcut for document ready + } else if ( jQuery.isFunction( selector ) ) { + return rootjQuery.ready( selector ); + } + + if ( selector.selector !== undefined ) { + this.selector = selector.selector; + this.context = selector.context; + } + + return jQuery.makeArray( selector, this ); + }, + + // Start with an empty selector + selector: "", + + // The current version of jQuery being used + jquery: "1.7.1", + + // The default length of a jQuery object is 0 + length: 0, + + // The number of elements contained in the matched element set + size: function() { + return this.length; + }, + + toArray: function() { + return slice.call( this, 0 ); + }, + + // Get the Nth element in the matched element set OR + // Get the whole matched element set as a clean array + get: function( num ) { + return num == null ? + + // Return a 'clean' array + this.toArray() : + + // Return just the object + ( num < 0 ? this[ this.length + num ] : this[ num ] ); + }, + + // Take an array of elements and push it onto the stack + // (returning the new matched element set) + pushStack: function( elems, name, selector ) { + // Build a new jQuery matched element set + var ret = this.constructor(); + + if ( jQuery.isArray( elems ) ) { + push.apply( ret, elems ); + + } else { + jQuery.merge( ret, elems ); + } + + // Add the old object onto the stack (as a reference) + ret.prevObject = this; + + ret.context = this.context; + + if ( name === "find" ) { + ret.selector = this.selector + ( this.selector ? " " : "" ) + selector; + } else if ( name ) { + ret.selector = this.selector + "." + name + "(" + selector + ")"; + } + + // Return the newly-formed element set + return ret; + }, + + // Execute a callback for every element in the matched set. + // (You can seed the arguments with an array of args, but this is + // only used internally.) + each: function( callback, args ) { + return jQuery.each( this, callback, args ); + }, + + ready: function( fn ) { + // Attach the listeners + jQuery.bindReady(); + + // Add the callback + readyList.add( fn ); + + return this; + }, + + eq: function( i ) { + i = +i; + return i === -1 ? + this.slice( i ) : + this.slice( i, i + 1 ); + }, + + first: function() { + return this.eq( 0 ); + }, + + last: function() { + return this.eq( -1 ); + }, + + slice: function() { + return this.pushStack( slice.apply( this, arguments ), + "slice", slice.call(arguments).join(",") ); + }, + + map: function( callback ) { + return this.pushStack( jQuery.map(this, function( elem, i ) { + return callback.call( elem, i, elem ); + })); + }, + + end: function() { + return this.prevObject || this.constructor(null); + }, + + // For internal use only. + // Behaves like an Array's method, not like a jQuery method. + push: push, + sort: [].sort, + splice: [].splice +}; + +// Give the init function the jQuery prototype for later instantiation +jQuery.fn.init.prototype = jQuery.fn; + +jQuery.extend = jQuery.fn.extend = function() { + var options, name, src, copy, copyIsArray, clone, + target = arguments[0] || {}, + i = 1, + length = arguments.length, + deep = false; + + // Handle a deep copy situation + if ( typeof target === "boolean" ) { + deep = target; + target = arguments[1] || {}; + // skip the boolean and the target + i = 2; + } + + // Handle case when target is a string or something (possible in deep copy) + if ( typeof target !== "object" && !jQuery.isFunction(target) ) { + target = {}; + } + + // extend jQuery itself if only one argument is passed + if ( length === i ) { + target = this; + --i; + } + + for ( ; i < length; i++ ) { + // Only deal with non-null/undefined values + if ( (options = arguments[ i ]) != null ) { + // Extend the base object + for ( name in options ) { + src = target[ name ]; + copy = options[ name ]; + + // Prevent never-ending loop + if ( target === copy ) { + continue; + } + + // Recurse if we're merging plain objects or arrays + if ( deep && copy && ( jQuery.isPlainObject(copy) || (copyIsArray = jQuery.isArray(copy)) ) ) { + if ( copyIsArray ) { + copyIsArray = false; + clone = src && jQuery.isArray(src) ? src : []; + + } else { + clone = src && jQuery.isPlainObject(src) ? src : {}; + } + + // Never move original objects, clone them + target[ name ] = jQuery.extend( deep, clone, copy ); + + // Don't bring in undefined values + } else if ( copy !== undefined ) { + target[ name ] = copy; + } + } + } + } + + // Return the modified object + return target; +}; + +jQuery.extend({ + noConflict: function( deep ) { + if ( window.$ === jQuery ) { + window.$ = _$; + } + + if ( deep && window.jQuery === jQuery ) { + window.jQuery = _jQuery; + } + + return jQuery; + }, + + // Is the DOM ready to be used? Set to true once it occurs. + isReady: false, + + // A counter to track how many items to wait for before + // the ready event fires. See #6781 + readyWait: 1, + + // Hold (or release) the ready event + holdReady: function( hold ) { + if ( hold ) { + jQuery.readyWait++; + } else { + jQuery.ready( true ); + } + }, + + // Handle when the DOM is ready + ready: function( wait ) { + // Either a released hold or an DOMready/load event and not yet ready + if ( (wait === true && !--jQuery.readyWait) || (wait !== true && !jQuery.isReady) ) { + // Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443). + if ( !document.body ) { + return setTimeout( jQuery.ready, 1 ); + } + + // Remember that the DOM is ready + jQuery.isReady = true; + + // If a normal DOM Ready event fired, decrement, and wait if need be + if ( wait !== true && --jQuery.readyWait > 0 ) { + return; + } + + // If there are functions bound, to execute + readyList.fireWith( document, [ jQuery ] ); + + // Trigger any bound ready events + if ( jQuery.fn.trigger ) { + jQuery( document ).trigger( "ready" ).off( "ready" ); + } + } + }, + + bindReady: function() { + if ( readyList ) { + return; + } + + readyList = jQuery.Callbacks( "once memory" ); + + // Catch cases where $(document).ready() is called after the + // browser event has already occurred. + if ( document.readyState === "complete" ) { + // Handle it asynchronously to allow scripts the opportunity to delay ready + return setTimeout( jQuery.ready, 1 ); + } + + // Mozilla, Opera and webkit nightlies currently support this event + if ( document.addEventListener ) { + // Use the handy event callback + document.addEventListener( "DOMContentLoaded", DOMContentLoaded, false ); + + // A fallback to window.onload, that will always work + window.addEventListener( "load", jQuery.ready, false ); + + // If IE event model is used + } else if ( document.attachEvent ) { + // ensure firing before onload, + // maybe late but safe also for iframes + document.attachEvent( "onreadystatechange", DOMContentLoaded ); + + // A fallback to window.onload, that will always work + window.attachEvent( "onload", jQuery.ready ); + + // If IE and not a frame + // continually check to see if the document is ready + var toplevel = false; + + try { + toplevel = window.frameElement == null; + } catch(e) {} + + if ( document.documentElement.doScroll && toplevel ) { + doScrollCheck(); + } + } + }, + + // See test/unit/core.js for details concerning isFunction. + // Since version 1.3, DOM methods and functions like alert + // aren't supported. They return false on IE (#2968). + isFunction: function( obj ) { + return jQuery.type(obj) === "function"; + }, + + isArray: Array.isArray || function( obj ) { + return jQuery.type(obj) === "array"; + }, + + // A crude way of determining if an object is a window + isWindow: function( obj ) { + return obj && typeof obj === "object" && "setInterval" in obj; + }, + + isNumeric: function( obj ) { + return !isNaN( parseFloat(obj) ) && isFinite( obj ); + }, + + type: function( obj ) { + return obj == null ? + String( obj ) : + class2type[ toString.call(obj) ] || "object"; + }, + + isPlainObject: function( obj ) { + // Must be an Object. + // Because of IE, we also have to check the presence of the constructor property. + // Make sure that DOM nodes and window objects don't pass through, as well + if ( !obj || jQuery.type(obj) !== "object" || obj.nodeType || jQuery.isWindow( obj ) ) { + return false; + } + + try { + // Not own constructor property must be Object + if ( obj.constructor && + !hasOwn.call(obj, "constructor") && + !hasOwn.call(obj.constructor.prototype, "isPrototypeOf") ) { + return false; + } + } catch ( e ) { + // IE8,9 Will throw exceptions on certain host objects #9897 + return false; + } + + // Own properties are enumerated firstly, so to speed up, + // if last one is own, then all properties are own. + + var key; + for ( key in obj ) {} + + return key === undefined || hasOwn.call( obj, key ); + }, + + isEmptyObject: function( obj ) { + for ( var name in obj ) { + return false; + } + return true; + }, + + error: function( msg ) { + throw new Error( msg ); + }, + + parseJSON: function( data ) { + if ( typeof data !== "string" || !data ) { + return null; + } + + // Make sure leading/trailing whitespace is removed (IE can't handle it) + data = jQuery.trim( data ); + + // Attempt to parse using the native JSON parser first + if ( window.JSON && window.JSON.parse ) { + return window.JSON.parse( data ); + } + + // Make sure the incoming data is actual JSON + // Logic borrowed from http://json.org/json2.js + if ( rvalidchars.test( data.replace( rvalidescape, "@" ) + .replace( rvalidtokens, "]" ) + .replace( rvalidbraces, "")) ) { + + return ( new Function( "return " + data ) )(); + + } + jQuery.error( "Invalid JSON: " + data ); + }, + + // Cross-browser xml parsing + parseXML: function( data ) { + var xml, tmp; + try { + if ( window.DOMParser ) { // Standard + tmp = new DOMParser(); + xml = tmp.parseFromString( data , "text/xml" ); + } else { // IE + xml = new ActiveXObject( "Microsoft.XMLDOM" ); + xml.async = "false"; + xml.loadXML( data ); + } + } catch( e ) { + xml = undefined; + } + if ( !xml || !xml.documentElement || xml.getElementsByTagName( "parsererror" ).length ) { + jQuery.error( "Invalid XML: " + data ); + } + return xml; + }, + + noop: function() {}, + + // Evaluates a script in a global context + // Workarounds based on findings by Jim Driscoll + // http://weblogs.java.net/blog/driscoll/archive/2009/09/08/eval-javascript-global-context + globalEval: function( data ) { + if ( data && rnotwhite.test( data ) ) { + // We use execScript on Internet Explorer + // We use an anonymous function so that context is window + // rather than jQuery in Firefox + ( window.execScript || function( data ) { + window[ "eval" ].call( window, data ); + } )( data ); + } + }, + + // Convert dashed to camelCase; used by the css and data modules + // Microsoft forgot to hump their vendor prefix (#9572) + camelCase: function( string ) { + return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase ); + }, + + nodeName: function( elem, name ) { + return elem.nodeName && elem.nodeName.toUpperCase() === name.toUpperCase(); + }, + + // args is for internal usage only + each: function( object, callback, args ) { + var name, i = 0, + length = object.length, + isObj = length === undefined || jQuery.isFunction( object ); + + if ( args ) { + if ( isObj ) { + for ( name in object ) { + if ( callback.apply( object[ name ], args ) === false ) { + break; + } + } + } else { + for ( ; i < length; ) { + if ( callback.apply( object[ i++ ], args ) === false ) { + break; + } + } + } + + // A special, fast, case for the most common use of each + } else { + if ( isObj ) { + for ( name in object ) { + if ( callback.call( object[ name ], name, object[ name ] ) === false ) { + break; + } + } + } else { + for ( ; i < length; ) { + if ( callback.call( object[ i ], i, object[ i++ ] ) === false ) { + break; + } + } + } + } + + return object; + }, + + // Use native String.trim function wherever possible + trim: trim ? + function( text ) { + return text == null ? + "" : + trim.call( text ); + } : + + // Otherwise use our own trimming functionality + function( text ) { + return text == null ? + "" : + text.toString().replace( trimLeft, "" ).replace( trimRight, "" ); + }, + + // results is for internal usage only + makeArray: function( array, results ) { + var ret = results || []; + + if ( array != null ) { + // The window, strings (and functions) also have 'length' + // Tweaked logic slightly to handle Blackberry 4.7 RegExp issues #6930 + var type = jQuery.type( array ); + + if ( array.length == null || type === "string" || type === "function" || type === "regexp" || jQuery.isWindow( array ) ) { + push.call( ret, array ); + } else { + jQuery.merge( ret, array ); + } + } + + return ret; + }, + + inArray: function( elem, array, i ) { + var len; + + if ( array ) { + if ( indexOf ) { + return indexOf.call( array, elem, i ); + } + + len = array.length; + i = i ? i < 0 ? Math.max( 0, len + i ) : i : 0; + + for ( ; i < len; i++ ) { + // Skip accessing in sparse arrays + if ( i in array && array[ i ] === elem ) { + return i; + } + } + } + + return -1; + }, + + merge: function( first, second ) { + var i = first.length, + j = 0; + + if ( typeof second.length === "number" ) { + for ( var l = second.length; j < l; j++ ) { + first[ i++ ] = second[ j ]; + } + + } else { + while ( second[j] !== undefined ) { + first[ i++ ] = second[ j++ ]; + } + } + + first.length = i; + + return first; + }, + + grep: function( elems, callback, inv ) { + var ret = [], retVal; + inv = !!inv; + + // Go through the array, only saving the items + // that pass the validator function + for ( var i = 0, length = elems.length; i < length; i++ ) { + retVal = !!callback( elems[ i ], i ); + if ( inv !== retVal ) { + ret.push( elems[ i ] ); + } + } + + return ret; + }, + + // arg is for internal usage only + map: function( elems, callback, arg ) { + var value, key, ret = [], + i = 0, + length = elems.length, + // jquery objects are treated as arrays + isArray = elems instanceof jQuery || length !== undefined && typeof length === "number" && ( ( length > 0 && elems[ 0 ] && elems[ length -1 ] ) || length === 0 || jQuery.isArray( elems ) ) ; + + // Go through the array, translating each of the items to their + if ( isArray ) { + for ( ; i < length; i++ ) { + value = callback( elems[ i ], i, arg ); + + if ( value != null ) { + ret[ ret.length ] = value; + } + } + + // Go through every key on the object, + } else { + for ( key in elems ) { + value = callback( elems[ key ], key, arg ); + + if ( value != null ) { + ret[ ret.length ] = value; + } + } + } + + // Flatten any nested arrays + return ret.concat.apply( [], ret ); + }, + + // A global GUID counter for objects + guid: 1, + + // Bind a function to a context, optionally partially applying any + // arguments. + proxy: function( fn, context ) { + if ( typeof context === "string" ) { + var tmp = fn[ context ]; + context = fn; + fn = tmp; + } + + // Quick check to determine if target is callable, in the spec + // this throws a TypeError, but we will just return undefined. + if ( !jQuery.isFunction( fn ) ) { + return undefined; + } + + // Simulated bind + var args = slice.call( arguments, 2 ), + proxy = function() { + return fn.apply( context, args.concat( slice.call( arguments ) ) ); + }; + + // Set the guid of unique handler to the same of original handler, so it can be removed + proxy.guid = fn.guid = fn.guid || proxy.guid || jQuery.guid++; + + return proxy; + }, + + // Mutifunctional method to get and set values to a collection + // The value/s can optionally be executed if it's a function + access: function( elems, key, value, exec, fn, pass ) { + var length = elems.length; + + // Setting many attributes + if ( typeof key === "object" ) { + for ( var k in key ) { + jQuery.access( elems, k, key[k], exec, fn, value ); + } + return elems; + } + + // Setting one attribute + if ( value !== undefined ) { + // Optionally, function values get executed if exec is true + exec = !pass && exec && jQuery.isFunction(value); + + for ( var i = 0; i < length; i++ ) { + fn( elems[i], key, exec ? value.call( elems[i], i, fn( elems[i], key ) ) : value, pass ); + } + + return elems; + } + + // Getting an attribute + return length ? fn( elems[0], key ) : undefined; + }, + + now: function() { + return ( new Date() ).getTime(); + }, + + // Use of jQuery.browser is frowned upon. + // More details: http://docs.jquery.com/Utilities/jQuery.browser + uaMatch: function( ua ) { + ua = ua.toLowerCase(); + + var match = rwebkit.exec( ua ) || + ropera.exec( ua ) || + rmsie.exec( ua ) || + ua.indexOf("compatible") < 0 && rmozilla.exec( ua ) || + []; + + return { browser: match[1] || "", version: match[2] || "0" }; + }, + + sub: function() { + function jQuerySub( selector, context ) { + return new jQuerySub.fn.init( selector, context ); + } + jQuery.extend( true, jQuerySub, this ); + jQuerySub.superclass = this; + jQuerySub.fn = jQuerySub.prototype = this(); + jQuerySub.fn.constructor = jQuerySub; + jQuerySub.sub = this.sub; + jQuerySub.fn.init = function init( selector, context ) { + if ( context && context instanceof jQuery && !(context instanceof jQuerySub) ) { + context = jQuerySub( context ); + } + + return jQuery.fn.init.call( this, selector, context, rootjQuerySub ); + }; + jQuerySub.fn.init.prototype = jQuerySub.fn; + var rootjQuerySub = jQuerySub(document); + return jQuerySub; + }, + + browser: {} +}); + +// Populate the class2type map +jQuery.each("Boolean Number String Function Array Date RegExp Object".split(" "), function(i, name) { + class2type[ "[object " + name + "]" ] = name.toLowerCase(); +}); + +browserMatch = jQuery.uaMatch( userAgent ); +if ( browserMatch.browser ) { + jQuery.browser[ browserMatch.browser ] = true; + jQuery.browser.version = browserMatch.version; +} + +// Deprecated, use jQuery.browser.webkit instead +if ( jQuery.browser.webkit ) { + jQuery.browser.safari = true; +} + +// IE doesn't match non-breaking spaces with \s +if ( rnotwhite.test( "\xA0" ) ) { + trimLeft = /^[\s\xA0]+/; + trimRight = /[\s\xA0]+$/; +} + +// All jQuery objects should point back to these +rootjQuery = jQuery(document); + +// Cleanup functions for the document ready method +if ( document.addEventListener ) { + DOMContentLoaded = function() { + document.removeEventListener( "DOMContentLoaded", DOMContentLoaded, false ); + jQuery.ready(); + }; + +} else if ( document.attachEvent ) { + DOMContentLoaded = function() { + // Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443). + if ( document.readyState === "complete" ) { + document.detachEvent( "onreadystatechange", DOMContentLoaded ); + jQuery.ready(); + } + }; +} + +// The DOM ready check for Internet Explorer +function doScrollCheck() { + if ( jQuery.isReady ) { + return; + } + + try { + // If IE is used, use the trick by Diego Perini + // http://javascript.nwbox.com/IEContentLoaded/ + document.documentElement.doScroll("left"); + } catch(e) { + setTimeout( doScrollCheck, 1 ); + return; + } + + // and execute any waiting functions + jQuery.ready(); +} + +return jQuery; + +})(); + + +// String to Object flags format cache +var flagsCache = {}; + +// Convert String-formatted flags into Object-formatted ones and store in cache +function createFlags( flags ) { + var object = flagsCache[ flags ] = {}, + i, length; + flags = flags.split( /\s+/ ); + for ( i = 0, length = flags.length; i < length; i++ ) { + object[ flags[i] ] = true; + } + return object; +} + +/* + * Create a callback list using the following parameters: + * + * flags: an optional list of space-separated flags that will change how + * the callback list behaves + * + * By default a callback list will act like an event callback list and can be + * "fired" multiple times. + * + * Possible flags: + * + * once: will ensure the callback list can only be fired once (like a Deferred) + * + * memory: will keep track of previous values and will call any callback added + * after the list has been fired right away with the latest "memorized" + * values (like a Deferred) + * + * unique: will ensure a callback can only be added once (no duplicate in the list) + * + * stopOnFalse: interrupt callings when a callback returns false + * + */ +jQuery.Callbacks = function( flags ) { + + // Convert flags from String-formatted to Object-formatted + // (we check in cache first) + flags = flags ? ( flagsCache[ flags ] || createFlags( flags ) ) : {}; + + var // Actual callback list + list = [], + // Stack of fire calls for repeatable lists + stack = [], + // Last fire value (for non-forgettable lists) + memory, + // Flag to know if list is currently firing + firing, + // First callback to fire (used internally by add and fireWith) + firingStart, + // End of the loop when firing + firingLength, + // Index of currently firing callback (modified by remove if needed) + firingIndex, + // Add one or several callbacks to the list + add = function( args ) { + var i, + length, + elem, + type, + actual; + for ( i = 0, length = args.length; i < length; i++ ) { + elem = args[ i ]; + type = jQuery.type( elem ); + if ( type === "array" ) { + // Inspect recursively + add( elem ); + } else if ( type === "function" ) { + // Add if not in unique mode and callback is not in + if ( !flags.unique || !self.has( elem ) ) { + list.push( elem ); + } + } + } + }, + // Fire callbacks + fire = function( context, args ) { + args = args || []; + memory = !flags.memory || [ context, args ]; + firing = true; + firingIndex = firingStart || 0; + firingStart = 0; + firingLength = list.length; + for ( ; list && firingIndex < firingLength; firingIndex++ ) { + if ( list[ firingIndex ].apply( context, args ) === false && flags.stopOnFalse ) { + memory = true; // Mark as halted + break; + } + } + firing = false; + if ( list ) { + if ( !flags.once ) { + if ( stack && stack.length ) { + memory = stack.shift(); + self.fireWith( memory[ 0 ], memory[ 1 ] ); + } + } else if ( memory === true ) { + self.disable(); + } else { + list = []; + } + } + }, + // Actual Callbacks object + self = { + // Add a callback or a collection of callbacks to the list + add: function() { + if ( list ) { + var length = list.length; + add( arguments ); + // Do we need to add the callbacks to the + // current firing batch? + if ( firing ) { + firingLength = list.length; + // With memory, if we're not firing then + // we should call right away, unless previous + // firing was halted (stopOnFalse) + } else if ( memory && memory !== true ) { + firingStart = length; + fire( memory[ 0 ], memory[ 1 ] ); + } + } + return this; + }, + // Remove a callback from the list + remove: function() { + if ( list ) { + var args = arguments, + argIndex = 0, + argLength = args.length; + for ( ; argIndex < argLength ; argIndex++ ) { + for ( var i = 0; i < list.length; i++ ) { + if ( args[ argIndex ] === list[ i ] ) { + // Handle firingIndex and firingLength + if ( firing ) { + if ( i <= firingLength ) { + firingLength--; + if ( i <= firingIndex ) { + firingIndex--; + } + } + } + // Remove the element + list.splice( i--, 1 ); + // If we have some unicity property then + // we only need to do this once + if ( flags.unique ) { + break; + } + } + } + } + } + return this; + }, + // Control if a given callback is in the list + has: function( fn ) { + if ( list ) { + var i = 0, + length = list.length; + for ( ; i < length; i++ ) { + if ( fn === list[ i ] ) { + return true; + } + } + } + return false; + }, + // Remove all callbacks from the list + empty: function() { + list = []; + return this; + }, + // Have the list do nothing anymore + disable: function() { + list = stack = memory = undefined; + return this; + }, + // Is it disabled? + disabled: function() { + return !list; + }, + // Lock the list in its current state + lock: function() { + stack = undefined; + if ( !memory || memory === true ) { + self.disable(); + } + return this; + }, + // Is it locked? + locked: function() { + return !stack; + }, + // Call all callbacks with the given context and arguments + fireWith: function( context, args ) { + if ( stack ) { + if ( firing ) { + if ( !flags.once ) { + stack.push( [ context, args ] ); + } + } else if ( !( flags.once && memory ) ) { + fire( context, args ); + } + } + return this; + }, + // Call all the callbacks with the given arguments + fire: function() { + self.fireWith( this, arguments ); + return this; + }, + // To know if the callbacks have already been called at least once + fired: function() { + return !!memory; + } + }; + + return self; +}; + + + + +var // Static reference to slice + sliceDeferred = [].slice; + +jQuery.extend({ + + Deferred: function( func ) { + var doneList = jQuery.Callbacks( "once memory" ), + failList = jQuery.Callbacks( "once memory" ), + progressList = jQuery.Callbacks( "memory" ), + state = "pending", + lists = { + resolve: doneList, + reject: failList, + notify: progressList + }, + promise = { + done: doneList.add, + fail: failList.add, + progress: progressList.add, + + state: function() { + return state; + }, + + // Deprecated + isResolved: doneList.fired, + isRejected: failList.fired, + + then: function( doneCallbacks, failCallbacks, progressCallbacks ) { + deferred.done( doneCallbacks ).fail( failCallbacks ).progress( progressCallbacks ); + return this; + }, + always: function() { + deferred.done.apply( deferred, arguments ).fail.apply( deferred, arguments ); + return this; + }, + pipe: function( fnDone, fnFail, fnProgress ) { + return jQuery.Deferred(function( newDefer ) { + jQuery.each( { + done: [ fnDone, "resolve" ], + fail: [ fnFail, "reject" ], + progress: [ fnProgress, "notify" ] + }, function( handler, data ) { + var fn = data[ 0 ], + action = data[ 1 ], + returned; + if ( jQuery.isFunction( fn ) ) { + deferred[ handler ](function() { + returned = fn.apply( this, arguments ); + if ( returned && jQuery.isFunction( returned.promise ) ) { + returned.promise().then( newDefer.resolve, newDefer.reject, newDefer.notify ); + } else { + newDefer[ action + "With" ]( this === deferred ? newDefer : this, [ returned ] ); + } + }); + } else { + deferred[ handler ]( newDefer[ action ] ); + } + }); + }).promise(); + }, + // Get a promise for this deferred + // If obj is provided, the promise aspect is added to the object + promise: function( obj ) { + if ( obj == null ) { + obj = promise; + } else { + for ( var key in promise ) { + obj[ key ] = promise[ key ]; + } + } + return obj; + } + }, + deferred = promise.promise({}), + key; + + for ( key in lists ) { + deferred[ key ] = lists[ key ].fire; + deferred[ key + "With" ] = lists[ key ].fireWith; + } + + // Handle state + deferred.done( function() { + state = "resolved"; + }, failList.disable, progressList.lock ).fail( function() { + state = "rejected"; + }, doneList.disable, progressList.lock ); + + // Call given func if any + if ( func ) { + func.call( deferred, deferred ); + } + + // All done! + return deferred; + }, + + // Deferred helper + when: function( firstParam ) { + var args = sliceDeferred.call( arguments, 0 ), + i = 0, + length = args.length, + pValues = new Array( length ), + count = length, + pCount = length, + deferred = length <= 1 && firstParam && jQuery.isFunction( firstParam.promise ) ? + firstParam : + jQuery.Deferred(), + promise = deferred.promise(); + function resolveFunc( i ) { + return function( value ) { + args[ i ] = arguments.length > 1 ? sliceDeferred.call( arguments, 0 ) : value; + if ( !( --count ) ) { + deferred.resolveWith( deferred, args ); + } + }; + } + function progressFunc( i ) { + return function( value ) { + pValues[ i ] = arguments.length > 1 ? sliceDeferred.call( arguments, 0 ) : value; + deferred.notifyWith( promise, pValues ); + }; + } + if ( length > 1 ) { + for ( ; i < length; i++ ) { + if ( args[ i ] && args[ i ].promise && jQuery.isFunction( args[ i ].promise ) ) { + args[ i ].promise().then( resolveFunc(i), deferred.reject, progressFunc(i) ); + } else { + --count; + } + } + if ( !count ) { + deferred.resolveWith( deferred, args ); + } + } else if ( deferred !== firstParam ) { + deferred.resolveWith( deferred, length ? [ firstParam ] : [] ); + } + return promise; + } +}); + + + + +jQuery.support = (function() { + + var support, + all, + a, + select, + opt, + input, + marginDiv, + fragment, + tds, + events, + eventName, + i, + isSupported, + div = document.createElement( "div" ), + documentElement = document.documentElement; + + // Preliminary tests + div.setAttribute("className", "t"); + div.innerHTML = "
a"; + + all = div.getElementsByTagName( "*" ); + a = div.getElementsByTagName( "a" )[ 0 ]; + + // Can't get basic test support + if ( !all || !all.length || !a ) { + return {}; + } + + // First batch of supports tests + select = document.createElement( "select" ); + opt = select.appendChild( document.createElement("option") ); + input = div.getElementsByTagName( "input" )[ 0 ]; + + support = { + // IE strips leading whitespace when .innerHTML is used + leadingWhitespace: ( div.firstChild.nodeType === 3 ), + + // Make sure that tbody elements aren't automatically inserted + // IE will insert them into empty tables + tbody: !div.getElementsByTagName("tbody").length, + + // Make sure that link elements get serialized correctly by innerHTML + // This requires a wrapper element in IE + htmlSerialize: !!div.getElementsByTagName("link").length, + + // Get the style information from getAttribute + // (IE uses .cssText instead) + style: /top/.test( a.getAttribute("style") ), + + // Make sure that URLs aren't manipulated + // (IE normalizes it by default) + hrefNormalized: ( a.getAttribute("href") === "/a" ), + + // Make sure that element opacity exists + // (IE uses filter instead) + // Use a regex to work around a WebKit issue. See #5145 + opacity: /^0.55/.test( a.style.opacity ), + + // Verify style float existence + // (IE uses styleFloat instead of cssFloat) + cssFloat: !!a.style.cssFloat, + + // Make sure that if no value is specified for a checkbox + // that it defaults to "on". + // (WebKit defaults to "" instead) + checkOn: ( input.value === "on" ), + + // Make sure that a selected-by-default option has a working selected property. + // (WebKit defaults to false instead of true, IE too, if it's in an optgroup) + optSelected: opt.selected, + + // Test setAttribute on camelCase class. If it works, we need attrFixes when doing get/setAttribute (ie6/7) + getSetAttribute: div.className !== "t", + + // Tests for enctype support on a form(#6743) + enctype: !!document.createElement("form").enctype, + + // Makes sure cloning an html5 element does not cause problems + // Where outerHTML is undefined, this still works + html5Clone: document.createElement("nav").cloneNode( true ).outerHTML !== "<:nav>", + + // Will be defined later + submitBubbles: true, + changeBubbles: true, + focusinBubbles: false, + deleteExpando: true, + noCloneEvent: true, + inlineBlockNeedsLayout: false, + shrinkWrapBlocks: false, + reliableMarginRight: true + }; + + // Make sure checked status is properly cloned + input.checked = true; + support.noCloneChecked = input.cloneNode( true ).checked; + + // Make sure that the options inside disabled selects aren't marked as disabled + // (WebKit marks them as disabled) + select.disabled = true; + support.optDisabled = !opt.disabled; + + // Test to see if it's possible to delete an expando from an element + // Fails in Internet Explorer + try { + delete div.test; + } catch( e ) { + support.deleteExpando = false; + } + + if ( !div.addEventListener && div.attachEvent && div.fireEvent ) { + div.attachEvent( "onclick", function() { + // Cloning a node shouldn't copy over any + // bound event handlers (IE does this) + support.noCloneEvent = false; + }); + div.cloneNode( true ).fireEvent( "onclick" ); + } + + // Check if a radio maintains its value + // after being appended to the DOM + input = document.createElement("input"); + input.value = "t"; + input.setAttribute("type", "radio"); + support.radioValue = input.value === "t"; + + input.setAttribute("checked", "checked"); + div.appendChild( input ); + fragment = document.createDocumentFragment(); + fragment.appendChild( div.lastChild ); + + // WebKit doesn't clone checked state correctly in fragments + support.checkClone = fragment.cloneNode( true ).cloneNode( true ).lastChild.checked; + + // Check if a disconnected checkbox will retain its checked + // value of true after appended to the DOM (IE6/7) + support.appendChecked = input.checked; + + fragment.removeChild( input ); + fragment.appendChild( div ); + + div.innerHTML = ""; + + // Check if div with explicit width and no margin-right incorrectly + // gets computed margin-right based on width of container. For more + // info see bug #3333 + // Fails in WebKit before Feb 2011 nightlies + // WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right + if ( window.getComputedStyle ) { + marginDiv = document.createElement( "div" ); + marginDiv.style.width = "0"; + marginDiv.style.marginRight = "0"; + div.style.width = "2px"; + div.appendChild( marginDiv ); + support.reliableMarginRight = + ( parseInt( ( window.getComputedStyle( marginDiv, null ) || { marginRight: 0 } ).marginRight, 10 ) || 0 ) === 0; + } + + // Technique from Juriy Zaytsev + // http://perfectionkills.com/detecting-event-support-without-browser-sniffing/ + // We only care about the case where non-standard event systems + // are used, namely in IE. Short-circuiting here helps us to + // avoid an eval call (in setAttribute) which can cause CSP + // to go haywire. See: https://developer.mozilla.org/en/Security/CSP + if ( div.attachEvent ) { + for( i in { + submit: 1, + change: 1, + focusin: 1 + }) { + eventName = "on" + i; + isSupported = ( eventName in div ); + if ( !isSupported ) { + div.setAttribute( eventName, "return;" ); + isSupported = ( typeof div[ eventName ] === "function" ); + } + support[ i + "Bubbles" ] = isSupported; + } + } + + fragment.removeChild( div ); + + // Null elements to avoid leaks in IE + fragment = select = opt = marginDiv = div = input = null; + + // Run tests that need a body at doc ready + jQuery(function() { + var container, outer, inner, table, td, offsetSupport, + conMarginTop, ptlm, vb, style, html, + body = document.getElementsByTagName("body")[0]; + + if ( !body ) { + // Return for frameset docs that don't have a body + return; + } + + conMarginTop = 1; + ptlm = "position:absolute;top:0;left:0;width:1px;height:1px;margin:0;"; + vb = "visibility:hidden;border:0;"; + style = "style='" + ptlm + "border:5px solid #000;padding:0;'"; + html = "
" + + "" + + "
"; + + container = document.createElement("div"); + container.style.cssText = vb + "width:0;height:0;position:static;top:0;margin-top:" + conMarginTop + "px"; + body.insertBefore( container, body.firstChild ); + + // Construct the test element + div = document.createElement("div"); + container.appendChild( div ); + + // Check if table cells still have offsetWidth/Height when they are set + // to display:none and there are still other visible table cells in a + // table row; if so, offsetWidth/Height are not reliable for use when + // determining if an element has been hidden directly using + // display:none (it is still safe to use offsets if a parent element is + // hidden; don safety goggles and see bug #4512 for more information). + // (only IE 8 fails this test) + div.innerHTML = "
t
"; + tds = div.getElementsByTagName( "td" ); + isSupported = ( tds[ 0 ].offsetHeight === 0 ); + + tds[ 0 ].style.display = ""; + tds[ 1 ].style.display = "none"; + + // Check if empty table cells still have offsetWidth/Height + // (IE <= 8 fail this test) + support.reliableHiddenOffsets = isSupported && ( tds[ 0 ].offsetHeight === 0 ); + + // Figure out if the W3C box model works as expected + div.innerHTML = ""; + div.style.width = div.style.paddingLeft = "1px"; + jQuery.boxModel = support.boxModel = div.offsetWidth === 2; + + if ( typeof div.style.zoom !== "undefined" ) { + // Check if natively block-level elements act like inline-block + // elements when setting their display to 'inline' and giving + // them layout + // (IE < 8 does this) + div.style.display = "inline"; + div.style.zoom = 1; + support.inlineBlockNeedsLayout = ( div.offsetWidth === 2 ); + + // Check if elements with layout shrink-wrap their children + // (IE 6 does this) + div.style.display = ""; + div.innerHTML = "
"; + support.shrinkWrapBlocks = ( div.offsetWidth !== 2 ); + } + + div.style.cssText = ptlm + vb; + div.innerHTML = html; + + outer = div.firstChild; + inner = outer.firstChild; + td = outer.nextSibling.firstChild.firstChild; + + offsetSupport = { + doesNotAddBorder: ( inner.offsetTop !== 5 ), + doesAddBorderForTableAndCells: ( td.offsetTop === 5 ) + }; + + inner.style.position = "fixed"; + inner.style.top = "20px"; + + // safari subtracts parent border width here which is 5px + offsetSupport.fixedPosition = ( inner.offsetTop === 20 || inner.offsetTop === 15 ); + inner.style.position = inner.style.top = ""; + + outer.style.overflow = "hidden"; + outer.style.position = "relative"; + + offsetSupport.subtractsBorderForOverflowNotVisible = ( inner.offsetTop === -5 ); + offsetSupport.doesNotIncludeMarginInBodyOffset = ( body.offsetTop !== conMarginTop ); + + body.removeChild( container ); + div = container = null; + + jQuery.extend( support, offsetSupport ); + }); + + return support; +})(); + + + + +var rbrace = /^(?:\{.*\}|\[.*\])$/, + rmultiDash = /([A-Z])/g; + +jQuery.extend({ + cache: {}, + + // Please use with caution + uuid: 0, + + // Unique for each copy of jQuery on the page + // Non-digits removed to match rinlinejQuery + expando: "jQuery" + ( jQuery.fn.jquery + Math.random() ).replace( /\D/g, "" ), + + // The following elements throw uncatchable exceptions if you + // attempt to add expando properties to them. + noData: { + "embed": true, + // Ban all objects except for Flash (which handle expandos) + "object": "clsid:D27CDB6E-AE6D-11cf-96B8-444553540000", + "applet": true + }, + + hasData: function( elem ) { + elem = elem.nodeType ? jQuery.cache[ elem[jQuery.expando] ] : elem[ jQuery.expando ]; + return !!elem && !isEmptyDataObject( elem ); + }, + + data: function( elem, name, data, pvt /* Internal Use Only */ ) { + if ( !jQuery.acceptData( elem ) ) { + return; + } + + var privateCache, thisCache, ret, + internalKey = jQuery.expando, + getByName = typeof name === "string", + + // We have to handle DOM nodes and JS objects differently because IE6-7 + // can't GC object references properly across the DOM-JS boundary + isNode = elem.nodeType, + + // Only DOM nodes need the global jQuery cache; JS object data is + // attached directly to the object so GC can occur automatically + cache = isNode ? jQuery.cache : elem, + + // Only defining an ID for JS objects if its cache already exists allows + // the code to shortcut on the same path as a DOM node with no cache + id = isNode ? elem[ internalKey ] : elem[ internalKey ] && internalKey, + isEvents = name === "events"; + + // Avoid doing any more work than we need to when trying to get data on an + // object that has no data at all + if ( (!id || !cache[id] || (!isEvents && !pvt && !cache[id].data)) && getByName && data === undefined ) { + return; + } + + if ( !id ) { + // Only DOM nodes need a new unique ID for each element since their data + // ends up in the global cache + if ( isNode ) { + elem[ internalKey ] = id = ++jQuery.uuid; + } else { + id = internalKey; + } + } + + if ( !cache[ id ] ) { + cache[ id ] = {}; + + // Avoids exposing jQuery metadata on plain JS objects when the object + // is serialized using JSON.stringify + if ( !isNode ) { + cache[ id ].toJSON = jQuery.noop; + } + } + + // An object can be passed to jQuery.data instead of a key/value pair; this gets + // shallow copied over onto the existing cache + if ( typeof name === "object" || typeof name === "function" ) { + if ( pvt ) { + cache[ id ] = jQuery.extend( cache[ id ], name ); + } else { + cache[ id ].data = jQuery.extend( cache[ id ].data, name ); + } + } + + privateCache = thisCache = cache[ id ]; + + // jQuery data() is stored in a separate object inside the object's internal data + // cache in order to avoid key collisions between internal data and user-defined + // data. + if ( !pvt ) { + if ( !thisCache.data ) { + thisCache.data = {}; + } + + thisCache = thisCache.data; + } + + if ( data !== undefined ) { + thisCache[ jQuery.camelCase( name ) ] = data; + } + + // Users should not attempt to inspect the internal events object using jQuery.data, + // it is undocumented and subject to change. But does anyone listen? No. + if ( isEvents && !thisCache[ name ] ) { + return privateCache.events; + } + + // Check for both converted-to-camel and non-converted data property names + // If a data property was specified + if ( getByName ) { + + // First Try to find as-is property data + ret = thisCache[ name ]; + + // Test for null|undefined property data + if ( ret == null ) { + + // Try to find the camelCased property + ret = thisCache[ jQuery.camelCase( name ) ]; + } + } else { + ret = thisCache; + } + + return ret; + }, + + removeData: function( elem, name, pvt /* Internal Use Only */ ) { + if ( !jQuery.acceptData( elem ) ) { + return; + } + + var thisCache, i, l, + + // Reference to internal data cache key + internalKey = jQuery.expando, + + isNode = elem.nodeType, + + // See jQuery.data for more information + cache = isNode ? jQuery.cache : elem, + + // See jQuery.data for more information + id = isNode ? elem[ internalKey ] : internalKey; + + // If there is already no cache entry for this object, there is no + // purpose in continuing + if ( !cache[ id ] ) { + return; + } + + if ( name ) { + + thisCache = pvt ? cache[ id ] : cache[ id ].data; + + if ( thisCache ) { + + // Support array or space separated string names for data keys + if ( !jQuery.isArray( name ) ) { + + // try the string as a key before any manipulation + if ( name in thisCache ) { + name = [ name ]; + } else { + + // split the camel cased version by spaces unless a key with the spaces exists + name = jQuery.camelCase( name ); + if ( name in thisCache ) { + name = [ name ]; + } else { + name = name.split( " " ); + } + } + } + + for ( i = 0, l = name.length; i < l; i++ ) { + delete thisCache[ name[i] ]; + } + + // If there is no data left in the cache, we want to continue + // and let the cache object itself get destroyed + if ( !( pvt ? isEmptyDataObject : jQuery.isEmptyObject )( thisCache ) ) { + return; + } + } + } + + // See jQuery.data for more information + if ( !pvt ) { + delete cache[ id ].data; + + // Don't destroy the parent cache unless the internal data object + // had been the only thing left in it + if ( !isEmptyDataObject(cache[ id ]) ) { + return; + } + } + + // Browsers that fail expando deletion also refuse to delete expandos on + // the window, but it will allow it on all other JS objects; other browsers + // don't care + // Ensure that `cache` is not a window object #10080 + if ( jQuery.support.deleteExpando || !cache.setInterval ) { + delete cache[ id ]; + } else { + cache[ id ] = null; + } + + // We destroyed the cache and need to eliminate the expando on the node to avoid + // false lookups in the cache for entries that no longer exist + if ( isNode ) { + // IE does not allow us to delete expando properties from nodes, + // nor does it have a removeAttribute function on Document nodes; + // we must handle all of these cases + if ( jQuery.support.deleteExpando ) { + delete elem[ internalKey ]; + } else if ( elem.removeAttribute ) { + elem.removeAttribute( internalKey ); + } else { + elem[ internalKey ] = null; + } + } + }, + + // For internal use only. + _data: function( elem, name, data ) { + return jQuery.data( elem, name, data, true ); + }, + + // A method for determining if a DOM node can handle the data expando + acceptData: function( elem ) { + if ( elem.nodeName ) { + var match = jQuery.noData[ elem.nodeName.toLowerCase() ]; + + if ( match ) { + return !(match === true || elem.getAttribute("classid") !== match); + } + } + + return true; + } +}); + +jQuery.fn.extend({ + data: function( key, value ) { + var parts, attr, name, + data = null; + + if ( typeof key === "undefined" ) { + if ( this.length ) { + data = jQuery.data( this[0] ); + + if ( this[0].nodeType === 1 && !jQuery._data( this[0], "parsedAttrs" ) ) { + attr = this[0].attributes; + for ( var i = 0, l = attr.length; i < l; i++ ) { + name = attr[i].name; + + if ( name.indexOf( "data-" ) === 0 ) { + name = jQuery.camelCase( name.substring(5) ); + + dataAttr( this[0], name, data[ name ] ); + } + } + jQuery._data( this[0], "parsedAttrs", true ); + } + } + + return data; + + } else if ( typeof key === "object" ) { + return this.each(function() { + jQuery.data( this, key ); + }); + } + + parts = key.split("."); + parts[1] = parts[1] ? "." + parts[1] : ""; + + if ( value === undefined ) { + data = this.triggerHandler("getData" + parts[1] + "!", [parts[0]]); + + // Try to fetch any internally stored data first + if ( data === undefined && this.length ) { + data = jQuery.data( this[0], key ); + data = dataAttr( this[0], key, data ); + } + + return data === undefined && parts[1] ? + this.data( parts[0] ) : + data; + + } else { + return this.each(function() { + var self = jQuery( this ), + args = [ parts[0], value ]; + + self.triggerHandler( "setData" + parts[1] + "!", args ); + jQuery.data( this, key, value ); + self.triggerHandler( "changeData" + parts[1] + "!", args ); + }); + } + }, + + removeData: function( key ) { + return this.each(function() { + jQuery.removeData( this, key ); + }); + } +}); + +function dataAttr( elem, key, data ) { + // If nothing was found internally, try to fetch any + // data from the HTML5 data-* attribute + if ( data === undefined && elem.nodeType === 1 ) { + + var name = "data-" + key.replace( rmultiDash, "-$1" ).toLowerCase(); + + data = elem.getAttribute( name ); + + if ( typeof data === "string" ) { + try { + data = data === "true" ? true : + data === "false" ? false : + data === "null" ? null : + jQuery.isNumeric( data ) ? parseFloat( data ) : + rbrace.test( data ) ? jQuery.parseJSON( data ) : + data; + } catch( e ) {} + + // Make sure we set the data so it isn't changed later + jQuery.data( elem, key, data ); + + } else { + data = undefined; + } + } + + return data; +} + +// checks a cache object for emptiness +function isEmptyDataObject( obj ) { + for ( var name in obj ) { + + // if the public data object is empty, the private is still empty + if ( name === "data" && jQuery.isEmptyObject( obj[name] ) ) { + continue; + } + if ( name !== "toJSON" ) { + return false; + } + } + + return true; +} + + + + +function handleQueueMarkDefer( elem, type, src ) { + var deferDataKey = type + "defer", + queueDataKey = type + "queue", + markDataKey = type + "mark", + defer = jQuery._data( elem, deferDataKey ); + if ( defer && + ( src === "queue" || !jQuery._data(elem, queueDataKey) ) && + ( src === "mark" || !jQuery._data(elem, markDataKey) ) ) { + // Give room for hard-coded callbacks to fire first + // and eventually mark/queue something else on the element + setTimeout( function() { + if ( !jQuery._data( elem, queueDataKey ) && + !jQuery._data( elem, markDataKey ) ) { + jQuery.removeData( elem, deferDataKey, true ); + defer.fire(); + } + }, 0 ); + } +} + +jQuery.extend({ + + _mark: function( elem, type ) { + if ( elem ) { + type = ( type || "fx" ) + "mark"; + jQuery._data( elem, type, (jQuery._data( elem, type ) || 0) + 1 ); + } + }, + + _unmark: function( force, elem, type ) { + if ( force !== true ) { + type = elem; + elem = force; + force = false; + } + if ( elem ) { + type = type || "fx"; + var key = type + "mark", + count = force ? 0 : ( (jQuery._data( elem, key ) || 1) - 1 ); + if ( count ) { + jQuery._data( elem, key, count ); + } else { + jQuery.removeData( elem, key, true ); + handleQueueMarkDefer( elem, type, "mark" ); + } + } + }, + + queue: function( elem, type, data ) { + var q; + if ( elem ) { + type = ( type || "fx" ) + "queue"; + q = jQuery._data( elem, type ); + + // Speed up dequeue by getting out quickly if this is just a lookup + if ( data ) { + if ( !q || jQuery.isArray(data) ) { + q = jQuery._data( elem, type, jQuery.makeArray(data) ); + } else { + q.push( data ); + } + } + return q || []; + } + }, + + dequeue: function( elem, type ) { + type = type || "fx"; + + var queue = jQuery.queue( elem, type ), + fn = queue.shift(), + hooks = {}; + + // If the fx queue is dequeued, always remove the progress sentinel + if ( fn === "inprogress" ) { + fn = queue.shift(); + } + + if ( fn ) { + // Add a progress sentinel to prevent the fx queue from being + // automatically dequeued + if ( type === "fx" ) { + queue.unshift( "inprogress" ); + } + + jQuery._data( elem, type + ".run", hooks ); + fn.call( elem, function() { + jQuery.dequeue( elem, type ); + }, hooks ); + } + + if ( !queue.length ) { + jQuery.removeData( elem, type + "queue " + type + ".run", true ); + handleQueueMarkDefer( elem, type, "queue" ); + } + } +}); + +jQuery.fn.extend({ + queue: function( type, data ) { + if ( typeof type !== "string" ) { + data = type; + type = "fx"; + } + + if ( data === undefined ) { + return jQuery.queue( this[0], type ); + } + return this.each(function() { + var queue = jQuery.queue( this, type, data ); + + if ( type === "fx" && queue[0] !== "inprogress" ) { + jQuery.dequeue( this, type ); + } + }); + }, + dequeue: function( type ) { + return this.each(function() { + jQuery.dequeue( this, type ); + }); + }, + // Based off of the plugin by Clint Helfers, with permission. + // http://blindsignals.com/index.php/2009/07/jquery-delay/ + delay: function( time, type ) { + time = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time; + type = type || "fx"; + + return this.queue( type, function( next, hooks ) { + var timeout = setTimeout( next, time ); + hooks.stop = function() { + clearTimeout( timeout ); + }; + }); + }, + clearQueue: function( type ) { + return this.queue( type || "fx", [] ); + }, + // Get a promise resolved when queues of a certain type + // are emptied (fx is the type by default) + promise: function( type, object ) { + if ( typeof type !== "string" ) { + object = type; + type = undefined; + } + type = type || "fx"; + var defer = jQuery.Deferred(), + elements = this, + i = elements.length, + count = 1, + deferDataKey = type + "defer", + queueDataKey = type + "queue", + markDataKey = type + "mark", + tmp; + function resolve() { + if ( !( --count ) ) { + defer.resolveWith( elements, [ elements ] ); + } + } + while( i-- ) { + if (( tmp = jQuery.data( elements[ i ], deferDataKey, undefined, true ) || + ( jQuery.data( elements[ i ], queueDataKey, undefined, true ) || + jQuery.data( elements[ i ], markDataKey, undefined, true ) ) && + jQuery.data( elements[ i ], deferDataKey, jQuery.Callbacks( "once memory" ), true ) )) { + count++; + tmp.add( resolve ); + } + } + resolve(); + return defer.promise(); + } +}); + + + + +var rclass = /[\n\t\r]/g, + rspace = /\s+/, + rreturn = /\r/g, + rtype = /^(?:button|input)$/i, + rfocusable = /^(?:button|input|object|select|textarea)$/i, + rclickable = /^a(?:rea)?$/i, + rboolean = /^(?:autofocus|autoplay|async|checked|controls|defer|disabled|hidden|loop|multiple|open|readonly|required|scoped|selected)$/i, + getSetAttribute = jQuery.support.getSetAttribute, + nodeHook, boolHook, fixSpecified; + +jQuery.fn.extend({ + attr: function( name, value ) { + return jQuery.access( this, name, value, true, jQuery.attr ); + }, + + removeAttr: function( name ) { + return this.each(function() { + jQuery.removeAttr( this, name ); + }); + }, + + prop: function( name, value ) { + return jQuery.access( this, name, value, true, jQuery.prop ); + }, + + removeProp: function( name ) { + name = jQuery.propFix[ name ] || name; + return this.each(function() { + // try/catch handles cases where IE balks (such as removing a property on window) + try { + this[ name ] = undefined; + delete this[ name ]; + } catch( e ) {} + }); + }, + + addClass: function( value ) { + var classNames, i, l, elem, + setClass, c, cl; + + if ( jQuery.isFunction( value ) ) { + return this.each(function( j ) { + jQuery( this ).addClass( value.call(this, j, this.className) ); + }); + } + + if ( value && typeof value === "string" ) { + classNames = value.split( rspace ); + + for ( i = 0, l = this.length; i < l; i++ ) { + elem = this[ i ]; + + if ( elem.nodeType === 1 ) { + if ( !elem.className && classNames.length === 1 ) { + elem.className = value; + + } else { + setClass = " " + elem.className + " "; + + for ( c = 0, cl = classNames.length; c < cl; c++ ) { + if ( !~setClass.indexOf( " " + classNames[ c ] + " " ) ) { + setClass += classNames[ c ] + " "; + } + } + elem.className = jQuery.trim( setClass ); + } + } + } + } + + return this; + }, + + removeClass: function( value ) { + var classNames, i, l, elem, className, c, cl; + + if ( jQuery.isFunction( value ) ) { + return this.each(function( j ) { + jQuery( this ).removeClass( value.call(this, j, this.className) ); + }); + } + + if ( (value && typeof value === "string") || value === undefined ) { + classNames = ( value || "" ).split( rspace ); + + for ( i = 0, l = this.length; i < l; i++ ) { + elem = this[ i ]; + + if ( elem.nodeType === 1 && elem.className ) { + if ( value ) { + className = (" " + elem.className + " ").replace( rclass, " " ); + for ( c = 0, cl = classNames.length; c < cl; c++ ) { + className = className.replace(" " + classNames[ c ] + " ", " "); + } + elem.className = jQuery.trim( className ); + + } else { + elem.className = ""; + } + } + } + } + + return this; + }, + + toggleClass: function( value, stateVal ) { + var type = typeof value, + isBool = typeof stateVal === "boolean"; + + if ( jQuery.isFunction( value ) ) { + return this.each(function( i ) { + jQuery( this ).toggleClass( value.call(this, i, this.className, stateVal), stateVal ); + }); + } + + return this.each(function() { + if ( type === "string" ) { + // toggle individual class names + var className, + i = 0, + self = jQuery( this ), + state = stateVal, + classNames = value.split( rspace ); + + while ( (className = classNames[ i++ ]) ) { + // check each className given, space seperated list + state = isBool ? state : !self.hasClass( className ); + self[ state ? "addClass" : "removeClass" ]( className ); + } + + } else if ( type === "undefined" || type === "boolean" ) { + if ( this.className ) { + // store className if set + jQuery._data( this, "__className__", this.className ); + } + + // toggle whole className + this.className = this.className || value === false ? "" : jQuery._data( this, "__className__" ) || ""; + } + }); + }, + + hasClass: function( selector ) { + var className = " " + selector + " ", + i = 0, + l = this.length; + for ( ; i < l; i++ ) { + if ( this[i].nodeType === 1 && (" " + this[i].className + " ").replace(rclass, " ").indexOf( className ) > -1 ) { + return true; + } + } + + return false; + }, + + val: function( value ) { + var hooks, ret, isFunction, + elem = this[0]; + + if ( !arguments.length ) { + if ( elem ) { + hooks = jQuery.valHooks[ elem.nodeName.toLowerCase() ] || jQuery.valHooks[ elem.type ]; + + if ( hooks && "get" in hooks && (ret = hooks.get( elem, "value" )) !== undefined ) { + return ret; + } + + ret = elem.value; + + return typeof ret === "string" ? + // handle most common string cases + ret.replace(rreturn, "") : + // handle cases where value is null/undef or number + ret == null ? "" : ret; + } + + return; + } + + isFunction = jQuery.isFunction( value ); + + return this.each(function( i ) { + var self = jQuery(this), val; + + if ( this.nodeType !== 1 ) { + return; + } + + if ( isFunction ) { + val = value.call( this, i, self.val() ); + } else { + val = value; + } + + // Treat null/undefined as ""; convert numbers to string + if ( val == null ) { + val = ""; + } else if ( typeof val === "number" ) { + val += ""; + } else if ( jQuery.isArray( val ) ) { + val = jQuery.map(val, function ( value ) { + return value == null ? "" : value + ""; + }); + } + + hooks = jQuery.valHooks[ this.nodeName.toLowerCase() ] || jQuery.valHooks[ this.type ]; + + // If set returns undefined, fall back to normal setting + if ( !hooks || !("set" in hooks) || hooks.set( this, val, "value" ) === undefined ) { + this.value = val; + } + }); + } +}); + +jQuery.extend({ + valHooks: { + option: { + get: function( elem ) { + // attributes.value is undefined in Blackberry 4.7 but + // uses .value. See #6932 + var val = elem.attributes.value; + return !val || val.specified ? elem.value : elem.text; + } + }, + select: { + get: function( elem ) { + var value, i, max, option, + index = elem.selectedIndex, + values = [], + options = elem.options, + one = elem.type === "select-one"; + + // Nothing was selected + if ( index < 0 ) { + return null; + } + + // Loop through all the selected options + i = one ? index : 0; + max = one ? index + 1 : options.length; + for ( ; i < max; i++ ) { + option = options[ i ]; + + // Don't return options that are disabled or in a disabled optgroup + if ( option.selected && (jQuery.support.optDisabled ? !option.disabled : option.getAttribute("disabled") === null) && + (!option.parentNode.disabled || !jQuery.nodeName( option.parentNode, "optgroup" )) ) { + + // Get the specific value for the option + value = jQuery( option ).val(); + + // We don't need an array for one selects + if ( one ) { + return value; + } + + // Multi-Selects return an array + values.push( value ); + } + } + + // Fixes Bug #2551 -- select.val() broken in IE after form.reset() + if ( one && !values.length && options.length ) { + return jQuery( options[ index ] ).val(); + } + + return values; + }, + + set: function( elem, value ) { + var values = jQuery.makeArray( value ); + + jQuery(elem).find("option").each(function() { + this.selected = jQuery.inArray( jQuery(this).val(), values ) >= 0; + }); + + if ( !values.length ) { + elem.selectedIndex = -1; + } + return values; + } + } + }, + + attrFn: { + val: true, + css: true, + html: true, + text: true, + data: true, + width: true, + height: true, + offset: true + }, + + attr: function( elem, name, value, pass ) { + var ret, hooks, notxml, + nType = elem.nodeType; + + // don't get/set attributes on text, comment and attribute nodes + if ( !elem || nType === 3 || nType === 8 || nType === 2 ) { + return; + } + + if ( pass && name in jQuery.attrFn ) { + return jQuery( elem )[ name ]( value ); + } + + // Fallback to prop when attributes are not supported + if ( typeof elem.getAttribute === "undefined" ) { + return jQuery.prop( elem, name, value ); + } + + notxml = nType !== 1 || !jQuery.isXMLDoc( elem ); + + // All attributes are lowercase + // Grab necessary hook if one is defined + if ( notxml ) { + name = name.toLowerCase(); + hooks = jQuery.attrHooks[ name ] || ( rboolean.test( name ) ? boolHook : nodeHook ); + } + + if ( value !== undefined ) { + + if ( value === null ) { + jQuery.removeAttr( elem, name ); + return; + + } else if ( hooks && "set" in hooks && notxml && (ret = hooks.set( elem, value, name )) !== undefined ) { + return ret; + + } else { + elem.setAttribute( name, "" + value ); + return value; + } + + } else if ( hooks && "get" in hooks && notxml && (ret = hooks.get( elem, name )) !== null ) { + return ret; + + } else { + + ret = elem.getAttribute( name ); + + // Non-existent attributes return null, we normalize to undefined + return ret === null ? + undefined : + ret; + } + }, + + removeAttr: function( elem, value ) { + var propName, attrNames, name, l, + i = 0; + + if ( value && elem.nodeType === 1 ) { + attrNames = value.toLowerCase().split( rspace ); + l = attrNames.length; + + for ( ; i < l; i++ ) { + name = attrNames[ i ]; + + if ( name ) { + propName = jQuery.propFix[ name ] || name; + + // See #9699 for explanation of this approach (setting first, then removal) + jQuery.attr( elem, name, "" ); + elem.removeAttribute( getSetAttribute ? name : propName ); + + // Set corresponding property to false for boolean attributes + if ( rboolean.test( name ) && propName in elem ) { + elem[ propName ] = false; + } + } + } + } + }, + + attrHooks: { + type: { + set: function( elem, value ) { + // We can't allow the type property to be changed (since it causes problems in IE) + if ( rtype.test( elem.nodeName ) && elem.parentNode ) { + jQuery.error( "type property can't be changed" ); + } else if ( !jQuery.support.radioValue && value === "radio" && jQuery.nodeName(elem, "input") ) { + // Setting the type on a radio button after the value resets the value in IE6-9 + // Reset value to it's default in case type is set after value + // This is for element creation + var val = elem.value; + elem.setAttribute( "type", value ); + if ( val ) { + elem.value = val; + } + return value; + } + } + }, + // Use the value property for back compat + // Use the nodeHook for button elements in IE6/7 (#1954) + value: { + get: function( elem, name ) { + if ( nodeHook && jQuery.nodeName( elem, "button" ) ) { + return nodeHook.get( elem, name ); + } + return name in elem ? + elem.value : + null; + }, + set: function( elem, value, name ) { + if ( nodeHook && jQuery.nodeName( elem, "button" ) ) { + return nodeHook.set( elem, value, name ); + } + // Does not return so that setAttribute is also used + elem.value = value; + } + } + }, + + propFix: { + tabindex: "tabIndex", + readonly: "readOnly", + "for": "htmlFor", + "class": "className", + maxlength: "maxLength", + cellspacing: "cellSpacing", + cellpadding: "cellPadding", + rowspan: "rowSpan", + colspan: "colSpan", + usemap: "useMap", + frameborder: "frameBorder", + contenteditable: "contentEditable" + }, + + prop: function( elem, name, value ) { + var ret, hooks, notxml, + nType = elem.nodeType; + + // don't get/set properties on text, comment and attribute nodes + if ( !elem || nType === 3 || nType === 8 || nType === 2 ) { + return; + } + + notxml = nType !== 1 || !jQuery.isXMLDoc( elem ); + + if ( notxml ) { + // Fix name and attach hooks + name = jQuery.propFix[ name ] || name; + hooks = jQuery.propHooks[ name ]; + } + + if ( value !== undefined ) { + if ( hooks && "set" in hooks && (ret = hooks.set( elem, value, name )) !== undefined ) { + return ret; + + } else { + return ( elem[ name ] = value ); + } + + } else { + if ( hooks && "get" in hooks && (ret = hooks.get( elem, name )) !== null ) { + return ret; + + } else { + return elem[ name ]; + } + } + }, + + propHooks: { + tabIndex: { + get: function( elem ) { + // elem.tabIndex doesn't always return the correct value when it hasn't been explicitly set + // http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/ + var attributeNode = elem.getAttributeNode("tabindex"); + + return attributeNode && attributeNode.specified ? + parseInt( attributeNode.value, 10 ) : + rfocusable.test( elem.nodeName ) || rclickable.test( elem.nodeName ) && elem.href ? + 0 : + undefined; + } + } + } +}); + +// Add the tabIndex propHook to attrHooks for back-compat (different case is intentional) +jQuery.attrHooks.tabindex = jQuery.propHooks.tabIndex; + +// Hook for boolean attributes +boolHook = { + get: function( elem, name ) { + // Align boolean attributes with corresponding properties + // Fall back to attribute presence where some booleans are not supported + var attrNode, + property = jQuery.prop( elem, name ); + return property === true || typeof property !== "boolean" && ( attrNode = elem.getAttributeNode(name) ) && attrNode.nodeValue !== false ? + name.toLowerCase() : + undefined; + }, + set: function( elem, value, name ) { + var propName; + if ( value === false ) { + // Remove boolean attributes when set to false + jQuery.removeAttr( elem, name ); + } else { + // value is true since we know at this point it's type boolean and not false + // Set boolean attributes to the same name and set the DOM property + propName = jQuery.propFix[ name ] || name; + if ( propName in elem ) { + // Only set the IDL specifically if it already exists on the element + elem[ propName ] = true; + } + + elem.setAttribute( name, name.toLowerCase() ); + } + return name; + } +}; + +// IE6/7 do not support getting/setting some attributes with get/setAttribute +if ( !getSetAttribute ) { + + fixSpecified = { + name: true, + id: true + }; + + // Use this for any attribute in IE6/7 + // This fixes almost every IE6/7 issue + nodeHook = jQuery.valHooks.button = { + get: function( elem, name ) { + var ret; + ret = elem.getAttributeNode( name ); + return ret && ( fixSpecified[ name ] ? ret.nodeValue !== "" : ret.specified ) ? + ret.nodeValue : + undefined; + }, + set: function( elem, value, name ) { + // Set the existing or create a new attribute node + var ret = elem.getAttributeNode( name ); + if ( !ret ) { + ret = document.createAttribute( name ); + elem.setAttributeNode( ret ); + } + return ( ret.nodeValue = value + "" ); + } + }; + + // Apply the nodeHook to tabindex + jQuery.attrHooks.tabindex.set = nodeHook.set; + + // Set width and height to auto instead of 0 on empty string( Bug #8150 ) + // This is for removals + jQuery.each([ "width", "height" ], function( i, name ) { + jQuery.attrHooks[ name ] = jQuery.extend( jQuery.attrHooks[ name ], { + set: function( elem, value ) { + if ( value === "" ) { + elem.setAttribute( name, "auto" ); + return value; + } + } + }); + }); + + // Set contenteditable to false on removals(#10429) + // Setting to empty string throws an error as an invalid value + jQuery.attrHooks.contenteditable = { + get: nodeHook.get, + set: function( elem, value, name ) { + if ( value === "" ) { + value = "false"; + } + nodeHook.set( elem, value, name ); + } + }; +} + + +// Some attributes require a special call on IE +if ( !jQuery.support.hrefNormalized ) { + jQuery.each([ "href", "src", "width", "height" ], function( i, name ) { + jQuery.attrHooks[ name ] = jQuery.extend( jQuery.attrHooks[ name ], { + get: function( elem ) { + var ret = elem.getAttribute( name, 2 ); + return ret === null ? undefined : ret; + } + }); + }); +} + +if ( !jQuery.support.style ) { + jQuery.attrHooks.style = { + get: function( elem ) { + // Return undefined in the case of empty string + // Normalize to lowercase since IE uppercases css property names + return elem.style.cssText.toLowerCase() || undefined; + }, + set: function( elem, value ) { + return ( elem.style.cssText = "" + value ); + } + }; +} + +// Safari mis-reports the default selected property of an option +// Accessing the parent's selectedIndex property fixes it +if ( !jQuery.support.optSelected ) { + jQuery.propHooks.selected = jQuery.extend( jQuery.propHooks.selected, { + get: function( elem ) { + var parent = elem.parentNode; + + if ( parent ) { + parent.selectedIndex; + + // Make sure that it also works with optgroups, see #5701 + if ( parent.parentNode ) { + parent.parentNode.selectedIndex; + } + } + return null; + } + }); +} + +// IE6/7 call enctype encoding +if ( !jQuery.support.enctype ) { + jQuery.propFix.enctype = "encoding"; +} + +// Radios and checkboxes getter/setter +if ( !jQuery.support.checkOn ) { + jQuery.each([ "radio", "checkbox" ], function() { + jQuery.valHooks[ this ] = { + get: function( elem ) { + // Handle the case where in Webkit "" is returned instead of "on" if a value isn't specified + return elem.getAttribute("value") === null ? "on" : elem.value; + } + }; + }); +} +jQuery.each([ "radio", "checkbox" ], function() { + jQuery.valHooks[ this ] = jQuery.extend( jQuery.valHooks[ this ], { + set: function( elem, value ) { + if ( jQuery.isArray( value ) ) { + return ( elem.checked = jQuery.inArray( jQuery(elem).val(), value ) >= 0 ); + } + } + }); +}); + + + + +var rformElems = /^(?:textarea|input|select)$/i, + rtypenamespace = /^([^\.]*)?(?:\.(.+))?$/, + rhoverHack = /\bhover(\.\S+)?\b/, + rkeyEvent = /^key/, + rmouseEvent = /^(?:mouse|contextmenu)|click/, + rfocusMorph = /^(?:focusinfocus|focusoutblur)$/, + rquickIs = /^(\w*)(?:#([\w\-]+))?(?:\.([\w\-]+))?$/, + quickParse = function( selector ) { + var quick = rquickIs.exec( selector ); + if ( quick ) { + // 0 1 2 3 + // [ _, tag, id, class ] + quick[1] = ( quick[1] || "" ).toLowerCase(); + quick[3] = quick[3] && new RegExp( "(?:^|\\s)" + quick[3] + "(?:\\s|$)" ); + } + return quick; + }, + quickIs = function( elem, m ) { + var attrs = elem.attributes || {}; + return ( + (!m[1] || elem.nodeName.toLowerCase() === m[1]) && + (!m[2] || (attrs.id || {}).value === m[2]) && + (!m[3] || m[3].test( (attrs[ "class" ] || {}).value )) + ); + }, + hoverHack = function( events ) { + return jQuery.event.special.hover ? events : events.replace( rhoverHack, "mouseenter$1 mouseleave$1" ); + }; + +/* + * Helper functions for managing events -- not part of the public interface. + * Props to Dean Edwards' addEvent library for many of the ideas. + */ +jQuery.event = { + + add: function( elem, types, handler, data, selector ) { + + var elemData, eventHandle, events, + t, tns, type, namespaces, handleObj, + handleObjIn, quick, handlers, special; + + // Don't attach events to noData or text/comment nodes (allow plain objects tho) + if ( elem.nodeType === 3 || elem.nodeType === 8 || !types || !handler || !(elemData = jQuery._data( elem )) ) { + return; + } + + // Caller can pass in an object of custom data in lieu of the handler + if ( handler.handler ) { + handleObjIn = handler; + handler = handleObjIn.handler; + } + + // Make sure that the handler has a unique ID, used to find/remove it later + if ( !handler.guid ) { + handler.guid = jQuery.guid++; + } + + // Init the element's event structure and main handler, if this is the first + events = elemData.events; + if ( !events ) { + elemData.events = events = {}; + } + eventHandle = elemData.handle; + if ( !eventHandle ) { + elemData.handle = eventHandle = function( e ) { + // Discard the second event of a jQuery.event.trigger() and + // when an event is called after a page has unloaded + return typeof jQuery !== "undefined" && (!e || jQuery.event.triggered !== e.type) ? + jQuery.event.dispatch.apply( eventHandle.elem, arguments ) : + undefined; + }; + // Add elem as a property of the handle fn to prevent a memory leak with IE non-native events + eventHandle.elem = elem; + } + + // Handle multiple events separated by a space + // jQuery(...).bind("mouseover mouseout", fn); + types = jQuery.trim( hoverHack(types) ).split( " " ); + for ( t = 0; t < types.length; t++ ) { + + tns = rtypenamespace.exec( types[t] ) || []; + type = tns[1]; + namespaces = ( tns[2] || "" ).split( "." ).sort(); + + // If event changes its type, use the special event handlers for the changed type + special = jQuery.event.special[ type ] || {}; + + // If selector defined, determine special event api type, otherwise given type + type = ( selector ? special.delegateType : special.bindType ) || type; + + // Update special based on newly reset type + special = jQuery.event.special[ type ] || {}; + + // handleObj is passed to all event handlers + handleObj = jQuery.extend({ + type: type, + origType: tns[1], + data: data, + handler: handler, + guid: handler.guid, + selector: selector, + quick: quickParse( selector ), + namespace: namespaces.join(".") + }, handleObjIn ); + + // Init the event handler queue if we're the first + handlers = events[ type ]; + if ( !handlers ) { + handlers = events[ type ] = []; + handlers.delegateCount = 0; + + // Only use addEventListener/attachEvent if the special events handler returns false + if ( !special.setup || special.setup.call( elem, data, namespaces, eventHandle ) === false ) { + // Bind the global event handler to the element + if ( elem.addEventListener ) { + elem.addEventListener( type, eventHandle, false ); + + } else if ( elem.attachEvent ) { + elem.attachEvent( "on" + type, eventHandle ); + } + } + } + + if ( special.add ) { + special.add.call( elem, handleObj ); + + if ( !handleObj.handler.guid ) { + handleObj.handler.guid = handler.guid; + } + } + + // Add to the element's handler list, delegates in front + if ( selector ) { + handlers.splice( handlers.delegateCount++, 0, handleObj ); + } else { + handlers.push( handleObj ); + } + + // Keep track of which events have ever been used, for event optimization + jQuery.event.global[ type ] = true; + } + + // Nullify elem to prevent memory leaks in IE + elem = null; + }, + + global: {}, + + // Detach an event or set of events from an element + remove: function( elem, types, handler, selector, mappedTypes ) { + + var elemData = jQuery.hasData( elem ) && jQuery._data( elem ), + t, tns, type, origType, namespaces, origCount, + j, events, special, handle, eventType, handleObj; + + if ( !elemData || !(events = elemData.events) ) { + return; + } + + // Once for each type.namespace in types; type may be omitted + types = jQuery.trim( hoverHack( types || "" ) ).split(" "); + for ( t = 0; t < types.length; t++ ) { + tns = rtypenamespace.exec( types[t] ) || []; + type = origType = tns[1]; + namespaces = tns[2]; + + // Unbind all events (on this namespace, if provided) for the element + if ( !type ) { + for ( type in events ) { + jQuery.event.remove( elem, type + types[ t ], handler, selector, true ); + } + continue; + } + + special = jQuery.event.special[ type ] || {}; + type = ( selector? special.delegateType : special.bindType ) || type; + eventType = events[ type ] || []; + origCount = eventType.length; + namespaces = namespaces ? new RegExp("(^|\\.)" + namespaces.split(".").sort().join("\\.(?:.*\\.)?") + "(\\.|$)") : null; + + // Remove matching events + for ( j = 0; j < eventType.length; j++ ) { + handleObj = eventType[ j ]; + + if ( ( mappedTypes || origType === handleObj.origType ) && + ( !handler || handler.guid === handleObj.guid ) && + ( !namespaces || namespaces.test( handleObj.namespace ) ) && + ( !selector || selector === handleObj.selector || selector === "**" && handleObj.selector ) ) { + eventType.splice( j--, 1 ); + + if ( handleObj.selector ) { + eventType.delegateCount--; + } + if ( special.remove ) { + special.remove.call( elem, handleObj ); + } + } + } + + // Remove generic event handler if we removed something and no more handlers exist + // (avoids potential for endless recursion during removal of special event handlers) + if ( eventType.length === 0 && origCount !== eventType.length ) { + if ( !special.teardown || special.teardown.call( elem, namespaces ) === false ) { + jQuery.removeEvent( elem, type, elemData.handle ); + } + + delete events[ type ]; + } + } + + // Remove the expando if it's no longer used + if ( jQuery.isEmptyObject( events ) ) { + handle = elemData.handle; + if ( handle ) { + handle.elem = null; + } + + // removeData also checks for emptiness and clears the expando if empty + // so use it instead of delete + jQuery.removeData( elem, [ "events", "handle" ], true ); + } + }, + + // Events that are safe to short-circuit if no handlers are attached. + // Native DOM events should not be added, they may have inline handlers. + customEvent: { + "getData": true, + "setData": true, + "changeData": true + }, + + trigger: function( event, data, elem, onlyHandlers ) { + // Don't do events on text and comment nodes + if ( elem && (elem.nodeType === 3 || elem.nodeType === 8) ) { + return; + } + + // Event object or event type + var type = event.type || event, + namespaces = [], + cache, exclusive, i, cur, old, ontype, special, handle, eventPath, bubbleType; + + // focus/blur morphs to focusin/out; ensure we're not firing them right now + if ( rfocusMorph.test( type + jQuery.event.triggered ) ) { + return; + } + + if ( type.indexOf( "!" ) >= 0 ) { + // Exclusive events trigger only for the exact event (no namespaces) + type = type.slice(0, -1); + exclusive = true; + } + + if ( type.indexOf( "." ) >= 0 ) { + // Namespaced trigger; create a regexp to match event type in handle() + namespaces = type.split("."); + type = namespaces.shift(); + namespaces.sort(); + } + + if ( (!elem || jQuery.event.customEvent[ type ]) && !jQuery.event.global[ type ] ) { + // No jQuery handlers for this event type, and it can't have inline handlers + return; + } + + // Caller can pass in an Event, Object, or just an event type string + event = typeof event === "object" ? + // jQuery.Event object + event[ jQuery.expando ] ? event : + // Object literal + new jQuery.Event( type, event ) : + // Just the event type (string) + new jQuery.Event( type ); + + event.type = type; + event.isTrigger = true; + event.exclusive = exclusive; + event.namespace = namespaces.join( "." ); + event.namespace_re = event.namespace? new RegExp("(^|\\.)" + namespaces.join("\\.(?:.*\\.)?") + "(\\.|$)") : null; + ontype = type.indexOf( ":" ) < 0 ? "on" + type : ""; + + // Handle a global trigger + if ( !elem ) { + + // TODO: Stop taunting the data cache; remove global events and always attach to document + cache = jQuery.cache; + for ( i in cache ) { + if ( cache[ i ].events && cache[ i ].events[ type ] ) { + jQuery.event.trigger( event, data, cache[ i ].handle.elem, true ); + } + } + return; + } + + // Clean up the event in case it is being reused + event.result = undefined; + if ( !event.target ) { + event.target = elem; + } + + // Clone any incoming data and prepend the event, creating the handler arg list + data = data != null ? jQuery.makeArray( data ) : []; + data.unshift( event ); + + // Allow special events to draw outside the lines + special = jQuery.event.special[ type ] || {}; + if ( special.trigger && special.trigger.apply( elem, data ) === false ) { + return; + } + + // Determine event propagation path in advance, per W3C events spec (#9951) + // Bubble up to document, then to window; watch for a global ownerDocument var (#9724) + eventPath = [[ elem, special.bindType || type ]]; + if ( !onlyHandlers && !special.noBubble && !jQuery.isWindow( elem ) ) { + + bubbleType = special.delegateType || type; + cur = rfocusMorph.test( bubbleType + type ) ? elem : elem.parentNode; + old = null; + for ( ; cur; cur = cur.parentNode ) { + eventPath.push([ cur, bubbleType ]); + old = cur; + } + + // Only add window if we got to document (e.g., not plain obj or detached DOM) + if ( old && old === elem.ownerDocument ) { + eventPath.push([ old.defaultView || old.parentWindow || window, bubbleType ]); + } + } + + // Fire handlers on the event path + for ( i = 0; i < eventPath.length && !event.isPropagationStopped(); i++ ) { + + cur = eventPath[i][0]; + event.type = eventPath[i][1]; + + handle = ( jQuery._data( cur, "events" ) || {} )[ event.type ] && jQuery._data( cur, "handle" ); + if ( handle ) { + handle.apply( cur, data ); + } + // Note that this is a bare JS function and not a jQuery handler + handle = ontype && cur[ ontype ]; + if ( handle && jQuery.acceptData( cur ) && handle.apply( cur, data ) === false ) { + event.preventDefault(); + } + } + event.type = type; + + // If nobody prevented the default action, do it now + if ( !onlyHandlers && !event.isDefaultPrevented() ) { + + if ( (!special._default || special._default.apply( elem.ownerDocument, data ) === false) && + !(type === "click" && jQuery.nodeName( elem, "a" )) && jQuery.acceptData( elem ) ) { + + // Call a native DOM method on the target with the same name name as the event. + // Can't use an .isFunction() check here because IE6/7 fails that test. + // Don't do default actions on window, that's where global variables be (#6170) + // IE<9 dies on focus/blur to hidden element (#1486) + if ( ontype && elem[ type ] && ((type !== "focus" && type !== "blur") || event.target.offsetWidth !== 0) && !jQuery.isWindow( elem ) ) { + + // Don't re-trigger an onFOO event when we call its FOO() method + old = elem[ ontype ]; + + if ( old ) { + elem[ ontype ] = null; + } + + // Prevent re-triggering of the same event, since we already bubbled it above + jQuery.event.triggered = type; + elem[ type ](); + jQuery.event.triggered = undefined; + + if ( old ) { + elem[ ontype ] = old; + } + } + } + } + + return event.result; + }, + + dispatch: function( event ) { + + // Make a writable jQuery.Event from the native event object + event = jQuery.event.fix( event || window.event ); + + var handlers = ( (jQuery._data( this, "events" ) || {} )[ event.type ] || []), + delegateCount = handlers.delegateCount, + args = [].slice.call( arguments, 0 ), + run_all = !event.exclusive && !event.namespace, + handlerQueue = [], + i, j, cur, jqcur, ret, selMatch, matched, matches, handleObj, sel, related; + + // Use the fix-ed jQuery.Event rather than the (read-only) native event + args[0] = event; + event.delegateTarget = this; + + // Determine handlers that should run if there are delegated events + // Avoid disabled elements in IE (#6911) and non-left-click bubbling in Firefox (#3861) + if ( delegateCount && !event.target.disabled && !(event.button && event.type === "click") ) { + + // Pregenerate a single jQuery object for reuse with .is() + jqcur = jQuery(this); + jqcur.context = this.ownerDocument || this; + + for ( cur = event.target; cur != this; cur = cur.parentNode || this ) { + selMatch = {}; + matches = []; + jqcur[0] = cur; + for ( i = 0; i < delegateCount; i++ ) { + handleObj = handlers[ i ]; + sel = handleObj.selector; + + if ( selMatch[ sel ] === undefined ) { + selMatch[ sel ] = ( + handleObj.quick ? quickIs( cur, handleObj.quick ) : jqcur.is( sel ) + ); + } + if ( selMatch[ sel ] ) { + matches.push( handleObj ); + } + } + if ( matches.length ) { + handlerQueue.push({ elem: cur, matches: matches }); + } + } + } + + // Add the remaining (directly-bound) handlers + if ( handlers.length > delegateCount ) { + handlerQueue.push({ elem: this, matches: handlers.slice( delegateCount ) }); + } + + // Run delegates first; they may want to stop propagation beneath us + for ( i = 0; i < handlerQueue.length && !event.isPropagationStopped(); i++ ) { + matched = handlerQueue[ i ]; + event.currentTarget = matched.elem; + + for ( j = 0; j < matched.matches.length && !event.isImmediatePropagationStopped(); j++ ) { + handleObj = matched.matches[ j ]; + + // Triggered event must either 1) be non-exclusive and have no namespace, or + // 2) have namespace(s) a subset or equal to those in the bound event (both can have no namespace). + if ( run_all || (!event.namespace && !handleObj.namespace) || event.namespace_re && event.namespace_re.test( handleObj.namespace ) ) { + + event.data = handleObj.data; + event.handleObj = handleObj; + + ret = ( (jQuery.event.special[ handleObj.origType ] || {}).handle || handleObj.handler ) + .apply( matched.elem, args ); + + if ( ret !== undefined ) { + event.result = ret; + if ( ret === false ) { + event.preventDefault(); + event.stopPropagation(); + } + } + } + } + } + + return event.result; + }, + + // Includes some event props shared by KeyEvent and MouseEvent + // *** attrChange attrName relatedNode srcElement are not normalized, non-W3C, deprecated, will be removed in 1.8 *** + props: "attrChange attrName relatedNode srcElement altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "), + + fixHooks: {}, + + keyHooks: { + props: "char charCode key keyCode".split(" "), + filter: function( event, original ) { + + // Add which for key events + if ( event.which == null ) { + event.which = original.charCode != null ? original.charCode : original.keyCode; + } + + return event; + } + }, + + mouseHooks: { + props: "button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "), + filter: function( event, original ) { + var eventDoc, doc, body, + button = original.button, + fromElement = original.fromElement; + + // Calculate pageX/Y if missing and clientX/Y available + if ( event.pageX == null && original.clientX != null ) { + eventDoc = event.target.ownerDocument || document; + doc = eventDoc.documentElement; + body = eventDoc.body; + + event.pageX = original.clientX + ( doc && doc.scrollLeft || body && body.scrollLeft || 0 ) - ( doc && doc.clientLeft || body && body.clientLeft || 0 ); + event.pageY = original.clientY + ( doc && doc.scrollTop || body && body.scrollTop || 0 ) - ( doc && doc.clientTop || body && body.clientTop || 0 ); + } + + // Add relatedTarget, if necessary + if ( !event.relatedTarget && fromElement ) { + event.relatedTarget = fromElement === event.target ? original.toElement : fromElement; + } + + // Add which for click: 1 === left; 2 === middle; 3 === right + // Note: button is not normalized, so don't use it + if ( !event.which && button !== undefined ) { + event.which = ( button & 1 ? 1 : ( button & 2 ? 3 : ( button & 4 ? 2 : 0 ) ) ); + } + + return event; + } + }, + + fix: function( event ) { + if ( event[ jQuery.expando ] ) { + return event; + } + + // Create a writable copy of the event object and normalize some properties + var i, prop, + originalEvent = event, + fixHook = jQuery.event.fixHooks[ event.type ] || {}, + copy = fixHook.props ? this.props.concat( fixHook.props ) : this.props; + + event = jQuery.Event( originalEvent ); + + for ( i = copy.length; i; ) { + prop = copy[ --i ]; + event[ prop ] = originalEvent[ prop ]; + } + + // Fix target property, if necessary (#1925, IE 6/7/8 & Safari2) + if ( !event.target ) { + event.target = originalEvent.srcElement || document; + } + + // Target should not be a text node (#504, Safari) + if ( event.target.nodeType === 3 ) { + event.target = event.target.parentNode; + } + + // For mouse/key events; add metaKey if it's not there (#3368, IE6/7/8) + if ( event.metaKey === undefined ) { + event.metaKey = event.ctrlKey; + } + + return fixHook.filter? fixHook.filter( event, originalEvent ) : event; + }, + + special: { + ready: { + // Make sure the ready event is setup + setup: jQuery.bindReady + }, + + load: { + // Prevent triggered image.load events from bubbling to window.load + noBubble: true + }, + + focus: { + delegateType: "focusin" + }, + blur: { + delegateType: "focusout" + }, + + beforeunload: { + setup: function( data, namespaces, eventHandle ) { + // We only want to do this special case on windows + if ( jQuery.isWindow( this ) ) { + this.onbeforeunload = eventHandle; + } + }, + + teardown: function( namespaces, eventHandle ) { + if ( this.onbeforeunload === eventHandle ) { + this.onbeforeunload = null; + } + } + } + }, + + simulate: function( type, elem, event, bubble ) { + // Piggyback on a donor event to simulate a different one. + // Fake originalEvent to avoid donor's stopPropagation, but if the + // simulated event prevents default then we do the same on the donor. + var e = jQuery.extend( + new jQuery.Event(), + event, + { type: type, + isSimulated: true, + originalEvent: {} + } + ); + if ( bubble ) { + jQuery.event.trigger( e, null, elem ); + } else { + jQuery.event.dispatch.call( elem, e ); + } + if ( e.isDefaultPrevented() ) { + event.preventDefault(); + } + } +}; + +// Some plugins are using, but it's undocumented/deprecated and will be removed. +// The 1.7 special event interface should provide all the hooks needed now. +jQuery.event.handle = jQuery.event.dispatch; + +jQuery.removeEvent = document.removeEventListener ? + function( elem, type, handle ) { + if ( elem.removeEventListener ) { + elem.removeEventListener( type, handle, false ); + } + } : + function( elem, type, handle ) { + if ( elem.detachEvent ) { + elem.detachEvent( "on" + type, handle ); + } + }; + +jQuery.Event = function( src, props ) { + // Allow instantiation without the 'new' keyword + if ( !(this instanceof jQuery.Event) ) { + return new jQuery.Event( src, props ); + } + + // Event object + if ( src && src.type ) { + this.originalEvent = src; + this.type = src.type; + + // Events bubbling up the document may have been marked as prevented + // by a handler lower down the tree; reflect the correct value. + this.isDefaultPrevented = ( src.defaultPrevented || src.returnValue === false || + src.getPreventDefault && src.getPreventDefault() ) ? returnTrue : returnFalse; + + // Event type + } else { + this.type = src; + } + + // Put explicitly provided properties onto the event object + if ( props ) { + jQuery.extend( this, props ); + } + + // Create a timestamp if incoming event doesn't have one + this.timeStamp = src && src.timeStamp || jQuery.now(); + + // Mark it as fixed + this[ jQuery.expando ] = true; +}; + +function returnFalse() { + return false; +} +function returnTrue() { + return true; +} + +// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding +// http://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html +jQuery.Event.prototype = { + preventDefault: function() { + this.isDefaultPrevented = returnTrue; + + var e = this.originalEvent; + if ( !e ) { + return; + } + + // if preventDefault exists run it on the original event + if ( e.preventDefault ) { + e.preventDefault(); + + // otherwise set the returnValue property of the original event to false (IE) + } else { + e.returnValue = false; + } + }, + stopPropagation: function() { + this.isPropagationStopped = returnTrue; + + var e = this.originalEvent; + if ( !e ) { + return; + } + // if stopPropagation exists run it on the original event + if ( e.stopPropagation ) { + e.stopPropagation(); + } + // otherwise set the cancelBubble property of the original event to true (IE) + e.cancelBubble = true; + }, + stopImmediatePropagation: function() { + this.isImmediatePropagationStopped = returnTrue; + this.stopPropagation(); + }, + isDefaultPrevented: returnFalse, + isPropagationStopped: returnFalse, + isImmediatePropagationStopped: returnFalse +}; + +// Create mouseenter/leave events using mouseover/out and event-time checks +jQuery.each({ + mouseenter: "mouseover", + mouseleave: "mouseout" +}, function( orig, fix ) { + jQuery.event.special[ orig ] = { + delegateType: fix, + bindType: fix, + + handle: function( event ) { + var target = this, + related = event.relatedTarget, + handleObj = event.handleObj, + selector = handleObj.selector, + ret; + + // For mousenter/leave call the handler if related is outside the target. + // NB: No relatedTarget if the mouse left/entered the browser window + if ( !related || (related !== target && !jQuery.contains( target, related )) ) { + event.type = handleObj.origType; + ret = handleObj.handler.apply( this, arguments ); + event.type = fix; + } + return ret; + } + }; +}); + +// IE submit delegation +if ( !jQuery.support.submitBubbles ) { + + jQuery.event.special.submit = { + setup: function() { + // Only need this for delegated form submit events + if ( jQuery.nodeName( this, "form" ) ) { + return false; + } + + // Lazy-add a submit handler when a descendant form may potentially be submitted + jQuery.event.add( this, "click._submit keypress._submit", function( e ) { + // Node name check avoids a VML-related crash in IE (#9807) + var elem = e.target, + form = jQuery.nodeName( elem, "input" ) || jQuery.nodeName( elem, "button" ) ? elem.form : undefined; + if ( form && !form._submit_attached ) { + jQuery.event.add( form, "submit._submit", function( event ) { + // If form was submitted by the user, bubble the event up the tree + if ( this.parentNode && !event.isTrigger ) { + jQuery.event.simulate( "submit", this.parentNode, event, true ); + } + }); + form._submit_attached = true; + } + }); + // return undefined since we don't need an event listener + }, + + teardown: function() { + // Only need this for delegated form submit events + if ( jQuery.nodeName( this, "form" ) ) { + return false; + } + + // Remove delegated handlers; cleanData eventually reaps submit handlers attached above + jQuery.event.remove( this, "._submit" ); + } + }; +} + +// IE change delegation and checkbox/radio fix +if ( !jQuery.support.changeBubbles ) { + + jQuery.event.special.change = { + + setup: function() { + + if ( rformElems.test( this.nodeName ) ) { + // IE doesn't fire change on a check/radio until blur; trigger it on click + // after a propertychange. Eat the blur-change in special.change.handle. + // This still fires onchange a second time for check/radio after blur. + if ( this.type === "checkbox" || this.type === "radio" ) { + jQuery.event.add( this, "propertychange._change", function( event ) { + if ( event.originalEvent.propertyName === "checked" ) { + this._just_changed = true; + } + }); + jQuery.event.add( this, "click._change", function( event ) { + if ( this._just_changed && !event.isTrigger ) { + this._just_changed = false; + jQuery.event.simulate( "change", this, event, true ); + } + }); + } + return false; + } + // Delegated event; lazy-add a change handler on descendant inputs + jQuery.event.add( this, "beforeactivate._change", function( e ) { + var elem = e.target; + + if ( rformElems.test( elem.nodeName ) && !elem._change_attached ) { + jQuery.event.add( elem, "change._change", function( event ) { + if ( this.parentNode && !event.isSimulated && !event.isTrigger ) { + jQuery.event.simulate( "change", this.parentNode, event, true ); + } + }); + elem._change_attached = true; + } + }); + }, + + handle: function( event ) { + var elem = event.target; + + // Swallow native change events from checkbox/radio, we already triggered them above + if ( this !== elem || event.isSimulated || event.isTrigger || (elem.type !== "radio" && elem.type !== "checkbox") ) { + return event.handleObj.handler.apply( this, arguments ); + } + }, + + teardown: function() { + jQuery.event.remove( this, "._change" ); + + return rformElems.test( this.nodeName ); + } + }; +} + +// Create "bubbling" focus and blur events +if ( !jQuery.support.focusinBubbles ) { + jQuery.each({ focus: "focusin", blur: "focusout" }, function( orig, fix ) { + + // Attach a single capturing handler while someone wants focusin/focusout + var attaches = 0, + handler = function( event ) { + jQuery.event.simulate( fix, event.target, jQuery.event.fix( event ), true ); + }; + + jQuery.event.special[ fix ] = { + setup: function() { + if ( attaches++ === 0 ) { + document.addEventListener( orig, handler, true ); + } + }, + teardown: function() { + if ( --attaches === 0 ) { + document.removeEventListener( orig, handler, true ); + } + } + }; + }); +} + +jQuery.fn.extend({ + + on: function( types, selector, data, fn, /*INTERNAL*/ one ) { + var origFn, type; + + // Types can be a map of types/handlers + if ( typeof types === "object" ) { + // ( types-Object, selector, data ) + if ( typeof selector !== "string" ) { + // ( types-Object, data ) + data = selector; + selector = undefined; + } + for ( type in types ) { + this.on( type, selector, data, types[ type ], one ); + } + return this; + } + + if ( data == null && fn == null ) { + // ( types, fn ) + fn = selector; + data = selector = undefined; + } else if ( fn == null ) { + if ( typeof selector === "string" ) { + // ( types, selector, fn ) + fn = data; + data = undefined; + } else { + // ( types, data, fn ) + fn = data; + data = selector; + selector = undefined; + } + } + if ( fn === false ) { + fn = returnFalse; + } else if ( !fn ) { + return this; + } + + if ( one === 1 ) { + origFn = fn; + fn = function( event ) { + // Can use an empty set, since event contains the info + jQuery().off( event ); + return origFn.apply( this, arguments ); + }; + // Use same guid so caller can remove using origFn + fn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ ); + } + return this.each( function() { + jQuery.event.add( this, types, fn, data, selector ); + }); + }, + one: function( types, selector, data, fn ) { + return this.on.call( this, types, selector, data, fn, 1 ); + }, + off: function( types, selector, fn ) { + if ( types && types.preventDefault && types.handleObj ) { + // ( event ) dispatched jQuery.Event + var handleObj = types.handleObj; + jQuery( types.delegateTarget ).off( + handleObj.namespace? handleObj.type + "." + handleObj.namespace : handleObj.type, + handleObj.selector, + handleObj.handler + ); + return this; + } + if ( typeof types === "object" ) { + // ( types-object [, selector] ) + for ( var type in types ) { + this.off( type, selector, types[ type ] ); + } + return this; + } + if ( selector === false || typeof selector === "function" ) { + // ( types [, fn] ) + fn = selector; + selector = undefined; + } + if ( fn === false ) { + fn = returnFalse; + } + return this.each(function() { + jQuery.event.remove( this, types, fn, selector ); + }); + }, + + bind: function( types, data, fn ) { + return this.on( types, null, data, fn ); + }, + unbind: function( types, fn ) { + return this.off( types, null, fn ); + }, + + live: function( types, data, fn ) { + jQuery( this.context ).on( types, this.selector, data, fn ); + return this; + }, + die: function( types, fn ) { + jQuery( this.context ).off( types, this.selector || "**", fn ); + return this; + }, + + delegate: function( selector, types, data, fn ) { + return this.on( types, selector, data, fn ); + }, + undelegate: function( selector, types, fn ) { + // ( namespace ) or ( selector, types [, fn] ) + return arguments.length == 1? this.off( selector, "**" ) : this.off( types, selector, fn ); + }, + + trigger: function( type, data ) { + return this.each(function() { + jQuery.event.trigger( type, data, this ); + }); + }, + triggerHandler: function( type, data ) { + if ( this[0] ) { + return jQuery.event.trigger( type, data, this[0], true ); + } + }, + + toggle: function( fn ) { + // Save reference to arguments for access in closure + var args = arguments, + guid = fn.guid || jQuery.guid++, + i = 0, + toggler = function( event ) { + // Figure out which function to execute + var lastToggle = ( jQuery._data( this, "lastToggle" + fn.guid ) || 0 ) % i; + jQuery._data( this, "lastToggle" + fn.guid, lastToggle + 1 ); + + // Make sure that clicks stop + event.preventDefault(); + + // and execute the function + return args[ lastToggle ].apply( this, arguments ) || false; + }; + + // link all the functions, so any of them can unbind this click handler + toggler.guid = guid; + while ( i < args.length ) { + args[ i++ ].guid = guid; + } + + return this.click( toggler ); + }, + + hover: function( fnOver, fnOut ) { + return this.mouseenter( fnOver ).mouseleave( fnOut || fnOver ); + } +}); + +jQuery.each( ("blur focus focusin focusout load resize scroll unload click dblclick " + + "mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave " + + "change select submit keydown keypress keyup error contextmenu").split(" "), function( i, name ) { + + // Handle event binding + jQuery.fn[ name ] = function( data, fn ) { + if ( fn == null ) { + fn = data; + data = null; + } + + return arguments.length > 0 ? + this.on( name, null, data, fn ) : + this.trigger( name ); + }; + + if ( jQuery.attrFn ) { + jQuery.attrFn[ name ] = true; + } + + if ( rkeyEvent.test( name ) ) { + jQuery.event.fixHooks[ name ] = jQuery.event.keyHooks; + } + + if ( rmouseEvent.test( name ) ) { + jQuery.event.fixHooks[ name ] = jQuery.event.mouseHooks; + } +}); + + + +/*! + * Sizzle CSS Selector Engine + * Copyright 2011, The Dojo Foundation + * Released under the MIT, BSD, and GPL Licenses. + * More information: http://sizzlejs.com/ + */ +(function(){ + +var chunker = /((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^\[\]]*\]|['"][^'"]*['"]|[^\[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g, + expando = "sizcache" + (Math.random() + '').replace('.', ''), + done = 0, + toString = Object.prototype.toString, + hasDuplicate = false, + baseHasDuplicate = true, + rBackslash = /\\/g, + rReturn = /\r\n/g, + rNonWord = /\W/; + +// Here we check if the JavaScript engine is using some sort of +// optimization where it does not always call our comparision +// function. If that is the case, discard the hasDuplicate value. +// Thus far that includes Google Chrome. +[0, 0].sort(function() { + baseHasDuplicate = false; + return 0; +}); + +var Sizzle = function( selector, context, results, seed ) { + results = results || []; + context = context || document; + + var origContext = context; + + if ( context.nodeType !== 1 && context.nodeType !== 9 ) { + return []; + } + + if ( !selector || typeof selector !== "string" ) { + return results; + } + + var m, set, checkSet, extra, ret, cur, pop, i, + prune = true, + contextXML = Sizzle.isXML( context ), + parts = [], + soFar = selector; + + // Reset the position of the chunker regexp (start from head) + do { + chunker.exec( "" ); + m = chunker.exec( soFar ); + + if ( m ) { + soFar = m[3]; + + parts.push( m[1] ); + + if ( m[2] ) { + extra = m[3]; + break; + } + } + } while ( m ); + + if ( parts.length > 1 && origPOS.exec( selector ) ) { + + if ( parts.length === 2 && Expr.relative[ parts[0] ] ) { + set = posProcess( parts[0] + parts[1], context, seed ); + + } else { + set = Expr.relative[ parts[0] ] ? + [ context ] : + Sizzle( parts.shift(), context ); + + while ( parts.length ) { + selector = parts.shift(); + + if ( Expr.relative[ selector ] ) { + selector += parts.shift(); + } + + set = posProcess( selector, set, seed ); + } + } + + } else { + // Take a shortcut and set the context if the root selector is an ID + // (but not if it'll be faster if the inner selector is an ID) + if ( !seed && parts.length > 1 && context.nodeType === 9 && !contextXML && + Expr.match.ID.test(parts[0]) && !Expr.match.ID.test(parts[parts.length - 1]) ) { + + ret = Sizzle.find( parts.shift(), context, contextXML ); + context = ret.expr ? + Sizzle.filter( ret.expr, ret.set )[0] : + ret.set[0]; + } + + if ( context ) { + ret = seed ? + { expr: parts.pop(), set: makeArray(seed) } : + Sizzle.find( parts.pop(), parts.length === 1 && (parts[0] === "~" || parts[0] === "+") && context.parentNode ? context.parentNode : context, contextXML ); + + set = ret.expr ? + Sizzle.filter( ret.expr, ret.set ) : + ret.set; + + if ( parts.length > 0 ) { + checkSet = makeArray( set ); + + } else { + prune = false; + } + + while ( parts.length ) { + cur = parts.pop(); + pop = cur; + + if ( !Expr.relative[ cur ] ) { + cur = ""; + } else { + pop = parts.pop(); + } + + if ( pop == null ) { + pop = context; + } + + Expr.relative[ cur ]( checkSet, pop, contextXML ); + } + + } else { + checkSet = parts = []; + } + } + + if ( !checkSet ) { + checkSet = set; + } + + if ( !checkSet ) { + Sizzle.error( cur || selector ); + } + + if ( toString.call(checkSet) === "[object Array]" ) { + if ( !prune ) { + results.push.apply( results, checkSet ); + + } else if ( context && context.nodeType === 1 ) { + for ( i = 0; checkSet[i] != null; i++ ) { + if ( checkSet[i] && (checkSet[i] === true || checkSet[i].nodeType === 1 && Sizzle.contains(context, checkSet[i])) ) { + results.push( set[i] ); + } + } + + } else { + for ( i = 0; checkSet[i] != null; i++ ) { + if ( checkSet[i] && checkSet[i].nodeType === 1 ) { + results.push( set[i] ); + } + } + } + + } else { + makeArray( checkSet, results ); + } + + if ( extra ) { + Sizzle( extra, origContext, results, seed ); + Sizzle.uniqueSort( results ); + } + + return results; +}; + +Sizzle.uniqueSort = function( results ) { + if ( sortOrder ) { + hasDuplicate = baseHasDuplicate; + results.sort( sortOrder ); + + if ( hasDuplicate ) { + for ( var i = 1; i < results.length; i++ ) { + if ( results[i] === results[ i - 1 ] ) { + results.splice( i--, 1 ); + } + } + } + } + + return results; +}; + +Sizzle.matches = function( expr, set ) { + return Sizzle( expr, null, null, set ); +}; + +Sizzle.matchesSelector = function( node, expr ) { + return Sizzle( expr, null, null, [node] ).length > 0; +}; + +Sizzle.find = function( expr, context, isXML ) { + var set, i, len, match, type, left; + + if ( !expr ) { + return []; + } + + for ( i = 0, len = Expr.order.length; i < len; i++ ) { + type = Expr.order[i]; + + if ( (match = Expr.leftMatch[ type ].exec( expr )) ) { + left = match[1]; + match.splice( 1, 1 ); + + if ( left.substr( left.length - 1 ) !== "\\" ) { + match[1] = (match[1] || "").replace( rBackslash, "" ); + set = Expr.find[ type ]( match, context, isXML ); + + if ( set != null ) { + expr = expr.replace( Expr.match[ type ], "" ); + break; + } + } + } + } + + if ( !set ) { + set = typeof context.getElementsByTagName !== "undefined" ? + context.getElementsByTagName( "*" ) : + []; + } + + return { set: set, expr: expr }; +}; + +Sizzle.filter = function( expr, set, inplace, not ) { + var match, anyFound, + type, found, item, filter, left, + i, pass, + old = expr, + result = [], + curLoop = set, + isXMLFilter = set && set[0] && Sizzle.isXML( set[0] ); + + while ( expr && set.length ) { + for ( type in Expr.filter ) { + if ( (match = Expr.leftMatch[ type ].exec( expr )) != null && match[2] ) { + filter = Expr.filter[ type ]; + left = match[1]; + + anyFound = false; + + match.splice(1,1); + + if ( left.substr( left.length - 1 ) === "\\" ) { + continue; + } + + if ( curLoop === result ) { + result = []; + } + + if ( Expr.preFilter[ type ] ) { + match = Expr.preFilter[ type ]( match, curLoop, inplace, result, not, isXMLFilter ); + + if ( !match ) { + anyFound = found = true; + + } else if ( match === true ) { + continue; + } + } + + if ( match ) { + for ( i = 0; (item = curLoop[i]) != null; i++ ) { + if ( item ) { + found = filter( item, match, i, curLoop ); + pass = not ^ found; + + if ( inplace && found != null ) { + if ( pass ) { + anyFound = true; + + } else { + curLoop[i] = false; + } + + } else if ( pass ) { + result.push( item ); + anyFound = true; + } + } + } + } + + if ( found !== undefined ) { + if ( !inplace ) { + curLoop = result; + } + + expr = expr.replace( Expr.match[ type ], "" ); + + if ( !anyFound ) { + return []; + } + + break; + } + } + } + + // Improper expression + if ( expr === old ) { + if ( anyFound == null ) { + Sizzle.error( expr ); + + } else { + break; + } + } + + old = expr; + } + + return curLoop; +}; + +Sizzle.error = function( msg ) { + throw new Error( "Syntax error, unrecognized expression: " + msg ); +}; + +/** + * Utility function for retreiving the text value of an array of DOM nodes + * @param {Array|Element} elem + */ +var getText = Sizzle.getText = function( elem ) { + var i, node, + nodeType = elem.nodeType, + ret = ""; + + if ( nodeType ) { + if ( nodeType === 1 || nodeType === 9 ) { + // Use textContent || innerText for elements + if ( typeof elem.textContent === 'string' ) { + return elem.textContent; + } else if ( typeof elem.innerText === 'string' ) { + // Replace IE's carriage returns + return elem.innerText.replace( rReturn, '' ); + } else { + // Traverse it's children + for ( elem = elem.firstChild; elem; elem = elem.nextSibling) { + ret += getText( elem ); + } + } + } else if ( nodeType === 3 || nodeType === 4 ) { + return elem.nodeValue; + } + } else { + + // If no nodeType, this is expected to be an array + for ( i = 0; (node = elem[i]); i++ ) { + // Do not traverse comment nodes + if ( node.nodeType !== 8 ) { + ret += getText( node ); + } + } + } + return ret; +}; + +var Expr = Sizzle.selectors = { + order: [ "ID", "NAME", "TAG" ], + + match: { + ID: /#((?:[\w\u00c0-\uFFFF\-]|\\.)+)/, + CLASS: /\.((?:[\w\u00c0-\uFFFF\-]|\\.)+)/, + NAME: /\[name=['"]*((?:[\w\u00c0-\uFFFF\-]|\\.)+)['"]*\]/, + ATTR: /\[\s*((?:[\w\u00c0-\uFFFF\-]|\\.)+)\s*(?:(\S?=)\s*(?:(['"])(.*?)\3|(#?(?:[\w\u00c0-\uFFFF\-]|\\.)*)|)|)\s*\]/, + TAG: /^((?:[\w\u00c0-\uFFFF\*\-]|\\.)+)/, + CHILD: /:(only|nth|last|first)-child(?:\(\s*(even|odd|(?:[+\-]?\d+|(?:[+\-]?\d*)?n\s*(?:[+\-]\s*\d+)?))\s*\))?/, + POS: /:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^\-]|$)/, + PSEUDO: /:((?:[\w\u00c0-\uFFFF\-]|\\.)+)(?:\((['"]?)((?:\([^\)]+\)|[^\(\)]*)+)\2\))?/ + }, + + leftMatch: {}, + + attrMap: { + "class": "className", + "for": "htmlFor" + }, + + attrHandle: { + href: function( elem ) { + return elem.getAttribute( "href" ); + }, + type: function( elem ) { + return elem.getAttribute( "type" ); + } + }, + + relative: { + "+": function(checkSet, part){ + var isPartStr = typeof part === "string", + isTag = isPartStr && !rNonWord.test( part ), + isPartStrNotTag = isPartStr && !isTag; + + if ( isTag ) { + part = part.toLowerCase(); + } + + for ( var i = 0, l = checkSet.length, elem; i < l; i++ ) { + if ( (elem = checkSet[i]) ) { + while ( (elem = elem.previousSibling) && elem.nodeType !== 1 ) {} + + checkSet[i] = isPartStrNotTag || elem && elem.nodeName.toLowerCase() === part ? + elem || false : + elem === part; + } + } + + if ( isPartStrNotTag ) { + Sizzle.filter( part, checkSet, true ); + } + }, + + ">": function( checkSet, part ) { + var elem, + isPartStr = typeof part === "string", + i = 0, + l = checkSet.length; + + if ( isPartStr && !rNonWord.test( part ) ) { + part = part.toLowerCase(); + + for ( ; i < l; i++ ) { + elem = checkSet[i]; + + if ( elem ) { + var parent = elem.parentNode; + checkSet[i] = parent.nodeName.toLowerCase() === part ? parent : false; + } + } + + } else { + for ( ; i < l; i++ ) { + elem = checkSet[i]; + + if ( elem ) { + checkSet[i] = isPartStr ? + elem.parentNode : + elem.parentNode === part; + } + } + + if ( isPartStr ) { + Sizzle.filter( part, checkSet, true ); + } + } + }, + + "": function(checkSet, part, isXML){ + var nodeCheck, + doneName = done++, + checkFn = dirCheck; + + if ( typeof part === "string" && !rNonWord.test( part ) ) { + part = part.toLowerCase(); + nodeCheck = part; + checkFn = dirNodeCheck; + } + + checkFn( "parentNode", part, doneName, checkSet, nodeCheck, isXML ); + }, + + "~": function( checkSet, part, isXML ) { + var nodeCheck, + doneName = done++, + checkFn = dirCheck; + + if ( typeof part === "string" && !rNonWord.test( part ) ) { + part = part.toLowerCase(); + nodeCheck = part; + checkFn = dirNodeCheck; + } + + checkFn( "previousSibling", part, doneName, checkSet, nodeCheck, isXML ); + } + }, + + find: { + ID: function( match, context, isXML ) { + if ( typeof context.getElementById !== "undefined" && !isXML ) { + var m = context.getElementById(match[1]); + // Check parentNode to catch when Blackberry 4.6 returns + // nodes that are no longer in the document #6963 + return m && m.parentNode ? [m] : []; + } + }, + + NAME: function( match, context ) { + if ( typeof context.getElementsByName !== "undefined" ) { + var ret = [], + results = context.getElementsByName( match[1] ); + + for ( var i = 0, l = results.length; i < l; i++ ) { + if ( results[i].getAttribute("name") === match[1] ) { + ret.push( results[i] ); + } + } + + return ret.length === 0 ? null : ret; + } + }, + + TAG: function( match, context ) { + if ( typeof context.getElementsByTagName !== "undefined" ) { + return context.getElementsByTagName( match[1] ); + } + } + }, + preFilter: { + CLASS: function( match, curLoop, inplace, result, not, isXML ) { + match = " " + match[1].replace( rBackslash, "" ) + " "; + + if ( isXML ) { + return match; + } + + for ( var i = 0, elem; (elem = curLoop[i]) != null; i++ ) { + if ( elem ) { + if ( not ^ (elem.className && (" " + elem.className + " ").replace(/[\t\n\r]/g, " ").indexOf(match) >= 0) ) { + if ( !inplace ) { + result.push( elem ); + } + + } else if ( inplace ) { + curLoop[i] = false; + } + } + } + + return false; + }, + + ID: function( match ) { + return match[1].replace( rBackslash, "" ); + }, + + TAG: function( match, curLoop ) { + return match[1].replace( rBackslash, "" ).toLowerCase(); + }, + + CHILD: function( match ) { + if ( match[1] === "nth" ) { + if ( !match[2] ) { + Sizzle.error( match[0] ); + } + + match[2] = match[2].replace(/^\+|\s*/g, ''); + + // parse equations like 'even', 'odd', '5', '2n', '3n+2', '4n-1', '-n+6' + var test = /(-?)(\d*)(?:n([+\-]?\d*))?/.exec( + match[2] === "even" && "2n" || match[2] === "odd" && "2n+1" || + !/\D/.test( match[2] ) && "0n+" + match[2] || match[2]); + + // calculate the numbers (first)n+(last) including if they are negative + match[2] = (test[1] + (test[2] || 1)) - 0; + match[3] = test[3] - 0; + } + else if ( match[2] ) { + Sizzle.error( match[0] ); + } + + // TODO: Move to normal caching system + match[0] = done++; + + return match; + }, + + ATTR: function( match, curLoop, inplace, result, not, isXML ) { + var name = match[1] = match[1].replace( rBackslash, "" ); + + if ( !isXML && Expr.attrMap[name] ) { + match[1] = Expr.attrMap[name]; + } + + // Handle if an un-quoted value was used + match[4] = ( match[4] || match[5] || "" ).replace( rBackslash, "" ); + + if ( match[2] === "~=" ) { + match[4] = " " + match[4] + " "; + } + + return match; + }, + + PSEUDO: function( match, curLoop, inplace, result, not ) { + if ( match[1] === "not" ) { + // If we're dealing with a complex expression, or a simple one + if ( ( chunker.exec(match[3]) || "" ).length > 1 || /^\w/.test(match[3]) ) { + match[3] = Sizzle(match[3], null, null, curLoop); + + } else { + var ret = Sizzle.filter(match[3], curLoop, inplace, true ^ not); + + if ( !inplace ) { + result.push.apply( result, ret ); + } + + return false; + } + + } else if ( Expr.match.POS.test( match[0] ) || Expr.match.CHILD.test( match[0] ) ) { + return true; + } + + return match; + }, + + POS: function( match ) { + match.unshift( true ); + + return match; + } + }, + + filters: { + enabled: function( elem ) { + return elem.disabled === false && elem.type !== "hidden"; + }, + + disabled: function( elem ) { + return elem.disabled === true; + }, + + checked: function( elem ) { + return elem.checked === true; + }, + + selected: function( elem ) { + // Accessing this property makes selected-by-default + // options in Safari work properly + if ( elem.parentNode ) { + elem.parentNode.selectedIndex; + } + + return elem.selected === true; + }, + + parent: function( elem ) { + return !!elem.firstChild; + }, + + empty: function( elem ) { + return !elem.firstChild; + }, + + has: function( elem, i, match ) { + return !!Sizzle( match[3], elem ).length; + }, + + header: function( elem ) { + return (/h\d/i).test( elem.nodeName ); + }, + + text: function( elem ) { + var attr = elem.getAttribute( "type" ), type = elem.type; + // IE6 and 7 will map elem.type to 'text' for new HTML5 types (search, etc) + // use getAttribute instead to test this case + return elem.nodeName.toLowerCase() === "input" && "text" === type && ( attr === type || attr === null ); + }, + + radio: function( elem ) { + return elem.nodeName.toLowerCase() === "input" && "radio" === elem.type; + }, + + checkbox: function( elem ) { + return elem.nodeName.toLowerCase() === "input" && "checkbox" === elem.type; + }, + + file: function( elem ) { + return elem.nodeName.toLowerCase() === "input" && "file" === elem.type; + }, + + password: function( elem ) { + return elem.nodeName.toLowerCase() === "input" && "password" === elem.type; + }, + + submit: function( elem ) { + var name = elem.nodeName.toLowerCase(); + return (name === "input" || name === "button") && "submit" === elem.type; + }, + + image: function( elem ) { + return elem.nodeName.toLowerCase() === "input" && "image" === elem.type; + }, + + reset: function( elem ) { + var name = elem.nodeName.toLowerCase(); + return (name === "input" || name === "button") && "reset" === elem.type; + }, + + button: function( elem ) { + var name = elem.nodeName.toLowerCase(); + return name === "input" && "button" === elem.type || name === "button"; + }, + + input: function( elem ) { + return (/input|select|textarea|button/i).test( elem.nodeName ); + }, + + focus: function( elem ) { + return elem === elem.ownerDocument.activeElement; + } + }, + setFilters: { + first: function( elem, i ) { + return i === 0; + }, + + last: function( elem, i, match, array ) { + return i === array.length - 1; + }, + + even: function( elem, i ) { + return i % 2 === 0; + }, + + odd: function( elem, i ) { + return i % 2 === 1; + }, + + lt: function( elem, i, match ) { + return i < match[3] - 0; + }, + + gt: function( elem, i, match ) { + return i > match[3] - 0; + }, + + nth: function( elem, i, match ) { + return match[3] - 0 === i; + }, + + eq: function( elem, i, match ) { + return match[3] - 0 === i; + } + }, + filter: { + PSEUDO: function( elem, match, i, array ) { + var name = match[1], + filter = Expr.filters[ name ]; + + if ( filter ) { + return filter( elem, i, match, array ); + + } else if ( name === "contains" ) { + return (elem.textContent || elem.innerText || getText([ elem ]) || "").indexOf(match[3]) >= 0; + + } else if ( name === "not" ) { + var not = match[3]; + + for ( var j = 0, l = not.length; j < l; j++ ) { + if ( not[j] === elem ) { + return false; + } + } + + return true; + + } else { + Sizzle.error( name ); + } + }, + + CHILD: function( elem, match ) { + var first, last, + doneName, parent, cache, + count, diff, + type = match[1], + node = elem; + + switch ( type ) { + case "only": + case "first": + while ( (node = node.previousSibling) ) { + if ( node.nodeType === 1 ) { + return false; + } + } + + if ( type === "first" ) { + return true; + } + + node = elem; + + case "last": + while ( (node = node.nextSibling) ) { + if ( node.nodeType === 1 ) { + return false; + } + } + + return true; + + case "nth": + first = match[2]; + last = match[3]; + + if ( first === 1 && last === 0 ) { + return true; + } + + doneName = match[0]; + parent = elem.parentNode; + + if ( parent && (parent[ expando ] !== doneName || !elem.nodeIndex) ) { + count = 0; + + for ( node = parent.firstChild; node; node = node.nextSibling ) { + if ( node.nodeType === 1 ) { + node.nodeIndex = ++count; + } + } + + parent[ expando ] = doneName; + } + + diff = elem.nodeIndex - last; + + if ( first === 0 ) { + return diff === 0; + + } else { + return ( diff % first === 0 && diff / first >= 0 ); + } + } + }, + + ID: function( elem, match ) { + return elem.nodeType === 1 && elem.getAttribute("id") === match; + }, + + TAG: function( elem, match ) { + return (match === "*" && elem.nodeType === 1) || !!elem.nodeName && elem.nodeName.toLowerCase() === match; + }, + + CLASS: function( elem, match ) { + return (" " + (elem.className || elem.getAttribute("class")) + " ") + .indexOf( match ) > -1; + }, + + ATTR: function( elem, match ) { + var name = match[1], + result = Sizzle.attr ? + Sizzle.attr( elem, name ) : + Expr.attrHandle[ name ] ? + Expr.attrHandle[ name ]( elem ) : + elem[ name ] != null ? + elem[ name ] : + elem.getAttribute( name ), + value = result + "", + type = match[2], + check = match[4]; + + return result == null ? + type === "!=" : + !type && Sizzle.attr ? + result != null : + type === "=" ? + value === check : + type === "*=" ? + value.indexOf(check) >= 0 : + type === "~=" ? + (" " + value + " ").indexOf(check) >= 0 : + !check ? + value && result !== false : + type === "!=" ? + value !== check : + type === "^=" ? + value.indexOf(check) === 0 : + type === "$=" ? + value.substr(value.length - check.length) === check : + type === "|=" ? + value === check || value.substr(0, check.length + 1) === check + "-" : + false; + }, + + POS: function( elem, match, i, array ) { + var name = match[2], + filter = Expr.setFilters[ name ]; + + if ( filter ) { + return filter( elem, i, match, array ); + } + } + } +}; + +var origPOS = Expr.match.POS, + fescape = function(all, num){ + return "\\" + (num - 0 + 1); + }; + +for ( var type in Expr.match ) { + Expr.match[ type ] = new RegExp( Expr.match[ type ].source + (/(?![^\[]*\])(?![^\(]*\))/.source) ); + Expr.leftMatch[ type ] = new RegExp( /(^(?:.|\r|\n)*?)/.source + Expr.match[ type ].source.replace(/\\(\d+)/g, fescape) ); +} + +var makeArray = function( array, results ) { + array = Array.prototype.slice.call( array, 0 ); + + if ( results ) { + results.push.apply( results, array ); + return results; + } + + return array; +}; + +// Perform a simple check to determine if the browser is capable of +// converting a NodeList to an array using builtin methods. +// Also verifies that the returned array holds DOM nodes +// (which is not the case in the Blackberry browser) +try { + Array.prototype.slice.call( document.documentElement.childNodes, 0 )[0].nodeType; + +// Provide a fallback method if it does not work +} catch( e ) { + makeArray = function( array, results ) { + var i = 0, + ret = results || []; + + if ( toString.call(array) === "[object Array]" ) { + Array.prototype.push.apply( ret, array ); + + } else { + if ( typeof array.length === "number" ) { + for ( var l = array.length; i < l; i++ ) { + ret.push( array[i] ); + } + + } else { + for ( ; array[i]; i++ ) { + ret.push( array[i] ); + } + } + } + + return ret; + }; +} + +var sortOrder, siblingCheck; + +if ( document.documentElement.compareDocumentPosition ) { + sortOrder = function( a, b ) { + if ( a === b ) { + hasDuplicate = true; + return 0; + } + + if ( !a.compareDocumentPosition || !b.compareDocumentPosition ) { + return a.compareDocumentPosition ? -1 : 1; + } + + return a.compareDocumentPosition(b) & 4 ? -1 : 1; + }; + +} else { + sortOrder = function( a, b ) { + // The nodes are identical, we can exit early + if ( a === b ) { + hasDuplicate = true; + return 0; + + // Fallback to using sourceIndex (in IE) if it's available on both nodes + } else if ( a.sourceIndex && b.sourceIndex ) { + return a.sourceIndex - b.sourceIndex; + } + + var al, bl, + ap = [], + bp = [], + aup = a.parentNode, + bup = b.parentNode, + cur = aup; + + // If the nodes are siblings (or identical) we can do a quick check + if ( aup === bup ) { + return siblingCheck( a, b ); + + // If no parents were found then the nodes are disconnected + } else if ( !aup ) { + return -1; + + } else if ( !bup ) { + return 1; + } + + // Otherwise they're somewhere else in the tree so we need + // to build up a full list of the parentNodes for comparison + while ( cur ) { + ap.unshift( cur ); + cur = cur.parentNode; + } + + cur = bup; + + while ( cur ) { + bp.unshift( cur ); + cur = cur.parentNode; + } + + al = ap.length; + bl = bp.length; + + // Start walking down the tree looking for a discrepancy + for ( var i = 0; i < al && i < bl; i++ ) { + if ( ap[i] !== bp[i] ) { + return siblingCheck( ap[i], bp[i] ); + } + } + + // We ended someplace up the tree so do a sibling check + return i === al ? + siblingCheck( a, bp[i], -1 ) : + siblingCheck( ap[i], b, 1 ); + }; + + siblingCheck = function( a, b, ret ) { + if ( a === b ) { + return ret; + } + + var cur = a.nextSibling; + + while ( cur ) { + if ( cur === b ) { + return -1; + } + + cur = cur.nextSibling; + } + + return 1; + }; +} + +// Check to see if the browser returns elements by name when +// querying by getElementById (and provide a workaround) +(function(){ + // We're going to inject a fake input element with a specified name + var form = document.createElement("div"), + id = "script" + (new Date()).getTime(), + root = document.documentElement; + + form.innerHTML = ""; + + // Inject it into the root element, check its status, and remove it quickly + root.insertBefore( form, root.firstChild ); + + // The workaround has to do additional checks after a getElementById + // Which slows things down for other browsers (hence the branching) + if ( document.getElementById( id ) ) { + Expr.find.ID = function( match, context, isXML ) { + if ( typeof context.getElementById !== "undefined" && !isXML ) { + var m = context.getElementById(match[1]); + + return m ? + m.id === match[1] || typeof m.getAttributeNode !== "undefined" && m.getAttributeNode("id").nodeValue === match[1] ? + [m] : + undefined : + []; + } + }; + + Expr.filter.ID = function( elem, match ) { + var node = typeof elem.getAttributeNode !== "undefined" && elem.getAttributeNode("id"); + + return elem.nodeType === 1 && node && node.nodeValue === match; + }; + } + + root.removeChild( form ); + + // release memory in IE + root = form = null; +})(); + +(function(){ + // Check to see if the browser returns only elements + // when doing getElementsByTagName("*") + + // Create a fake element + var div = document.createElement("div"); + div.appendChild( document.createComment("") ); + + // Make sure no comments are found + if ( div.getElementsByTagName("*").length > 0 ) { + Expr.find.TAG = function( match, context ) { + var results = context.getElementsByTagName( match[1] ); + + // Filter out possible comments + if ( match[1] === "*" ) { + var tmp = []; + + for ( var i = 0; results[i]; i++ ) { + if ( results[i].nodeType === 1 ) { + tmp.push( results[i] ); + } + } + + results = tmp; + } + + return results; + }; + } + + // Check to see if an attribute returns normalized href attributes + div.innerHTML = ""; + + if ( div.firstChild && typeof div.firstChild.getAttribute !== "undefined" && + div.firstChild.getAttribute("href") !== "#" ) { + + Expr.attrHandle.href = function( elem ) { + return elem.getAttribute( "href", 2 ); + }; + } + + // release memory in IE + div = null; +})(); + +if ( document.querySelectorAll ) { + (function(){ + var oldSizzle = Sizzle, + div = document.createElement("div"), + id = "__sizzle__"; + + div.innerHTML = "

"; + + // Safari can't handle uppercase or unicode characters when + // in quirks mode. + if ( div.querySelectorAll && div.querySelectorAll(".TEST").length === 0 ) { + return; + } + + Sizzle = function( query, context, extra, seed ) { + context = context || document; + + // Only use querySelectorAll on non-XML documents + // (ID selectors don't work in non-HTML documents) + if ( !seed && !Sizzle.isXML(context) ) { + // See if we find a selector to speed up + var match = /^(\w+$)|^\.([\w\-]+$)|^#([\w\-]+$)/.exec( query ); + + if ( match && (context.nodeType === 1 || context.nodeType === 9) ) { + // Speed-up: Sizzle("TAG") + if ( match[1] ) { + return makeArray( context.getElementsByTagName( query ), extra ); + + // Speed-up: Sizzle(".CLASS") + } else if ( match[2] && Expr.find.CLASS && context.getElementsByClassName ) { + return makeArray( context.getElementsByClassName( match[2] ), extra ); + } + } + + if ( context.nodeType === 9 ) { + // Speed-up: Sizzle("body") + // The body element only exists once, optimize finding it + if ( query === "body" && context.body ) { + return makeArray( [ context.body ], extra ); + + // Speed-up: Sizzle("#ID") + } else if ( match && match[3] ) { + var elem = context.getElementById( match[3] ); + + // Check parentNode to catch when Blackberry 4.6 returns + // nodes that are no longer in the document #6963 + if ( elem && elem.parentNode ) { + // Handle the case where IE and Opera return items + // by name instead of ID + if ( elem.id === match[3] ) { + return makeArray( [ elem ], extra ); + } + + } else { + return makeArray( [], extra ); + } + } + + try { + return makeArray( context.querySelectorAll(query), extra ); + } catch(qsaError) {} + + // qSA works strangely on Element-rooted queries + // We can work around this by specifying an extra ID on the root + // and working up from there (Thanks to Andrew Dupont for the technique) + // IE 8 doesn't work on object elements + } else if ( context.nodeType === 1 && context.nodeName.toLowerCase() !== "object" ) { + var oldContext = context, + old = context.getAttribute( "id" ), + nid = old || id, + hasParent = context.parentNode, + relativeHierarchySelector = /^\s*[+~]/.test( query ); + + if ( !old ) { + context.setAttribute( "id", nid ); + } else { + nid = nid.replace( /'/g, "\\$&" ); + } + if ( relativeHierarchySelector && hasParent ) { + context = context.parentNode; + } + + try { + if ( !relativeHierarchySelector || hasParent ) { + return makeArray( context.querySelectorAll( "[id='" + nid + "'] " + query ), extra ); + } + + } catch(pseudoError) { + } finally { + if ( !old ) { + oldContext.removeAttribute( "id" ); + } + } + } + } + + return oldSizzle(query, context, extra, seed); + }; + + for ( var prop in oldSizzle ) { + Sizzle[ prop ] = oldSizzle[ prop ]; + } + + // release memory in IE + div = null; + })(); +} + +(function(){ + var html = document.documentElement, + matches = html.matchesSelector || html.mozMatchesSelector || html.webkitMatchesSelector || html.msMatchesSelector; + + if ( matches ) { + // Check to see if it's possible to do matchesSelector + // on a disconnected node (IE 9 fails this) + var disconnectedMatch = !matches.call( document.createElement( "div" ), "div" ), + pseudoWorks = false; + + try { + // This should fail with an exception + // Gecko does not error, returns false instead + matches.call( document.documentElement, "[test!='']:sizzle" ); + + } catch( pseudoError ) { + pseudoWorks = true; + } + + Sizzle.matchesSelector = function( node, expr ) { + // Make sure that attribute selectors are quoted + expr = expr.replace(/\=\s*([^'"\]]*)\s*\]/g, "='$1']"); + + if ( !Sizzle.isXML( node ) ) { + try { + if ( pseudoWorks || !Expr.match.PSEUDO.test( expr ) && !/!=/.test( expr ) ) { + var ret = matches.call( node, expr ); + + // IE 9's matchesSelector returns false on disconnected nodes + if ( ret || !disconnectedMatch || + // As well, disconnected nodes are said to be in a document + // fragment in IE 9, so check for that + node.document && node.document.nodeType !== 11 ) { + return ret; + } + } + } catch(e) {} + } + + return Sizzle(expr, null, null, [node]).length > 0; + }; + } +})(); + +(function(){ + var div = document.createElement("div"); + + div.innerHTML = "
"; + + // Opera can't find a second classname (in 9.6) + // Also, make sure that getElementsByClassName actually exists + if ( !div.getElementsByClassName || div.getElementsByClassName("e").length === 0 ) { + return; + } + + // Safari caches class attributes, doesn't catch changes (in 3.2) + div.lastChild.className = "e"; + + if ( div.getElementsByClassName("e").length === 1 ) { + return; + } + + Expr.order.splice(1, 0, "CLASS"); + Expr.find.CLASS = function( match, context, isXML ) { + if ( typeof context.getElementsByClassName !== "undefined" && !isXML ) { + return context.getElementsByClassName(match[1]); + } + }; + + // release memory in IE + div = null; +})(); + +function dirNodeCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) { + for ( var i = 0, l = checkSet.length; i < l; i++ ) { + var elem = checkSet[i]; + + if ( elem ) { + var match = false; + + elem = elem[dir]; + + while ( elem ) { + if ( elem[ expando ] === doneName ) { + match = checkSet[elem.sizset]; + break; + } + + if ( elem.nodeType === 1 && !isXML ){ + elem[ expando ] = doneName; + elem.sizset = i; + } + + if ( elem.nodeName.toLowerCase() === cur ) { + match = elem; + break; + } + + elem = elem[dir]; + } + + checkSet[i] = match; + } + } +} + +function dirCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) { + for ( var i = 0, l = checkSet.length; i < l; i++ ) { + var elem = checkSet[i]; + + if ( elem ) { + var match = false; + + elem = elem[dir]; + + while ( elem ) { + if ( elem[ expando ] === doneName ) { + match = checkSet[elem.sizset]; + break; + } + + if ( elem.nodeType === 1 ) { + if ( !isXML ) { + elem[ expando ] = doneName; + elem.sizset = i; + } + + if ( typeof cur !== "string" ) { + if ( elem === cur ) { + match = true; + break; + } + + } else if ( Sizzle.filter( cur, [elem] ).length > 0 ) { + match = elem; + break; + } + } + + elem = elem[dir]; + } + + checkSet[i] = match; + } + } +} + +if ( document.documentElement.contains ) { + Sizzle.contains = function( a, b ) { + return a !== b && (a.contains ? a.contains(b) : true); + }; + +} else if ( document.documentElement.compareDocumentPosition ) { + Sizzle.contains = function( a, b ) { + return !!(a.compareDocumentPosition(b) & 16); + }; + +} else { + Sizzle.contains = function() { + return false; + }; +} + +Sizzle.isXML = function( elem ) { + // documentElement is verified for cases where it doesn't yet exist + // (such as loading iframes in IE - #4833) + var documentElement = (elem ? elem.ownerDocument || elem : 0).documentElement; + + return documentElement ? documentElement.nodeName !== "HTML" : false; +}; + +var posProcess = function( selector, context, seed ) { + var match, + tmpSet = [], + later = "", + root = context.nodeType ? [context] : context; + + // Position selectors must be done after the filter + // And so must :not(positional) so we move all PSEUDOs to the end + while ( (match = Expr.match.PSEUDO.exec( selector )) ) { + later += match[0]; + selector = selector.replace( Expr.match.PSEUDO, "" ); + } + + selector = Expr.relative[selector] ? selector + "*" : selector; + + for ( var i = 0, l = root.length; i < l; i++ ) { + Sizzle( selector, root[i], tmpSet, seed ); + } + + return Sizzle.filter( later, tmpSet ); +}; + +// EXPOSE +// Override sizzle attribute retrieval +Sizzle.attr = jQuery.attr; +Sizzle.selectors.attrMap = {}; +jQuery.find = Sizzle; +jQuery.expr = Sizzle.selectors; +jQuery.expr[":"] = jQuery.expr.filters; +jQuery.unique = Sizzle.uniqueSort; +jQuery.text = Sizzle.getText; +jQuery.isXMLDoc = Sizzle.isXML; +jQuery.contains = Sizzle.contains; + + +})(); + + +var runtil = /Until$/, + rparentsprev = /^(?:parents|prevUntil|prevAll)/, + // Note: This RegExp should be improved, or likely pulled from Sizzle + rmultiselector = /,/, + isSimple = /^.[^:#\[\.,]*$/, + slice = Array.prototype.slice, + POS = jQuery.expr.match.POS, + // methods guaranteed to produce a unique set when starting from a unique set + guaranteedUnique = { + children: true, + contents: true, + next: true, + prev: true + }; + +jQuery.fn.extend({ + find: function( selector ) { + var self = this, + i, l; + + if ( typeof selector !== "string" ) { + return jQuery( selector ).filter(function() { + for ( i = 0, l = self.length; i < l; i++ ) { + if ( jQuery.contains( self[ i ], this ) ) { + return true; + } + } + }); + } + + var ret = this.pushStack( "", "find", selector ), + length, n, r; + + for ( i = 0, l = this.length; i < l; i++ ) { + length = ret.length; + jQuery.find( selector, this[i], ret ); + + if ( i > 0 ) { + // Make sure that the results are unique + for ( n = length; n < ret.length; n++ ) { + for ( r = 0; r < length; r++ ) { + if ( ret[r] === ret[n] ) { + ret.splice(n--, 1); + break; + } + } + } + } + } + + return ret; + }, + + has: function( target ) { + var targets = jQuery( target ); + return this.filter(function() { + for ( var i = 0, l = targets.length; i < l; i++ ) { + if ( jQuery.contains( this, targets[i] ) ) { + return true; + } + } + }); + }, + + not: function( selector ) { + return this.pushStack( winnow(this, selector, false), "not", selector); + }, + + filter: function( selector ) { + return this.pushStack( winnow(this, selector, true), "filter", selector ); + }, + + is: function( selector ) { + return !!selector && ( + typeof selector === "string" ? + // If this is a positional selector, check membership in the returned set + // so $("p:first").is("p:last") won't return true for a doc with two "p". + POS.test( selector ) ? + jQuery( selector, this.context ).index( this[0] ) >= 0 : + jQuery.filter( selector, this ).length > 0 : + this.filter( selector ).length > 0 ); + }, + + closest: function( selectors, context ) { + var ret = [], i, l, cur = this[0]; + + // Array (deprecated as of jQuery 1.7) + if ( jQuery.isArray( selectors ) ) { + var level = 1; + + while ( cur && cur.ownerDocument && cur !== context ) { + for ( i = 0; i < selectors.length; i++ ) { + + if ( jQuery( cur ).is( selectors[ i ] ) ) { + ret.push({ selector: selectors[ i ], elem: cur, level: level }); + } + } + + cur = cur.parentNode; + level++; + } + + return ret; + } + + // String + var pos = POS.test( selectors ) || typeof selectors !== "string" ? + jQuery( selectors, context || this.context ) : + 0; + + for ( i = 0, l = this.length; i < l; i++ ) { + cur = this[i]; + + while ( cur ) { + if ( pos ? pos.index(cur) > -1 : jQuery.find.matchesSelector(cur, selectors) ) { + ret.push( cur ); + break; + + } else { + cur = cur.parentNode; + if ( !cur || !cur.ownerDocument || cur === context || cur.nodeType === 11 ) { + break; + } + } + } + } + + ret = ret.length > 1 ? jQuery.unique( ret ) : ret; + + return this.pushStack( ret, "closest", selectors ); + }, + + // Determine the position of an element within + // the matched set of elements + index: function( elem ) { + + // No argument, return index in parent + if ( !elem ) { + return ( this[0] && this[0].parentNode ) ? this.prevAll().length : -1; + } + + // index in selector + if ( typeof elem === "string" ) { + return jQuery.inArray( this[0], jQuery( elem ) ); + } + + // Locate the position of the desired element + return jQuery.inArray( + // If it receives a jQuery object, the first element is used + elem.jquery ? elem[0] : elem, this ); + }, + + add: function( selector, context ) { + var set = typeof selector === "string" ? + jQuery( selector, context ) : + jQuery.makeArray( selector && selector.nodeType ? [ selector ] : selector ), + all = jQuery.merge( this.get(), set ); + + return this.pushStack( isDisconnected( set[0] ) || isDisconnected( all[0] ) ? + all : + jQuery.unique( all ) ); + }, + + andSelf: function() { + return this.add( this.prevObject ); + } +}); + +// A painfully simple check to see if an element is disconnected +// from a document (should be improved, where feasible). +function isDisconnected( node ) { + return !node || !node.parentNode || node.parentNode.nodeType === 11; +} + +jQuery.each({ + parent: function( elem ) { + var parent = elem.parentNode; + return parent && parent.nodeType !== 11 ? parent : null; + }, + parents: function( elem ) { + return jQuery.dir( elem, "parentNode" ); + }, + parentsUntil: function( elem, i, until ) { + return jQuery.dir( elem, "parentNode", until ); + }, + next: function( elem ) { + return jQuery.nth( elem, 2, "nextSibling" ); + }, + prev: function( elem ) { + return jQuery.nth( elem, 2, "previousSibling" ); + }, + nextAll: function( elem ) { + return jQuery.dir( elem, "nextSibling" ); + }, + prevAll: function( elem ) { + return jQuery.dir( elem, "previousSibling" ); + }, + nextUntil: function( elem, i, until ) { + return jQuery.dir( elem, "nextSibling", until ); + }, + prevUntil: function( elem, i, until ) { + return jQuery.dir( elem, "previousSibling", until ); + }, + siblings: function( elem ) { + return jQuery.sibling( elem.parentNode.firstChild, elem ); + }, + children: function( elem ) { + return jQuery.sibling( elem.firstChild ); + }, + contents: function( elem ) { + return jQuery.nodeName( elem, "iframe" ) ? + elem.contentDocument || elem.contentWindow.document : + jQuery.makeArray( elem.childNodes ); + } +}, function( name, fn ) { + jQuery.fn[ name ] = function( until, selector ) { + var ret = jQuery.map( this, fn, until ); + + if ( !runtil.test( name ) ) { + selector = until; + } + + if ( selector && typeof selector === "string" ) { + ret = jQuery.filter( selector, ret ); + } + + ret = this.length > 1 && !guaranteedUnique[ name ] ? jQuery.unique( ret ) : ret; + + if ( (this.length > 1 || rmultiselector.test( selector )) && rparentsprev.test( name ) ) { + ret = ret.reverse(); + } + + return this.pushStack( ret, name, slice.call( arguments ).join(",") ); + }; +}); + +jQuery.extend({ + filter: function( expr, elems, not ) { + if ( not ) { + expr = ":not(" + expr + ")"; + } + + return elems.length === 1 ? + jQuery.find.matchesSelector(elems[0], expr) ? [ elems[0] ] : [] : + jQuery.find.matches(expr, elems); + }, + + dir: function( elem, dir, until ) { + var matched = [], + cur = elem[ dir ]; + + while ( cur && cur.nodeType !== 9 && (until === undefined || cur.nodeType !== 1 || !jQuery( cur ).is( until )) ) { + if ( cur.nodeType === 1 ) { + matched.push( cur ); + } + cur = cur[dir]; + } + return matched; + }, + + nth: function( cur, result, dir, elem ) { + result = result || 1; + var num = 0; + + for ( ; cur; cur = cur[dir] ) { + if ( cur.nodeType === 1 && ++num === result ) { + break; + } + } + + return cur; + }, + + sibling: function( n, elem ) { + var r = []; + + for ( ; n; n = n.nextSibling ) { + if ( n.nodeType === 1 && n !== elem ) { + r.push( n ); + } + } + + return r; + } +}); + +// Implement the identical functionality for filter and not +function winnow( elements, qualifier, keep ) { + + // Can't pass null or undefined to indexOf in Firefox 4 + // Set to 0 to skip string check + qualifier = qualifier || 0; + + if ( jQuery.isFunction( qualifier ) ) { + return jQuery.grep(elements, function( elem, i ) { + var retVal = !!qualifier.call( elem, i, elem ); + return retVal === keep; + }); + + } else if ( qualifier.nodeType ) { + return jQuery.grep(elements, function( elem, i ) { + return ( elem === qualifier ) === keep; + }); + + } else if ( typeof qualifier === "string" ) { + var filtered = jQuery.grep(elements, function( elem ) { + return elem.nodeType === 1; + }); + + if ( isSimple.test( qualifier ) ) { + return jQuery.filter(qualifier, filtered, !keep); + } else { + qualifier = jQuery.filter( qualifier, filtered ); + } + } + + return jQuery.grep(elements, function( elem, i ) { + return ( jQuery.inArray( elem, qualifier ) >= 0 ) === keep; + }); +} + + + + +function createSafeFragment( document ) { + var list = nodeNames.split( "|" ), + safeFrag = document.createDocumentFragment(); + + if ( safeFrag.createElement ) { + while ( list.length ) { + safeFrag.createElement( + list.pop() + ); + } + } + return safeFrag; +} + +var nodeNames = "abbr|article|aside|audio|canvas|datalist|details|figcaption|figure|footer|" + + "header|hgroup|mark|meter|nav|output|progress|section|summary|time|video", + rinlinejQuery = / jQuery\d+="(?:\d+|null)"/g, + rleadingWhitespace = /^\s+/, + rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig, + rtagName = /<([\w:]+)/, + rtbody = /", "" ], + legend: [ 1, "
", "
" ], + thead: [ 1, "", "
" ], + tr: [ 2, "", "
" ], + td: [ 3, "", "
" ], + col: [ 2, "", "
" ], + area: [ 1, "", "" ], + _default: [ 0, "", "" ] + }, + safeFragment = createSafeFragment( document ); + +wrapMap.optgroup = wrapMap.option; +wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead; +wrapMap.th = wrapMap.td; + +// IE can't serialize and ' ); + + iframe_doc.close(); + + // Update the Iframe's hash, for great justice. + iframe.location.hash = hash; + } + }; + + })(); + // ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + // ^^^^^^^^^^^^^^^^^^^ REMOVE IF NOT SUPPORTING IE6/7/8 ^^^^^^^^^^^^^^^^^^^ + // ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + + return self; + })(); + +})(jQuery,this); diff --git a/jquery/jquery.scrollTo-1.4.2.js b/jquery/jquery.scrollTo-1.4.2.js new file mode 100644 index 0000000..eec31e1 --- /dev/null +++ b/jquery/jquery.scrollTo-1.4.2.js @@ -0,0 +1,215 @@ +/** + * jQuery.ScrollTo + * Copyright (c) 2007-2009 Ariel Flesler - aflesler(at)gmail(dot)com | http://flesler.blogspot.com + * Dual licensed under MIT and GPL. + * Date: 5/25/2009 + * + * @projectDescription Easy element scrolling using jQuery. + * http://flesler.blogspot.com/2007/10/jqueryscrollto.html + * Works with jQuery +1.2.6. Tested on FF 2/3, IE 6/7/8, Opera 9.5/6, Safari 3, Chrome 1 on WinXP. + * + * @author Ariel Flesler + * @version 1.4.2 + * + * @id jQuery.scrollTo + * @id jQuery.fn.scrollTo + * @param {String, Number, DOMElement, jQuery, Object} target Where to scroll the matched elements. + * The different options for target are: + * - A number position (will be applied to all axes). + * - A string position ('44', '100px', '+=90', etc ) will be applied to all axes + * - A jQuery/DOM element ( logically, child of the element to scroll ) + * - A string selector, that will be relative to the element to scroll ( 'li:eq(2)', etc ) + * - A hash { top:x, left:y }, x and y can be any kind of number/string like above. +* - A percentage of the container's dimension/s, for example: 50% to go to the middle. + * - The string 'max' for go-to-end. + * @param {Number} duration The OVERALL length of the animation, this argument can be the settings object instead. + * @param {Object,Function} settings Optional set of settings or the onAfter callback. + * @option {String} axis Which axis must be scrolled, use 'x', 'y', 'xy' or 'yx'. + * @option {Number} duration The OVERALL length of the animation. + * @option {String} easing The easing method for the animation. + * @option {Boolean} margin If true, the margin of the target element will be deducted from the final position. + * @option {Object, Number} offset Add/deduct from the end position. One number for both axes or { top:x, left:y }. + * @option {Object, Number} over Add/deduct the height/width multiplied by 'over', can be { top:x, left:y } when using both axes. + * @option {Boolean} queue If true, and both axis are given, the 2nd axis will only be animated after the first one ends. + * @option {Function} onAfter Function to be called after the scrolling ends. + * @option {Function} onAfterFirst If queuing is activated, this function will be called after the first scrolling ends. + * @return {jQuery} Returns the same jQuery object, for chaining. + * + * @desc Scroll to a fixed position + * @example $('div').scrollTo( 340 ); + * + * @desc Scroll relatively to the actual position + * @example $('div').scrollTo( '+=340px', { axis:'y' } ); + * + * @dec Scroll using a selector (relative to the scrolled element) + * @example $('div').scrollTo( 'p.paragraph:eq(2)', 500, { easing:'swing', queue:true, axis:'xy' } ); + * + * @ Scroll to a DOM element (same for jQuery object) + * @example var second_child = document.getElementById('container').firstChild.nextSibling; + * $('#container').scrollTo( second_child, { duration:500, axis:'x', onAfter:function(){ + * alert('scrolled!!'); + * }}); + * + * @desc Scroll on both axes, to different values + * @example $('div').scrollTo( { top: 300, left:'+=200' }, { axis:'xy', offset:-20 } ); + */ +;(function( $ ){ + + var $scrollTo = $.scrollTo = function( target, duration, settings ){ + $(window).scrollTo( target, duration, settings ); + }; + + $scrollTo.defaults = { + axis:'xy', + duration: parseFloat($.fn.jquery) >= 1.3 ? 0 : 1 + }; + + // Returns the element that needs to be animated to scroll the window. + // Kept for backwards compatibility (specially for localScroll & serialScroll) + $scrollTo.window = function( scope ){ + return $(window)._scrollable(); + }; + + // Hack, hack, hack :) + // Returns the real elements to scroll (supports window/iframes, documents and regular nodes) + $.fn._scrollable = function(){ + return this.map(function(){ + var elem = this, + isWin = !elem.nodeName || $.inArray( elem.nodeName.toLowerCase(), ['iframe','#document','html','body'] ) != -1; + + if( !isWin ) + return elem; + + var doc = (elem.contentWindow || elem).document || elem.ownerDocument || elem; + + return $.browser.safari || doc.compatMode == 'BackCompat' ? + doc.body : + doc.documentElement; + }); + }; + + $.fn.scrollTo = function( target, duration, settings ){ + if( typeof duration == 'object' ){ + settings = duration; + duration = 0; + } + if( typeof settings == 'function' ) + settings = { onAfter:settings }; + + if( target == 'max' ) + target = 9e9; + + settings = $.extend( {}, $scrollTo.defaults, settings ); + // Speed is still recognized for backwards compatibility + duration = duration || settings.speed || settings.duration; + // Make sure the settings are given right + settings.queue = settings.queue && settings.axis.length > 1; + + if( settings.queue ) + // Let's keep the overall duration + duration /= 2; + settings.offset = both( settings.offset ); + settings.over = both( settings.over ); + + return this._scrollable().each(function(){ + var elem = this, + $elem = $(elem), + targ = target, toff, attr = {}, + win = $elem.is('html,body'); + + switch( typeof targ ){ + // A number will pass the regex + case 'number': + case 'string': + if( /^([+-]=)?\d+(\.\d+)?(px|%)?$/.test(targ) ){ + targ = both( targ ); + // We are done + break; + } + // Relative selector, no break! + targ = $(targ,this); + case 'object': + // DOMElement / jQuery + if( targ.is || targ.style ) + // Get the real position of the target + toff = (targ = $(targ)).offset(); + } + $.each( settings.axis.split(''), function( i, axis ){ + var Pos = axis == 'x' ? 'Left' : 'Top', + pos = Pos.toLowerCase(), + key = 'scroll' + Pos, + old = elem[key], + max = $scrollTo.max(elem, axis); + + if( toff ){// jQuery / DOMElement + attr[key] = toff[pos] + ( win ? 0 : old - $elem.offset()[pos] ); + + // If it's a dom element, reduce the margin + if( settings.margin ){ + attr[key] -= parseInt(targ.css('margin'+Pos)) || 0; + attr[key] -= parseInt(targ.css('border'+Pos+'Width')) || 0; + } + + attr[key] += settings.offset[pos] || 0; + + if( settings.over[pos] ) + // Scroll to a fraction of its width/height + attr[key] += targ[axis=='x'?'width':'height']() * settings.over[pos]; + }else{ + var val = targ[pos]; + // Handle percentage values + attr[key] = val.slice && val.slice(-1) == '%' ? + parseFloat(val) / 100 * max + : val; + } + + // Number or 'number' + if( /^\d+$/.test(attr[key]) ) + // Check the limits + attr[key] = attr[key] <= 0 ? 0 : Math.min( attr[key], max ); + + // Queueing axes + if( !i && settings.queue ){ + // Don't waste time animating, if there's no need. + if( old != attr[key] ) + // Intermediate animation + animate( settings.onAfterFirst ); + // Don't animate this axis again in the next iteration. + delete attr[key]; + } + }); + + animate( settings.onAfter ); + + function animate( callback ){ + $elem.animate( attr, duration, settings.easing, callback && function(){ + callback.call(this, target, settings); + }); + }; + + }).end(); + }; + + // Max scrolling position, works on quirks mode + // It only fails (not too badly) on IE, quirks mode. + $scrollTo.max = function( elem, axis ){ + var Dim = axis == 'x' ? 'Width' : 'Height', + scroll = 'scroll'+Dim; + + if( !$(elem).is('html,body') ) + return elem[scroll] - $(elem)[Dim.toLowerCase()](); + + var size = 'client' + Dim, + html = elem.ownerDocument.documentElement, + body = elem.ownerDocument.body; + + return Math.max( html[scroll], body[scroll] ) + - Math.min( html[size] , body[size] ); + + }; + + function both( val ){ + return typeof val == 'object' ? val : { top:val, left:val }; + }; + +})( jQuery ); \ No newline at end of file diff --git a/jquery/jquery.ui-1.8.18.core.js b/jquery/jquery.ui-1.8.18.core.js new file mode 100644 index 0000000..98b4f9b --- /dev/null +++ b/jquery/jquery.ui-1.8.18.core.js @@ -0,0 +1,319 @@ +/*! + * jQuery UI 1.8.18 + * + * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI + */ +(function( $, undefined ) { + +// prevent duplicate loading +// this is only a problem because we proxy existing functions +// and we don't want to double proxy them +$.ui = $.ui || {}; +if ( $.ui.version ) { + return; +} + +$.extend( $.ui, { + version: "1.8.18", + + keyCode: { + ALT: 18, + BACKSPACE: 8, + CAPS_LOCK: 20, + COMMA: 188, + COMMAND: 91, + COMMAND_LEFT: 91, // COMMAND + COMMAND_RIGHT: 93, + CONTROL: 17, + DELETE: 46, + DOWN: 40, + END: 35, + ENTER: 13, + ESCAPE: 27, + HOME: 36, + INSERT: 45, + LEFT: 37, + MENU: 93, // COMMAND_RIGHT + NUMPAD_ADD: 107, + NUMPAD_DECIMAL: 110, + NUMPAD_DIVIDE: 111, + NUMPAD_ENTER: 108, + NUMPAD_MULTIPLY: 106, + NUMPAD_SUBTRACT: 109, + PAGE_DOWN: 34, + PAGE_UP: 33, + PERIOD: 190, + RIGHT: 39, + SHIFT: 16, + SPACE: 32, + TAB: 9, + UP: 38, + WINDOWS: 91 // COMMAND + } +}); + +// plugins +$.fn.extend({ + propAttr: $.fn.prop || $.fn.attr, + + _focus: $.fn.focus, + focus: function( delay, fn ) { + return typeof delay === "number" ? + this.each(function() { + var elem = this; + setTimeout(function() { + $( elem ).focus(); + if ( fn ) { + fn.call( elem ); + } + }, delay ); + }) : + this._focus.apply( this, arguments ); + }, + + scrollParent: function() { + var scrollParent; + if (($.browser.msie && (/(static|relative)/).test(this.css('position'))) || (/absolute/).test(this.css('position'))) { + scrollParent = this.parents().filter(function() { + return (/(relative|absolute|fixed)/).test($.curCSS(this,'position',1)) && (/(auto|scroll)/).test($.curCSS(this,'overflow',1)+$.curCSS(this,'overflow-y',1)+$.curCSS(this,'overflow-x',1)); + }).eq(0); + } else { + scrollParent = this.parents().filter(function() { + return (/(auto|scroll)/).test($.curCSS(this,'overflow',1)+$.curCSS(this,'overflow-y',1)+$.curCSS(this,'overflow-x',1)); + }).eq(0); + } + + return (/fixed/).test(this.css('position')) || !scrollParent.length ? $(document) : scrollParent; + }, + + zIndex: function( zIndex ) { + if ( zIndex !== undefined ) { + return this.css( "zIndex", zIndex ); + } + + if ( this.length ) { + var elem = $( this[ 0 ] ), position, value; + while ( elem.length && elem[ 0 ] !== document ) { + // Ignore z-index if position is set to a value where z-index is ignored by the browser + // This makes behavior of this function consistent across browsers + // WebKit always returns auto if the element is positioned + position = elem.css( "position" ); + if ( position === "absolute" || position === "relative" || position === "fixed" ) { + // IE returns 0 when zIndex is not specified + // other browsers return a string + // we ignore the case of nested elements with an explicit value of 0 + //
+ value = parseInt( elem.css( "zIndex" ), 10 ); + if ( !isNaN( value ) && value !== 0 ) { + return value; + } + } + elem = elem.parent(); + } + } + + return 0; + }, + + disableSelection: function() { + return this.bind( ( $.support.selectstart ? "selectstart" : "mousedown" ) + + ".ui-disableSelection", function( event ) { + event.preventDefault(); + }); + }, + + enableSelection: function() { + return this.unbind( ".ui-disableSelection" ); + } +}); + +$.each( [ "Width", "Height" ], function( i, name ) { + var side = name === "Width" ? [ "Left", "Right" ] : [ "Top", "Bottom" ], + type = name.toLowerCase(), + orig = { + innerWidth: $.fn.innerWidth, + innerHeight: $.fn.innerHeight, + outerWidth: $.fn.outerWidth, + outerHeight: $.fn.outerHeight + }; + + function reduce( elem, size, border, margin ) { + $.each( side, function() { + size -= parseFloat( $.curCSS( elem, "padding" + this, true) ) || 0; + if ( border ) { + size -= parseFloat( $.curCSS( elem, "border" + this + "Width", true) ) || 0; + } + if ( margin ) { + size -= parseFloat( $.curCSS( elem, "margin" + this, true) ) || 0; + } + }); + return size; + } + + $.fn[ "inner" + name ] = function( size ) { + if ( size === undefined ) { + return orig[ "inner" + name ].call( this ); + } + + return this.each(function() { + $( this ).css( type, reduce( this, size ) + "px" ); + }); + }; + + $.fn[ "outer" + name] = function( size, margin ) { + if ( typeof size !== "number" ) { + return orig[ "outer" + name ].call( this, size ); + } + + return this.each(function() { + $( this).css( type, reduce( this, size, true, margin ) + "px" ); + }); + }; +}); + +// selectors +function focusable( element, isTabIndexNotNaN ) { + var nodeName = element.nodeName.toLowerCase(); + if ( "area" === nodeName ) { + var map = element.parentNode, + mapName = map.name, + img; + if ( !element.href || !mapName || map.nodeName.toLowerCase() !== "map" ) { + return false; + } + img = $( "img[usemap=#" + mapName + "]" )[0]; + return !!img && visible( img ); + } + return ( /input|select|textarea|button|object/.test( nodeName ) + ? !element.disabled + : "a" == nodeName + ? element.href || isTabIndexNotNaN + : isTabIndexNotNaN) + // the element and all of its ancestors must be visible + && visible( element ); +} + +function visible( element ) { + return !$( element ).parents().andSelf().filter(function() { + return $.curCSS( this, "visibility" ) === "hidden" || + $.expr.filters.hidden( this ); + }).length; +} + +$.extend( $.expr[ ":" ], { + data: function( elem, i, match ) { + return !!$.data( elem, match[ 3 ] ); + }, + + focusable: function( element ) { + return focusable( element, !isNaN( $.attr( element, "tabindex" ) ) ); + }, + + tabbable: function( element ) { + var tabIndex = $.attr( element, "tabindex" ), + isTabIndexNaN = isNaN( tabIndex ); + return ( isTabIndexNaN || tabIndex >= 0 ) && focusable( element, !isTabIndexNaN ); + } +}); + +// support +$(function() { + var body = document.body, + div = body.appendChild( div = document.createElement( "div" ) ); + + // access offsetHeight before setting the style to prevent a layout bug + // in IE 9 which causes the elemnt to continue to take up space even + // after it is removed from the DOM (#8026) + div.offsetHeight; + + $.extend( div.style, { + minHeight: "100px", + height: "auto", + padding: 0, + borderWidth: 0 + }); + + $.support.minHeight = div.offsetHeight === 100; + $.support.selectstart = "onselectstart" in div; + + // set display to none to avoid a layout bug in IE + // http://dev.jquery.com/ticket/4014 + body.removeChild( div ).style.display = "none"; +}); + + + + + +// deprecated +$.extend( $.ui, { + // $.ui.plugin is deprecated. Use the proxy pattern instead. + plugin: { + add: function( module, option, set ) { + var proto = $.ui[ module ].prototype; + for ( var i in set ) { + proto.plugins[ i ] = proto.plugins[ i ] || []; + proto.plugins[ i ].push( [ option, set[ i ] ] ); + } + }, + call: function( instance, name, args ) { + var set = instance.plugins[ name ]; + if ( !set || !instance.element[ 0 ].parentNode ) { + return; + } + + for ( var i = 0; i < set.length; i++ ) { + if ( instance.options[ set[ i ][ 0 ] ] ) { + set[ i ][ 1 ].apply( instance.element, args ); + } + } + } + }, + + // will be deprecated when we switch to jQuery 1.4 - use jQuery.contains() + contains: function( a, b ) { + return document.compareDocumentPosition ? + a.compareDocumentPosition( b ) & 16 : + a !== b && a.contains( b ); + }, + + // only used by resizable + hasScroll: function( el, a ) { + + //If overflow is hidden, the element might have extra content, but the user wants to hide it + if ( $( el ).css( "overflow" ) === "hidden") { + return false; + } + + var scroll = ( a && a === "left" ) ? "scrollLeft" : "scrollTop", + has = false; + + if ( el[ scroll ] > 0 ) { + return true; + } + + // TODO: determine which cases actually cause this to happen + // if the element doesn't have the scroll set, see if it's possible to + // set the scroll + el[ scroll ] = 1; + has = ( el[ scroll ] > 0 ); + el[ scroll ] = 0; + return has; + }, + + // these are odd functions, fix the API or move into individual plugins + isOverAxis: function( x, reference, size ) { + //Determines when x coordinate is over "b" element axis + return ( x > reference ) && ( x < ( reference + size ) ); + }, + isOver: function( y, x, top, left, height, width ) { + //Determines when x, y coordinates is over "b" element + return $.ui.isOverAxis( y, top, height ) && $.ui.isOverAxis( x, left, width ); + } +}); + +})( jQuery ); diff --git a/jquery/jquery.ui-1.8.18.mouse.js b/jquery/jquery.ui-1.8.18.mouse.js new file mode 100644 index 0000000..669d563 --- /dev/null +++ b/jquery/jquery.ui-1.8.18.mouse.js @@ -0,0 +1,162 @@ +/*! + * jQuery UI Mouse 1.8.18 + * + * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Mouse + * + * Depends: + * jquery.ui.widget.js + */ +(function( $, undefined ) { + +var mouseHandled = false; +$( document ).mouseup( function( e ) { + mouseHandled = false; +}); + +$.widget("ui.mouse", { + options: { + cancel: ':input,option', + distance: 1, + delay: 0 + }, + _mouseInit: function() { + var self = this; + + this.element + .bind('mousedown.'+this.widgetName, function(event) { + return self._mouseDown(event); + }) + .bind('click.'+this.widgetName, function(event) { + if (true === $.data(event.target, self.widgetName + '.preventClickEvent')) { + $.removeData(event.target, self.widgetName + '.preventClickEvent'); + event.stopImmediatePropagation(); + return false; + } + }); + + this.started = false; + }, + + // TODO: make sure destroying one instance of mouse doesn't mess with + // other instances of mouse + _mouseDestroy: function() { + this.element.unbind('.'+this.widgetName); + }, + + _mouseDown: function(event) { + // don't let more than one widget handle mouseStart + if( mouseHandled ) { return }; + + // we may have missed mouseup (out of window) + (this._mouseStarted && this._mouseUp(event)); + + this._mouseDownEvent = event; + + var self = this, + btnIsLeft = (event.which == 1), + // event.target.nodeName works around a bug in IE 8 with + // disabled inputs (#7620) + elIsCancel = (typeof this.options.cancel == "string" && event.target.nodeName ? $(event.target).closest(this.options.cancel).length : false); + if (!btnIsLeft || elIsCancel || !this._mouseCapture(event)) { + return true; + } + + this.mouseDelayMet = !this.options.delay; + if (!this.mouseDelayMet) { + this._mouseDelayTimer = setTimeout(function() { + self.mouseDelayMet = true; + }, this.options.delay); + } + + if (this._mouseDistanceMet(event) && this._mouseDelayMet(event)) { + this._mouseStarted = (this._mouseStart(event) !== false); + if (!this._mouseStarted) { + event.preventDefault(); + return true; + } + } + + // Click event may never have fired (Gecko & Opera) + if (true === $.data(event.target, this.widgetName + '.preventClickEvent')) { + $.removeData(event.target, this.widgetName + '.preventClickEvent'); + } + + // these delegates are required to keep context + this._mouseMoveDelegate = function(event) { + return self._mouseMove(event); + }; + this._mouseUpDelegate = function(event) { + return self._mouseUp(event); + }; + $(document) + .bind('mousemove.'+this.widgetName, this._mouseMoveDelegate) + .bind('mouseup.'+this.widgetName, this._mouseUpDelegate); + + event.preventDefault(); + + mouseHandled = true; + return true; + }, + + _mouseMove: function(event) { + // IE mouseup check - mouseup happened when mouse was out of window + if ($.browser.msie && !(document.documentMode >= 9) && !event.button) { + return this._mouseUp(event); + } + + if (this._mouseStarted) { + this._mouseDrag(event); + return event.preventDefault(); + } + + if (this._mouseDistanceMet(event) && this._mouseDelayMet(event)) { + this._mouseStarted = + (this._mouseStart(this._mouseDownEvent, event) !== false); + (this._mouseStarted ? this._mouseDrag(event) : this._mouseUp(event)); + } + + return !this._mouseStarted; + }, + + _mouseUp: function(event) { + $(document) + .unbind('mousemove.'+this.widgetName, this._mouseMoveDelegate) + .unbind('mouseup.'+this.widgetName, this._mouseUpDelegate); + + if (this._mouseStarted) { + this._mouseStarted = false; + + if (event.target == this._mouseDownEvent.target) { + $.data(event.target, this.widgetName + '.preventClickEvent', true); + } + + this._mouseStop(event); + } + + return false; + }, + + _mouseDistanceMet: function(event) { + return (Math.max( + Math.abs(this._mouseDownEvent.pageX - event.pageX), + Math.abs(this._mouseDownEvent.pageY - event.pageY) + ) >= this.options.distance + ); + }, + + _mouseDelayMet: function(event) { + return this.mouseDelayMet; + }, + + // These are placeholder methods, to be overriden by extending plugin + _mouseStart: function(event) {}, + _mouseDrag: function(event) {}, + _mouseStop: function(event) {}, + _mouseCapture: function(event) { return true; } +}); + +})(jQuery); diff --git a/jquery/jquery.ui-1.8.18.resizable.js b/jquery/jquery.ui-1.8.18.resizable.js new file mode 100644 index 0000000..b441435 --- /dev/null +++ b/jquery/jquery.ui-1.8.18.resizable.js @@ -0,0 +1,808 @@ +/* + * jQuery UI Resizable 1.8.18 + * + * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Resizables + * + * Depends: + * jquery.ui.core.js + * jquery.ui.mouse.js + * jquery.ui.widget.js + */ +(function( $, undefined ) { + +$.widget("ui.resizable", $.ui.mouse, { + widgetEventPrefix: "resize", + options: { + alsoResize: false, + animate: false, + animateDuration: "slow", + animateEasing: "swing", + aspectRatio: false, + autoHide: false, + containment: false, + ghost: false, + grid: false, + handles: "e,s,se", + helper: false, + maxHeight: null, + maxWidth: null, + minHeight: 10, + minWidth: 10, + zIndex: 1000 + }, + _create: function() { + + var self = this, o = this.options; + this.element.addClass("ui-resizable"); + + $.extend(this, { + _aspectRatio: !!(o.aspectRatio), + aspectRatio: o.aspectRatio, + originalElement: this.element, + _proportionallyResizeElements: [], + _helper: o.helper || o.ghost || o.animate ? o.helper || 'ui-resizable-helper' : null + }); + + //Wrap the element if it cannot hold child nodes + if(this.element[0].nodeName.match(/canvas|textarea|input|select|button|img/i)) { + + //Create a wrapper element and set the wrapper to the new current internal element + this.element.wrap( + $('
').css({ + position: this.element.css('position'), + width: this.element.outerWidth(), + height: this.element.outerHeight(), + top: this.element.css('top'), + left: this.element.css('left') + }) + ); + + //Overwrite the original this.element + this.element = this.element.parent().data( + "resizable", this.element.data('resizable') + ); + + this.elementIsWrapper = true; + + //Move margins to the wrapper + this.element.css({ marginLeft: this.originalElement.css("marginLeft"), marginTop: this.originalElement.css("marginTop"), marginRight: this.originalElement.css("marginRight"), marginBottom: this.originalElement.css("marginBottom") }); + this.originalElement.css({ marginLeft: 0, marginTop: 0, marginRight: 0, marginBottom: 0}); + + //Prevent Safari textarea resize + this.originalResizeStyle = this.originalElement.css('resize'); + this.originalElement.css('resize', 'none'); + + //Push the actual element to our proportionallyResize internal array + this._proportionallyResizeElements.push(this.originalElement.css({ position: 'static', zoom: 1, display: 'block' })); + + // avoid IE jump (hard set the margin) + this.originalElement.css({ margin: this.originalElement.css('margin') }); + + // fix handlers offset + this._proportionallyResize(); + + } + + this.handles = o.handles || (!$('.ui-resizable-handle', this.element).length ? "e,s,se" : { n: '.ui-resizable-n', e: '.ui-resizable-e', s: '.ui-resizable-s', w: '.ui-resizable-w', se: '.ui-resizable-se', sw: '.ui-resizable-sw', ne: '.ui-resizable-ne', nw: '.ui-resizable-nw' }); + if(this.handles.constructor == String) { + + if(this.handles == 'all') this.handles = 'n,e,s,w,se,sw,ne,nw'; + var n = this.handles.split(","); this.handles = {}; + + for(var i = 0; i < n.length; i++) { + + var handle = $.trim(n[i]), hname = 'ui-resizable-'+handle; + var axis = $('
'); + + // increase zIndex of sw, se, ne, nw axis + //TODO : this modifies original option + if(/sw|se|ne|nw/.test(handle)) axis.css({ zIndex: ++o.zIndex }); + + //TODO : What's going on here? + if ('se' == handle) { + axis.addClass('ui-icon ui-icon-gripsmall-diagonal-se'); + }; + + //Insert into internal handles object and append to element + this.handles[handle] = '.ui-resizable-'+handle; + this.element.append(axis); + } + + } + + this._renderAxis = function(target) { + + target = target || this.element; + + for(var i in this.handles) { + + if(this.handles[i].constructor == String) + this.handles[i] = $(this.handles[i], this.element).show(); + + //Apply pad to wrapper element, needed to fix axis position (textarea, inputs, scrolls) + if (this.elementIsWrapper && this.originalElement[0].nodeName.match(/textarea|input|select|button/i)) { + + var axis = $(this.handles[i], this.element), padWrapper = 0; + + //Checking the correct pad and border + padWrapper = /sw|ne|nw|se|n|s/.test(i) ? axis.outerHeight() : axis.outerWidth(); + + //The padding type i have to apply... + var padPos = [ 'padding', + /ne|nw|n/.test(i) ? 'Top' : + /se|sw|s/.test(i) ? 'Bottom' : + /^e$/.test(i) ? 'Right' : 'Left' ].join(""); + + target.css(padPos, padWrapper); + + this._proportionallyResize(); + + } + + //TODO: What's that good for? There's not anything to be executed left + if(!$(this.handles[i]).length) + continue; + + } + }; + + //TODO: make renderAxis a prototype function + this._renderAxis(this.element); + + this._handles = $('.ui-resizable-handle', this.element) + .disableSelection(); + + //Matching axis name + this._handles.mouseover(function() { + if (!self.resizing) { + if (this.className) + var axis = this.className.match(/ui-resizable-(se|sw|ne|nw|n|e|s|w)/i); + //Axis, default = se + self.axis = axis && axis[1] ? axis[1] : 'se'; + } + }); + + //If we want to auto hide the elements + if (o.autoHide) { + this._handles.hide(); + $(this.element) + .addClass("ui-resizable-autohide") + .hover(function() { + if (o.disabled) return; + $(this).removeClass("ui-resizable-autohide"); + self._handles.show(); + }, + function(){ + if (o.disabled) return; + if (!self.resizing) { + $(this).addClass("ui-resizable-autohide"); + self._handles.hide(); + } + }); + } + + //Initialize the mouse interaction + this._mouseInit(); + + }, + + destroy: function() { + + this._mouseDestroy(); + + var _destroy = function(exp) { + $(exp).removeClass("ui-resizable ui-resizable-disabled ui-resizable-resizing") + .removeData("resizable").unbind(".resizable").find('.ui-resizable-handle').remove(); + }; + + //TODO: Unwrap at same DOM position + if (this.elementIsWrapper) { + _destroy(this.element); + var wrapper = this.element; + wrapper.after( + this.originalElement.css({ + position: wrapper.css('position'), + width: wrapper.outerWidth(), + height: wrapper.outerHeight(), + top: wrapper.css('top'), + left: wrapper.css('left') + }) + ).remove(); + } + + this.originalElement.css('resize', this.originalResizeStyle); + _destroy(this.originalElement); + + return this; + }, + + _mouseCapture: function(event) { + var handle = false; + for (var i in this.handles) { + if ($(this.handles[i])[0] == event.target) { + handle = true; + } + } + + return !this.options.disabled && handle; + }, + + _mouseStart: function(event) { + + var o = this.options, iniPos = this.element.position(), el = this.element; + + this.resizing = true; + this.documentScroll = { top: $(document).scrollTop(), left: $(document).scrollLeft() }; + + // bugfix for http://dev.jquery.com/ticket/1749 + if (el.is('.ui-draggable') || (/absolute/).test(el.css('position'))) { + el.css({ position: 'absolute', top: iniPos.top, left: iniPos.left }); + } + + this._renderProxy(); + + var curleft = num(this.helper.css('left')), curtop = num(this.helper.css('top')); + + if (o.containment) { + curleft += $(o.containment).scrollLeft() || 0; + curtop += $(o.containment).scrollTop() || 0; + } + + //Store needed variables + this.offset = this.helper.offset(); + this.position = { left: curleft, top: curtop }; + this.size = this._helper ? { width: el.outerWidth(), height: el.outerHeight() } : { width: el.width(), height: el.height() }; + this.originalSize = this._helper ? { width: el.outerWidth(), height: el.outerHeight() } : { width: el.width(), height: el.height() }; + this.originalPosition = { left: curleft, top: curtop }; + this.sizeDiff = { width: el.outerWidth() - el.width(), height: el.outerHeight() - el.height() }; + this.originalMousePosition = { left: event.pageX, top: event.pageY }; + + //Aspect Ratio + this.aspectRatio = (typeof o.aspectRatio == 'number') ? o.aspectRatio : ((this.originalSize.width / this.originalSize.height) || 1); + + var cursor = $('.ui-resizable-' + this.axis).css('cursor'); + $('body').css('cursor', cursor == 'auto' ? this.axis + '-resize' : cursor); + + el.addClass("ui-resizable-resizing"); + this._propagate("start", event); + return true; + }, + + _mouseDrag: function(event) { + + //Increase performance, avoid regex + var el = this.helper, o = this.options, props = {}, + self = this, smp = this.originalMousePosition, a = this.axis; + + var dx = (event.pageX-smp.left)||0, dy = (event.pageY-smp.top)||0; + var trigger = this._change[a]; + if (!trigger) return false; + + // Calculate the attrs that will be change + var data = trigger.apply(this, [event, dx, dy]), ie6 = $.browser.msie && $.browser.version < 7, csdif = this.sizeDiff; + + // Put this in the mouseDrag handler since the user can start pressing shift while resizing + this._updateVirtualBoundaries(event.shiftKey); + if (this._aspectRatio || event.shiftKey) + data = this._updateRatio(data, event); + + data = this._respectSize(data, event); + + // plugins callbacks need to be called first + this._propagate("resize", event); + + el.css({ + top: this.position.top + "px", left: this.position.left + "px", + width: this.size.width + "px", height: this.size.height + "px" + }); + + if (!this._helper && this._proportionallyResizeElements.length) + this._proportionallyResize(); + + this._updateCache(data); + + // calling the user callback at the end + this._trigger('resize', event, this.ui()); + + return false; + }, + + _mouseStop: function(event) { + + this.resizing = false; + var o = this.options, self = this; + + if(this._helper) { + var pr = this._proportionallyResizeElements, ista = pr.length && (/textarea/i).test(pr[0].nodeName), + soffseth = ista && $.ui.hasScroll(pr[0], 'left') /* TODO - jump height */ ? 0 : self.sizeDiff.height, + soffsetw = ista ? 0 : self.sizeDiff.width; + + var s = { width: (self.helper.width() - soffsetw), height: (self.helper.height() - soffseth) }, + left = (parseInt(self.element.css('left'), 10) + (self.position.left - self.originalPosition.left)) || null, + top = (parseInt(self.element.css('top'), 10) + (self.position.top - self.originalPosition.top)) || null; + + if (!o.animate) + this.element.css($.extend(s, { top: top, left: left })); + + self.helper.height(self.size.height); + self.helper.width(self.size.width); + + if (this._helper && !o.animate) this._proportionallyResize(); + } + + $('body').css('cursor', 'auto'); + + this.element.removeClass("ui-resizable-resizing"); + + this._propagate("stop", event); + + if (this._helper) this.helper.remove(); + return false; + + }, + + _updateVirtualBoundaries: function(forceAspectRatio) { + var o = this.options, pMinWidth, pMaxWidth, pMinHeight, pMaxHeight, b; + + b = { + minWidth: isNumber(o.minWidth) ? o.minWidth : 0, + maxWidth: isNumber(o.maxWidth) ? o.maxWidth : Infinity, + minHeight: isNumber(o.minHeight) ? o.minHeight : 0, + maxHeight: isNumber(o.maxHeight) ? o.maxHeight : Infinity + }; + + if(this._aspectRatio || forceAspectRatio) { + // We want to create an enclosing box whose aspect ration is the requested one + // First, compute the "projected" size for each dimension based on the aspect ratio and other dimension + pMinWidth = b.minHeight * this.aspectRatio; + pMinHeight = b.minWidth / this.aspectRatio; + pMaxWidth = b.maxHeight * this.aspectRatio; + pMaxHeight = b.maxWidth / this.aspectRatio; + + if(pMinWidth > b.minWidth) b.minWidth = pMinWidth; + if(pMinHeight > b.minHeight) b.minHeight = pMinHeight; + if(pMaxWidth < b.maxWidth) b.maxWidth = pMaxWidth; + if(pMaxHeight < b.maxHeight) b.maxHeight = pMaxHeight; + } + this._vBoundaries = b; + }, + + _updateCache: function(data) { + var o = this.options; + this.offset = this.helper.offset(); + if (isNumber(data.left)) this.position.left = data.left; + if (isNumber(data.top)) this.position.top = data.top; + if (isNumber(data.height)) this.size.height = data.height; + if (isNumber(data.width)) this.size.width = data.width; + }, + + _updateRatio: function(data, event) { + + var o = this.options, cpos = this.position, csize = this.size, a = this.axis; + + if (isNumber(data.height)) data.width = (data.height * this.aspectRatio); + else if (isNumber(data.width)) data.height = (data.width / this.aspectRatio); + + if (a == 'sw') { + data.left = cpos.left + (csize.width - data.width); + data.top = null; + } + if (a == 'nw') { + data.top = cpos.top + (csize.height - data.height); + data.left = cpos.left + (csize.width - data.width); + } + + return data; + }, + + _respectSize: function(data, event) { + + var el = this.helper, o = this._vBoundaries, pRatio = this._aspectRatio || event.shiftKey, a = this.axis, + ismaxw = isNumber(data.width) && o.maxWidth && (o.maxWidth < data.width), ismaxh = isNumber(data.height) && o.maxHeight && (o.maxHeight < data.height), + isminw = isNumber(data.width) && o.minWidth && (o.minWidth > data.width), isminh = isNumber(data.height) && o.minHeight && (o.minHeight > data.height); + + if (isminw) data.width = o.minWidth; + if (isminh) data.height = o.minHeight; + if (ismaxw) data.width = o.maxWidth; + if (ismaxh) data.height = o.maxHeight; + + var dw = this.originalPosition.left + this.originalSize.width, dh = this.position.top + this.size.height; + var cw = /sw|nw|w/.test(a), ch = /nw|ne|n/.test(a); + + if (isminw && cw) data.left = dw - o.minWidth; + if (ismaxw && cw) data.left = dw - o.maxWidth; + if (isminh && ch) data.top = dh - o.minHeight; + if (ismaxh && ch) data.top = dh - o.maxHeight; + + // fixing jump error on top/left - bug #2330 + var isNotwh = !data.width && !data.height; + if (isNotwh && !data.left && data.top) data.top = null; + else if (isNotwh && !data.top && data.left) data.left = null; + + return data; + }, + + _proportionallyResize: function() { + + var o = this.options; + if (!this._proportionallyResizeElements.length) return; + var element = this.helper || this.element; + + for (var i=0; i < this._proportionallyResizeElements.length; i++) { + + var prel = this._proportionallyResizeElements[i]; + + if (!this.borderDif) { + var b = [prel.css('borderTopWidth'), prel.css('borderRightWidth'), prel.css('borderBottomWidth'), prel.css('borderLeftWidth')], + p = [prel.css('paddingTop'), prel.css('paddingRight'), prel.css('paddingBottom'), prel.css('paddingLeft')]; + + this.borderDif = $.map(b, function(v, i) { + var border = parseInt(v,10)||0, padding = parseInt(p[i],10)||0; + return border + padding; + }); + } + + if ($.browser.msie && !(!($(element).is(':hidden') || $(element).parents(':hidden').length))) + continue; + + prel.css({ + height: (element.height() - this.borderDif[0] - this.borderDif[2]) || 0, + width: (element.width() - this.borderDif[1] - this.borderDif[3]) || 0 + }); + + }; + + }, + + _renderProxy: function() { + + var el = this.element, o = this.options; + this.elementOffset = el.offset(); + + if(this._helper) { + + this.helper = this.helper || $('
'); + + // fix ie6 offset TODO: This seems broken + var ie6 = $.browser.msie && $.browser.version < 7, ie6offset = (ie6 ? 1 : 0), + pxyoffset = ( ie6 ? 2 : -1 ); + + this.helper.addClass(this._helper).css({ + width: this.element.outerWidth() + pxyoffset, + height: this.element.outerHeight() + pxyoffset, + position: 'absolute', + left: this.elementOffset.left - ie6offset +'px', + top: this.elementOffset.top - ie6offset +'px', + zIndex: ++o.zIndex //TODO: Don't modify option + }); + + this.helper + .appendTo("body") + .disableSelection(); + + } else { + this.helper = this.element; + } + + }, + + _change: { + e: function(event, dx, dy) { + return { width: this.originalSize.width + dx }; + }, + w: function(event, dx, dy) { + var o = this.options, cs = this.originalSize, sp = this.originalPosition; + return { left: sp.left + dx, width: cs.width - dx }; + }, + n: function(event, dx, dy) { + var o = this.options, cs = this.originalSize, sp = this.originalPosition; + return { top: sp.top + dy, height: cs.height - dy }; + }, + s: function(event, dx, dy) { + return { height: this.originalSize.height + dy }; + }, + se: function(event, dx, dy) { + return $.extend(this._change.s.apply(this, arguments), this._change.e.apply(this, [event, dx, dy])); + }, + sw: function(event, dx, dy) { + return $.extend(this._change.s.apply(this, arguments), this._change.w.apply(this, [event, dx, dy])); + }, + ne: function(event, dx, dy) { + return $.extend(this._change.n.apply(this, arguments), this._change.e.apply(this, [event, dx, dy])); + }, + nw: function(event, dx, dy) { + return $.extend(this._change.n.apply(this, arguments), this._change.w.apply(this, [event, dx, dy])); + } + }, + + _propagate: function(n, event) { + $.ui.plugin.call(this, n, [event, this.ui()]); + (n != "resize" && this._trigger(n, event, this.ui())); + }, + + plugins: {}, + + ui: function() { + return { + originalElement: this.originalElement, + element: this.element, + helper: this.helper, + position: this.position, + size: this.size, + originalSize: this.originalSize, + originalPosition: this.originalPosition + }; + } + +}); + +$.extend($.ui.resizable, { + version: "1.8.18" +}); + +/* + * Resizable Extensions + */ + +$.ui.plugin.add("resizable", "alsoResize", { + + start: function (event, ui) { + var self = $(this).data("resizable"), o = self.options; + + var _store = function (exp) { + $(exp).each(function() { + var el = $(this); + el.data("resizable-alsoresize", { + width: parseInt(el.width(), 10), height: parseInt(el.height(), 10), + left: parseInt(el.css('left'), 10), top: parseInt(el.css('top'), 10) + }); + }); + }; + + if (typeof(o.alsoResize) == 'object' && !o.alsoResize.parentNode) { + if (o.alsoResize.length) { o.alsoResize = o.alsoResize[0]; _store(o.alsoResize); } + else { $.each(o.alsoResize, function (exp) { _store(exp); }); } + }else{ + _store(o.alsoResize); + } + }, + + resize: function (event, ui) { + var self = $(this).data("resizable"), o = self.options, os = self.originalSize, op = self.originalPosition; + + var delta = { + height: (self.size.height - os.height) || 0, width: (self.size.width - os.width) || 0, + top: (self.position.top - op.top) || 0, left: (self.position.left - op.left) || 0 + }, + + _alsoResize = function (exp, c) { + $(exp).each(function() { + var el = $(this), start = $(this).data("resizable-alsoresize"), style = {}, + css = c && c.length ? c : el.parents(ui.originalElement[0]).length ? ['width', 'height'] : ['width', 'height', 'top', 'left']; + + $.each(css, function (i, prop) { + var sum = (start[prop]||0) + (delta[prop]||0); + if (sum && sum >= 0) + style[prop] = sum || null; + }); + + el.css(style); + }); + }; + + if (typeof(o.alsoResize) == 'object' && !o.alsoResize.nodeType) { + $.each(o.alsoResize, function (exp, c) { _alsoResize(exp, c); }); + }else{ + _alsoResize(o.alsoResize); + } + }, + + stop: function (event, ui) { + $(this).removeData("resizable-alsoresize"); + } +}); + +$.ui.plugin.add("resizable", "animate", { + + stop: function(event, ui) { + var self = $(this).data("resizable"), o = self.options; + + var pr = self._proportionallyResizeElements, ista = pr.length && (/textarea/i).test(pr[0].nodeName), + soffseth = ista && $.ui.hasScroll(pr[0], 'left') /* TODO - jump height */ ? 0 : self.sizeDiff.height, + soffsetw = ista ? 0 : self.sizeDiff.width; + + var style = { width: (self.size.width - soffsetw), height: (self.size.height - soffseth) }, + left = (parseInt(self.element.css('left'), 10) + (self.position.left - self.originalPosition.left)) || null, + top = (parseInt(self.element.css('top'), 10) + (self.position.top - self.originalPosition.top)) || null; + + self.element.animate( + $.extend(style, top && left ? { top: top, left: left } : {}), { + duration: o.animateDuration, + easing: o.animateEasing, + step: function() { + + var data = { + width: parseInt(self.element.css('width'), 10), + height: parseInt(self.element.css('height'), 10), + top: parseInt(self.element.css('top'), 10), + left: parseInt(self.element.css('left'), 10) + }; + + if (pr && pr.length) $(pr[0]).css({ width: data.width, height: data.height }); + + // propagating resize, and updating values for each animation step + self._updateCache(data); + self._propagate("resize", event); + + } + } + ); + } + +}); + +$.ui.plugin.add("resizable", "containment", { + + start: function(event, ui) { + var self = $(this).data("resizable"), o = self.options, el = self.element; + var oc = o.containment, ce = (oc instanceof $) ? oc.get(0) : (/parent/.test(oc)) ? el.parent().get(0) : oc; + if (!ce) return; + + self.containerElement = $(ce); + + if (/document/.test(oc) || oc == document) { + self.containerOffset = { left: 0, top: 0 }; + self.containerPosition = { left: 0, top: 0 }; + + self.parentData = { + element: $(document), left: 0, top: 0, + width: $(document).width(), height: $(document).height() || document.body.parentNode.scrollHeight + }; + } + + // i'm a node, so compute top, left, right, bottom + else { + var element = $(ce), p = []; + $([ "Top", "Right", "Left", "Bottom" ]).each(function(i, name) { p[i] = num(element.css("padding" + name)); }); + + self.containerOffset = element.offset(); + self.containerPosition = element.position(); + self.containerSize = { height: (element.innerHeight() - p[3]), width: (element.innerWidth() - p[1]) }; + + var co = self.containerOffset, ch = self.containerSize.height, cw = self.containerSize.width, + width = ($.ui.hasScroll(ce, "left") ? ce.scrollWidth : cw ), height = ($.ui.hasScroll(ce) ? ce.scrollHeight : ch); + + self.parentData = { + element: ce, left: co.left, top: co.top, width: width, height: height + }; + } + }, + + resize: function(event, ui) { + var self = $(this).data("resizable"), o = self.options, + ps = self.containerSize, co = self.containerOffset, cs = self.size, cp = self.position, + pRatio = self._aspectRatio || event.shiftKey, cop = { top:0, left:0 }, ce = self.containerElement; + + if (ce[0] != document && (/static/).test(ce.css('position'))) cop = co; + + if (cp.left < (self._helper ? co.left : 0)) { + self.size.width = self.size.width + (self._helper ? (self.position.left - co.left) : (self.position.left - cop.left)); + if (pRatio) self.size.height = self.size.width / o.aspectRatio; + self.position.left = o.helper ? co.left : 0; + } + + if (cp.top < (self._helper ? co.top : 0)) { + self.size.height = self.size.height + (self._helper ? (self.position.top - co.top) : self.position.top); + if (pRatio) self.size.width = self.size.height * o.aspectRatio; + self.position.top = self._helper ? co.top : 0; + } + + self.offset.left = self.parentData.left+self.position.left; + self.offset.top = self.parentData.top+self.position.top; + + var woset = Math.abs( (self._helper ? self.offset.left - cop.left : (self.offset.left - cop.left)) + self.sizeDiff.width ), + hoset = Math.abs( (self._helper ? self.offset.top - cop.top : (self.offset.top - co.top)) + self.sizeDiff.height ); + + var isParent = self.containerElement.get(0) == self.element.parent().get(0), + isOffsetRelative = /relative|absolute/.test(self.containerElement.css('position')); + + if(isParent && isOffsetRelative) woset -= self.parentData.left; + + if (woset + self.size.width >= self.parentData.width) { + self.size.width = self.parentData.width - woset; + if (pRatio) self.size.height = self.size.width / self.aspectRatio; + } + + if (hoset + self.size.height >= self.parentData.height) { + self.size.height = self.parentData.height - hoset; + if (pRatio) self.size.width = self.size.height * self.aspectRatio; + } + }, + + stop: function(event, ui){ + var self = $(this).data("resizable"), o = self.options, cp = self.position, + co = self.containerOffset, cop = self.containerPosition, ce = self.containerElement; + + var helper = $(self.helper), ho = helper.offset(), w = helper.outerWidth() - self.sizeDiff.width, h = helper.outerHeight() - self.sizeDiff.height; + + if (self._helper && !o.animate && (/relative/).test(ce.css('position'))) + $(this).css({ left: ho.left - cop.left - co.left, width: w, height: h }); + + if (self._helper && !o.animate && (/static/).test(ce.css('position'))) + $(this).css({ left: ho.left - cop.left - co.left, width: w, height: h }); + + } +}); + +$.ui.plugin.add("resizable", "ghost", { + + start: function(event, ui) { + + var self = $(this).data("resizable"), o = self.options, cs = self.size; + + self.ghost = self.originalElement.clone(); + self.ghost + .css({ opacity: .25, display: 'block', position: 'relative', height: cs.height, width: cs.width, margin: 0, left: 0, top: 0 }) + .addClass('ui-resizable-ghost') + .addClass(typeof o.ghost == 'string' ? o.ghost : ''); + + self.ghost.appendTo(self.helper); + + }, + + resize: function(event, ui){ + var self = $(this).data("resizable"), o = self.options; + if (self.ghost) self.ghost.css({ position: 'relative', height: self.size.height, width: self.size.width }); + }, + + stop: function(event, ui){ + var self = $(this).data("resizable"), o = self.options; + if (self.ghost && self.helper) self.helper.get(0).removeChild(self.ghost.get(0)); + } + +}); + +$.ui.plugin.add("resizable", "grid", { + + resize: function(event, ui) { + var self = $(this).data("resizable"), o = self.options, cs = self.size, os = self.originalSize, op = self.originalPosition, a = self.axis, ratio = o._aspectRatio || event.shiftKey; + o.grid = typeof o.grid == "number" ? [o.grid, o.grid] : o.grid; + var ox = Math.round((cs.width - os.width) / (o.grid[0]||1)) * (o.grid[0]||1), oy = Math.round((cs.height - os.height) / (o.grid[1]||1)) * (o.grid[1]||1); + + if (/^(se|s|e)$/.test(a)) { + self.size.width = os.width + ox; + self.size.height = os.height + oy; + } + else if (/^(ne)$/.test(a)) { + self.size.width = os.width + ox; + self.size.height = os.height + oy; + self.position.top = op.top - oy; + } + else if (/^(sw)$/.test(a)) { + self.size.width = os.width + ox; + self.size.height = os.height + oy; + self.position.left = op.left - ox; + } + else { + self.size.width = os.width + ox; + self.size.height = os.height + oy; + self.position.top = op.top - oy; + self.position.left = op.left - ox; + } + } + +}); + +var num = function(v) { + return parseInt(v, 10) || 0; +}; + +var isNumber = function(value) { + return !isNaN(parseInt(value, 10)); +}; + +})(jQuery); diff --git a/jquery/jquery.ui-1.8.18.widget.js b/jquery/jquery.ui-1.8.18.widget.js new file mode 100644 index 0000000..0c6f53f --- /dev/null +++ b/jquery/jquery.ui-1.8.18.widget.js @@ -0,0 +1,272 @@ +/*! + * jQuery UI Widget 1.8.18 + * + * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Widget + */ +(function( $, undefined ) { + +// jQuery 1.4+ +if ( $.cleanData ) { + var _cleanData = $.cleanData; + $.cleanData = function( elems ) { + for ( var i = 0, elem; (elem = elems[i]) != null; i++ ) { + try { + $( elem ).triggerHandler( "remove" ); + // http://bugs.jquery.com/ticket/8235 + } catch( e ) {} + } + _cleanData( elems ); + }; +} else { + var _remove = $.fn.remove; + $.fn.remove = function( selector, keepData ) { + return this.each(function() { + if ( !keepData ) { + if ( !selector || $.filter( selector, [ this ] ).length ) { + $( "*", this ).add( [ this ] ).each(function() { + try { + $( this ).triggerHandler( "remove" ); + // http://bugs.jquery.com/ticket/8235 + } catch( e ) {} + }); + } + } + return _remove.call( $(this), selector, keepData ); + }); + }; +} + +$.widget = function( name, base, prototype ) { + var namespace = name.split( "." )[ 0 ], + fullName; + name = name.split( "." )[ 1 ]; + fullName = namespace + "-" + name; + + if ( !prototype ) { + prototype = base; + base = $.Widget; + } + + // create selector for plugin + $.expr[ ":" ][ fullName ] = function( elem ) { + return !!$.data( elem, name ); + }; + + $[ namespace ] = $[ namespace ] || {}; + $[ namespace ][ name ] = function( options, element ) { + // allow instantiation without initializing for simple inheritance + if ( arguments.length ) { + this._createWidget( options, element ); + } + }; + + var basePrototype = new base(); + // we need to make the options hash a property directly on the new instance + // otherwise we'll modify the options hash on the prototype that we're + // inheriting from +// $.each( basePrototype, function( key, val ) { +// if ( $.isPlainObject(val) ) { +// basePrototype[ key ] = $.extend( {}, val ); +// } +// }); + basePrototype.options = $.extend( true, {}, basePrototype.options ); + $[ namespace ][ name ].prototype = $.extend( true, basePrototype, { + namespace: namespace, + widgetName: name, + widgetEventPrefix: $[ namespace ][ name ].prototype.widgetEventPrefix || name, + widgetBaseClass: fullName + }, prototype ); + + $.widget.bridge( name, $[ namespace ][ name ] ); +}; + +$.widget.bridge = function( name, object ) { + $.fn[ name ] = function( options ) { + var isMethodCall = typeof options === "string", + args = Array.prototype.slice.call( arguments, 1 ), + returnValue = this; + + // allow multiple hashes to be passed on init + options = !isMethodCall && args.length ? + $.extend.apply( null, [ true, options ].concat(args) ) : + options; + + // prevent calls to internal methods + if ( isMethodCall && options.charAt( 0 ) === "_" ) { + return returnValue; + } + + if ( isMethodCall ) { + this.each(function() { + var instance = $.data( this, name ), + methodValue = instance && $.isFunction( instance[options] ) ? + instance[ options ].apply( instance, args ) : + instance; + // TODO: add this back in 1.9 and use $.error() (see #5972) +// if ( !instance ) { +// throw "cannot call methods on " + name + " prior to initialization; " + +// "attempted to call method '" + options + "'"; +// } +// if ( !$.isFunction( instance[options] ) ) { +// throw "no such method '" + options + "' for " + name + " widget instance"; +// } +// var methodValue = instance[ options ].apply( instance, args ); + if ( methodValue !== instance && methodValue !== undefined ) { + returnValue = methodValue; + return false; + } + }); + } else { + this.each(function() { + var instance = $.data( this, name ); + if ( instance ) { + instance.option( options || {} )._init(); + } else { + $.data( this, name, new object( options, this ) ); + } + }); + } + + return returnValue; + }; +}; + +$.Widget = function( options, element ) { + // allow instantiation without initializing for simple inheritance + if ( arguments.length ) { + this._createWidget( options, element ); + } +}; + +$.Widget.prototype = { + widgetName: "widget", + widgetEventPrefix: "", + options: { + disabled: false + }, + _createWidget: function( options, element ) { + // $.widget.bridge stores the plugin instance, but we do it anyway + // so that it's stored even before the _create function runs + $.data( element, this.widgetName, this ); + this.element = $( element ); + this.options = $.extend( true, {}, + this.options, + this._getCreateOptions(), + options ); + + var self = this; + this.element.bind( "remove." + this.widgetName, function() { + self.destroy(); + }); + + this._create(); + this._trigger( "create" ); + this._init(); + }, + _getCreateOptions: function() { + return $.metadata && $.metadata.get( this.element[0] )[ this.widgetName ]; + }, + _create: function() {}, + _init: function() {}, + + destroy: function() { + this.element + .unbind( "." + this.widgetName ) + .removeData( this.widgetName ); + this.widget() + .unbind( "." + this.widgetName ) + .removeAttr( "aria-disabled" ) + .removeClass( + this.widgetBaseClass + "-disabled " + + "ui-state-disabled" ); + }, + + widget: function() { + return this.element; + }, + + option: function( key, value ) { + var options = key; + + if ( arguments.length === 0 ) { + // don't return a reference to the internal hash + return $.extend( {}, this.options ); + } + + if (typeof key === "string" ) { + if ( value === undefined ) { + return this.options[ key ]; + } + options = {}; + options[ key ] = value; + } + + this._setOptions( options ); + + return this; + }, + _setOptions: function( options ) { + var self = this; + $.each( options, function( key, value ) { + self._setOption( key, value ); + }); + + return this; + }, + _setOption: function( key, value ) { + this.options[ key ] = value; + + if ( key === "disabled" ) { + this.widget() + [ value ? "addClass" : "removeClass"]( + this.widgetBaseClass + "-disabled" + " " + + "ui-state-disabled" ) + .attr( "aria-disabled", value ); + } + + return this; + }, + + enable: function() { + return this._setOption( "disabled", false ); + }, + disable: function() { + return this._setOption( "disabled", true ); + }, + + _trigger: function( type, event, data ) { + var prop, orig, + callback = this.options[ type ]; + + data = data || {}; + event = $.Event( event ); + event.type = ( type === this.widgetEventPrefix ? + type : + this.widgetEventPrefix + type ).toLowerCase(); + // the original event may come from any element + // so we need to reset the target on the new event + event.target = this.element[ 0 ]; + + // copy original event properties over to the new event + orig = event.originalEvent; + if ( orig ) { + for ( prop in orig ) { + if ( !( prop in event ) ) { + event[ prop ] = orig[ prop ]; + } + } + } + + this.element.trigger( event, data ); + + return !( $.isFunction(callback) && + callback.call( this.element[0], event, data ) === false || + event.isDefaultPrevented() ); + } +}; + +})( jQuery ); diff --git a/jquery/split_jquery.pl b/jquery/split_jquery.pl new file mode 100644 index 0000000..3edc763 --- /dev/null +++ b/jquery/split_jquery.pl @@ -0,0 +1,25 @@ +# script to split file into parts of roughly 32kb +#!/bin/perl +my $file = shift; +my $target = shift; +my $count = 1; +my $len = 0; +$target=~/p(\d+).js/; +my $part = $1; +open(F,"<$file") || die ("cannot open file for reading: $!"); +open(G,">$target") || die("cannot open file for writing: $!"); +while () +{ + if ($part==$count) + { + print G "$_"; + } + $len+=length($_); + if ($len>32768) + { + $len=0; + $count++; + } +} +close(F); +close(G); diff --git a/qtools/Doxyfile b/qtools/Doxyfile index e194967..aa8de17 100644 --- a/qtools/Doxyfile +++ b/qtools/Doxyfile @@ -44,7 +44,6 @@ SUBGROUPING = YES INLINE_GROUPED_CLASSES = NO INLINE_SIMPLE_STRUCTS = NO TYPEDEF_HIDES_STRUCT = NO -SYMBOL_CACHE_SIZE = 0 LOOKUP_CACHE_SIZE = 0 #--------------------------------------------------------------------------- # Build related configuration options @@ -120,7 +119,7 @@ USE_MDFILE_AS_MAINPAGE = # configuration options related to source browsing #--------------------------------------------------------------------------- SOURCE_BROWSER = YES -INLINE_SOURCES = YES +INLINE_SOURCES = NO STRIP_CODE_COMMENTS = YES REFERENCED_BY_RELATION = YES REFERENCES_RELATION = YES @@ -187,9 +186,9 @@ MATHJAX_RELPATH = http://cdn.mathjax.org/mathjax/latest MATHJAX_EXTENSIONS = MATHJAX_CODEFILE = SEARCHENGINE = YES -SERVER_BASED_SEARCH = NO -EXTERNAL_SEARCH = NO -SEARCHENGINE_URL = +SERVER_BASED_SEARCH = YES +EXTERNAL_SEARCH = YES +SEARCHENGINE_URL = http://macbookpro/~dimitri/doxysearch.cgi SEARCHDATA_FILE = searchdata.xml EXTERNAL_SEARCH_ID = EXTRA_SEARCH_MAPPINGS = diff --git a/src/cite.cpp b/src/cite.cpp index d4860c8..576c4bf 100644 --- a/src/cite.cpp +++ b/src/cite.cpp @@ -138,7 +138,7 @@ void CiteDict::generatePage() const f.setName(citeListFile); if (!f.open(IO_WriteOnly)) { - err("error: could not open file %s for writing\n",citeListFile.data()); + err("could not open file %s for writing\n",citeListFile.data()); } FTextStream t(&f); t << "" << endl; @@ -161,7 +161,7 @@ void CiteDict::generatePage() const QCString bib2xhtml = bib2xhtml_pl; if (!f.open(IO_WriteOnly)) { - err("error: could not open file %s for writing\n",bib2xhtmlFile.data()); + err("could not open file %s for writing\n",bib2xhtmlFile.data()); } f.writeBlock(bib2xhtml, bib2xhtml.length()); f.close(); @@ -172,7 +172,7 @@ void CiteDict::generatePage() const f.setName(doxygenBstFile); if (!f.open(IO_WriteOnly)) { - err("error: could not open file %s for writing\n",doxygenBstFile.data()); + err("could not open file %s for writing\n",doxygenBstFile.data()); } f.writeBlock(bstData, bstData.length()); f.close(); @@ -206,7 +206,7 @@ void CiteDict::generatePage() const } else if (!fi.exists()) { - err("Error: bib file %s not found!\n",bibFile.data()); + err("bib file %s not found!\n",bibFile.data()); } bibdata = citeDataList.next(); } @@ -226,7 +226,7 @@ void CiteDict::generatePage() const f.setName(citeListFile); if (!f.open(IO_ReadOnly)) { - err("error: could not open file %s/citelist.doc for reading\n",outputDir.data()); + err("could not open file %s/citelist.doc for reading\n",outputDir.data()); } bool insideBib=FALSE; @@ -293,7 +293,7 @@ void CiteDict::generatePage() const } else { - err("Error: bib file %s not found!\n",bibFile.data()); + err("bib file %s not found!\n",bibFile.data()); } bibdata = citeDataList.next(); } diff --git a/src/clangparser.cpp b/src/clangparser.cpp index 08ad05d..d35f5da 100644 --- a/src/clangparser.cpp +++ b/src/clangparser.cpp @@ -8,7 +8,7 @@ #include #include "message.h" #include "sortdict.h" -#include "outputlist.h" +#include "outputgen.h" #include "filedef.h" #include "memberdef.h" #include "doxygen.h" @@ -17,6 +17,13 @@ #include "growbuf.h" #include "membername.h" #include "filename.h" + +static Definition *g_currentDefinition=0; +static MemberDef *g_currentMemberDef=0; +static uint g_currentLine=0; +static bool g_searchForBody=FALSE; +static bool g_insideBody=FALSE; +static uint g_bracketCount=0; #endif ClangParser *ClangParser::instance() @@ -33,6 +40,9 @@ ClangParser *ClangParser::s_instance = 0; class ClangParser::Private { public: + Private() : tu(0), tokens(0), numTokens(0), cursors(0), + ufs(0), sources(0), numFiles(0), fileMapping(257) + { fileMapping.setAutoDelete(TRUE); } int getCurrentTokenLine(); CXIndex index; CXTranslationUnit tu; @@ -42,8 +52,10 @@ class ClangParser::Private CXCursor *cursors; uint curLine; uint curToken; - CXUnsavedFile uf; - QCString source; + CXUnsavedFile *ufs; + QCString *sources; + uint numFiles; + QDict fileMapping; }; static QCString detab(const QCString &s) @@ -122,20 +134,46 @@ static QStrList getClangOptions() return options; } -#if 0 +/** Callback function called for each include in a translation unit */ static void inclusionVisitor(CXFile includedFile, - CXSourceLocation* inclusionStack, - unsigned includeLen, + CXSourceLocation* /*inclusionStack*/, + unsigned /*includeLen*/, CXClientData clientData) { - const char *fileName = (const char *)clientData; + QDict *fileDict = (QDict *)clientData; CXString incFileName = clang_getFileName(includedFile); - printf("--- file %s includes %s\n",fileName,clang_getCString(incFileName)); + //printf("--- file %s includes %s\n",fileName,clang_getCString(incFileName)); + fileDict->insert(clang_getCString(incFileName),(void*)0x8); clang_disposeString(incFileName); } -#endif -void ClangParser::start(const char *fileName) +/** filter the \a files and only keep those that are found as include files + * within the current translation unit. + * @param[in,out] files The list of files to filter. + */ +void ClangParser::determineInputFilesInSameTu(QStrList &files) +{ + // put the files in this translation unit in a dictionary + QDict incFound(257); + clang_getInclusions(p->tu, + inclusionVisitor, + (CXClientData)&incFound + ); + // create a new filtered file list + QStrList resultIncludes; + QStrListIterator it2(files); + for (it2.toFirst();it2.current();++it2) + { + if (incFound.find(it2.current())) + { + resultIncludes.append(it2.current()); + } + } + // replace the original list + files=resultIncludes; +} + +void ClangParser::start(const char *fileName,QStrList &filesInTranslationUnit) { static bool clangAssistedParsing = Config_getBool("CLANG_ASSISTED_PARSING"); static QStrList &includePath = Config_getList("INCLUDE_PATH"); @@ -146,7 +184,7 @@ void ClangParser::start(const char *fileName) p->index = clang_createIndex(0, 0); p->curLine = 1; p->curToken = 0; - char *argv[4+Doxygen::inputPaths.count()+includePath.count()+clangOptions.count()]; + char **argv = (char**)malloc(sizeof(char*)*(4+Doxygen::inputPaths.count()+includePath.count()+clangOptions.count())); QDictIterator di(Doxygen::inputPaths); int argc=0; // add include paths for input files @@ -171,44 +209,70 @@ void ClangParser::start(const char *fileName) argv[argc++]=strdup("-ferror-limit=0"); argv[argc++]=strdup("-x"); // force C++ argv[argc++]=strdup("c++"); - // the file name + + // provide the input and and its dependencies as unsaved files so we can + // pass the filtered versions argv[argc++]=strdup(fileName); static bool filterSourceFiles = Config_getBool("FILTER_SOURCE_FILES"); - p->source = detab(fileToString(fileName,filterSourceFiles,TRUE)); //printf("source %s ----------\n%s\n-------------\n\n", // fileName,p->source.data()); - p->uf.Filename = strdup(fileName); - p->uf.Contents = p->source.data(); - p->uf.Length = p->source.length(); + uint numUnsavedFiles = filesInTranslationUnit.count()+1; + p->numFiles = numUnsavedFiles; + p->sources = new QCString[numUnsavedFiles]; + p->ufs = new CXUnsavedFile[numUnsavedFiles]; + p->sources[0] = detab(fileToString(fileName,filterSourceFiles,TRUE)); + p->ufs[0].Filename = strdup(fileName); + p->ufs[0].Contents = p->sources[0].data(); + p->ufs[0].Length = p->sources[0].length(); + QStrListIterator it(filesInTranslationUnit); + uint i=1; + for (it.toFirst();it.current() && ifileMapping.insert(it.current(),new uint(i)); + p->sources[i] = detab(fileToString(it.current(),filterSourceFiles,TRUE)); + p->ufs[i].Filename = strdup(it.current()); + p->ufs[i].Contents = p->sources[i].data(); + p->ufs[i].Length = p->sources[i].length(); + } + + // let libclang do the actual parsing p->tu = clang_parseTranslationUnit(p->index, 0, - argv, argc, &p->uf, 1, + argv, argc, p->ufs, numUnsavedFiles, CXTranslationUnit_DetailedPreprocessingRecord); + // free arguments for (int i=0;itu) { - //clang_getInclusions(p->tu, - // inclusionVisitor, - // (CXClientData)fileName - // ); + // filter out any includes not found by the clang parser + determineInputFilesInSameTu(filesInTranslationUnit); + + // show any warnings that the compiler produced for (uint i=0, n=clang_getNumDiagnostics(p->tu); i!=n; ++i) { CXDiagnostic diag = clang_getDiagnostic(p->tu, i); CXString string = clang_formatDiagnostic(diag, clang_defaultDiagnosticDisplayOptions()); - err("%s\n",clang_getCString(string)); + err("%s [clang]\n",clang_getCString(string)); clang_disposeString(string); + clang_disposeDiagnostic(diag); } + + // create a source range for the given file QFileInfo fi(fileName); CXFile f = clang_getFile(p->tu, fileName); CXSourceLocation fileBegin = clang_getLocationForOffset(p->tu, f, 0); - CXSourceLocation fileEnd = clang_getLocationForOffset(p->tu, f, p->uf.Length); + CXSourceLocation fileEnd = clang_getLocationForOffset(p->tu, f, p->ufs[0].Length); CXSourceRange fileRange = clang_getRange(fileBegin, fileEnd); + // produce a token stream for the file clang_tokenize(p->tu,fileRange,&p->tokens,&p->numTokens); + + // produce cursors for each token in the stream p->cursors=new CXCursor[p->numTokens]; clang_annotateTokens(p->tu,p->tokens,p->numTokens,p->cursors); } @@ -217,7 +281,42 @@ void ClangParser::start(const char *fileName) p->tokens = 0; p->numTokens = 0; p->cursors = 0; - err("Failed to parse translation unit %s\n",fileName); + err("clang: Failed to parse translation unit %s\n",fileName); + } +} + +void ClangParser::switchToFile(const char *fileName) +{ + if (p->tu) + { + delete[] p->cursors; + clang_disposeTokens(p->tu,p->tokens,p->numTokens); + p->tokens = 0; + p->numTokens = 0; + p->cursors = 0; + + QFileInfo fi(fileName); + CXFile f = clang_getFile(p->tu, fileName); + uint *pIndex=p->fileMapping.find(fileName); + if (pIndex && *pIndexnumFiles) + { + uint i=*pIndex; + //printf("switchToFile %s: len=%ld\n",fileName,p->ufs[i].Length); + CXSourceLocation fileBegin = clang_getLocationForOffset(p->tu, f, 0); + CXSourceLocation fileEnd = clang_getLocationForOffset(p->tu, f, p->ufs[i].Length); + CXSourceRange fileRange = clang_getRange(fileBegin, fileEnd); + + clang_tokenize(p->tu,fileRange,&p->tokens,&p->numTokens); + p->cursors=new CXCursor[p->numTokens]; + clang_annotateTokens(p->tu,p->tokens,p->numTokens,p->cursors); + + p->curLine = 1; + p->curToken = 0; + } + else + { + err("clang: Failed to find input file %s in mapping\n",fileName); + } } } @@ -225,19 +324,28 @@ void ClangParser::finish() { static bool clangAssistedParsing = Config_getBool("CLANG_ASSISTED_PARSING"); if (!clangAssistedParsing) return; - //printf("ClangParser::finish()\n"); - delete[] p->cursors; - clang_disposeTokens(p->tu,p->tokens,p->numTokens); - clang_disposeTranslationUnit(p->tu); - clang_disposeIndex(p->index); - free((void *)p->uf.Filename); - p->source.resize(0); - p->uf.Contents = 0; - p->uf.Filename = 0; - p->uf.Contents = 0; - p->tokens = 0; - p->numTokens = 0; - p->cursors = 0; + if (p->tu) + { + //printf("ClangParser::finish()\n"); + delete[] p->cursors; + clang_disposeTokens(p->tu,p->tokens,p->numTokens); + clang_disposeTranslationUnit(p->tu); + clang_disposeIndex(p->index); + p->fileMapping.clear(); + p->tokens = 0; + p->numTokens = 0; + p->cursors = 0; + } + for (uint i=0;inumFiles;i++) + { + free((void *)p->ufs[i].Filename); + } + delete[] p->ufs; + delete[] p->sources; + p->ufs = 0; + p->sources = 0; + p->numFiles = 0; + p->tu = 0; } int ClangParser::Private::getCurrentTokenLine() @@ -251,9 +359,6 @@ int ClangParser::Private::getCurrentTokenLine() return l; } -/** Looks for \a symbol which should be found at \a line and returns - * a Clang unique identifier for the symbol. - */ QCString ClangParser::lookup(uint line,const char *symbol) { //printf("ClangParser::lookup(%d,%s)\n",line,symbol); @@ -405,14 +510,23 @@ static QCString keywordToType(const char *keyword) return "keyword"; } -static void writeLineNumber(OutputList &ol,FileDef *fd,uint line) +static void writeLineNumber(CodeOutputInterface &ol,FileDef *fd,uint line) { Definition *d = fd ? fd->getSourceDefinition(line) : 0; if (d && d->isLinkable()) { + g_currentDefinition=d; + g_currentLine=line; MemberDef *md = fd->getSourceMember(line); if (md && md->isLinkable()) // link to member { + if (g_currentMemberDef!=md) // new member, start search for body + { + g_searchForBody=TRUE; + g_insideBody=FALSE; + g_bracketCount=0; + } + g_currentMemberDef=md; ol.writeLineNumber(md->getReference(), md->getOutputFileBase(), md->anchor(), @@ -420,6 +534,7 @@ static void writeLineNumber(OutputList &ol,FileDef *fd,uint line) } else // link to compound { + g_currentMemberDef=0; ol.writeLineNumber(d->getReference(), d->getOutputFileBase(), d->anchor(), @@ -430,9 +545,19 @@ static void writeLineNumber(OutputList &ol,FileDef *fd,uint line) { ol.writeLineNumber(0,0,0,line); } + + // set search page target + if (Doxygen::searchIndex) + { + QCString lineAnchor; + lineAnchor.sprintf("l%05d",line); + ol.setCurrentDoc(fd,lineAnchor,TRUE); + } + + //printf("writeLineNumber(%d) g_searchForBody=%d\n",line,g_searchForBody); } -static void codifyLines(OutputList &ol,FileDef *fd,const char *text, +static void codifyLines(CodeOutputInterface &ol,FileDef *fd,const char *text, uint &line,uint &column,const char *fontClass=0) { if (fontClass) ol.startFontClass(fontClass); @@ -468,7 +593,7 @@ static void codifyLines(OutputList &ol,FileDef *fd,const char *text, if (fontClass) ol.endFontClass(); } -static void writeMultiLineCodeLink(OutputList &ol, +static void writeMultiLineCodeLink(CodeOutputInterface &ol, FileDef *fd,uint &line,uint &column, const char *ref,const char *file, const char *anchor,const char *text, @@ -500,23 +625,26 @@ static void writeMultiLineCodeLink(OutputList &ol, } } -void ClangParser::linkInclude(OutputList &ol,FileDef *fd, +void ClangParser::linkInclude(CodeOutputInterface &ol,FileDef *fd, uint &line,uint &column,const char *text) { QCString incName = text; incName = incName.mid(1,incName.length()-2); // strip ".." or <..> FileDef *ifd=0; - FileName *fn = Doxygen::inputNameDict->find(incName); - if (fn) + if (!incName.isEmpty()) { - bool found=false; - FileNameIterator fni(*fn); - // for each include name - for (fni.toFirst();!found && (ifd=fni.current());++fni) + FileName *fn = Doxygen::inputNameDict->find(incName); + if (fn) { - // see if this source file actually includes the file - found = fd->isIncluded(ifd->absFilePath()); - //printf(" include file %s found=%d\n",ifd->absFilePath().data(),found); + bool found=false; + FileNameIterator fni(*fn); + // for each include name + for (fni.toFirst();!found && (ifd=fni.current());++fni) + { + // see if this source file actually includes the file + found = fd->isIncluded(ifd->absFilePath()); + //printf(" include file %s found=%d\n",ifd->absFilePath().data(),found); + } } } if (ifd) @@ -529,7 +657,7 @@ void ClangParser::linkInclude(OutputList &ol,FileDef *fd, } } -void ClangParser::linkMacro(OutputList &ol,FileDef *fd, +void ClangParser::linkMacro(CodeOutputInterface &ol,FileDef *fd, uint &line,uint &column,const char *text) { MemberName *mn=Doxygen::functionNameSDict->find(text); @@ -556,7 +684,8 @@ void ClangParser::linkMacro(OutputList &ol,FileDef *fd, codifyLines(ol,fd,text,line,column); } -void ClangParser::linkIdentifier(OutputList &ol,FileDef *fd, + +void ClangParser::linkIdentifier(CodeOutputInterface &ol,FileDef *fd, uint &line,uint &column,const char *text,int tokenIndex) { CXCursor c = p->cursors[tokenIndex]; @@ -587,6 +716,12 @@ void ClangParser::linkIdentifier(OutputList &ol,FileDef *fd, //} if (d && d->isLinkable()) { + if (g_insideBody && + g_currentMemberDef && d->definitionType()==Definition::TypeMember && + (g_currentMemberDef!=d || g_currentLinegetReference(), @@ -603,8 +738,46 @@ void ClangParser::linkIdentifier(OutputList &ol,FileDef *fd, clang_disposeString(usr); } -void ClangParser::writeSources(OutputList &ol,FileDef *fd) +static void detectFunctionBody(const char *s) +{ + //printf("punct=%s g_searchForBody=%d g_insideBody=%d g_bracketCount=%d\n", + // s,g_searchForBody,g_insideBody,g_bracketCount); + + if (g_searchForBody && (qstrcmp(s,":")==0 || qstrcmp(s,"{")==0)) // start of 'body' (: is for constructor) + { + g_searchForBody=FALSE; + g_insideBody=TRUE; + } + else if (g_searchForBody && qstrcmp(s,";")==0) // declaration only + { + g_searchForBody=FALSE; + g_insideBody=FALSE; + } + if (g_insideBody && qstrcmp(s,"{")==0) // increase scoping level + { + g_bracketCount++; + } + if (g_insideBody && qstrcmp(s,"}")==0) // decrease scoping level + { + g_bracketCount--; + if (g_bracketCount<=0) // got outside of function body + { + g_insideBody=FALSE; + g_bracketCount=0; + } + } +} + +void ClangParser::writeSources(CodeOutputInterface &ol,FileDef *fd) { + // (re)set global parser state + g_currentDefinition=0; + g_currentMemberDef=0; + g_currentLine=0; + g_searchForBody=FALSE; + g_insideBody=FALSE; + g_bracketCount=0; + unsigned int line=1,column=1; QCString lineNumber,lineAnchor; ol.startCodeLine(TRUE); @@ -659,9 +832,12 @@ void ClangParser::writeSources(OutputList &ol,FileDef *fd) case CXToken_Comment: codifyLines(ol,fd,s,line,column,"comment"); break; - //case CXToken_Punctuation: return "CXToken_Punctation"; - //case CXToken_Identifier: return "CXToken_Indentifier"; - default: + default: // CXToken_Punctuation or CXToken_Identifier + if (tokenKind==CXToken_Punctuation) + { + detectFunctionBody(s); + //printf("punct %s: %d\n",s,cursorKind); + } switch (cursorKind) { case CXCursor_PreprocessingDirective: @@ -677,9 +853,20 @@ void ClangParser::writeSources(OutputList &ol,FileDef *fd) linkMacro(ol,fd,line,column,s); break; default: - if (tokenKind==CXToken_Identifier) + if (tokenKind==CXToken_Identifier || + (tokenKind==CXToken_Punctuation && // for operators + (cursorKind==CXCursor_DeclRefExpr || + cursorKind==CXCursor_MemberRefExpr || + cursorKind==CXCursor_CallExpr || + cursorKind==CXCursor_ObjCMessageExpr) + ) + ) { linkIdentifier(ol,fd,line,column,s,i); + if (Doxygen::searchIndex) + { + ol.addWord(s,FALSE); + } } else { @@ -706,7 +893,11 @@ ClangParser::~ClangParser() //-------------------------------------------------------------------------- #else // use stubbed functionality in case libclang support is disabled. -void ClangParser::start(const char *) +void ClangParser::start(const char *,QStrList &) +{ +} + +void ClangParser::switchToFile(const char *) { } @@ -719,7 +910,7 @@ QCString ClangParser::lookup(uint,const char *) return ""; } -void ClangParser::writeSources(OutputList &,FileDef *) +void ClangParser::writeSources(CodeOutputInterface &,FileDef *) { } diff --git a/src/clangparser.h b/src/clangparser.h index fc56b3a..214ea50 100644 --- a/src/clangparser.h +++ b/src/clangparser.h @@ -2,29 +2,61 @@ #define CLANGPARSER_H #include +#include -class OutputList; +class CodeOutputInterface; class FileDef; +/** @brief Wrapper for to let libclang assisted parsing. */ class ClangParser { public: + /** Returns the one and only instance of the class */ static ClangParser *instance(); - void start(const char *fileName); + + /** Start parsing a file. + * @param[in] fileName The name of the file to parse. + * @param[in,out] filesInTanslationUnit Other files that are + * part of the input and included by the file. + * The function will return a subset of the files, + * only including the onces that were actually found + * during parsing. + */ + void start(const char *fileName,QStrList &filesInTranslationUnit); + + /** Switches to another file within the translation unit started + * with start(). + * @param[in] The name of the file to switch to. + */ + void switchToFile(const char *fileName); + + /** Finishes parsing a translation unit. Free any resources that + * were needed for parsing. + */ void finish(); + + /** Looks for \a symbol which should be found at \a line and + * returns a clang unique reference to the symbol. + */ QCString lookup(uint line,const char *symbol); - void writeSources(OutputList &ol,FileDef *fd); + + /** writes the syntax highlighted source code for a file + * @param[out] ol The output generator list to write to. + * @param[in] fd The file to write sources for. + */ + void writeSources(CodeOutputInterface &ol,FileDef *fd); private: - void linkIdentifier(OutputList &ol,FileDef *fd, + void linkIdentifier(CodeOutputInterface &ol,FileDef *fd, uint &line,uint &column, const char *text,int tokenIndex); - void linkMacro(OutputList &ol,FileDef *fd, + void linkMacro(CodeOutputInterface &ol,FileDef *fd, uint &line,uint &column, const char *text); - void linkInclude(OutputList &ol,FileDef *fd, + void linkInclude(CodeOutputInterface &ol,FileDef *fd, uint &line,uint &column, const char *text); + void determineInputFilesInSameTu(QStrList &filesInTranslationUnit); class Private; Private *p; ClangParser(); diff --git a/src/classdef.cpp b/src/classdef.cpp index dd32918..1429fdd 100644 --- a/src/classdef.cpp +++ b/src/classdef.cpp @@ -921,8 +921,8 @@ void ClassDef::writeBriefDescription(OutputList &ol,bool exampleFlag) if (!briefDescription().isEmpty() && Config_getBool("BRIEF_MEMBER_DESC")) { ol.startParagraph(); - ol.parseDoc(briefFile(),briefLine(),this,0, - briefDescription(),TRUE,FALSE,0,TRUE,FALSE); + ol.generateDoc(briefFile(),briefLine(),this,0, + briefDescription(),TRUE,FALSE,0,TRUE,FALSE); ol.pushGeneratorState(); ol.disable(OutputGenerator::RTF); ol.writeString(" \n"); @@ -956,7 +956,7 @@ void ClassDef::writeDetailedDocumentationBody(OutputList &ol) // repeat brief description if (!briefDescription().isEmpty() && repeatBrief) { - ol.parseDoc(briefFile(),briefLine(),this,0,briefDescription(),FALSE,FALSE); + ol.generateDoc(briefFile(),briefLine(),this,0,briefDescription(),FALSE,FALSE); } if (!briefDescription().isEmpty() && repeatBrief && !documentation().isEmpty()) @@ -969,7 +969,7 @@ void ClassDef::writeDetailedDocumentationBody(OutputList &ol) // write documentation if (!documentation().isEmpty()) { - ol.parseDoc(docFile(),docLine(),this,0,documentation(),TRUE,FALSE); + ol.generateDoc(docFile(),docLine(),this,0,documentation(),TRUE,FALSE); } // write type constraints writeTypeConstraints(ol,this,m_impl->typeConstraints); @@ -1249,7 +1249,7 @@ void ClassDef::writeInheritanceGraph(OutputList &ol) } else { - err("error: invalid marker %d in inherits list!\n",entryIndex); + err("invalid marker %d in inherits list!\n",entryIndex); } index=newIndex+matchLen; } @@ -1558,6 +1558,11 @@ void ClassDef::writeTagFileMarker() { Doxygen::tagFile << " " << convertToXML(anchor()) << "" << endl; } + QCString idStr = id(); + if (!idStr.isEmpty()) + { + Doxygen::tagFile << " " << convertToXML(idStr) << "" << endl; + } if (m_impl->tempArgs) { ArgumentListIterator ali(*m_impl->tempArgs); @@ -1812,14 +1817,19 @@ void ClassDef::writeDeclarationLink(OutputList &ol,bool &found,const char *heade // add the brief description if available if (!briefDescription().isEmpty() && Config_getBool("BRIEF_MEMBER_DESC")) { - ol.startMemberDescription(anchor()); - ol.parseDoc(briefFile(),briefLine(),this,0, - briefDescription(),FALSE,FALSE,0,TRUE,FALSE); - if (isLinkableInProject()) + DocRoot *rootNode = validatingParseDoc(briefFile(),briefLine(),this,0, + briefDescription(),FALSE,FALSE,0,TRUE,FALSE); + if (rootNode && !rootNode->isEmpty()) { - writeMoreLink(ol,anchor()); + ol.startMemberDescription(anchor()); + ol.writeDoc(rootNode,this,0); + if (isLinkableInProject()) + { + writeMoreLink(ol,anchor()); + } + ol.endMemberDescription(); } - ol.endMemberDescription(); + delete rootNode; } ol.endMemberDeclaration(anchor(),0); } @@ -2744,11 +2754,11 @@ void ClassDef::mergeMembers() if (srcCd==dstCd || dstCd->isBaseClass(srcCd,TRUE)) // member is in the same or a base class { - LockingPtr srcAl = srcMd->argumentList(); - LockingPtr dstAl = dstMd->argumentList(); + ArgumentList *srcAl = srcMd->argumentList(); + ArgumentList *dstAl = dstMd->argumentList(); found=matchArguments2( - srcMd->getOuterScope(),srcMd->getFileDef(),srcAl.pointer(), - dstMd->getOuterScope(),dstMd->getFileDef(),dstAl.pointer(), + srcMd->getOuterScope(),srcMd->getFileDef(),srcAl, + dstMd->getOuterScope(),dstMd->getFileDef(),dstAl, TRUE ); //printf(" Yes, matching (%s<->%s): %d\n", @@ -3772,8 +3782,8 @@ void ClassDef::addListReferences() if (!isLinkableInProject()) return; //printf("ClassDef(%s)::addListReferences()\n",name().data()); { - LockingPtr< QList > xrefItems = xrefListItems(); - addRefItem(xrefItems.pointer(), + QList *xrefItems = xrefListItems(); + addRefItem(xrefItems, qualifiedName(), lang==SrcLangExt_Fortran ? theTranslator->trType(TRUE,TRUE) : theTranslator->trClass(TRUE,TRUE), diff --git a/src/code.l b/src/code.l index 2026f0c..01636fa 100644 --- a/src/code.l +++ b/src/code.l @@ -417,7 +417,7 @@ static void popScope() } else { - //err("Error: Too many end of scopes found!\n"); + //err("Too many end of scopes found!\n"); } //printf("popScope() result: `%s'\n",g_classScope.data()); } @@ -656,7 +656,7 @@ static void addUsingDirective(const char *name) static void setParameterList(MemberDef *md) { g_classScope = md->getClassDef() ? md->getClassDef()->name().data() : ""; - LockingPtr al = md->argumentList(); + ArgumentList *al = md->argumentList(); if (al==0) return; Argument *a = al->first(); while (a) @@ -831,58 +831,6 @@ static void updateCallContextForSmartPointer() } } -static QCString fileLocation() -{ - QCString result = g_sourceFileDef?g_sourceFileDef->absFilePath():QCString("[unknown]"); - result+=":"+QCString().setNum(g_yyLineNr); - result+=":"+QCString().setNum(g_yyColNr); - return result; -} - -static void addDocCrossReference(MemberDef *src,MemberDef *dst) -{ - static bool referencedByRelation = Config_getBool("REFERENCED_BY_RELATION"); - static bool referencesRelation = Config_getBool("REFERENCES_RELATION"); - static bool callerGraph = Config_getBool("CALLER_GRAPH"); - static bool callGraph = Config_getBool("CALL_GRAPH"); - - //printf("--> addDocCrossReference src=%s,dst=%s\n",src->name().data(),dst->name().data()); - if (dst->isTypedef() || dst->isEnumerate()) return; // don't add types - if ((referencedByRelation || callerGraph || dst->hasCallerGraph()) && - (src->isFunction() || src->isSlot()) - ) - { - dst->addSourceReferencedBy(src,fileLocation()); - MemberDef *mdDef = dst->memberDefinition(); - if (mdDef) - { - mdDef->addSourceReferencedBy(src,fileLocation()); - } - MemberDef *mdDecl = dst->memberDeclaration(); - if (mdDecl) - { - mdDecl->addSourceReferencedBy(src,fileLocation()); - } - } - if ((referencesRelation || callGraph || src->hasCallGraph()) && - (src->isFunction() || src->isSlot()) - ) - { - src->addSourceReferences(dst,fileLocation()); - MemberDef *mdDef = src->memberDefinition(); - if (mdDef) - { - mdDef->addSourceReferences(dst,fileLocation()); - } - MemberDef *mdDecl = src->memberDeclaration(); - if (mdDecl) - { - mdDecl->addSourceReferences(dst,fileLocation()); - } - } - -} - static bool getLinkInScope(const QCString &c, // scope const QCString &m, // member const char *memberText, // exact text @@ -1805,7 +1753,7 @@ TEMPLIST "<"[^\"\}\{\(\)\/\n\>]*">" SCOPETNAME (((({ID}{TEMPLIST}?){BN}*)?{SEP}{BN}*)*)((~{BN}*)?{ID}) SCOPEPREFIX ({ID}{TEMPLIST}?{BN}*{SEP}{BN}*)+ KEYWORD_OBJC ("@public"|"@private"|"@protected"|"@class"|"@implementation"|"@interface"|"@end"|"@selector"|"@protocol"|"@optional"|"@required"|"@throw"|"@synthesize"|"@property") -KEYWORD ("asm"|"__assume"|"auto"|"class"|"const"|"delete"|"enum"|"explicit"|"extern"|"false"|"friend"|"gcnew"|"gcroot"|"get"|"inline"|"internal"|"mutable"|"namespace"|"new"|"nullptr"|"override"|"operator"|"pin_ptr"|"private"|"protected"|"public"|"raise"|"register"|"remove"|"self"|"sizeof"|"static"|"struct"|"__super"|"function"|"template"|"generic"|"this"|"true"|"typedef"|"typeid"|"typename"|"union"|"using"|"virtual"|"volatile"|"abstract"|"final"|"import"|"synchronized"|"transient"|{KEYWORD_OBJC}) +KEYWORD ("asm"|"__assume"|"auto"|"class"|"const"|"delete"|"enum"|"explicit"|"extern"|"false"|"friend"|"gcnew"|"gcroot"|"get"|"inline"|"internal"|"mutable"|"namespace"|"new"|"nullptr"|"override"|"operator"|"pin_ptr"|"private"|"protected"|"public"|"raise"|"register"|"remove"|"self"|"sizeof"|"static"|"struct"|"__super"|"function"|"template"|"generic"|"this"|"true"|"typedef"|"typeid"|"typename"|"union"|"using"|"virtual"|"volatile"|"abstract"|"final"|"import"|"synchronized"|"transient"|"alignas"|"alignof"|{KEYWORD_OBJC}) FLOWKW ("break"|"case"|"catch"|"continue"|"default"|"do"|"else"|"finally"|"for"|"foreach"|"for each"|"goto"|"if"|"return"|"switch"|"throw"|"throws"|"try"|"while"|"@try"|"@catch"|"@finally") TYPEKW ("bool"|"char"|"double"|"float"|"int"|"long"|"object"|"short"|"signed"|"unsigned"|"void"|"wchar_t"|"size_t"|"boolean"|"id"|"SEL"|"string"|"nullptr") CASTKW ("const_cast"|"dynamic_cast"|"reinterpret_cast"|"static_cast") @@ -1834,6 +1782,8 @@ RAWEND ")"[^ \t\(\)\\]{0,16}\" %x MemberCall2 %x SkipInits %x ClassName +%x AlignAs +%x AlignAsEnd %x PackageName %x ClassVar %x CppCliTypeModifierFollowup @@ -2146,9 +2096,42 @@ RAWEND ")"[^ \t\(\)\\]{0,16}\" {ID}("::"{ID})* { g_curClassName=yytext; addType(); - generateClassOrGlobalLink(*g_code,yytext); - BEGIN( ClassVar ); + if (g_curClassName=="alignas") + { + startFontClass("keyword"); + g_code->codify(yytext); + endFontClass(); + BEGIN( AlignAs ); + } + else + { + generateClassOrGlobalLink(*g_code,yytext); + BEGIN( ClassVar ); + } } +"(" { + g_bracketCount=1; + g_code->codify(yytext); + BEGIN( AlignAsEnd ); + } +\n { g_yyLineNr++; + codifyLines(yytext); + } +. { g_code->codify(yytext); } +"(" { g_code->codify(yytext); + g_bracketCount++; + } +")" { + g_code->codify(yytext); + if (--g_bracketCount<=0) + { + BEGIN(ClassName); + } + } +\n { g_yyLineNr++; + codifyLines(yytext); + } +. { g_code->codify(yytext); } {ID}("\\"{ID})* { // PHP namespace g_curClassName=substitute(yytext,"\\","::"); g_scopeStack.push(CLASSBLOCK); diff --git a/src/commentscan.l b/src/commentscan.l index 4ac850e..1644a6d 100644 --- a/src/commentscan.l +++ b/src/commentscan.l @@ -220,6 +220,7 @@ static DocCmdMap docCmdMap[] = { "copydoc", &handleCopyDoc, TRUE }, { "copybrief", 0, FALSE }, { "copydetails", 0, TRUE }, + { "copyright", 0, TRUE }, { "date", 0, TRUE }, { "dotfile", 0, TRUE }, { "htmlinclude", 0, FALSE }, @@ -294,7 +295,7 @@ class DocCmdMapper { if (m_map.find(p->cmdName)!=0) { - printf("Error: DocCmdMapper: command %s already added\n",p->cmdName); + err("DocCmdMapper: command %s already added\n",p->cmdName); exit(1); } Cmd *cmd = new Cmd; @@ -869,7 +870,7 @@ ATTR ({B}+[^>\n]*)? DOCNL "\n"|"\\_linebr" LC "\\"{B}*"\n" NW [^a-z_A-Z0-9] -FILESCHAR [a-z_A-Z0-9\x80-\xFF\\:\\\/\-\+] +FILESCHAR [a-z_A-Z0-9\x80-\xFF\\:\\\/\-\+@&#] FILEECHAR [a-z_A-Z0-9\x80-\xFF\-\+] FILE ({FILESCHAR}*{FILEECHAR}+("."{FILESCHAR}*{FILEECHAR}+)*)|("\""[^\n\"]*"\"") ID "$"?[a-z_A-Z\x80-\xFF][a-z_A-Z0-9\x80-\xFF]* @@ -1022,7 +1023,7 @@ RCSTAG "$"{ID}":"[^\n$]+"$" {B}*{CMD}"endinternal"{B}* { if (!inInternalDocs) warn(yyFileName,yyLineNr, - "warning: found \\endinternal without matching \\internal" + "found \\endinternal without matching \\internal" ); inInternalDocs = FALSE; } @@ -1284,7 +1285,7 @@ RCSTAG "$"{ID}":"[^\n$]+"$" } {DOCNL} { // missing argument warn(yyFileName,yyLineNr, - "warning: missing argument after \\enum." + "missing argument after \\enum." ); addOutput('\n'); if (*yytext=='\n') yyLineNr++; @@ -1305,7 +1306,7 @@ RCSTAG "$"{ID}":"[^\n$]+"$" } {DOCNL} { // missing argument warn(yyFileName,yyLineNr, - "warning: missing argument after " + "missing argument after " "\\namespace." ); addOutput('\n'); @@ -1327,7 +1328,7 @@ RCSTAG "$"{ID}":"[^\n$]+"$" } {DOCNL} { // missing argument warn(yyFileName,yyLineNr, - "warning: missing argument after " + "missing argument after " "\\package." ); addOutput('\n'); @@ -1358,7 +1359,7 @@ RCSTAG "$"{ID}":"[^\n$]+"$" } {DOCNL} { warn(yyFileName,yyLineNr, - "warning: missing argument after " + "missing argument after " "\\%s.",YY_START==ClassDocArg1?"class":"category" ); addOutput('\n'); @@ -1419,7 +1420,7 @@ RCSTAG "$"{ID}":"[^\n$]+"$" } {DOCNL} { // missing argument! warn(yyFileName,yyLineNr, - "warning: missing group name after %s", + "missing group name after %s", current->groupDocCmd() ); addOutput('\n'); @@ -1440,7 +1441,7 @@ RCSTAG "$"{ID}":"[^\n$]+"$" ) // defgroup requires second argument { warn(yyFileName,yyLineNr, - "warning: missing title after " + "missing title after " "\\defgroup %s", current->name.data() ); } @@ -1460,7 +1461,7 @@ RCSTAG "$"{ID}":"[^\n$]+"$" } {DOCNL} { warn(yyFileName,yyLineNr, - "warning: missing argument after " + "missing argument after " "\\page." ); if (*yytext=='\n') yyLineNr++; @@ -1506,7 +1507,7 @@ RCSTAG "$"{ID}":"[^\n$]+"$" } {DOCNL} { // missing arguments warn(yyFileName,yyLineNr, - "warning: Missing first argument of \\xrefitem" + "Missing first argument of \\xrefitem" ); if (*yytext=='\n') yyLineNr++; addOutput('\n'); @@ -1526,7 +1527,7 @@ RCSTAG "$"{ID}":"[^\n$]+"$" } {DOCNL} { // missing argument warn(yyFileName,yyLineNr, - "warning: Missing second argument of \\xrefitem" + "Missing second argument of \\xrefitem" ); if (*yytext=='\n') yyLineNr++; addOutput('\n'); @@ -1547,7 +1548,7 @@ RCSTAG "$"{ID}":"[^\n$]+"$" } {DOCNL} { // missing argument warn(yyFileName,yyLineNr, - "warning: Missing third argument of \\xrefitem" + "Missing third argument of \\xrefitem" ); if (*yytext=='\n') yyLineNr++; addOutput('\n'); @@ -1574,7 +1575,7 @@ RCSTAG "$"{ID}":"[^\n$]+"$" } {DOCNL} { // missing argument warn(yyFileName,yyLineNr, - "warning: Missing argument of \\relates or \\memberof command" + "Missing argument of \\relates or \\memberof command" ); if (*yytext=='\n') yyLineNr++; addOutput('\n'); @@ -1609,7 +1610,7 @@ RCSTAG "$"{ID}":"[^\n$]+"$" } {DOCNL} { // missing argument warn(yyFileName,yyLineNr, - "warning: \\section command has no label" + "\\section command has no label" ); if (*yytext=='\n') yyLineNr++; addOutput('\n'); @@ -1617,7 +1618,7 @@ RCSTAG "$"{ID}":"[^\n$]+"$" } . { // invalid character for section label warn(yyFileName,yyLineNr, - "warning: Invalid or missing section label" + "Invalid or missing section label" ); BEGIN(Comment); } @@ -1663,7 +1664,7 @@ RCSTAG "$"{ID}":"[^\n$]+"$" } {DOCNL} { // missing argument warn(yyFileName,yyLineNr, - "warning: \\subpage command has no label" + "\\subpage command has no label" ); if (*yytext=='\n') yyLineNr++; addOutput('\n'); @@ -1693,7 +1694,7 @@ RCSTAG "$"{ID}":"[^\n$]+"$" } {DOCNL} { // missing argument warn(yyFileName,yyLineNr, - "warning: \\anchor command has no label" + "\\anchor command has no label" ); if (*yytext=='\n') yyLineNr++; addOutput('\n'); @@ -1701,7 +1702,7 @@ RCSTAG "$"{ID}":"[^\n$]+"$" } . { // invalid character for anchor label warn(yyFileName,yyLineNr, - "warning: Invalid or missing anchor label" + "Invalid or missing anchor label" ); BEGIN(Comment); } @@ -1733,7 +1734,7 @@ RCSTAG "$"{ID}":"[^\n$]+"$" if (g_commentCount<0 && blockName!="verbatim") { warn(yyFileName,yyLineNr, - "warning: found */ without matching /* while inside a \\%s block! Perhaps a missing \\end%s?\n",blockName.data(),blockName.data()); + "found */ without matching /* while inside a \\%s block! Perhaps a missing \\end%s?\n",blockName.data(),blockName.data()); } } . { @@ -1741,7 +1742,7 @@ RCSTAG "$"{ID}":"[^\n$]+"$" } <> { warn(yyFileName,yyLineNr, - "warning: reached end of comment while inside a @%s block; check for missing @end%s tag!", + "reached end of comment while inside a @%s block; check for missing @end%s tag!", blockName.data(),blockName.data() ); yyterminate(); @@ -1771,7 +1772,7 @@ RCSTAG "$"{ID}":"[^\n$]+"$" } \n { warn(yyFileName,yyLineNr, - "warning: invalid expression '%s' for guard",g_guardExpr.data()); + "invalid expression '%s' for guard",g_guardExpr.data()); unput(*yytext); BEGIN(GuardParam); } @@ -1822,7 +1823,7 @@ RCSTAG "$"{ID}":"[^\n$]+"$" if (guards.isEmpty()) { warn(yyFileName,yyLineNr, - "warning: found @endif without matching start command"); + "found @endif without matching start command"); } else { @@ -1834,7 +1835,7 @@ RCSTAG "$"{ID}":"[^\n$]+"$" if (guards.isEmpty()) { warn(yyFileName,yyLineNr, - "warning: found @else without matching start command"); + "found @else without matching start command"); } else { @@ -1851,7 +1852,7 @@ RCSTAG "$"{ID}":"[^\n$]+"$" if (guards.isEmpty()) { warn(yyFileName,yyLineNr, - "warning: found @elseif without matching start command"); + "found @elseif without matching start command"); } else { @@ -1958,7 +1959,7 @@ RCSTAG "$"{ID}":"[^\n$]+"$" if (!inGroupParamFound) { warn(yyFileName,yyLineNr, - "warning: Missing group name for \\ingroup command" + "Missing group name for \\ingroup command" ); } if (*yytext=='\n') yyLineNr++; @@ -2039,7 +2040,7 @@ RCSTAG "$"{ID}":"[^\n$]+"$" } {DOCNL} { // missing argument warn(yyFileName,yyLineNr, - "warning: \\inherit command has no argument" + "\\inherit command has no argument" ); if (*yytext=='\n') yyLineNr++; addOutput('\n'); @@ -2047,7 +2048,7 @@ RCSTAG "$"{ID}":"[^\n$]+"$" } . { // invalid character for anchor label warn(yyFileName,yyLineNr, - "warning: Invalid or missing name for \\inherit command" + "Invalid or missing name for \\inherit command" ); BEGIN(Comment); } @@ -2062,7 +2063,7 @@ RCSTAG "$"{ID}":"[^\n$]+"$" } {DOCNL} { // missing argument warn(yyFileName,yyLineNr, - "warning: \\extends or \\implements command has no argument" + "\\extends or \\implements command has no argument" ); if (*yytext=='\n') yyLineNr++; addOutput('\n'); @@ -2098,7 +2099,7 @@ RCSTAG "$"{ID}":"[^\n$]+"$" } {DOCNL} { // missing argument warn(yyFileName,yyLineNr, - "warning: \\cite command has no label" + "\\cite command has no label" ); if (*yytext=='\n') yyLineNr++; addOutput('\n'); @@ -2106,7 +2107,7 @@ RCSTAG "$"{ID}":"[^\n$]+"$" } . { // invalid character for cite label warn(yyFileName,yyLineNr, - "warning: Invalid or missing cite label" + "Invalid or missing cite label" ); BEGIN(Comment); } @@ -2425,7 +2426,7 @@ static bool handleSubpage(const QCString &s) ) { warn(yyFileName,yyLineNr, - "warning: found \\subpage command in a comment block that is not marked as a page!"); + "found \\subpage command in a comment block that is not marked as a page!"); } if (g_spaceBeforeCmd) { @@ -2491,7 +2492,7 @@ static bool handleElseIf(const QCString &) if (guards.isEmpty()) { warn(yyFileName,yyLineNr, - "warning: found \\else without matching start command"); + "found \\else without matching start command"); } else { @@ -2506,7 +2507,7 @@ static bool handleElse(const QCString &) if (guards.isEmpty()) { warn(yyFileName,yyLineNr, - "warning: found \\else without matching start command"); + "found \\else without matching start command"); } else { @@ -2520,7 +2521,7 @@ static bool handleEndIf(const QCString &) if (guards.isEmpty()) { warn(yyFileName,yyLineNr, - "warning: found \\endif without matching start command"); + "found \\endif without matching start command"); } else { @@ -2683,7 +2684,7 @@ static void checkFormula() { if (YY_START==ReadFormulaShort || YY_START==ReadFormulaLong) { - warn(yyFileName,yyLineNr,"warning: End of comment block while inside formula."); + warn(yyFileName,yyLineNr,"End of comment block while inside formula."); } } @@ -2819,14 +2820,14 @@ void groupLeaveFile(const char *fileName,int line) { //if (g_memberGroupId!=DOX_NOGROUP) //{ - // warn(fileName,line,"warning: end of file while inside a member group\n"); + // warn(fileName,line,"end of file while inside a member group\n"); //} g_memberGroupId=DOX_NOGROUP; g_memberGroupRelates.resize(0); g_memberGroupDocs.resize(0); if (!g_autoGroupStack.isEmpty()) { - warn(fileName,line,"warning: end of file while inside a group\n"); + warn(fileName,line,"end of file while inside a group\n"); } } @@ -2834,7 +2835,7 @@ void groupEnterCompound(const char *fileName,int line,const char *name) { if (g_memberGroupId!=DOX_NOGROUP) { - warn(fileName,line,"warning: try to put compound %s inside a member group\n",name); + warn(fileName,line,"try to put compound %s inside a member group\n",name); } g_memberGroupId=DOX_NOGROUP; g_memberGroupRelates.resize(0); @@ -2857,7 +2858,7 @@ void groupLeaveCompound(const char *,int,const char * /*name*/) //printf("groupLeaveCompound(%s)\n",name); //if (g_memberGroupId!=DOX_NOGROUP) //{ - // warn(fileName,line,"warning: end of compound %s while inside a member group\n",name); + // warn(fileName,line,"end of compound %s while inside a member group\n",name); //} g_memberGroupId=DOX_NOGROUP; g_memberGroupRelates.resize(0); diff --git a/src/condparser.cpp b/src/condparser.cpp index 1964eda..c99a232 100644 --- a/src/condparser.cpp +++ b/src/condparser.cpp @@ -75,7 +75,7 @@ bool CondParser::parse(const char *fileName,int lineNr,const char *expr) } if (m_err) { - warn(fileName,lineNr,"Warning: problem evaluating expression '%s': %s", + warn(fileName,lineNr,"problem evaluating expression '%s': %s", expr,m_err.data()); } //printf("expr='%s' answer=%d\n",expr,answer); diff --git a/src/config.h b/src/config.h index 47bef4c..7d37516 100644 --- a/src/config.h +++ b/src/config.h @@ -42,7 +42,8 @@ class ConfigOption O_String, //insert(name,option); m_obsolete->append(option); return option; } + /*! Adds an option that has been disabled at compile time. */ + ConfigOption *addDisabled(const char *name) + { + ConfigDisabled *option = new ConfigDisabled(name); + m_dict->insert(name,option); + m_disabled->append(option); + return option; + } /*! @} */ /*! Writes a template configuration to stream \a t. If \a shortIndex @@ -614,6 +635,7 @@ class Config { m_options = new QList; m_obsolete = new QList; + m_disabled = new QList; m_dict = new QDict(257); m_options->setAutoDelete(TRUE); m_obsolete->setAutoDelete(TRUE); @@ -624,12 +646,14 @@ class Config { delete m_options; delete m_obsolete; + delete m_disabled; delete m_dict; } private: QList *m_options; QList *m_obsolete; + QList *m_disabled; QDict *m_dict; static Config *m_instance; QCString m_userComment; diff --git a/src/config.l b/src/config.l index 0c2bcbf..8a4188e 100644 --- a/src/config.l +++ b/src/config.l @@ -180,7 +180,7 @@ void ConfigInt::convertStrToVal() int val = m_valueString.toInt(&ok); if (!ok || valm_maxVal) { - config_warn("warning: argument `%s' for option %s is not a valid number in the range [%d..%d]!\n" + config_warn("Warning: argument `%s' for option %s is not a valid number in the range [%d..%d]!\n" "Using the default: %d!\n",m_valueString.data(),m_name.data(),m_minVal,m_maxVal,m_value); } m_value=val; @@ -202,7 +202,7 @@ void ConfigBool::convertStrToVal() } else { - config_warn("warning: argument `%s' for option %s is not a valid boolean value\n" + config_warn("Warning: argument `%s' for option %s is not a valid boolean value\n" "Using the default: %s!\n",m_valueString.data(),m_name.data(),m_value?"YES":"NO"); } } @@ -382,6 +382,12 @@ void ConfigObsolete::writeXML(FTextStream &t) "id='" << convertToXML(name()) << "'/>" << endl; } +void ConfigDisabled::writeXML(FTextStream &t) +{ + t << "