From db83bca8eb2f8db4ab1d3da4e4f1e516b2823368 Mon Sep 17 00:00:00 2001 From: WrinklyNinja Date: Mon, 27 Jan 2014 21:26:52 +0000 Subject: [PATCH 01/36] Issue #70. Plugins with userlist entries and unsaved edits have their names bolded in the plugins list. Also fixed a bug with dirty info not being cleared when changing plugin. --- src/gui/editor.cpp | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/gui/editor.cpp b/src/gui/editor.cpp index 3dbdeafe..8bbf1b24 100644 --- a/src/gui/editor.cpp +++ b/src/gui/editor.cpp @@ -268,6 +268,9 @@ Editor::Editor(wxWindow *parent, const wxString& title, const std::string userli if (_basePlugins[i].LoadsBSA(_game)) { pluginList->SetItemTextColour(i, wxColour(0, 142, 219)); } + if (std::find(_editedPlugins.begin(), _editedPlugins.end(), _basePlugins[i]) != _editedPlugins.end()) { + pluginList->SetItemFont(i, wxSystemSettings::GetFont(wxSYS_DEFAULT_GUI_FONT).Bold()); + } } pluginList->SetColumnWidth(0, wxLIST_AUTOSIZE); @@ -307,6 +310,7 @@ void Editor::OnPluginSelect(wxListEvent& event) { incsList->DeleteAllItems(); messageList->DeleteAllItems(); tagsList->DeleteAllItems(); + dirtyList->DeleteAllItems(); set files = plugin.LoadAfter(); int i=0; @@ -807,6 +811,12 @@ void Editor::ApplyEdits(const wxString& plugin) { *it = diff; else _editedPlugins.push_back(diff); + + //Also mark plugin as edited in list. + if (!diff.HasNameOnly()) { + long i = pluginList->FindItem(-1, plugin); + pluginList->SetItemFont(i, wxSystemSettings::GetFont(wxSYS_DEFAULT_GUI_FONT).Bold()); + } } boss::Plugin Editor::GetMasterData(const wxString& plugin) const { From 8e671b63766c88ea3dd03927c73c45e477ce728a Mon Sep 17 00:00:00 2001 From: WrinklyNinja Date: Mon, 27 Jan 2014 23:51:00 +0000 Subject: [PATCH 02/36] Fixed bug where file display fields would be generated needlessly. --- src/backend/generators.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/backend/generators.h b/src/backend/generators.h index 7ac4614d..e33d7de6 100644 --- a/src/backend/generators.h +++ b/src/backend/generators.h @@ -761,7 +761,7 @@ namespace YAML { if (rhs.IsConditional()) out << Key << "condition" << Value << rhs.Condition(); - if (!rhs.DisplayName().empty()) + if (rhs.DisplayName() != rhs.Name()) out << Key << "display" << Value << rhs.DisplayName(); out << EndMap; From 2f21a9056456edd183a4d478ac3517f500e6723f Mon Sep 17 00:00:00 2001 From: WrinklyNinja Date: Tue, 28 Jan 2014 10:20:36 +0000 Subject: [PATCH 03/36] Issue #70 work. * Fixed range limits on the priority spinner. * Implemented right-click menu for plugin list, moved "Copy Metadata As Text" into it and added "Copy Name" and "Remove All User-Added Metadata" entries. --- src/gui/editor.cpp | 114 +++++++++++++++++++++++++++++++-------------- src/gui/editor.h | 7 ++- src/gui/ids.h | 4 +- 3 files changed, 88 insertions(+), 37 deletions(-) diff --git a/src/gui/editor.cpp b/src/gui/editor.cpp index 8bbf1b24..f5875734 100644 --- a/src/gui/editor.cpp +++ b/src/gui/editor.cpp @@ -30,6 +30,7 @@ #include #include +#include using namespace std; @@ -121,7 +122,7 @@ Editor::Editor(wxWindow *parent, const wxString& title, const std::string userli //Initialise controls. pluginText = new wxStaticText(this, wxID_ANY, ""); prioritySpin = new wxSpinCtrl(this, wxID_ANY, "0"); - prioritySpin->SetRange(-10,10); + prioritySpin->SetRange(std::numeric_limits::min(), std::numeric_limits::max()); enableUserEditsBox = new wxCheckBox(this, wxID_ANY, translate("Enable User Changes")); addBtn = new wxButton(this, BUTTON_AddRow, translate("Add File")); @@ -129,7 +130,6 @@ Editor::Editor(wxWindow *parent, const wxString& title, const std::string userli removeBtn = new wxButton(this, BUTTON_RemoveRow, translate("Remove File")); applyBtn = new wxButton(this, BUTTON_Apply, translate("Save Changes")); cancelBtn = new wxButton(this, BUTTON_Cancel, translate("Cancel")); - exportBtn = new wxButton(this, BUTTON_Export, translate("Copy Metadata As Text")); pluginList = new wxListView(this, LIST_Plugins, wxDefaultPosition, wxDefaultSize, wxLC_REPORT|wxLC_SINGLE_SEL); reqsList = new wxListView(reqsTab, LIST_Reqs, wxDefaultPosition, wxDefaultSize, wxLC_REPORT|wxLC_SINGLE_SEL); @@ -139,6 +139,8 @@ Editor::Editor(wxWindow *parent, const wxString& title, const std::string userli dirtyList = new wxListView(dirtyTab, LIST_DirtyInfo, wxDefaultPosition, wxDefaultSize, wxLC_REPORT|wxLC_SINGLE_SEL); messageList = new MessageList(messagesTab, LIST_Messages, language); + pluginMenu = new wxMenu(); + //Tie together notebooks and panels. listBook->AddPage(reqsTab, translate("Requirements"), true); listBook->AddPage(incsTab, translate("Incompatibilities")); @@ -172,13 +174,17 @@ Editor::Editor(wxWindow *parent, const wxString& title, const std::string userli dirtyList->AppendColumn(translate("Deleted Navmesh Count")); dirtyList->AppendColumn(translate("Cleaning Utility")); + //Set up plugin right-click menu. + pluginMenu->Append(MENU_CopyName, translate("Copy Name")); + pluginMenu->Append(MENU_CopyMetadata, translate("Copy Metadata As Text")); + pluginMenu->Append(MENU_ClearMetadata, translate("Remove All User-Added Metadata")); + //Initialise control states. addBtn->Enable(false); editBtn->Enable(false); removeBtn->Enable(false); prioritySpin->Enable(false); enableUserEditsBox->Enable(false); - exportBtn->Enable(false); //Make plugin name bold text. wxFont font = pluginText->GetFont(); @@ -199,7 +205,10 @@ Editor::Editor(wxWindow *parent, const wxString& title, const std::string userli Bind(wxEVT_BUTTON, &Editor::OnAddRow, this, BUTTON_AddRow); Bind(wxEVT_BUTTON, &Editor::OnEditRow, this, BUTTON_EditRow); Bind(wxEVT_BUTTON, &Editor::OnRemoveRow, this, BUTTON_RemoveRow); - Bind(wxEVT_BUTTON, &Editor::OnExport, this, BUTTON_Export); + Bind(wxEVT_LIST_ITEM_RIGHT_CLICK, &Editor::OnPluginListRightClick, this); + Bind(wxEVT_MENU, &Editor::OnPluginCopyName, this, MENU_CopyName); + Bind(wxEVT_MENU, &Editor::OnPluginCopyMetadata, this, MENU_CopyMetadata); + Bind(wxEVT_MENU, &Editor::OnPluginClearMetadata, this, MENU_ClearMetadata); //Set up layout. wxBoxSizer * bigBox = new wxBoxSizer(wxHORIZONTAL); @@ -251,8 +260,6 @@ Editor::Editor(wxWindow *parent, const wxString& title, const std::string userli hbox2->Add(removeBtn, 0, wxLEFT, 5); mainBox->Add(hbox2, 0, wxALIGN_RIGHT); - mainBox->Add(exportBtn, 0, wxALIGN_RIGHT|wxTOP, 10); - mainBox->AddSpacer(30); wxBoxSizer * hbox6 = new wxBoxSizer(wxHORIZONTAL); @@ -372,7 +379,66 @@ void Editor::OnPluginSelect(wxListEvent& event) { addBtn->Enable(true); editBtn->Enable(false); removeBtn->Enable(false); - exportBtn->Enable(true); + } +} + +void Editor::OnPluginListRightClick(wxListEvent& event) { + PopupMenu(pluginMenu); +} + +void Editor::OnPluginCopyName(wxCommandEvent& event) { + if (wxTheClipboard->Open()) { + wxTheClipboard->SetData(new wxTextDataObject(pluginList->GetItemText(pluginList->GetFirstSelected()))); + wxTheClipboard->Close(); + } +} + +void Editor::OnPluginCopyMetadata(wxCommandEvent& event) { + wxString selectedPlugin = pluginList->GetItemText(pluginList->GetFirstSelected()); + boss::Plugin plugin = GetUserData(selectedPlugin); + + string text; + if (plugin.HasNameOnly()) + text = "name: " + plugin.Name(); + else { + YAML::Emitter yout; + yout.SetIndent(2); + yout << plugin; + text = yout.c_str(); + } + + BOOST_LOG_TRIVIAL(info) << "Exported userlist metadata text for \"" << selectedPlugin.ToUTF8() << "\": " << text; + + if (!text.empty() && wxTheClipboard->Open()) { + wxTheClipboard->SetData(new wxTextDataObject(FromUTF8(text))); + wxTheClipboard->Close(); + } +} + +void Editor::OnPluginClearMetadata(wxCommandEvent& event) { + wxMessageDialog dialog(this, + translate("Are you sure you want to clear all existing user-added metadata from this plugin?"), + translate("BOSS: Warning"), + wxYES_NO | wxCANCEL | wxICON_EXCLAMATION); + + if (dialog.ShowModal() == wxID_YES) { + long i = pluginList->GetFirstSelected(); + wxString selectedPlugin = pluginList->GetItemText(i); + boss::Plugin p(string(selectedPlugin.ToUTF8())); + + //Need to clear what's currently in the editor and what's from the userlist. + + vector::const_iterator it = std::find(_editedPlugins.begin(), _editedPlugins.end(), p); + + //Delete existing userlist entry. + if (it != _editedPlugins.end()) + _editedPlugins.erase(it); + + //Also clear any unapplied data. Easiest way to do this is to simulate loading the plugin's data again. + pluginText->SetLabelText(""); + pluginList->Select(i, false); + pluginList->Select(i, true); + pluginList->SetItemFont(i, wxSystemSettings::GetFont(wxSYS_DEFAULT_GUI_FONT)); } } @@ -751,27 +817,6 @@ void Editor::OnRowSelect(wxListEvent& event) { } } -void Editor::OnExport(wxCommandEvent& event) { - wxString currentPlugin = pluginText->GetLabelText(); - - boss::Plugin initial = GetMasterData(currentPlugin); - boss::Plugin edited = GetNewData(currentPlugin); - - boss::Plugin diff = edited.DiffMetadata(initial); - - YAML::Emitter yout; - yout.SetIndent(2); - yout << diff; - string text = yout.c_str(); - - BOOST_LOG_TRIVIAL(info) << "Exported metadata text for \"" << currentPlugin.ToUTF8() << "\": " << text; - - if (!text.empty() && wxTheClipboard->Open()) { - wxTheClipboard->SetData( new wxTextDataObject(FromUTF8(text)) ); - wxTheClipboard->Close(); - } -} - void Editor::OnQuit(wxCommandEvent& event) { BOOST_LOG_TRIVIAL(debug) << "Exiting metadata editor."; if (event.GetId() == BUTTON_Apply) { @@ -813,10 +858,12 @@ void Editor::ApplyEdits(const wxString& plugin) { _editedPlugins.push_back(diff); //Also mark plugin as edited in list. - if (!diff.HasNameOnly()) { - long i = pluginList->FindItem(-1, plugin); + long i = pluginList->FindItem(-1, plugin); + if (!diff.HasNameOnly()) pluginList->SetItemFont(i, wxSystemSettings::GetFont(wxSYS_DEFAULT_GUI_FONT).Bold()); - } + else + pluginList->SetItemFont(i, wxSystemSettings::GetFont(wxSYS_DEFAULT_GUI_FONT)); + } boss::Plugin Editor::GetMasterData(const wxString& plugin) const { @@ -834,10 +881,9 @@ boss::Plugin Editor::GetMasterData(const wxString& plugin) const { boss::Plugin Editor::GetUserData(const wxString& plugin) const { BOOST_LOG_TRIVIAL(debug) << "Getting userlist metadata for plugin: " << plugin.ToUTF8(); - boss::Plugin p; - boss::Plugin p_in(string(plugin.ToUTF8())); + boss::Plugin p(string(plugin.ToUTF8())); - vector::const_iterator it = std::find(_editedPlugins.begin(), _editedPlugins.end(), p_in); + vector::const_iterator it = std::find(_editedPlugins.begin(), _editedPlugins.end(), p); if (it != _editedPlugins.end()) p = *it; diff --git a/src/gui/editor.h b/src/gui/editor.h index 5f28c5c1..6a07bef6 100644 --- a/src/gui/editor.h +++ b/src/gui/editor.h @@ -57,24 +57,27 @@ public: Editor(wxWindow *parent, const wxString& title, const std::string userlistPath, const std::vector& basePlugins, std::vector& editedPlugins, const unsigned int language, const boss::Game& game); void OnPluginSelect(wxListEvent& event); + void OnPluginListRightClick(wxListEvent& event); + void OnPluginCopyName(wxCommandEvent& event); + void OnPluginCopyMetadata(wxCommandEvent& event); + void OnPluginClearMetadata(wxCommandEvent& event); void OnEnabledToggle(wxCommandEvent& event); void OnPriorityChange(wxSpinEvent& event); void OnListBookChange(wxBookCtrlEvent& event); void OnAddRow(wxCommandEvent& event); void OnEditRow(wxCommandEvent& event); void OnRemoveRow(wxCommandEvent& event); - void OnExport(wxCommandEvent& event); void OnRecalc(wxCommandEvent& event); void OnRowSelect(wxListEvent& event); void OnQuit(wxCommandEvent& event); private: + wxMenu * pluginMenu; wxButton * addBtn; wxButton * editBtn; wxButton * removeBtn; wxButton * applyBtn; wxButton * cancelBtn; - wxButton * exportBtn; wxListView * pluginList; wxListView * reqsList; wxListView * incsList; diff --git a/src/gui/ids.h b/src/gui/ids.h index ad010602..3a01118f 100644 --- a/src/gui/ids.h +++ b/src/gui/ids.h @@ -63,8 +63,10 @@ enum { BUTTON_RemoveContent, BUTTON_Apply, BUTTON_Cancel, - BUTTON_Export, BOOK_Lists, + MENU_CopyName, + MENU_CopyMetadata, + MENU_ClearMetadata, //Main window - dynamically created IDs. MENU_LowestDynamicGameID, LIST_LoadOrder, From 58ab8f5158a4332883a551d16082566b6aee1cab Mon Sep 17 00:00:00 2001 From: WrinklyNinja Date: Tue, 28 Jan 2014 17:44:37 +0000 Subject: [PATCH 04/36] Updated readme for UI changes. --- docs/BOSS Readme.html | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/docs/BOSS Readme.html b/docs/BOSS Readme.html index 5110d1a4..9f42d7fe 100644 --- a/docs/BOSS Readme.html +++ b/docs/BOSS Readme.html @@ -204,9 +204,8 @@ Visual C++ Redistributable for Visual Studio 2013 (x86). BOSS can be install
BOSS's metadata editor.

BOSS's sorting algorithm uses the contents of plugins to work out where they should load relative to one another. However, this is sometimes not enough for it to produce a correct load order. In such cases, additional metadata can be supplied so that the plugins get sorted correctly. This metadata is supplied to BOSS by two sources: one is the masterlist, which is maintained by the BOSS team, and the other is the userlist, which you can edit as you desire. -

The metadata editor allows you to manage the metadata stored in your userlist. When opened, it lists all the plugins you have installed, and any that are missing but have existing user-added metadata, in alphabetical order. Plugins that load BSAs are displayed in blue text. Clicking on a plugin then opens its metadata for editing, and displays any existing metadata in the fields to the right of the plugin list. These fields are explained in the table below. +

The metadata editor allows you to manage the metadata stored in your userlist. When opened, it lists all the plugins you have installed, and any that are missing but have existing user-added metadata, in alphabetical order. Plugins that load BSAs are displayed in blue text, and plugins with user-added metadata are displayed in bold text. Selecting a plugin then opens its metadata for editing, and displays any existing metadata in the fields to the right of the plugin list. Right-clicking a plugin displays a context menu containing a few commands. The editor fields and context menu commands are explained in the tables below.

The Add …, Edit … and Remove … buttons are used to edit the contents of the list currently visible. The Edit … and Remove … buttons are greyed out if no row is selected or if the selected row is not user-added metadata, but comes from the masterlist or the plugin itself. Metadata that comes from the masterlist or the plugin itself cannot be edited or removed, only added to. This is to prevent users from accidently overriding important metadata. -

The Copy Metadata As Text copies the selected plugin's current metadata, as it appears in the userlist, to the clipboard. This makes it easier to share your metadata changes with the BOSS team, as they can then paste this text directly into the masterlist, and also avoids any typos being introduced. If posting the text in an online forum that supports BBCode (as most forums do), be sure to wrap it in [code] tags, eg. [code]copied text[/code], so that the spaces are not removed by the forum software.

The Save Changes button will save any user-added metadata to your userlist, including any changes made, then exit the metadata editor. The Cancel button will exit the editor without saving any changes. @@ -244,8 +243,15 @@ Visual C++ Redistributable for Visual Studio 2013 (x86). BOSS can be install

If a plugin's masters are missing, an error message will be displayed for it. Filter patches are special mods designed for use with a Bashed Patch that do not require all their masters to be present, and so any plugin with the Filter tag applied and missing masters will not cause any errors to be displayed.

- - + + + +
Context Menu CommandDescription +
Copy NameCopies the selected plugin's filename to the clipboard. +
Copy Metadata As TextCopies the selected plugin's current metadata, as it appears in the userlist, to the clipboard. This makes it easier to share your metadata changes with the BOSS team, as they can then paste this text directly into the masterlist, and also avoids any typos being introduced. If posting the text in an online forum that supports BBCode (as most forums do), be sure to wrap it in [code] tags, eg. [code]copied text[/code], so that the spaces are not removed by the forum software. +
Remove All User-Added MetadataThis removes all saved user-added metadata from the selected plugin, and any unsaved data added to the plugin since the Metadata Editor window was opened. +
+

Editing Settings

From 7fc9ab178f636328506cd4983149de0f97fbe930 Mon Sep 17 00:00:00 2001 From: WrinklyNinja Date: Wed, 29 Jan 2014 10:06:48 +0000 Subject: [PATCH 05/36] Delete svg.htc Part of issue #90 work. Doing this via the web interface for a change. --- resources/svgweb/svg.htc | 1 - 1 file changed, 1 deletion(-) delete mode 100644 resources/svgweb/svg.htc diff --git a/resources/svgweb/svg.htc b/resources/svgweb/svg.htc deleted file mode 100644 index de76ff8f..00000000 --- a/resources/svgweb/svg.htc +++ /dev/null @@ -1 +0,0 @@ - From 709b5de6a8157853016f449fe331384d895365e2 Mon Sep 17 00:00:00 2001 From: WrinklyNinja Date: Wed, 29 Jan 2014 10:06:56 +0000 Subject: [PATCH 06/36] Delete svg.js Part of issue #90 work. Doing this via the web interface for a change. --- resources/svgweb/svg.js | 209 ---------------------------------------- 1 file changed, 209 deletions(-) delete mode 100644 resources/svgweb/svg.js diff --git a/resources/svgweb/svg.js b/resources/svgweb/svg.js deleted file mode 100644 index 638b4c77..00000000 --- a/resources/svgweb/svg.js +++ /dev/null @@ -1,209 +0,0 @@ -(function(){function q(a,b){for(var c in b)a.prototype[c]=b[c]}function O(a,b){for(var c in b)a[c]=b[c]}function v(a,b,c,d){if(!b)b=a.documentElement;if(typeof XPathEvaluator!="undefined"){var e=new XPathEvaluator;a=a.createNSResolver(b);c=e.evaluate(c,b,a,0,null);for(b=r();e=c.iterateNext();)b.push(e);return b}else{a.setProperty("SelectionLanguage","XPath");if(d){var f="",h={};for(e=0;e\n';e+=d==svgns&&!c?"<"+a+' xmlns="'+svgnsFake+'" xmlns:xlink="http://www.w3.org/1999/xlink"/>': -"<"+a+" xmlns:"+c+'="'+d+'"/>';this._nodeXML=z(e).documentElement}else if(b==i.DOCUMENT_FRAGMENT_NODE){e='\n<__document__fragment>';this._nodeXML=z(e).documentElement}if(b!=i.DOCUMENT_NODE&&this._nodeXML){this._nodeXML.getAttribute("__guid")||this._nodeXML.setAttribute("__guid","_"+K++);this._guid=this._nodeXML.getAttribute("__guid");svgweb._guidLookup["_"+this._guid]=this}if(b==i.ELEMENT_NODE)this.localName=a.indexOf(":")!=-1?a.match(/^[^:]*:(.*)$/)[1]: -a;this.nodeType=b?b:i.ELEMENT_NODE;if(b==i.ELEMENT_NODE||b==i.DOCUMENT_NODE||b==i.DOCUMENT_FRAGMENT_NODE){this.prefix=c;this.namespaceURI=d;this._nodeValue=null}else if(b==i.TEXT_NODE){this._nodeValue=this._nodeXML.firstChild.nodeValue;this.namespaceURI=this.prefix=null;if(this._nodeValue===undefined)this._nodeValue=null}this.ownerDocument=document;if(this._handler&&this._handler.type=="object")this.ownerDocument=this._handler.document;j&&this._createEmptyMethods();this._childNodes=this._createChildNodes(); -b==i.TEXT_NODE&&this._nodeXML.setAttribute("__fakeTextNode",true);if(j)j&&this.nodeType!=i.DOCUMENT_NODE&&this._createHTC();else this._defineNodeAccessors()}}function t(a,b,c,d,e){if(!(a===undefined&&c===undefined&&d===undefined&&e===undefined)){i.apply(this,[a,i.ELEMENT_NODE,b,c,d,e]);this._attributes={};this._attributes._id="";this._importAttributes(this,this._nodeXML);j||this._defineAccessors();if(this.namespaceURI==svgns){if(!(j&&this._attached&&this._handler&&this._handler.type=="script"&&this.nodeName== -"svg"))this.style=new s(this);if(!(j&&this._attached&&this._handler&&this._handler.type=="script"&&this.nodeName=="svg"))if(j)this.style._ignoreStyleChanges=false}}}function C(a){i.apply(this,["#document-fragment",i.DOCUMENT_FRAGMENT_NODE,null,null,null,null]);this.ownerDocument=a}function s(a){this._element=a;this._setup()}function W(a,b){this._handler=b;this._svgNode=a;this._scriptsToExec=[];this._htcLoaded=Object.defineProperty?true:false;this._swfLoaded=false;for(var c=0;this._svgNode._onloadListeners&& -c=this.length?null:this[b]};return a}function F(a,b,c,d,e,f,h){this.a=a;this.b=b;this.c=c;this.d=d;this.e=e;this.f=f;this._handler=h}function G(a){this.value=a}function H(a){this.baseVal=a;this.animVal=undefined} -function Y(a,b,c){this.type=a;this.matrix=b;this.angle=c}function I(a,b,c,d){if(c===undefined)c=false;this._formalAccessors=c;this.x=a;this.y=b;if(c){this.setX=m(this,function(e){this.x=e;d("x",e)});this.getX=m(this,function(){return this.x});this.setY=m(this,function(e){this.y=e;d("y",e)});this.getY=m(this,function(){return this.y});this.setXY=m(this,function(e,f){this.x=e;this.y=f;d("xy",e,f)})}}function M(a,b,c,d){this.x=a;this.y=b;this.width=c;this.height=d}window.svgns="http://www.w3.org/2000/svg"; -window.xlinkns="http://www.w3.org/1999/xlink";svgnsFake="urn:__fake__internal__namespace";var w=false,x=false,Z=false,j=false,$=false,N=false,u=false,aa=false,P=false,A=false;(function(){var a=navigator,b=a.userAgent;a=a.appVersion;var c=parseFloat(a);if(b.indexOf("Opera")>=0)w=c;var d=Math.max(a.indexOf("WebKit"),a.indexOf("Safari"),0);if(d)x=parseFloat(a.split("Version/")[1])||parseFloat(a.substr(d+7))>419.3?3:2;b.indexOf("AdobeAIR");if(a.indexOf("Konqueror")>=0||x)$=c;if(b.indexOf("Gecko")>=0&& -!$)Z=c;if(Z)N=parseFloat(b.split("Firefox/")[1])||undefined;if(document.all&&!w)j=parseFloat(a.split("MSIE ")[1])||undefined;if(b.indexOf("Chrome")>=0)aa=1;isStandardsMode=document.documentMode?document.documentMode>5:document.compatMode=="CSS1Compat";if(document.contentType=="application/xhtml+xml")u=true;else if(typeof XMLDocument!="undefined"&&document.constructor==XMLDocument)u=true;if(typeof DOMParser!="undefined"&&typeof XPathEvaluator!="undefined"&&typeof XMLSerializer!="undefined")A=P=true})(); -var da=function(){for(var a=false,b=document.getElementsByTagName("script"),c=0;c<\/script>');document.getElementById("__ie__svg__onload").onreadystatechange=function(){this.readyState=="complete"&&a._onDOMContentLoaded()};var b=function(){if(window.onload){a._saveWindowOnload();document.detachEvent("onreadystatechange",b)}};document.attachEvent("onreadystatechange",b)}},_setXDomain:function(){for(var a=document.getElementsByTagName("script"),b=0;b0)a=b[c].content;b=document.getElementsByTagName("script");for(c=0;c\s*/,"")}RegExp.lastIndex=0;for(var d,e=/\n'+a;if(/xmlns:[^=]+=['"]http:\/\/www\.w3\.org\/1999\/xlink['"]/.test(a)==false)a=a.replace("\s+\<");if(this.renderer==l){a=a.replace(//g,"");a=a.replace(/")+2;n=n.substring(0,n.indexOf("]]\>"));n=""+n+"]]\>";g.push(n);k=e[1].substring(0,k);d=e[1].substring(d+1,e[1].length);e[1]=k+"__SVG_CDATA_TOKEN_"+f+d;d=h.exec(e[1]);f++}}e[1]=e[1].replace(/>([^<]+)</g,"><__text>$1</__text><");if(a)for(f=0;f<g.length;f++)e[1]=e[1].replace("__SVG_CDATA_TOKEN_"+f,g[f]);a=e[0]+b+e[1];for(f=2;f<e.length;f++)a+=e[f]}a=a.replace(/<NESTEDSVG/g,"<svg");if(this.renderer==l){a=l._encodeFlashData(a);a=a.replace(/xmlns(\:[^=]*)?=['"]http\:\/\/www\.w3\.org\/2000\/svg['"]/g, -'xmlns$1="'+svgnsFake+'"')}c=this._addTracking(a,c);a=A?(new XMLSerializer).serializeToString(c):c.xml;if(this.renderer==l)a=a.replace(RegExp(svgnsFake,"g"),svgns);return{svg:a,xml:c}},_processSVGScript:function(a){var b;if(u){b="";for(var c=0;c<a.childNodes.length;c++)b+=a.childNodes[c].textContent}else b=a.innerHTML;var d=this._cleanSVG(b,true,true);c=d.svg;var e=d.xml;d=e.documentElement.getAttribute("id");var f=e.documentElement.getAttribute("onload");if(f){f=new Function('var evt = { target: document.getElementById("'+ -d+'") ,currentTarget: document.getElementById("'+d+'") ,preventDefault: function() { this.returnValue=false; }};'+f);this._loadListeners.push(function(h,g){return function(){var k=svgweb.handlers[g];k=svgweb.getHandlerType()=="flash"?k.document.documentElement._getProxyNode():document.getElementById(g);return h.apply(k)}}(f,d))}a=new this.renderer({type:"script",svgID:d,xml:e,svgString:c,origSVG:b,scriptNode:a});this.handlers[d]=a;this.handlers.push(a);a.start()},_processSVGObject:function(a){var b= -a.getAttribute("id");if(!b){a.setAttribute("id",svgweb._generateID("__svg__random__","__object"));b=a.getAttribute("id")}a=new this.renderer({type:"object",objID:b,objNode:a});this.handlers[b]=a;this.handlers.push(a);a.start();return b},_generateID:function(a,b){b||(b="");a||(a="");return a+("_"+K++)+b},_addTracking:function(a,b){var c=z(a,!b),d=c.documentElement;d&&!d.getAttribute("id")&&d.setAttribute("id",this._generateID("__svg__random__",null));if(this.getHandlerType()!="flash")return c;for(var e= -d;e;){e.nodeType==i.ELEMENT_NODE&&e.setAttribute("__guid","_"+K++);e.nodeType==i.ELEMENT_NODE&&!e.getAttribute("id")&&e.setAttribute("id",svgweb._generateID("__svg__random__",null));var f=e.firstChild;if(f)e=f;else for(;e;){if(e!=d)if(f=e.nextSibling){e=f;break}if(e==d)e=null;else{e=e.parentNode;if(e.nodeType!=1)e=null}}}return c},_handleDone:function(a,b,c){this.totalLoaded++;if(b=="script"&&c._scriptNode._onloadListeners){for(a=0;a<c._scriptNode._onloadListeners.length;a++){var d=c._scriptNode._onloadListeners[a]; -if(svgweb.getHandlerType()=="flash")d=d.listener;else c._svgRoot.addEventListener.toString().indexOf("[native code]")!=-1&&o._patchAddEventListener(c._svgRoot);try{var e=document.getElementById(c.id);w?setTimeout(function(){d.apply(e);e=d=null},1):d.apply(e)}catch(f){console.log("Error while firing onload listener: "+f.message||f)}}c._scriptNode._onloadListeners=[]}this.totalLoaded>=this.totalSVG&&this._fireOnLoad()},_handleHTMLTitleBug:function(){var a=document.getElementsByTagName("head")[0],b= -a.getElementsByTagName("title");if(b.length===0){b=document.createElement("title");a.appendChild(b)}},_fireFlashError:function(){},_exportID:function(a){a.__defineGetter__("id",function(){return a.getAttribute("id")});a.__defineSetter__("id",function(b){return a.setAttribute("id",b)})},_watchUnload:function(){window.attachEvent("onunload",function(){window.detachEvent("onunload",arguments.callee);svgweb._fireUnload()})},_fireUnload:function(){if(j){for(var a=0;a<svgweb.handlers.length;a++)if(svgweb.handlers[a].type== -"object"){var b=svgweb.handlers[a].flash;b&&b.parentNode&&svgweb.removeChild(b,b.parentNode)}else svgweb.handlers[a].document.documentElement=null;if(b=document.getElementById("__htc_container")){for(a=0;a<b.childNodes.length;a++){var c=b.childNodes[a];if(c.nodeType==1&&c.namespaceURI==svgns){c.detachEvent("onpropertychange",c._fakeNode.style._changeListener);c.style.item=null;c.style.setProperty=null;c.style.getPropertyValue=null}if(c._fakeNode)c._fakeNode._htcNode=null;c._fakeNode=null;c._handler= -null}b.parentNode.removeChild(b)}for(a=0;a<svgweb.handlers.length;a++)svgweb.handlers[a].flash=null;svgweb.handlers=null;for(a=0;a<svgweb._removedNodes.length;a++){b=svgweb._removedNodes[a];if(b._fakeNode)b._fakeNode._htcNode=null;b._fakeNode=null;b._handler=null}svgweb._removedNodes=null;document.getElementById=document._getElementById;document._getElementById=null;document.getElementsByTagNameNS=document._getElementsByTagNameNS;document._getElementsByTagNameNS=null;document.createElementNS=document._createElementNS; -document._createElementNS=null;document.createElement=document._createElement;document._createElement=null;document.createTextNode=document._createTextNode;document._createTextNode=null;document._importNodeFunc=null;document.createDocumentFragment=document._createDocumentFragment;document._createDocumentFragment=null;window.addEventListener=null;window._addEventListener=null;window.attachEvent=window._attachEvent;J=window._attachEvent=null}},_cleanupSVGObjects:function(){if(this.config.use=="flash"&& -this.config.hasNativeSVG())for(var a=0;a<this._svgObjects.length;a++){for(var b=this._svgObjects[a],c=document.createElement("div"),d=0;d<b.attributes.length;d++){var e=b.attributes[d];c.setAttribute(e.nodeName,e.nodeValue)}c.innerHTML=b.innerHTML;b.parentNode.replaceChild(c,b);this._svgObjects[a]=c}for(a=0;a<this._svgObjects.length;a++)this._svgObjects[a].style.visibility="hidden"},_interceptOnloadListeners:function(){if(window.addEventListener){window._addEventListener=window.addEventListener;window.addEventListener= -function(a,b,c){if(a.toLowerCase()=="svgload")svgweb.addOnLoad(b);else return window._addEventListener(a,b,c)}}else window.addEventListener=function(a,b){if(a.toLowerCase()=="svgload")svgweb.addOnLoad(b);else if(j&&window.attachEvent)return window.attachEvent("on"+a,b)};if(j&&window.attachEvent){window._attachEvent=window.attachEvent;window.attachEvent=function(a,b){if(a.toLowerCase()=="onsvgload")svgweb.addOnLoad(b);else return window._attachEvent(a,b)}}},_saveWindowOnload:function(){var a=window.onsvgload; -if(document.getElementsByTagName("body")){var b=document.getElementsByTagName("body")[0];if(b.getAttribute("onsvgload")){callbackStr=b.getAttribute("onsvgload");a=function(c){return function(){eval(c)}}(callbackStr)}}if(a){j?this._loadListeners.splice(0,0,a):this._loadListeners.push(a);window.onsvgload=a=null}}});q(S,{supported:false,reason:null,use:null,_forceFlash:function(){for(var a=false,b=false,c=document.getElementsByTagName("meta"),d=0;d<c.length;d++)if(c[d].name=="svg.render.forceflash"&& -c[d].content.toLowerCase()=="true")b=a=true;if(window.location.search.indexOf("svg.render.forceflash=true")!=-1)a=true;else if(b&&window.location.search.indexOf("svg.render.forceflash=false")!=-1)a=false;return a},hasNativeSVG:function(){return document.implementation&&document.implementation.hasFeature?document.implementation.hasFeature("http://www.w3.org/TR/SVG11/feature#BasicStructure","1.1"):false}});T.prototype={version:-1,versionMajor:-1,versionMinor:-1,versionRevision:-1,capable:false,isVersionOrAbove:function(a, -b,c){c=parseFloat("."+c);return this.versionMajor>=a&&this.versionMinor>=b&&this.versionRevision>=c?true:false},_detectVersion:function(){for(var a,b=25;b>0;b--){if(j){var c;try{c=b>6?new ActiveXObject("ShockwaveFlash.ShockwaveFlash."+b):new ActiveXObject("ShockwaveFlash.ShockwaveFlash");if(typeof c=="object"){if(b==6)c.AllowScriptAccess="always";a=c.GetVariable("$version")}}catch(d){continue}}else a=this._JSFlashInfo(b);if(a==-1){this.capable=false;break}else if(a!==0){a=j?a.split(" ")[1].split(","): -a.split(".");this.versionMajor=a[0];this.versionMinor=a[1];this.versionRevision=a[2];this.version=parseFloat(this.versionMajor+"."+this.versionRevision);this.capable=true;break}}},_JSFlashInfo:function(){if(navigator.plugins!==null&&navigator.plugins.length>0)if(navigator.plugins["Shockwave Flash 2.0"]||navigator.plugins["Shockwave Flash"]){var a=navigator.plugins["Shockwave Flash"+(navigator.plugins["Shockwave Flash 2.0"]?" 2.0":"")].description.split(" "),b=a[2].split("."),c=b[0];b=b[1];a=(a[3]|| -a[4]).split("r");return c+"."+b+"."+(a[1]>0?a[1]:0)}return-1}};l._keyboardListeners=[];l._unattachedDoc=z('<?xml version="1.0"?>\n<svg xmlns="'+svgns+'"></svg>',false);l._prepareBehavior=function(a,b){for(var c=null,d=0;d<document.namespaces.length;d++)if(document.namespaces.item(d).name=="svg"){c=document.namespaces.item(d);break}if(c===null)c=document.namespaces.add("svg",svgns);c.doImport(a+b)};l._getNode=function(a,b){var c;c=svgweb._guidLookup["_"+a.getAttribute("__guid")];var d=false;if(!c&& -a.nodeName=="__text")d=true;if(!c&&!d&&a.nodeType==i.ELEMENT_NODE)c=new t(a.nodeName,a.prefix,a.namespaceURI,a,b);else if(!c&&(a.nodeType==i.TEXT_NODE||d))c=new i("#text",i.TEXT_NODE,null,null,a,b);else if(!c)throw Error("Unknown node type given to _getNode: "+a.nodeType);return c._getProxyNode()};l._patchBrowserObjects=function(a,b){if(!b._getElementById){b._getElementById=b.getElementById;b.getElementById=l._getElementById;b._getElementsByTagNameNS=b.getElementsByTagNameNS;b.getElementsByTagNameNS= -l._getElementsByTagNameNS;b._createElementNS=b.createElementNS;b.createElementNS=l._createElementNS;b._createElement=b.createElement;b.createElement=l._createElement;b._createTextNode=b.createTextNode;b.createTextNode=l._createTextNode;b._importNodeFunc=l._importNodeFunc;b._createDocumentFragment=b.createDocumentFragment;b.createDocumentFragment=l._createDocumentFragment;b._addEventListener=b.addEventListener;b.addEventListener=l._addEventListener}};l._patchFakeObjects=function(a,b){b._addEventListener= -b.addEventListener;b.addEventListener=l._addEventListener};l._addEventListener=function(a,b,c){if(a.substring(0,3)=="key"){var d=function(e){return function(f){if(!f.preventDefault)f.preventDefault=function(){this.returnValue=false;f=null};typeof e=="object"?e.handleEvent.call(e,f):e(f)}}(b);d.__type=a;d.__listener=b;d.__useCapture=c;this._handler?this._handler._keyboardListeners.push(d):l._keyboardListeners.push(d)}if(this._addEventListener)this._addEventListener(a,b,c);else this.attachEvent&&this.attachEvent("on"+ -a,b)};l._getElementById=function(a){var b=document._getElementById(a);if(b!==null)return b;for(var c=0;c<svgweb.handlers.length;c++){if(svgweb.handlers[c].type=="script")b=svgweb.handlers[c].document.getElementById(a);if(b)return b}return null};l._getElementsByTagNameNS=function(a,b){var c=r();if(document._getElementsByTagNameNS)for(var d=document._getElementsByTagNameNS(a,b),e=0;e<d.length;e++)c.push(d[e]);for(var f=0;f<svgweb.handlers.length;f++)if(svgweb.handlers[f].type=="script"){d=svgweb.handlers[f].document.getElementsByTagNameNS(a, -b);for(e=0;e<d.length;e++)c.push(d[e])}return c};l._createElementNS=function(a,b,c){if(c===undefined)c=false;if(a===null||a=="http://www.w3.org/1999/xhtml")return j?document.createElement(b):document._createElementNS(a,b);var d=false;if(a==svgns){a=svgnsFake;d=true}if(!j&&!c){if(svgweb._allSVGNamespaces["_"+a])d=true;for(c=0;!d&&c<svgweb.handlers.length;c++)if(svgweb.handlers[c].type=="script"&&svgweb.handlers[c].document._namespaces["_"+a]){d=true;break}if(!d)return document._createElementNS(a,b)}var e; -if(svgweb._allSVGNamespaces["_"+a])e=svgweb._allSVGNamespaces["_"+a];else for(c=0;c<svgweb.handlers.length;c++)if(svgweb.handlers[c].type=="script")if(e=svgweb.handlers[c].document._namespaces["_"+a])break;if(e=="xmlns"||!e)e=b.indexOf(":")!=-1?b.substring(0,b.indexOf(":")):null;return(new t(b,e,a))._getProxyNode()};l._createElement=function(a,b){if(b){if(b&&a.toLowerCase()=="object"){var c=document._createElement("object");c._onloadListeners=[];var d=c.addEventListener;(function(e,f){e.addEventListener= -function(h,g,k){if(h.toLowerCase()=="svgload")this._onloadListeners.push(g);else d?f(h,g,k):this.attachEvent("on"+h,g)}})(c,d);return c}}else return document._createElement(a)};l._createTextNode=function(a,b){if(b){var c=l._unattachedDoc,d;d=j?c.createElement("__text"):c.createElementNS(svgnsFake,"__text");d.appendChild(c.createTextNode(a));c=new i("#text",i.TEXT_NODE,null,null,d);c._nodeValue=a;c.ownerDocument=document;return c._getProxyNode()}else return document._createTextNode(a)};l._importNodeFunc= -function(a,b,c){switch(b.nodeType){case 1:var d=a.createElement(b.nodeName);if(b.attributes&&b.attributes.length>0)for(var e=0;e<b.attributes.length;e++){var f=b.attributes[e].nodeName,h=b.getAttribute(f);d.setAttribute(f,h)}if(c&&b.childNodes&&b.childNodes.length>0)for(e=0;e<b.childNodes.length;e++)d.appendChild(document._importNodeFunc(a,b.childNodes[e],c));return d;case 3:return a.createTextNode(b.nodeValue)}};l._createDocumentFragment=function(a){return a?(new C(document))._getProxyNode():document._createDocumentFragment()}; -l._encodeFlashData=function(a){a=a.toString().replace(/\\/g,"\\\\");return a=a.replace(/&/g,"__SVG__AMPERSAND")};q(l,{flashID:null,flash:null,start:function(){if(this.type=="script")this._handleScript();else this.type=="object"&&this._handleObject()},_stringToMsg:function(a){if(a==null||typeof a!="string")return a;var b={};a=a.split(/__SVG__DELIMIT/g);for(var c=0;c<a.length;c++){var d=a[c].indexOf(":"),e=a[c].substring(0,d);d=a[c].substring(d+1);if(d==="true")d=true;else if(d==="false")d=false;else if(d=== -"null")d=null;else if(d==="undefined")d=undefined;b[e]=d}return b},debugMsg:function(a){if(a===undefined)return"undefined";else if(a===null)return"null";var b=[],c;for(c in a)b.push(c+":"+a[c]);b=b.join(", ");return"{"+b+"}"},sendToFlash:function(a,b){var c=b.join("__SVG__DELIMIT");if(this._redrawManager.isSuspended())this._redrawManager.batch(a,c);else try{typeof this.flash[a]=="undefined"&&__flash__addCallback(this.flash,a);return this.flash[a](c)}catch(d){console.log("Call to flash but flash is not present! "+ -a+": "+this.debugMsg(c)+": "+d)}},onMessage:function(a){a=this._stringToMsg(a);if(a.type=="event")this._onEvent(a);else if(a.type=="log")this._onLog(a);else if(a.type=="script")this._onObjectScript(a);else if(a.type=="viewsource")this._onViewSource();else if(a.type=="viewsourceDynamic")this._onViewSourceDynamic(a);else a.type=="error"&&this._onFlashError(a)},fireOnLoad:function(a,b){svgweb._handleDone(a,b,this)},_handleScript:function(){this.document=new D(this._xml,this);this.document.documentElement= -new E(this._xml.documentElement,this._svgString,this._scriptNode,this)},_handleObject:function(){this._svgObject=new W(this._objNode,this);this._objNode=null},_onLog:function(a){console.log("FLASH: "+a.logString)},_onEvent:function(a){if(a.eventType.substr(0,5)=="mouse"||a.eventType=="click")this._onMouseEvent(a);else if(a.eventType.substr(0,3)=="key")this._onKeyboardEvent(a);else if(a.eventType=="onRenderingFinished")if(this.type=="script")this.document.documentElement._onRenderingFinished(a);else this.type== -"object"&&this._svgObject._onRenderingFinished(a);else if(a.eventType=="onFlashLoaded")if(this.type=="script")this.document.documentElement._onFlashLoaded(a);else this.type=="object"&&this._svgObject._onFlashLoaded(a)},_onMouseEvent:function(a){var b=this._getElementByGuid(a.targetGUID),c=this._getElementByGuid(a.currentTargetGUID),d={target:b._getProxyNode(),currentTarget:c._getProxyNode(),type:a.eventType,clientX:Math.round(new Number(a.stageX)),clientY:Math.round(new Number(a.stageY)),screenX:Math.round(new Number(a.stageX)), -screenY:Math.round(new Number(a.stageY)),altKey:a.altKey,ctrlKey:a.ctrlKey,shiftKey:a.shiftKey,button:0,preventDefault:function(){this.returnValue=false},stopPropagation:function(){}},e=c._listeners[a.eventType];if(e)for(var f=0;f<e.length;f++){var h=e[f].listener;typeof h=="object"?h.handleEvent.call(h,d):h.call(d.currentTarget,d)}if(a.scriptCode!=null)this.type=="object"?this.sandbox_eval(this._svgObject._sandboxedScript('var evt = { target: document.getElementById("'+b._getProxyNode().getAttribute("id")+ -'") ,\ncurrentTarget:document.getElementById("'+c._getProxyNode().getAttribute("id")+'") ,\ntype: "'+a.eventType+'",\nclientX: '+Math.round(new Number(a.stageX))+",\nclientY: "+Math.round(new Number(a.stageY))+",\nscreenX: "+Math.round(new Number(a.stageX))+",\nscreenY: "+Math.round(new Number(a.stageY))+",\naltKey: "+a.altKey+",\nctrlKey: "+a.ctrlKey+",\nshiftKey: "+a.shiftKey+",\nbutton: 0,\npreventDefault: function() { this.returnValue=false; },\nstopPropagation: function() { }\n};\n"+(";(function (evt) { "+ -a.scriptCode+"; }).call(evt.currentTarget, evt);\n"))):(new Function(a.scriptCode)).call(d.currentTarget,d)},_onKeyboardEvent:function(a){var b=this._getElementByGuid(a.targetGUID),c=this._getElementByGuid(a.currentTargetGUID);a={target:b._getProxyNode(),currentTarget:c._getProxyNode(),type:a.eventType,keyCode:Number(a.keyCode),altKey:a.altKey,ctrlKey:a.ctrlKey,shiftKey:a.shiftKey,preventDefault:function(){this.returnValue=false},stopPropagation:function(){}};if(!((N||aa)&&this.flash.getAttribute("wmode")== -"transparent")){if(this.type=="script")for(b=0;b<l._keyboardListeners.length;b++){c=l._keyboardListeners[b];c.__type==a.type&&c.call(a.currentTarget,a)}var d=this._keyboardListeners;for(b=0;b<d.length;b++){c=d[b];c.__type==a.type&&c.call(a.currentTarget,a)}}},addKeyboardListener:function(a,b,c){var d=function(e){return function(f){if(!f.preventDefault)f.preventDefault=function(){this.returnValue=false;f=null};typeof e=="object"?e.handleEvent.call(e,f):e(f)}}(b);d.__type=a;d.__listener=b;d.__useCapture= -c;this._keyboardListeners.push(d)},_getElementByGuid:function(a){var b=svgweb._guidLookup["_"+a];if(b)return b;var c;if(this.type=="script")c=v(this._xml,null,'//*[@__guid="'+a+'"]');else if(this.type=="object")c=v(this._svgObject._xml,null,'//*[@__guid="'+a+'"]');if(c.length)a=c[0];else return null;b=l._getNode(a,this);if(j&&b._fakeNode)b=b._fakeNode;b._attached=true;return b},_onFlashError:function(a){this._onLog(a);svgweb._fireFlashError("FLASH: "+a.logString);throw Error("FLASH: "+a.logString); -},_onObjectScript:function(a){this._svgObject._scriptsToExec.push(a.script)},_onViewSource:function(){var a=this._origSVG;a||(a="SVG Source Not Available");a=a.replace(/>/g,"&gt;").replace(/</g,"&lt;");var b=window.open("","_blank");b.document.write("<html><body><pre>"+a+"</pre></body></html>");b.document.close()},_onViewSourceDynamic:function(a){if(a.source.indexOf("<?xml")==-1)a.source='<?xml version="1.0"?>\n'+a.source;a.source=a.source.replace(/<svg:([^ ]+) /g,"<$1 ");a.source=a.source.replace(/<\/svg:([^>]+)>/g, -"</$1>");a.source=a.source.replace(/\n\s*<__text[^\/]*\/>/gm,"");a.source=a.source.replace(/<__text[^>]*>([^<]*)<\/__text>/gm,"$1");a.source=a.source.replace(/<__text[^>]*>/g,"");a.source=a.source.replace(/<\/__text>/g,"");a.source=a.source.replace(/\s*__guid="[^"]*"/g,"");a.source=a.source.replace(/ id="__svg__random__[^"]*"/g,"");a.source=a.source.replace(/>\n\n/g,">\n");a.source=a.source.replace(/>/g,"&gt;");a.source=a.source.replace(/</g,"&lt;");var b=window.open("","_blank");b.document.write("<body><pre>"+ -a.source+"</pre></body>");b.document.close()}});o._patchBrowserObjects=function(a,b){if(!b._getElementById){b._getElementById=b.getElementById;b.getElementById=function(d){var e=b._getElementById(d);if(e!==null)return e.parentNode===null?null:e;e=v(b,null,'//*[@id="'+d+'"]');if(e.length){d=e[0];d.namespaceURI!==null&&d.namespaceURI!=svgns&&d.namespaceURI!="http://www.w3.org/1999/xhtml"&&svgweb._exportID(d);return d}else return null};b._getElementsByTagNameNS=b.getElementsByTagNameNS;b.getElementsByTagNameNS= -function(d,e){var f=b._getElementsByTagNameNS(d,e);if(f!==null&&f.length!==0){if(d!==null&&d!="http://www.w3.org/1999/xhtml"&&d!=svgns){for(var h=0;h<f.length;h++){var g=f[h];svgweb._exportID(g)}return f}return f}if(f===null||f.length===0)f=r();var k;for(h=0;h<svgweb.handlers.length;h++){g=svgweb.handlers[h];if(g.type!="object")if(k=g._namespaces["_"+d]){k=v(b,g._svgRoot,k=="xmlns"?"//*[namespace-uri()='"+svgns+"' and name()='"+e+"']":k?"//"+k+":"+e:"//"+e,g._namespaces);if(k!==null&&k!==undefined&& -k.length>0){for(h=0;h<k.length;h++){g=k[h];g.namespaceURI!==null&&g.namespaceURI!=svgns&&g.namespaceURI!="http://www.w3.org/1999/xhtml"&&svgweb._exportID(g);f.push(g)}return f}}}return r()};b._createElementNS=b.createElementNS;b.createElementNS=function(d,e){if(d!=svgns||e!="svg")return b._createElementNS(d,e);var f=b._createElementNS(d,e);return f=o._patchAddEventListener(f)};b._createElement=b.createElement;b.createElement=function(d,e){if(!e)return b._createElement(d);if(e&&d=="object"){var f= -b._createElement(d);return f=o._patchAddEventListener(f)}else throw"Unknown createElement() call for SVG: "+d;};o._patchCloneNode();N&&o._patchStyleObject(a);var c=b.rootElement;c&&c.localName=="svg"&&c.namespaceURI==svgns&&o._patchSvgFileAddEventListener(a,b)}};o._patchCloneNode=function(){var a;a=typeof SVGSVGElement!="undefined"?SVGSVGElement.prototype:document.createElementNS(svgns,"svg").__proto__;if(!a._cloneNode){a._cloneNode=a.cloneNode;a.cloneNode=function(b){b=this._cloneNode(b);o._patchAddEventListener(b); -return b}}};o._patchAddEventListener=function(a){if(a.nodeName.toLowerCase()=="object"&&!o._objectAddEventListener)o._objectAddEventListener=a.addEventListener;a._addEventListener=a.nodeName.toLowerCase()=="object"?o._objectAddEventListener:a.addEventListener;a._onloadListeners=[];a.addEventListener=function(){return function(b,c,d){b.toLowerCase()=="svgload"?this._onloadListeners.push(c):a._addEventListener(b,c,d)}}();return a};o._patchStyleObject=function(a){var b=a.CSSStyleDeclaration;for(a=0;a< -s._allStyles.length;a++){var c=s._allStyles[a],d=c.replace(/([A-Z])/g,"-$1").toLowerCase();(function(e,f){b.prototype.__defineSetter__(e,function(h){return this.setProperty(f,h,null)});b.prototype.__defineGetter__(e,function(){return this.getPropertyValue(f)})})(c,d)}};o._patchSvgFileAddEventListener=function(a){var b=a.addEventListener;a.addEventListener=function(c,d,e){if(c.toLowerCase()!="svgload")b(c,d,e);else typeof d=="object"?d.handleEvent.call(d,undefined):d()};if(Object.defineProperty)Object.defineProperty(a, -"onsvgload",{get:function(){return this.__onsvgload},set:function(c){this.__onsvgload=c;this.addEventListener("SVGLoad",c,false)}});else{a.__defineGetter__("onsvgload",function(){return this.__onsvgload});a.__defineSetter__("onsvgload",function(c){this.__onsvgload=c;this.addEventListener("SVGLoad",c,false)})}};q(o,{start:function(){if(this.type=="object")this._handleObject();else this.type=="script"&&this._handleScript()},_handleScript:function(){this._namespaces=this._getNamespaces();this._processSVGScript(this._xml, -this._svgString,this._scriptNode);this._loaded=true;svgweb._handleDone(this.id,"script",this)},_handleObject:function(){this._objNode.style.overflow="hidden";this._objNode.style.visibility="visible";if(this._objNode._svgWindow)this._onObjectLoad(this._objNode._svgFunc,this._objNode._svgWindow);else{this._objNode._svgHandler=this;var a=this,b=function(){a._objNode.contentDocument&&a._onObjectLoad(a._objNode._svgFunc,a._objNode.contentDocument.defaultView)};if(this._objNode._addEventListener)this._objNode._addEventListener("load", -b,false);else if(w&&this._objNode.onload==null){var c=this._objNode.parentNode,d=this._objNode.nextSibling;c.removeChild(this._objNode);this._objNode.addEventListener("load",b,false);d?c.insertBefore(this._objNode,d):c.appendChild(this._objNode)}else this._objNode.addEventListener("load",b,false)}},_onObjectLoad:function(a,b){if(this._loaded)a&&a.apply(b);else{this._loaded=true;var c=b.document;o._patchBrowserObjects(b,c);var d=c.rootElement;d&&this._patchCurrentTranslate(d);b.svgns=svgns;b.xlinkns= -xlinkns;this._namespaces=this._getNamespaces(c);a&&a.apply(b);for(c=0;this._objNode._onloadListeners&&c<this._objNode._onloadListeners.length;c++){a=this._objNode._onloadListeners[c];a.apply(this._objNode)}svgweb._fireOnLoad()}},_processSVGScript:function(a,b,c){var d;try{d=document.importNode(a.documentElement,true)}catch(e){if(typeof DOMParser!="undefined"){a=(new DOMParser).parseFromString(b,"application/xml");d=document.adoptNode(a.documentElement,true)}}c.parentNode.replaceChild(d,c);this._svgRoot= -d;this._patchCurrentTranslate(this._svgRoot)},_getNamespaces:function(a){var b=[];a=a?a.documentElement.attributes:this._xml.documentElement.attributes;for(var c=0;c<a.length;c++){var d=a[c];if(/^xmlns:?(.*)$/.test(d.nodeName)){var e=d.nodeName.match(/^xmlns:?(.*)$/);e=e[1]?e[1]:"xmlns";d=d.nodeValue;if(!b["_"+e]){b["_"+e]=d;b["_"+d]=e;b.push(d)}}}return b},_patchCurrentTranslate:function(a){var b;if(typeof SVGRoot!="undefined")b=a.currentTranslate;else if(typeof a.currentTranslate.__proto__!="undefined")b= -a.currentTranslate.__proto__;else if(typeof SVGPoint!="undefined")b=SVGPoint.prototype;b.setX=function(c){return this.x=c};b.getX=function(){return this.x};b.setY=function(c){return this.y=c};b.getY=function(){return this.y};b.setXY=function(c,d){this.x=c;this.y=d}}});q(U,{isSuspended:function(){return this._ids.length>0},batch:function(a,b){this._batch.push(a+":"+b)},suspendRedraw:function(a,b){if(a===undefined)throw"Not enough arguments to suspendRedraw";if(b===undefined)b=true;var c=this._nextID; -this._nextID++;var d=this,e=window.setTimeout(function(){d.unsuspendRedraw(c);delete d._timeoutIDs["_"+c]},a);this._ids.push(c);this._timeoutIDs["_"+c]=e;if(b)try{typeof this._handler.flash.jsSuspendRedraw=="undefined"&&__flash__addCallback(this._handler.flash,"jsSuspendRedraw");this._handler.flash.jsSuspendRedraw()}catch(f){console.log("suspendRedraw exception: "+f)}return c},unsuspendRedraw:function(a,b){if(b===undefined)b=true;for(var c=-1,d=0;d<this._ids.length;d++)if(this._ids[d]==a){c=d;break}if(c== --1)throw"Unknown id passed to unsuspendRedraw: "+a;this._timeoutIDs["_"+a]!=undefined&&window.clearTimeout(this._timeoutIDs["_"+a]);this._ids.splice(c,1);delete this._timeoutIDs["_"+a];if(!(this.isSuspended()||this._batch.length==0&&!b)){c=this._batch.join("__SVG__METHOD__DELIMIT");this._batch=[];try{typeof this._handler.flash.jsUnsuspendRedrawAll=="undefined"&&__flash__addCallback(this._handler.flash,"jsUnsuspendRedrawAll");this._handler.flash.jsUnsuspendRedrawAll(c)}catch(e){console.log("unsuspendRedraw exception: "+ -e)}}},unsuspendRedrawAll:function(){for(var a=0;a<this._ids.length;a++)this.unsuspendRedraw(this._ids[a])},forceRedraw:function(){}});q(V,{hasFeature:function(){}});O(i,{ELEMENT_NODE:1,TEXT_NODE:3,DOCUMENT_NODE:9,DOCUMENT_FRAGMENT_NODE:11});q(i,{_listeners:null,_detachedListeners:null,insertBefore:function(a,b){if(this.nodeType!=i.ELEMENT_NODE&&this.nodeType!=i.DOCUMENT_FRAGMENT_NODE)throw"Not supported";a.parentNode&&a.parentNode.removeChild(a);a=this._getFakeNode(a);b=this._getFakeNode(b);var c= -a.nodeType==i.DOCUMENT_FRAGMENT_NODE,d;if(c)d=a._getChildNodes(true);if(c&&d.length==0){a._reset();return a._getProxyNode()}var e=this._findChild(b);if(e===null)throw Error("Invalid child passed to insertBefore");e=e.position;var f=[];if(c)for(c=0;c<d.length;c++)f.push(d[c]);else f.push(a);for(c=0;c<f.length;c++){this._nodeXML.insertBefore(this._importNode(f[c],false),b._nodeXML);this._processAppendedChildren(f[c],this,this._attached)}if(this._attached&&this._passThrough){d=l._encodeFlashData(B(a, -this._handler.document._namespaces));this._handler.sendToFlash("jsInsertBefore",[b._guid,this._guid,e,d])}if(!j)for(c=0;c<f.length;c++){this._defineChildNodeAccessor(this._childNodes.length);this._childNodes.length++}if(a.nodeType==i.DOCUMENT_FRAGMENT_NODE)a._reset();else a._attached=this._attached;return a._getProxyNode()},replaceChild:function(a,b){if(this.nodeType!=i.ELEMENT_NODE&&this.nodeType!=i.DOCUMENT_FRAGMENT_NODE)throw"Not supported";a.parentNode&&a.parentNode.removeChild(a);a=this._getFakeNode(a); -b=this._getFakeNode(b);var c=a.nodeType==i.DOCUMENT_FRAGMENT_NODE,d;if(c)d=a._getChildNodes(true);if(c&&d.length==0){a._reset();return a._getProxyNode()}var e=this._findChild(b);if(e===null)throw Error("Invalid child passed to replaceChild");e=e.position;this.removeChild(b);var f=[];if(c)for(c=0;c<d.length;c++)f.push(d[c]);else f.push(a);if(!j)for(c=0;c<f.length;c++){this._defineChildNodeAccessor(this._childNodes.length);this._childNodes.length++}d=false;if(e>=this._nodeXML.childNodes.length)d=true; -var h=e;for(c=0;c<f.length;c++){var g=this._importNode(f[c],false);if(d)this._nodeXML.appendChild(g);else{this._nodeXML.insertBefore(g,this._nodeXML.childNodes[h]);h++}}if(this._attached&&this._passThrough){f=l._encodeFlashData(B(a,this._handler.document._namespaces));this._handler.sendToFlash("jsAddChildAt",[this._guid,e,f])}this._processAppendedChildren(a,this,this._attached);b._setUnattached();svgweb._removedNodes.push(b._getProxyNode());if(a.nodeType==i.DOCUMENT_FRAGMENT_NODE)a._reset();else a._attached= -this._attached;return b._getProxyNode()},removeChild:function(a){if(this.nodeType!=i.ELEMENT_NODE&&this.nodeType!=i.DOCUMENT_FRAGMENT_NODE)throw"Not supported";if(a.nodeType!=i.ELEMENT_NODE&&a.nodeType!=i.TEXT_NODE)throw"Not supported";a=this._getFakeNode(a);var b=this._findChild(a);if(b===null)throw Error("Invalid child passed to removeChild");var c=b.position;this._nodeXML.removeChild(b.nodeXML);if(a.nodeType==i.ELEMENT_NODE)if((b=a._getId())&&this._attached)this._handler.document._nodeById["_"+ -b]=undefined;a._persistEventListeners();if(j)this._childNodes.splice(c,1);else{delete this._childNodes[this._childNodes.length-1];this._childNodes.length--}this._attached&&this._passThrough&&this._handler.sendToFlash("jsRemoveChild",[a._guid]);a._setUnattached();svgweb._removedNodes.push(a._getProxyNode());return a._getProxyNode()},appendChild:function(a){if(this.nodeType!=i.ELEMENT_NODE&&this.nodeType!=i.DOCUMENT_FRAGMENT_NODE)throw"Not supported";a.parentNode&&a.parentNode.removeChild(a);a=this._getFakeNode(a); -var b=a.nodeType==i.DOCUMENT_FRAGMENT_NODE,c;if(b)c=a._getChildNodes(true);if(b&&c.length==0){a._reset();return a._getProxyNode()}if(b)for(var d=0;d<c.length;d++)this._importNode(c[d]);else this._importNode(a);if(j)if(b)for(d=0;d<c.length;d++)this._childNodes.push(c[d]._htcNode);else this._childNodes.push(a._htcNode);else if(b)for(d=0;d<c.length;d++){this._defineChildNodeAccessor(this._childNodes.length);this._childNodes.length++}else{this._defineChildNodeAccessor(this._childNodes.length);this._childNodes.length++}this._attached&& -this._passThrough&&this._handler.sendToFlash("jsAppendChild",[this._guid,l._encodeFlashData(B(a,this._handler.document._namespaces))]);this._processAppendedChildren(a,this,this._attached);if(a.nodeType==i.DOCUMENT_FRAGMENT_NODE)a._reset();else a._attached=this._attached;return a._getProxyNode()},hasChildNodes:function(){return this._getChildNodes().length>0},isSupported:function(a,b){if(b=="2.0")if(a=="Core")return true;else{if(a=="Events"||a=="UIEvents"||a=="MouseEvents")return true}else return false}, -hasAttributes:function(){if(this.nodeType==i.ELEMENT_NODE)for(var a in this._attributes)if(!/^_xmlns/i.test(a))if(!(a=="_id"&&/^__svg__random__/.test(this._attributes[a])))if(!(a=="___guid"&&/^__guid/.test(this._attributes[a])))if(!(a=="___fakeTextNode"&&/^__fakeTextNode/.test(this._attributes[a])))if(/^_.*/.test(a)&&this._attributes.hasOwnProperty(a))return true;return false},addEventListener:function(a,b,c,d){if(this.nodeType!=i.ELEMENT_NODE&&this.nodeType!=i.TEXT_NODE&&(this.nodeType!=i.DOCUMENT_NODE|| -a.substring(0,3)!="key"))throw"Not supported";if(!d&&!this._attached)this._detachedListeners.push({type:a,listener:b,useCapture:c});else{if(this._listeners[a]===undefined)this._listeners[a]=[];this._listeners[a].push({type:a,listener:b,useCapture:c});this._listeners[a]["_"+b.toString()+":"+c]=b;a.substring(0,3)=="key"?this._handler.addKeyboardListener(a,b,c):this._handler.sendToFlash("jsAddEventListener",[this._guid,a])}},removeEventListener:function(a,b,c){if(this.nodeType!=i.ELEMENT_NODE&&this.nodeType!= -i.TEXT_NODE)throw"Not supported";var d;if(this._attached){if(this._listeners[a]){d=this._findListener(this._listeners[a],a,b,c);if(d!==null){this._listeners[a].splice(d,1);delete this._listeners[a]["_"+b.toString()+":"+c]}}if(a.substring(0,3)=="key"){d=this._findListener(this._keyboardListeners,a,b,c);d!==null&&this._keyboardListeners.splice(d,1)}this._handler.sendToFlash("jsRemoveEventListener",[this._guid,a])}else{d=this._findListener(this._detachedListeners,a,b,c);d!==null&&this._detachedListeners.splice(d, -1)}},getScreenCTM:function(){if(this._handler){var a=this._handler.sendToFlash("jsGetScreenCTM",[this._guid]);a=this._handler._stringToMsg(a);return new F(new Number(a.a),new Number(a.b),new Number(a.c),new Number(a.d),new Number(a.e),new Number(a.f),this._handler)}else return new F(1,0,0,1,0,0)},getCTM:function(){return this.getScreenCTM()},cloneNode:function(a){var b;if(this.nodeType==i.ELEMENT_NODE&&this.namespaceURI!=svgns)b=new t(this.nodeName,this.prefix,this.namespaceURI);else if(this.nodeType== -i.ELEMENT_NODE)b=document.createElementNS(this.namespaceURI,this.nodeName);else if(this.nodeType==i.TEXT_NODE)b=document.createTextNode(this._nodeValue,true);else if(this.nodeType==i.DOCUMENT_FRAGMENT_NODE)b=document.createDocumentFragment(true);else throw"cloneNode not supported for nodeType: "+this.nodeType;b=this._getFakeNode(b);for(var c=this._nodeXML.attributes,d=0;d<c.length;d++){var e=c.item(d);e.name.match(/([^:]+):?(.*)/);var f=e.namespaceURI;if(x&&e.name.indexOf("xmlns")!=-1)b._nodeXML.setAttribute(e.name, -e.nodeValue);else{var h=b._nodeXML.ownerDocument;f=j?h.createNode(2,e.name,f):h.createAttributeNS(f,e.name);f.nodeValue=e.nodeValue;j?b._nodeXML.setAttributeNode(f):b._nodeXML.setAttributeNodeNS(f)}}b._nodeXML.setAttribute("__guid",b._guid);if(j){c=this._htcNode.style;for(d=0;d<c.length;d++){e=c.item(d);f=c.getPropertyValue(e);try{b._htcNode.style.length++}catch(g){}b.style.length++;b.style._ignoreStyleChanges=true;b._htcNode.style[e]=f;b.style._ignoreStyleChanges=false}}b.nodeType==i.ELEMENT_NODE&& -b._importAttributes(b,b._nodeXML);if(a&&(b.nodeType==i.ELEMENT_NODE||b.nodeType==i.DOCUMENT_FRAGMENT_NODE)){a=this._getChildNodes();for(d=0;d<a.length;d++){c=a[d].cloneNode(true);b.appendChild(c)}}b.ownerDocument=this.ownerDocument;return b._getProxyNode()},toString:function(){return this.namespaceURI==svgns?"[_SVG"+this.localName.charAt(0).toUpperCase()+this.localName.substring(1)+"]":this.prefix?"["+this.prefix+":"+this.localName+"]":this.localName?"["+this.localName+"]":"["+this.nodeName+"]"}, -_addEvent:function(a,b,c){if(a.addEventListener)a.addEventListener(b,c,false);else if(a.attachEvent){a["e"+b+c]=c;a[b+c]=function(d,e,f){return function(){d["e"+e+f](window.event)}}(a,b,c);a.attachEvent("on"+b,a[b+c])}},nodeName:null,nodeType:null,ownerDocument:null,namespaceURI:null,localName:null,prefix:null,_getParentNode:function(){if(this.nodeType==i.DOCUMENT_NODE||this.nodeType==i.DOCUMENT_FRAGMENT_NODE)return null;if(this._attached&&this._handler&&this._getProxyNode()==this._handler.document.rootElement)if(this._handler.type== -"script")return this._handler.flash.parentNode;else if(this._handler.type=="object")return this._handler.document;var a=this._nodeXML.parentNode;if(a===null||a.nodeType==i.DOCUMENT_NODE)return null;a=l._getNode(a,this._handler);this._getFakeNode(a)._attached=this._attached;return a},_getFirstChild:function(){if(this.nodeType==i.TEXT_NODE)return null;var a=this._nodeXML.firstChild;if(a===null)return null;a=l._getNode(a,this._handler);this._getFakeNode(a)._attached=this._attached;return a},_getLastChild:function(){if(this.nodeType== -i.TEXT_NODE)return null;var a=this._nodeXML.lastChild;if(a===null)return null;a=l._getNode(a,this._handler);this._getFakeNode(a)._attached=this._attached;return a},_getPreviousSibling:function(){if(this.nodeType==i.DOCUMENT_NODE||this.nodeType==i.DOCUMENT_FRAGMENT_NODE)return null;if(this._attached&&this._handler&&this._getProxyNode()==this._handler.document.rootElement&&this._handler.type=="script"){var a=this._handler.flash.previousSibling;if(a&&a.nodeType==1&&a.className&&a.className.indexOf("embedssvg")!= --1){a=a.getAttribute("id").replace("_flash","");a=svgweb.handlers[a].document.documentElement;return a._getProxyNode()}else return a}a=this._nodeXML.previousSibling;if(a===null||a.nodeType==7)return null;a=l._getNode(a,this._handler);this._getFakeNode(a)._attached=this._attached;return a},_getNextSibling:function(){if(this.nodeType==i.DOCUMENT_NODE||this.nodeType==i.DOCUMENT_FRAGMENT_NODE)return null;if(this._attached&&this._handler&&this._getProxyNode()==this._handler.document.rootElement&&this._handler.type== -"script"){var a=this._handler.flash.nextSibling;if(a&&a.nodeType==1&&a.className&&a.className.indexOf("embedssvg")!=-1){a=this._handler.document._nodeById["_"+a.getAttribute("id").replace("_flash","")];return a._getProxyNode()}else return a}a=this._nodeXML.nextSibling;if(a===null)return null;a=l._getNode(a,this._handler);this._getFakeNode(a)._attached=this._attached;return a},_passThrough:true,_attached:false,_fake:true,_defineNodeAccessors:function(){this.__defineGetter__("parentNode",m(this,this._getParentNode)); -this.__defineGetter__("firstChild",m(this,this._getFirstChild));this.__defineGetter__("lastChild",m(this,this._getLastChild));this.__defineGetter__("previousSibling",m(this,this._getPreviousSibling));this.__defineGetter__("nextSibling",m(this,this._getNextSibling));this.__defineGetter__("childNodes",function(c){return function(){return c._childNodes}}(this));if(this.nodeName=="#text")this._childNodes.length=0;else{var a=this._nodeXML.childNodes;this._childNodes.length=a.length;for(var b=0;b<a.length;b++)this._defineChildNodeAccessor(b)}if(this.nodeType== -i.TEXT_NODE){this.__defineGetter__("data",function(c){return function(){return c._nodeValue}}(this));this.__defineSetter__("data",function(c){return function(d){return c._setNodeValue(d)}}(this));this.__defineGetter__("textContent",function(c){return function(){return c._nodeValue}}(this));this.__defineSetter__("textContent",function(c){return function(d){return c._setNodeValue(d)}}(this))}else this.__defineGetter__("textContent",function(){return function(){return""}}());this.__defineGetter__("nodeValue", -function(c){return function(){return c._nodeValue}}(this));this.__defineSetter__("nodeValue",function(c){return function(d){return c._setNodeValue(d)}}(this))},_defineChildNodeAccessor:function(a){var b=this;this._childNodes.__defineGetter__(a,function(){var c=l._getNode(b._nodeXML.childNodes[a],b._handler);c._attached=b._attached;return c})},_getChildNodes:function(a){if(!j)return this._childNodes;if(a===undefined)a=false;var b=r();if(this.nodeName=="#text")return b;if(this._nodeXML.childNodes.length== -this._childNodes.length&&!a)return this._childNodes;else{for(var c=0;c<this._nodeXML.childNodes.length;c++){var d=l._getNode(this._nodeXML.childNodes[c],this._handler);d._fakeNode._attached=this._attached;if(a)d=d._fakeNode;b.push(d)}return this._childNodes=b}},_createHTC:function(){if(Object.defineProperty){this._htcNode=document.createElement("div");this._htcNode.appendChild=function(c){return this._fakeNode.appendChild(c)};this._htcNode.addEventListener=function(c,d,e){return this._fakeNode.addEventListener(c, -d,e)};this._htcNode.beginElement=function(){return this._fakeNode.beginElement()};this._htcNode.beginElementAt=function(c){return this._fakeNode.beginElementAt(c)};this._htcNode.endElement=function(){return this._fakeNode.endElement()};this._htcNode.endElementAt=function(c){return this._fakeNode.endElementAt(c)};this._htcNode._cloneNode=this._htcNode.cloneNode;this._htcNode.cloneNode=function(c){return this._fakeNode.cloneNode(c)};this._htcNode.createSVGPoint=function(){return this._fakeNode.createSVGPoint()}; -this._htcNode.createSVGRect=function(){return this._fakeNode.createSVGRect()};this._htcNode.getAttribute=function(c){return this._fakeNode.getAttribute(c)};this._htcNode.getAttributeNS=function(c,d){return this._fakeNode.getAttributeNS(c,d)};this._htcNode.getScreenCTM=function(){return this._fakeNode.getScreenCTM()};this._htcNode.getBBox=function(){return this._fakeNode.getBBox()};this._htcNode.getCTM=function(){return this._fakeNode.getCTM()};this._htcNode.getElementsByTagNameNS=function(c,d){return this._fakeNode.getElementsByTagNameNS(c, -d)};this._htcNode.hasChildNodes=function(){return this._fakeNode.hasChildNodes()};this._htcNode.hasAttributes=function(){return this._fakeNode.hasAttributes()};this._htcNode.hasAttribute=function(c){return this._fakeNode.hasAttribute(c)};this._htcNode.hasAttributeNS=function(c,d){return this._fakeNode.hasAttributeNS(c,d)};this._htcNode.insertBefore=function(c,d){return this._fakeNode.insertBefore(c,d)};this._htcNode.isSupported=function(c,d){return this._fakeNode.isSupported(c,d)};this._htcNode.setAttribute= -function(c,d){return this._fakeNode.setAttribute(c,d)};this._htcNode.setAttributeNS=function(c,d,e){return this._fakeNode.setAttributeNS(c,d,e)};this._htcNode.removeChild=function(c){return this._fakeNode.removeChild(c)};this._htcNode.replaceChild=function(c,d){return this._fakeNode.replaceChild(c,d)};this._htcNode.removeAttribute=function(c){return this._fakeNode.removeAttribute(c)};this._htcNode.removeAttributeNS=function(c,d){return this._fakeNode.removeAttributeNS(c,d)};this._htcNode.removeEventListener= -function(c,d,e){return this._fakeNode.removeEventListener(c,d,e)};this._htcNode.get=function(c){return this._fakeNode.get(c)};this._htcNode.set=function(c,d){return this._fakeNode.set(c,d)};this._htcNode.create=function(c,d,e,f,h){return this._fakeNode.create(c,d,e,f,h)};this._htcNode.createChild=function(c,d,e,f,h){return this._fakeNode.createChild(c,d,e,f,h)};this._htcNode.addChild=function(c,d){return this._fakeNode.addChild(c,d)};this._htcNode._getNodeName=function(){return this._fakeNode.nodeName}; -this._htcNode._getNodeType=function(){return this._fakeNode.nodeType};this._htcNode._getLocalName=function(){return this._fakeNode.localName};this._htcNode._getPrefix=function(){return this._fakeNode.prefix};this._htcNode._getNamespaceURI=function(){return this._fakeNode.namespaceURI};this._htcNode._getChildNodes=function(){return this._fakeNode._getChildNodes()};this._htcNode._getParentNode=function(){return this._fakeNode._getParentNode()};this._htcNode._getFirstChild=function(){return this._fakeNode._getFirstChild()}; -this._htcNode._getLastChild=function(){return this._fakeNode._getLastChild()};this._htcNode._getPreviousSibling=function(){return this._fakeNode._getPreviousSibling()};this._htcNode._getNextSibling=function(){return this._fakeNode._getNextSibling()};this._htcNode._getNodeValue=function(){return this._fakeNode._nodeValue};this._htcNode._setNodeValue=function(c){return this._fakeNode._setNodeValue(c)};this._htcNode._getTextContent=function(){return this._fakeNode._getTextContent()};this._htcNode._setTextContent= -function(c){return this._fakeNode._setTextContent(c)};this._htcNode._getData=function(){return this._fakeNode._getData()};this._htcNode._setData=function(c){return this._fakeNode._setData(c)};this._htcNode._getOwnerDocument=function(){return this._fakeNode.ownerDocument};this._htcNode._getId=function(){return this._fakeNode._getId()};this._htcNode._setId=function(c){return this._fakeNode._setId(c)};this._htcNode._getX=function(){return this._fakeNode._getX()};this._htcNode._getY=function(){return this._fakeNode._getY()}; -this._htcNode._getWidth=function(){return this._fakeNode._getWidth()};this._htcNode._getHeight=function(){return this._fakeNode._getHeight()};this._htcNode._getCurrentScale=function(){return this._fakeNode._getCurrentScale()};this._htcNode._setCurrentScale=function(c){return this._fakeNode._setCurrentScale(c)};this._htcNode._getCurrentTranslate=function(){return this._fakeNode._getCurrentTranslate()};Object.defineProperty(this._htcNode,"currentScale",{get:function(){return this._getCurrentScale()}, -set:function(c){this._setCurrentScale(c)}});Object.defineProperty(this._htcNode,"currentTranslate",{get:function(){return this._getCurrentTranslate()},set:function(){}});Object.defineProperty(this._htcNode,"nodeName",{get:function(){return this._getNodeName()},set:function(){}});Object.defineProperty(this._htcNode,"nodeType",{get:function(){return this._getNodeType()},set:function(){}});Object.defineProperty(this._htcNode,"localName",{get:function(){return this._getLocalName()},set:function(){}}); -Object.defineProperty(this._htcNode,"prefix",{get:function(){return this._getPrefix()},set:function(){}});Object.defineProperty(this._htcNode,"namespaceURI",{get:function(){return this._getNamespaceURI()},set:function(){}});Object.defineProperty(this._htcNode,"childNodes",{get:function(){return this._getChildNodes()},set:function(){}});Object.defineProperty(this._htcNode,"parentNode",{get:function(){return this._getParentNode()},set:function(){}});Object.defineProperty(this._htcNode,"firstChild", -{get:function(){return this._getFirstChild()},set:function(){}});Object.defineProperty(this._htcNode,"id",{get:function(){return this._getId()},set:function(c){this._setId(c)}});Object.defineProperty(this._htcNode,"lastChild",{get:function(){return this._getLastChild()},set:function(){}});Object.defineProperty(this._htcNode,"previousSibling",{get:function(){return this._getPreviousSibling()},set:function(){}});Object.defineProperty(this._htcNode,"nextSibling",{get:function(){return this._getNextSibling()}, -set:function(){}});Object.defineProperty(this._htcNode,"nodeValue",{get:function(){return this._getNodeValue()},set:function(c){this._setNodeValue(c)}});Object.defineProperty(this._htcNode,"textContent",{get:function(){return this._getTextContent()},set:function(c){this._setTextContent(c)}});Object.defineProperty(this._htcNode,"data",{get:function(){return this._getData()},set:function(c){this._setData(c)}});Object.defineProperty(this._htcNode,"ownerDocument",{get:function(){return this._getOwnerDocument()}, -set:function(){}});Object.defineProperty(this._htcNode,"x",{get:function(){return this._getX()},set:function(){}});Object.defineProperty(this._htcNode,"y",{get:function(){return this._getY()},set:function(){}});Object.defineProperty(this._htcNode,"width",{get:function(){return this._getWidth()},set:function(){}});Object.defineProperty(this._htcNode,"height",{get:function(){return this._getHeight()},set:function(){}});this._htcNode._fakeNode=this;this._htcNode._handler=this._handler}else{if(!this._htcContainer){this._htcContainer= -document.getElementById("__htc_container");if(!this._htcContainer){var a=document.getElementsByTagName("body")[0],b=document.createElement("div");b.id="__htc_container";b.style.position="absolute";b.style.top="-5000px";b.style.left="-5000px";a.appendChild(b);this._htcContainer=b}}this._htcNode=document.createElement("svg:"+this.nodeName);this._htcNode._fakeNode=this;this._htcNode._handler=this._handler;this._htcContainer.appendChild(this._htcNode)}},_setNodeValue:function(a){if(this.nodeType!=i.TEXT_NODE)return a; -this._nodeValue=a;this._nodeXML.firstChild.nodeValue=a;if(this._attached&&this._passThrough){var b=l._encodeFlashData(a);this._handler.sendToFlash("jsSetText",[this._nodeXML.parentNode.getAttribute("__guid"),this._guid,b])}return a},_getFakeNode:function(a){a||(a=this);if(j&&a._fakeNode)a=a._fakeNode;return a},_processAppendedChildren:function(a,b,c){var d;b=a.nodeType==i.DOCUMENT_FRAGMENT_NODE?this._getFakeNode(a._getFirstChild()):a;if(c)d=this._handler._redrawManager.suspendRedraw(1E4,false);for(;b;){var e= -b._nodeXML;b._handler=this._handler;e=e.getAttribute("id");if(c&&b.nodeType==i.ELEMENT_NODE&&e)this._handler.document._nodeById["_"+e]=b;if(c){if(this._handler.type=="script")b.ownerDocument=document;else if(this._handler.type=="object")b.ownerDocument=this._handler.document;b._attached=true;for(e=0;e<b._detachedListeners.length;e++){var f=b._detachedListeners[e];f&&b.addEventListener(f.type,f.listener,f.useCapture,true)}b._detachedListeners=[]}if(e=(e=b._getChildNodes())&&e.length>0?e[0]:null){b= -e;if(j)b=b._fakeNode}for(;!e&&b;){if(b!=a)if(e=b._getNextSibling()){b=e;if(j)b=b._fakeNode;break}if(b==a)b=null;else{if((b=b._getParentNode())&&j)b=b._fakeNode;if(b&&(b.nodeType!=1||b._handler&&b._getProxyNode()==b._handler.document.rootElement))b=null}}}c&&this._handler._redrawManager.unsuspendRedraw(d,false)},_importNode:function(a,b){if(typeof b=="undefined")b=true;var c;c=this._attached?this._handler.document._xml:this._nodeXML.ownerDocument;c=typeof c.importNode=="undefined"?document._importNodeFunc(c, -a._nodeXML,true):c.importNode(a._nodeXML,true);b&&this._nodeXML.appendChild(c);a._importChildXML(c);return c},_importChildXML:function(a){this._nodeXML=a;a=this._getChildNodes();for(var b=0;b<a.length;b++){var c=a[b];if(j&&c._fakeNode)c=c._fakeNode;c._nodeXML=this._nodeXML.childNodes[b];c._importChildXML(this._nodeXML.childNodes[b])}},_findChild:function(a,b){if(b===undefined)b=false;for(var c={},d=0,e=0;e<this._nodeXML.childNodes.length;e++){var f=this._nodeXML.childNodes[e];if(!(f.nodeType!=i.ELEMENT_NODE&& -f.nodeType!=i.TEXT_NODE))if(!(b&&(f.getAttribute("__fakeTextNode")||f.nodeType==i.TEXT_NODE))){f.nodeType==i.ELEMENT_NODE&&d++;if(f.nodeType==i.ELEMENT_NODE&&f.getAttribute("__guid")==a._guid){c.position=b?d:e;c.nodeXML=f;return c}}}return null},_setUnattached:function(){for(var a=this._getChildNodes(),b=0;b<a.length;b++){var c=a[b];if(j)c=c._fakeNode;c._setUnattached()}this._attached=false;this._handler=null},_getProxyNode:function(){return j?this._htcNode:this},_createChildNodes:function(){var a; -if(j)a=r();else{a={};a.item=function(b){return b>=this.length?null:this[b]}}return a},_getTextContent:function(){return this.nodeType==i.TEXT_NODE?this._nodeValue:""},_setTextContent:function(a){return this.nodeType==i.TEXT_NODE?this._setNodeValue(a):""},_getData:function(){if(this.nodeType==i.TEXT_NODE)return this._nodeValue},_setData:function(a){if(this.nodeType==i.TEXT_NODE)return this._setNodeValue(a)},_createEmptyMethods:function(){if(this.nodeType==i.TEXT_NODE)this.getAttribute=this.getAttributeNS= -this.setAttribute=this.setAttributeNS=this.removeAttribute=this.removeAttributeNS=this.hasAttribute=this.hasAttributeNS=this.getElementsByTagNameNS=this._getId=this._setId=this._getX=this._getY=this._getWidth=this._getHeight=this._getCurrentScale=this._setCurrentScale=this._getCurrentTranslate=this.createSVGRect=this.createSVGPoint=function(){}},_persistEventListeners:function(){for(var a in this._listeners)for(var b=0;b<this._listeners[a].length;b++){var c=this._listeners[a][b];this._detachedListeners.push({type:c.type, -listener:c.listener,useCapture:c.useCapture})}this._listeners=[];a=this._getChildNodes();for(b=0;b<a.length;b++){c=a[b];if(c._fakeNode)c=c._fakeNode;c._persistEventListeners()}},_findListener:function(a,b,c,d){for(var e=0;e<a.length;e++){var f=a[e];if(f.listener==c&&f.type==b&&f.useCapture==d)return e}return null}});t.prototype=new i;q(t,{getAttribute:function(a){return this.getAttributeNS(null,a,true)},getAttributeNS:function(a,b,c){var d;if(a==null&&b=="__guid")return null;if(this._attached&&this._passThrough&& -!this._handler._redrawManager.isSuspended())d=this._handler.sendToFlash("jsGetAttribute",[this._guid,false,false,a,b,true]);else if(j){if(j)if(a)for(var e=0;e<this._nodeXML.attributes.length;e++){var f=this._nodeXML.attributes.item(e),h=(new String(f.name)).match(/[^:]*:?(.*)/)[1];if(f.namespaceURI&&f.namespaceURI==a&&h==b){d=f.nodeValue;break}}else d=this._nodeXML.getAttribute(b)}else d=this._nodeXML.getAttributeNS(a,b);if(a=="null"&&b=="id"&&!d)return"";if(d===undefined||d===null||/^[ ]*$/.test(d))return c? -null:"";return d},removeAttribute:function(a){this.removeAttributeNS(null,a)},removeAttributeNS:function(a,b){if(b=="id"&&this._attached&&this.namespaceURI==svgns){var c=this._handler.document,d=this._nodeXML.getAttribute("id");c._nodeById["_"+d]=undefined}var e;if(a)for(c=0;c<this._nodeXML.attributes.length;c++){d=this._nodeXML.attributes.item(c);var f=(new String(d.name)).match(/([^:]+:)?(.*)/),h;if(d.name.indexOf(":")!=-1){h=f[1];f=f[2]}else f=f[1];if(d.namespaceURI&&d.namespaceURI==a&&f==b){e= -d;break}}else e=this._nodeXML.getAttributeNode(b);if(e){this._nodeXML.removeAttributeNode(e);e=b;if(a)e=h+":"+b;this._attributes["_"+e]=undefined;this._attached&&this._passThrough&&this._handler.sendToFlash("jsRemoveAttribute",[this._guid,a,b])}else console.log("No attribute node found for: "+b+" in the namespace: "+a)},setAttribute:function(a,b){this.setAttributeNS(null,a,b)},setAttributeNS:function(a,b,c){if(c===null||typeof c=="undefined")c="";var d=b;if(b.indexOf(":")!=-1)d=b.split(":")[1];if(this._attached&& -b=="id"){var e=this._handler.document,f=this._nodeXML.getAttribute("id");e._nodeById["_"+f]=undefined;if(f===0||f)e._nodeById["_"+c]=this}if(x&&d=="style"&&this._nodeXML.parentNode!==null&&this._nodeXML.parentNode.nodeName=="clipPath"){e=this._nodeXML.nextSibling;f=this._nodeXML.parentNode;this._nodeXML.parentNode.removeChild(this._nodeXML);this._nodeXML.setAttribute("style",c);e?f.insertBefore(this._nodeXML,e):f.appendChild(this._nodeXML)}else if(a&&j){e=this._nodeXML.ownerDocument.createNode(2, -b,a);e.nodeValue=c;this._nodeXML.setAttributeNode(e)}else j?this._nodeXML.setAttribute(b,c):this._nodeXML.setAttributeNS(a,b,c);if(/^xmlns:?(.*)$/.test(b)){e=b.match(/^xmlns:?(.*)$/);e=e[1]?e[1]:"xmlns";f=c;if(!svgweb._allSVGNamespaces["_"+e]){svgweb._allSVGNamespaces["_"+e]=f;svgweb._allSVGNamespaces["_"+f]=e}}this._attributes["_"+b]=c;if(this._attached&&this._passThrough){b=l._encodeFlashData(c);this._handler.sendToFlash("jsSetAttribute",[this._guid,false,a,d,b])}if(this._handler&&this._handler.type== -"script"&&this._attached&&this._getProxyNode()==this._handler.document.rootElement&&(d=="width"||d=="height"))svgweb._onWindowResize()},hasAttribute:function(a){return this.hasAttributeNS(null,a)},hasAttributeNS:function(a,b){if(!a&&!j)return this._nodeXML.hasAttribute(b);else if(j){for(var c=null,d=0;d<this._nodeXML.attributes.length;d++){var e=this._nodeXML.attributes.item(d),f=(new String(e.name)).match(/(?:[^:]+:)?(.*)/)[1],h=e.namespaceURI;if(h=="")h=null;if(a==h&&f==b){c=e;break}}return c!= -null}else return this._nodeXML.hasAttributeNS(a,b)},getElementsByTagNameNS:function(a,b){var c=r(),d;if(a=="")a=null;if(a==svgns)a=svgnsFake;if(this._nodeXML.getElementsByTagNameNS)c=this._nodeXML.getElementsByTagNameNS(a,b);else{var e=null;if(this._attached)e=this._handler.document._namespaces;d="xmlns";if(a&&a!="*"&&e){d=e["_"+a];if(d===undefined)return r()}d=v(this._nodeXML.ownerDocument,this._nodeXML,a=="*"&&b=="*"?"//*[ancestor::*[@__guid = '"+this._guid+"']]":a=="*"?"//*[namespace-uri()='*' and local-name()='"+ -b+"' and ancestor::*[@__guid = '"+this._guid+"']]":b=="*"?"//*[namespace-uri()='"+a+"' and ancestor::*[@__guid = '"+this._guid+"']]":"//"+b+"[ancestor::*[@__guid = '"+this._guid+"']]| //*[namespace-uri()='"+a+"' and local-name()='"+b+"' and ancestor::*[@__guid = '"+this._guid+"']]",e);if(d!==null&&d!==undefined&&d.length>0)for(e=0;e<d.length;e++)d[e]!==this._nodeXML&&c.push(d[e])}if((a=="*"||a==svgnsFake)&&b=="*"){d=[];for(e=0;e<c.length;e++)c[e].nodeType==i.ELEMENT_NODE&&c[e].nodeName!="__text"&& -d.push(c[e]);c=d}d=r();for(e=0;e<c.length;e++){var f=l._getNode(c[e],this._handler);this._getFakeNode(f)._attached=this._attached;d.push(f)}return d},beginElement:function(){this.beginElementAt(0)},endElement:function(){this.endElementAt(0)},beginElementAt:function(a){this._attached&&this._passThrough&&this._handler.sendToFlash("jsBeginElementAt",[this._guid,a])},endElementAt:function(a){this._attached&&this._passThrough&&this._handler.sendToFlash("jsEndElementAt",[this._guid,a])},style:null,_setClassName:function(){}, -_getClassName:function(){},_setTransform:function(){},_getTransform:function(){},_getViewBox:function(){},_getId:function(){return this._attributes._id?this._attributes._id:""},_setId:function(a){return this.setAttribute("id",a)},ownerSVGElement:null,_getX:function(){var a=this._trimMeasurement(this.getAttribute("x"));return new H(new G(new Number(a)))},_getY:function(){var a=this._trimMeasurement(this.getAttribute("y"));return new H(new G(new Number(a)))},_getWidth:function(){var a=this._trimMeasurement(this.getAttribute("width")); -return new H(new G(new Number(a)))},_getHeight:function(){var a=this._trimMeasurement(this.getAttribute("height"));return new H(new G(new Number(a)))},_getCurrentScale:function(){return this._currentScale},_setCurrentScale:function(a){if(a!==this._currentScale){this._currentScale=a;this._handler.sendToFlash("jsSetCurrentScale",[a])}return a},_getCurrentTranslate:function(){return this._currentTranslate},createSVGPoint:function(){return new I(0,0)},createSVGRect:function(){return new M(0,0,0,0)},getBBox:function(){if(this._handler){var a= -this._handler.sendToFlash("jsGetBBox",[this._guid]);a=this._handler._stringToMsg(a);return new M(new Number(a.x),new Number(a.y),new Number(a.width),new Number(a.height))}else return new M(0,0,0,0)},_trimMeasurement:function(a){if(a!==null)a=a.replace(/[a-z]/gi,"");return a},_getInnerHTML:function(){},_setInnerHTML:function(){},_allEvents:["onfocusin","onfocusout","onactivate","onclick","onmousedown","onmouseup","onmouseover","onmousemove","onmouseout","onload","onunload","onabort","onerror","onresize", -"onscroll","onzoom","onbegin","onend","onrepeat"],_handleEvent:function(){},_prepareEvents:function(){},_attributes:null,_importAttributes:function(a,b){for(var c=0;c<b.attributes.length;c++){var d=b.attributes[c];this._attributes["_"+d.nodeName]=d.nodeValue}},_defineAccessors:function(){var a=this;if(this.nodeName=="svg"||this.nodeName=="use"){this.__defineGetter__("x",function(){return a._getX()});this.__defineGetter__("y",function(){return a._getY()});this.__defineGetter__("width",function(){return a._getWidth()}); -this.__defineGetter__("height",function(){return a._getHeight()})}if(this.nodeName=="svg"){this.__defineGetter__("currentTranslate",function(){return a._getCurrentTranslate()});this.__defineGetter__("currentScale",function(){return a._getCurrentScale()});this.__defineSetter__("currentScale",function(b){return a._setCurrentScale(b)})}this.__defineGetter__("id",m(this,this._getId));this.__defineSetter__("id",m(this,this._setId))},_defineAccessor:function(a,b){var c=this;this.__defineGetter__(a,function(){return c.getAttribute(a)}); -b&&this.__defineSetter__(a,function(d){return c.setAttribute(a,d)})}});C.prototype=new i;q(C,{_reset:function(){for(;this._nodeXML.firstChild;)this._nodeXML.removeChild(this._nodeXML.firstChild);this._childNodes=this._createChildNodes();j||this._defineNodeAccessors()}});s._allStyles=["font","fontFamily","fontSize","fontSizeAdjust","fontStretch","fontStyle","fontVariant","fontWeight","direction","letterSpacing","textDecoration","unicodeBidi","wordSpacing","clip","color","cursor","display","overflow", -"visibility","clipPath","clipRule","mask","opacity","enableBackground","filter","floodColor","floodOpacity","lightingColor","stopColor","stopOpacity","pointerEvents","colorInterpolation","colorInterpolationFilters","colorProfile","colorRendering","fill","fillOpacity","fillRule","imageRendering","marker","markerEnd","markerMid","markerStart","shapeRendering","stroke","strokeDasharray","strokeDashoffset","strokeLinecap","strokeLinejoin","strokeMiterlimit","strokeOpacity","strokeWidth","textRendering", -"alignmentBaseline","baselineShift","dominantBaseline","glyphOrientationHorizontal","glyphOrientationVertical","kerning","textAnchor","writingMode"];s._allRootStyles=["border","verticalAlign","backgroundColor","top","right","bottom","left","position","width","height","margin","marginTop","marginBottom","marginRight","marginLeft","padding","paddingTop","paddingBottom","paddingLeft","paddingRight","borderTopWidth","borderRightWidth","borderBottomWidth","borderLeftWidth","borderTopColor","borderRightColor", -"borderBottomColor","borderLeftColor","borderTopStyle","borderRightStyle","borderBottomStyle","borderLeftStyle","zIndex","overflowX","overflowY","float","clear"];q(s,{_ignoreStyleChanges:true,_setup:function(){this._normalizeStyle();if(j){var a=this._element._htcNode.style,b=this._fromStyleString();for(f=0;f<b.length;f++){h=this._toCamelCase(b[f].styleName);var c=b[f].styleValue;try{a[h]=c}catch(d){console.log("The following exception occurred setting style."+h+" on IE: "+(d.message||d))}}try{a.length= -0}catch(e){}this.length=0;a.item=m(this,this.item);a.setProperty=m(this,this.setProperty);a.getPropertyValue=m(this,this.getPropertyValue);this._changeListener=m(this,this._onPropertyChange);this._element._htcNode.attachEvent("onpropertychange",this._changeListener);if(j&&j>=8)return a.pixelBottom}else{for(var f=0;f<s._allStyles.length;f++){var h=s._allStyles[f];this._defineAccessor(h)}if(this._element._handler&&this._element._getProxyNode()==this._element._handler.document.rootElement)for(f=0;f< -s._allRootStyles.length;f++){h=s._allRootStyles[f];this._defineAccessor(h)}this.__defineGetter__("length",m(this,this._getLength))}},_defineAccessor:function(a){var b=this;this.__defineGetter__(a,function(){return b._getStyleAttribute(a)});this.__defineSetter__(a,function(c){return b._setStyleAttribute(a,c)})},_setStyleAttribute:function(a,b){for(var c=this._fromCamelCase(a),d=this._fromStyleString(),e=false,f=0;f<d.length;f++)if(d[f].styleName===c){d[f].styleValue=b;e=true;break}e||d.push({styleName:c, -styleValue:b});d=this._toStyleString(d);this._element._nodeXML.setAttribute("style",d);this._element._attributes._style=d;if(j){d=this._element._htcNode.style;if(!e){try{d.length++}catch(h){}this.length++}this._ignoreStyleChanges=true;d[a]=b;this._ignoreStyleChanges=false}if(this._element._attached&&this._element._passThrough){e=l._encodeFlashData(b);this._element._handler.sendToFlash("jsSetAttribute",[this._element._guid,true,null,c,e])}},_getStyleAttribute:function(a){a=this._fromCamelCase(a);if(this._element._attached&& -this._element._passThrough&&!this._element._handler._redrawManager.isSuspended())return this._element._handler.sendToFlash("jsGetAttribute",[this._element._guid,true,false,null,a,false]);else{for(var b=this._fromStyleString(),c=0;c<b.length;c++)if(b[c].styleName===a)return b[c].styleValue;return null}},_fromStyleString:function(){var a=this._element._nodeXML.getAttribute("style");if(a===null||a===undefined)return[];if(a.indexOf(";")==-1)a=[a];else{a=a.split(/\s*;\s*/);a[a.length-1]||(a=a.slice(0, -a.length-1))}for(var b=[],c=0;c<a.length;c++){var d=a[c].split(":");if(d.length==2){var e=d[0];d=d[1];e=e.replace(/^\s+/,"");d=d.replace(/^\s+/,"");b.push({styleName:e,styleValue:d})}}return b},_toStyleString:function(a){for(var b="",c=0;c<a.length;c++){b+=a[c].styleName+": ";b+=a[c].styleValue+";";if(c!=a.length-1)b+=" "}return b},_fromCamelCase:function(a){return a.replace(/([A-Z])/g,"-$1").toLowerCase()},_toCamelCase:function(a){if(a.indexOf("-")==-1)return a;var b="";a=a.split("-");b+=a[0];for(var c= -1;c<a.length;c++)b+=a[c].charAt(0).toUpperCase()+a[c].substring(1);return b},setProperty:function(a,b){this._setStyleAttribute(this._toCamelCase(a),b);return b},getPropertyValue:function(a){return this._getStyleAttribute(this._toCamelCase(a))},item:function(a){return this._fromStyleString()[a].styleName},_getLength:function(){return this._fromStyleString().length},_normalizeStyle:function(){if(this._element._nodeXML.getAttribute("style"))if(/[A-Z]/.test(this._element._nodeXML.getAttribute("style"))){for(var a= -this._fromStyleString(),b=0;b<a.length;b++){a[b].styleName=a[b].styleName.toLowerCase();if(a[b].styleValue.indexOf("url(")==-1)a[b].styleValue=a[b].styleValue.toLowerCase()}var c="";for(b=0;b<a.length;b++)c+=a[b].styleName+": "+a[b].styleValue+"; ";if(c.charAt(c.length-1)==" ")c=c.substring(0,c.length-1);this._element._passThrough=false;this._element.setAttribute("style",c);this._element._passThrough=true}},_onPropertyChange:function(){if(!this._ignoreStyleChanges){var a=window.event.propertyName; -if(a&&/^style\./.test(a)&&a!="style.length"){a=a.match(/^style\.(.*)$/)[1];this._setStyleAttribute(a,this._element._htcNode.style[a])}}}});q(W,{_scriptsToExec:null,_utf8encode:function(a){a=a.replace(/\r\n/g,"\n");for(var b="",c=0;c<a.length;c++){var d=a.charCodeAt(c);if(d<128)b+=String.fromCharCode(d);else{if(d>127&&d<2048)b+=escape(String.fromCharCode(d>>6|192));else{b+=escape(String.fromCharCode(d>>12|224));b+=escape(String.fromCharCode(d>>6&63|128))}b+=escape(String.fromCharCode(d&63|128))}}return b}, -_fetchURL:function(a,b,c){var d=ca();if(j){a=this._utf8encode(a);a+=a.indexOf("?")==-1?"?":"&";a+=(new Date).getTime()}d.onreadystatechange=function(){if(d.readyState==4){d.status==200?b(d.responseText):c(d.status+": "+d.statusText);d=null}};d.open("GET",a,true);d.send(null)},_fallback:function(a){console.log("onError (fallback), error="+a)},_loadHTC:function(){this._dummyNode=document.createElement("svg:__force__load");this._dummyNode._handler=this._handler;this._readyStateListener=m(this,this._onHTCLoaded); -this._dummyNode.attachEvent("onreadystatechange",this._readyStateListener);document.getElementsByTagName("head")[0].appendChild(this._dummyNode)},_onFlashLoaded:function(a){document.getElementById(this._handler.flashID)?this._onFlashLoadedNow(a):setTimeout(function(b,c){return function(){b._onFlashLoaded(c)}}(this,a),1)},_onFlashLoadedNow:function(){this._handler.flash=document.getElementById(this._handler.flashID);if(this._savedParams.length){for(var a=0;a<this._savedParams.length;a++)this._handler.flash.appendChild(this._savedParams[a]); -this._savedParams=null}this._handler.flash.top=this._handler.flash.parent=window;this._swfLoaded=true;if(!j||this._htcLoaded)this._onEverythingLoaded()},_onHTCLoaded:function(){document.getElementsByTagName("head")[0].removeChild(this._dummyNode);this._dummyNode.detachEvent("onreadystatechange",this._readyStateListener);this._dummyNode=null;this._htcLoaded=true;this._swfLoaded&&this._onEverythingLoaded()},_onEverythingLoaded:function(){var a=this._handler._inserter._determineSize();this._handler.sendToFlash("jsHandleLoad", -[this._getRelativeTo("object"),this._getRelativeTo("page"),a.pixelsWidth,a.pixelsHeight,false,this._svgString])},_onRenderingFinished:function(){this._handler.flash.style.visibility="visible";var a=this._xml.documentElement,b=a.getAttribute("id"),c=new E(a,null,null,this._handler),d=this._handler.document;d._attached=true;d.documentElement=c._getProxyNode();d.rootElement=c._getProxyNode();d._nodeById["_"+b]=c;j&&this._handler.flash.setAttribute("contentDocument",null);try{this._handler.flash.contentDocument= -d}catch(e){try{this._handler.flash.__contentDocument=d;var f=this;Object.defineProperty(this._handler.flash,"contentDocument",{get:function(){return f._handler.flash.__contentDocument},set:function(g){f._handler.flash.__contentDocument=g}})}catch(h){console.log("This exception occurred setting object contentDocument: "+(h.message||h))}}this._handler.window=new X(this._handler);d.defaultView=this._handler.window;l._patchFakeObjects(d.defaultView,d);if(a=a.getAttribute("onload")){a=";(function(){"+ -('var evt = { target: document.getElementById("'+c.getAttribute("id")+'") ,currentTarget: document.getElementById("'+c.getAttribute("id")+'") ,preventDefault: function() { this.returnValue=false; }};')+a+"}).apply(document.documentElement);";this._scriptsToExec.push(a)}c="";for(a=0;a<this._scriptsToExec.length;a++)c+=this._scriptsToExec[a]+"\n";this._executeScript(c);this._handler._loaded=true;this._handler.fireOnLoad(this._handler.id,"object")},_getRelativeTo:function(a){var b="";if((a=a=="object"? -this.url.replace(/[^:]*:\/\/[^\/]*/).match(/\/?[^\?\#]*/)[0]:window.location.pathname.toString())&&a.length>0&&a.indexOf("/")!=-1)b=a.replace(/\/([^\/]*)$/,"/");return b},_executeScript:function(a){var b=document.createElement("iframe");b.setAttribute("src","about:blank");b.style.position="absolute";b.style.top="-1000px";b.style.left="-1000px";document.getElementsByTagName("body")[0].appendChild(b);var c=b.contentDocument?b.contentDocument:b.contentWindow.document;b=b.contentWindow;this._handler.document.defaultView= -b;a=this._sandboxedScript(a);a=a+";if (__svgHandler) __svgHandler.sandbox_eval = "+(j?"window.eval;":"function(scriptCode) { return window.eval(scriptCode) };");if(w)setTimeout(function(d,e,f){return function(){e.eval.apply(e,[f]);d._fireOnload()}}(this._handler.window,b,a),1);else{c.write("<script>"+a+"<\/script>");c.close();this._handler.window._fireOnload()}},_sandboxedScript:function(a){var b="top.svgweb";if(!top.svgweb&&self.frameElement){if(!self.frameElement.id)self.frameElement.id=svgweb._generateID("__svg__random__", -"__iframe");b='top.document.getElementById("'+self.frameElement.id+'").contentWindow.svgweb'}a="var __svgHandler = "+b+'.handlers["'+this._handler.id+'"];\nwindow.svgns = "'+svgns+'";\nwindow.xlinkns = "'+xlinkns+'";\nwindow._timeoutIDs = [];\nwindow._setTimeout = window.setTimeout;\nwindow.setTimeout = \n (function() {\n return function(f, ms) {\n var timeID = window._setTimeout(f, ms);\n window._timeoutIDs.push(timeID);\n return timeID;\n };\n })();\nwindow._intervalIDs = [];\nwindow._setInterval = window.setInterval;\nwindow.setInterval = \n (function() {\n return function(f, ms) {\n var timeID = window._setInterval(f, ms);\n window._intervalIDs.push(timeID);\n return timeID;\n };\n })();\n\n\n'+ -a;a=a.replace(/top\.document/g,"top.DOCUMENT");a=a.replace(/top\.window/g,"top.WINDOW");a=a.replace(/(^|[^A-Za-z0-9_])document(\.|'|"|\,| |\))/g,"$1__svgHandler.document$2");a=a.replace(/window\.(location|addEventListener|onload|frameElement)/g,"__svgHandler.window.$1");a=a.replace(/top\.DOCUMENT/g,"top.document");return a=a.replace(/top\.WINDOW/g,"top.window")},_getPARAMs:function(a){for(var b=[],c=0;c<a.childNodes.length;c++){var d=a.childNodes[c];d.nodeName.toUpperCase()=="PARAM"&&b.push(d.cloneNode(false))}return b}}); -q(X,{addEventListener:function(a,b){if(a.toLowerCase()=="svgload"||a.toLowerCase()=="load")this._onloadListeners.push(b)},_fireOnload:function(){for(var a=0;a<this._onloadListeners.length;a++)try{this._onloadListeners[a]()}catch(b){console.log("The following exception occurred from an SVG onload listener: "+(b.message||b))}if(this.onload)try{this.onload()}catch(c){console.log("The following exception occurred from an SVG onload listener: "+(c.message||c))}},_createLocation:function(a){var b={},c= -this._handler._svgObject.url;a=a?a:window.location;if(/^data:/.test(c)){b.href=c;b.toString=function(){return this.href};return b}if(!/^http/.test(c))if(c.charAt(0)=="/")c=a.protocol+"//"+a.host+c;else if(a.pathname.indexOf("/")==-1)c=a.protocol+"//"+a.host+"/"+c;else{for(var d=a.pathname,e=d.length-1;e>=0;e--){if(d.charAt(e)=="/")break;d=d.substring(0,e)}c=a.protocol+"//"+a.host+d+c}c=c.match(/^(https?:)\/\/([^\/:]*):?([0-9]*)([^\?#]*)([^#]*)(#.*)?$/);b.protocol=c[1]?c[1]:a.href;if(b.protocol.charAt(b.protocol.length- -1)!=":")b.protocol+=":";b.hostname=c[2];b.port="";if(c[3])b.port=c[3];d=true;if(b.protocol!=a.protocol||b.hostname!=a.hostname||b.port&&b.port!=a.port)d=false;if(d&&!b.port)b.port=a.port;b.host=b.port?b.hostname+":"+b.port:b.hostname;b.pathname=c[4]?c[4]:"";b.search=c[5]?c[5]:"";b.hash=c[6]?c[6]:"";b.href=b.protocol+"//"+b.host+b.pathname+b.search+b.hash;b.toString=function(){return this.protocol+"//"+this.host+this.pathname+this.search+this.hash};return b}});q(L,{_setupFlash:function(){var a=this._determineSize(), -b=this._determineBackground(),c=this._determineStyle(),d=this._determineClassName(),e=this._determineCustomAttrs(),f;if(this._embedType=="script"){f=this._nodeXML.getAttribute("id");this._handler.flashID=f+"_flash"}else if(this._embedType=="object"){f=this._replaceMe.getAttribute("id");this._handler.flashID=f}this._insertFlash(this._createFlash(a,f,b,c,d,e))},_insertFlash:function(a){if(j){var b=this;window.setTimeout(function(){b._replaceMe.removeAttribute("id");b._replaceMe.removeAttribute("name"); -b._replaceMe.outerHTML=a;b=null},1)}else{var c;if(u){if(u)c=a}else{var d=document.createElement("div");d.innerHTML=a;c=d.childNodes[0];d.removeChild(c);for(d=0;d<c.childNodes.length;d++){var e=c.childNodes[d];if(e.nodeName.toUpperCase()=="EMBED"){c=e;break}}}this._replaceMe.parentNode.replaceChild(c,this._replaceMe);return c}},_determineSize:function(){var a=this._parentNode.clientWidth,b=this._parentNode.clientHeight;if(b==0)this.invalidParentHeight=true;if(a==0)a=this._parentNode.offsetWidth;if(!x){a-= -this._getMargin(this._parentNode,"margin-left");a-=this._getMargin(this._parentNode,"margin-right");b-=this._getMargin(this._parentNode,"margin-top");b-=this._getMargin(this._parentNode,"margin-bottom")}return isStandardsMode?this._getStandardsSize(a,b):this._getQuirksSize(a,b)},_getQuirksSize:function(a,b){var c,d;if(this._embedType=="script")for(c=this._parentNode;c&&c.style;){if(c.nodeName.toLowerCase()=="div")break;if(c.nodeName.toLowerCase()=="body"){if(this._nodeXML.getAttribute("style")&&this._nodeXML.getAttribute("style").indexOf("fixed")!= --1){b=window.innerHeight&&window.innerHeight>0?window.innerHeight:document.documentElement&&document.documentElement.clientHeight&&document.documentElement.clientHeight>0?document.documentElement.clientHeight:document.body.clientHeight;this.invalidParentHeight=false}else{this.invalidParentHeight=true;b=0}break}c=c.parentNode}var e=this._explicitWidth,f=this._explicitHeight,h=this._nodeXML.getAttribute("width");if(h&&h.indexOf("%")==-1)h=parseInt(h).toString();var g=this._nodeXML.getAttribute("height"); -if(g&&g.indexOf("%")==-1)g=parseInt(g).toString();if(e&&f){c=e.indexOf("%")!=-1?a*parseInt(e)/100:e;if(f.indexOf("%")!=-1)if(b>0)d=b*parseInt(f)/100;else console.log("SVGWeb: unhandled resize scenario.");else d=f;return{width:e,height:d,pixelsWidth:c,pixelsHeight:d,clipMode:this._nodeXML.getAttribute("viewBox")?"neither":"both"}}if(e){c=e.indexOf("%")!=-1?a*parseInt(e)/100:e;if(this._nodeXML.getAttribute("viewBox")){if(h&&h.indexOf("%")==-1&&g&&g.indexOf("%")==-1)f=c*(g/h);else{g=this._nodeXML.getAttribute("viewBox").split(/\s+|,/); -h=g[2];g=g[3];f=c*(g/h)}return{width:e,height:f,pixelsWidth:c,pixelsHeight:f,clipMode:"neither"}}else{f=h&&h.indexOf("%")==-1&&g&&g.indexOf("%")==-1?c*(g/h):g&&g.indexOf("%")==-1?g:150;return{width:e,height:f,pixelsWidth:c,pixelsHeight:f,clipMode:"both"}}}if(f){d=f.indexOf("%")!=-1?b*parseInt(f)/100:f;if(this._nodeXML.getAttribute("viewBox")){if(h&&h.indexOf("%")==-1&&g&&g.indexOf("%")==-1)e=d*(h/g);else{g=this._nodeXML.getAttribute("viewBox").split(/\s+|,/);h=g[2];g=g[3];e=d*(h/g)}return{width:e, -height:f,pixelsWidth:e,pixelsHeight:d,clipMode:"neither"}}else{if(h&&h.indexOf("%")==-1&&g&&g.indexOf("%")==-1)c=e=d*(h/g);else{e=h?h:"100%";c=e.indexOf("%")!=-1?a*parseInt(e)/100:e}return{width:e,height:f,pixelsWidth:c,pixelsHeight:d,clipMode:"both"}}}e=h?h:"100%";c=e.indexOf("%")!=-1?a*parseInt(e)/100:e;if(g&&g.indexOf("%")==-1){f=g;return{width:e,height:f,pixelsWidth:c,pixelsHeight:f,clipMode:this._nodeXML.getAttribute("viewBox")?"neither":"both"}}else if(this._nodeXML.getAttribute("viewBox")){if(this._embedType== -"script"&&(g==null||g.indexOf("%")!=-1)&&!this.invalidParentHeight){if(g==null)g="100%";d=b*parseInt(g)/100;return{width:e,height:d,pixelsWidth:c,pixelsHeight:d,clipMode:"neither"}}g=this._nodeXML.getAttribute("viewBox").split(/\s+|,/);h=g[2];g=g[3];f=c*(g/h);return{width:e,height:f,pixelsWidth:c,pixelsHeight:f,clipMode:"neither"}}else{f=150;return{width:e,height:f,pixelsWidth:c,pixelsHeight:f,clipMode:"both"}}},_getStandardsSize:function(a,b){var c,d,e=this._explicitWidth,f=this._explicitHeight, -h=this._nodeXML.getAttribute("width");if(h&&h.indexOf("%")==-1)h=parseInt(h).toString();var g=this._nodeXML.getAttribute("height");if(g&&g.indexOf("%")==-1)g=parseInt(g).toString();if(e&&!f)return this._getQuirksSize(a,b);if(!e&&!f)return this._getQuirksSize(a,b);if(!e&&f){e=h?h:"100%";c=e.indexOf("%")!=-1?a*parseInt(e)/100:e;if(f.indexOf("%")==-1){d=f;if(h&&h.indexOf("%")==-1&&g&&g.indexOf("%")==-1)c=e=f*(h/g);else if(this._nodeXML.getAttribute("viewBox")){viewBox=this._nodeXML.getAttribute("viewBox").split(/\s+|,/); -boxWidth=viewBox[2];boxHeight=viewBox[3];c=e=d*(boxWidth/boxHeight)}return{width:e,height:f,pixelsWidth:c,pixelsHeight:f,clipMode:this._nodeXML.getAttribute("viewBox")?"neither":"both"}}else{if(g&&g.indexOf("%")==-1)d=g;else if(this._nodeXML.getAttribute("viewBox")){viewBox=this._nodeXML.getAttribute("viewBox").split(/\s+|,/);boxWidth=viewBox[2];boxHeight=viewBox[3];d=c*(boxHeight/boxWidth)}else d=150;return{width:e,height:d,pixelsWidth:c,pixelsHeight:d,clipMode:this._nodeXML.getAttribute("viewBox")? -"neither":"both"}}}if(e&&f){c=e.indexOf("%")!=-1?a*parseInt(e)/100:e;if(f.indexOf("%")==-1)return{width:e,height:f,pixelsWidth:c,pixelsHeight:f,clipMode:this._nodeXML.getAttribute("viewBox")?"neither":"both"};else if(h&&h.indexOf("%")==-1&&g&&g.indexOf("%")==-1){d=c*(g/h);return{width:e,height:d,pixelsWidth:c,pixelsHeight:d,clipMode:"neither"}}else if(this.invalidParentHeight)if(this._nodeXML.getAttribute("viewBox")){viewBox=this._nodeXML.getAttribute("viewBox").split(/\s+|,/);boxWidth=viewBox[2]; -boxHeight=viewBox[3];f=c*(boxHeight/boxWidth);return{width:e,height:f,pixelsWidth:c,pixelsHeight:f,clipMode:"neither"}}else{d=g&&g.indexOf("%")==-1?g:150;return{width:e,height:d,pixelsWidth:c,pixelsHeight:d,clipMode:"both"}}else{d=b*parseInt(f)/100;return{width:e,height:d,pixelsWidth:c,pixelsHeight:d,clipMode:"neither"}}}},_getMargin:function(a,b){var c;if(a.currentStyle)c=parseInt(a.currentStyle[b]);else if(window.getComputedStyle)c=parseInt(document.defaultView.getComputedStyle(a,null).getPropertyValue(b)); -return c?c:0},_determineBackground:function(){var a=false,b=null,c=this._nodeXML.getAttribute("style");if(c&&c.indexOf("background-color")!=-1)if(c=c.match(/background\-color:\s*([^;]*)/))b=c[1];if(b===null)a=true;return{color:b,transparent:a}},_determineStyle:function(){var a=this._nodeXML.getAttribute("style");a||(a="");if(a.length>0&&a.charAt(a.length-1)!=";")a+=";";if(this._embedType=="script"&&a.indexOf("display:")==-1)a+="display: inline;";if(this._embedType=="script"&&a.indexOf("overflow:")== --1)a+="overflow: hidden;";return a},_determineClassName:function(){var a=this._nodeXML.getAttribute("class");return a?a+" embedssvg":"embedssvg"},_determineCustomAttrs:function(){var a=[];if(this._embedType=="object")for(var b=this._replaceMe,c=document._createElement("object"),d=0;d<b.attributes.length;d++){var e=b.attributes[d],f=e.nodeName;e=e.nodeValue;!e&&e!=="true"||c.getAttribute(f)||/^(id|name|width|height|data|class|style|codebase|type|_listeners|addEventListener|onload)$/.test(f)||a.push({attrName:f.toString(), -attrValue:e.toString()})}return a},_createFlash:function(a,b,c,d,e,f){b="uniqueId="+encodeURIComponent(b)+"&sourceType=string&clipMode="+a.clipMode+"&debug=true&svgId="+encodeURIComponent(b);var h;h=this._isXDomain?svgweb.xDomainURL+"svg.swf":svgweb.libraryPath+"svg.swf";var g=window.location.protocol;if(g.charAt(g.length-1)==":")g=g.substring(0,g.length-1);var k;if(u){k=document.createElement("embed");k.setAttribute("src",h);k.setAttribute("quality","high");c.color&&k.setAttribute("bgcolor",c.color); -c.transparent&&k.setAttribute("wmode","transparent");k.setAttribute("width",a.width);k.setAttribute("height",a.height);k.setAttribute("id",this._handler.flashID);k.setAttribute("name",this._handler.flashID);k.setAttribute("swLiveConnect","true");k.setAttribute("allowScriptAccess","always");k.setAttribute("type","application/x-shockwave-flash");k.setAttribute("FlashVars",b);k.setAttribute("pluginspage",g+"://www.macromedia.com/go/getflashplayer");k.setAttribute("style",d);k.setAttribute("className", -e);for(var n=0;n<f.length;n++)k.setAttribute(f[n].attrName,f[n].attrValue)}else{k="";for(n=0;n<f.length;n++)k+=" "+f[n].attrName+'="'+f[n].attrValue+'"';k='<object\n classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000"\n codebase="'+g+'://fpdownload.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=10,0,0,0"\n width="'+a.width+'"\n height="'+a.height+'"\n id="'+this._handler.flashID+'"\n name="'+this._handler.flashID+'"\n style="'+d+'"\n class="'+e+'"\n '+k+'\n>\n <param name="allowScriptAccess" value="always"></param>\n <param name="movie" value="'+ -h+'"></param>\n <param name="quality" value="high"></param>\n <param name="FlashVars" value="'+b+'"></param>\n '+(c.color?'<param name="bgcolor" value="'+c.color+'"></param>\n ':"")+(c.transparent?'<param name="wmode" value="transparent"></param>\n ':"")+'<embed src="'+h+'" quality="high" '+(c.color?'bgcolor="'+c.color+'" \n':"")+(c.transparent?'wmode="transparent" \n':"")+'width="'+a.width+'" height="'+a.height+'" id="'+this._handler.flashID+'" name="'+this._handler.flashID+'" swLiveConnect="true" allowScriptAccess="always" type="application/x-shockwave-flash" FlashVars="'+ -b+'" pluginspage="'+g+'://www.macromedia.com/go/getflashplayer" style="'+d+'"\n class="'+e+'"\n '+k+"\n /></object>"}return k}});E.prototype=new t;q(E,{suspendRedraw:function(a){return this._handler._redrawManager.suspendRedraw(a)},unsuspendRedraw:function(a){this._handler._redrawManager.unsuspendRedraw(a)},unsuspendRedrawAll:function(){this._handler._redrawManager.unsuspendRedrawAll()},forceRedraw:function(){},nearestViewportElement:null,farthestViewportElement:null,getTransformToElement:function(){}, -_onHTCLoaded:function(){this._htcNode.detachEvent("onreadystatechange",this._readyStateListener);this.style._ignoreStyleChanges=false;this._htcLoaded=true;this._swfLoaded&&this._onEverythingLoaded()},_onFlashLoaded:function(a){document.getElementById(this._handler.flashID)?this._onFlashLoadedNow(a):setTimeout(function(b,c){return function(){b._onFlashLoaded(c)}}(this,a),1)},_onFlashLoadedNow:function(){this._handler.flash=document.getElementById(this._handler.flashID);this._swfLoaded=true;if(!j|| -this._htcLoaded)this._onEverythingLoaded()},_onEverythingLoaded:function(){var a=this._handler._inserter._determineSize();this._handler.sendToFlash("jsHandleLoad",[this._getRelativeTo("object"),this._getRelativeTo("page"),a.pixelsWidth,a.pixelsHeight,true,this._svgString])},_onRenderingFinished:function(){if(this._handler.type=="script")this._handler.flash.documentElement=this._getProxyNode();if(this._attached)if(this._handler.type=="script")this.ownerDocument=document;else if(this._handler.type== -"object")this.ownerDocument=this._handler.document;this._handler.document.rootElement=this._getProxyNode();var a=this._nodeXML.getAttribute("id");this._handler._loaded=true;this._handler.fireOnLoad(a,"script")},_getRelativeTo:function(){var a="",b=window.location.pathname.toString();if(b&&b.length>0&&b.indexOf("/")!=-1)a=b.replace(/\/([^\/]*)$/,"/");return a},_addRedrawMethods:function(){this._htcNode.suspendRedraw=function(){return function(a){return this._fakeNode.suspendRedraw(a)}}();this._htcNode.unsuspendRedraw= -function(){return function(a){return this._fakeNode.unsuspendRedraw(a)}}();this._htcNode.unsuspendRedrawAll=function(){return function(){return this._fakeNode.unsuspendRedrawAll()}}();this._htcNode.forceRedraw=function(){return function(){return this._fakeNode.forceRedraw()}}()},_createCurrentTranslate:function(){return new I(0,0,true,m(this,this._updateCurrentTranslate))},_updateCurrentTranslate:function(a,b,c){a=="xy"?this._handler.sendToFlash("jsSetCurrentTranslate",["xy",b,c]):this._handler.sendToFlash("jsSetCurrentTranslate", -[a,b])}});D.prototype=new i;q(D,{_nodeById:null,implementation:null,documentElement:null,createElementNS:function(a,b){var c=this._namespaces["_"+a];if(c=="xmlns"||!c)c=b.indexOf(":")!=-1?b.substring(0,b.indexOf(":")):null;return(new t(b,c,a,undefined,this._handler))._getProxyNode()},createTextNode:function(a){var b=l._unattachedDoc,c;c=j?b.createElement("__text"):b.createElementNS(svgnsFake,"__text");c.appendChild(b.createTextNode(a));b=new i("#text",i.TEXT_NODE,null,null,c,this._handler);b._nodeValue= -a;b.ownerDocument=this;return b._getProxyNode()},createDocumentFragment:function(){return(new C(this))._getProxyNode()},getElementById:function(a){a=v(this._xml,null,'//*[@id="'+a+'"]');if(a.length)a=a[0];else return null;a=l._getNode(a,this._handler);this._getFakeNode(a)._attached=true;return a},getElementsByTagNameNS:function(a,b){if(this._handler.type=="script"&&!this._handler._loaded)return[];var c=this.rootElement.getElementsByTagNameNS(a,b);if(a==svgns&&b=="svg"){if(typeof c.push=="undefined"){var d= -c;c=[];for(var e=0;e<d.length;e++)c.push(d[e])}c.push(this.rootElement)}return c},_getNamespaces:function(){for(var a=[],b=this._xml.documentElement.attributes,c=0;c<b.length;c++){var d=b[c];if(/^xmlns:?(.*)$/.test(d.nodeName)){var e=d.nodeName.match(/^xmlns:?(.*)$/);e=e[1]?e[1]:"xmlns";d=d.nodeValue;if(!a["_"+e]){a["_"+e]=d;a["_"+d]=e;a.push(d)}}}return a}});q(F,{multiply:function(){},inverse:function(){var a=this._handler.sendToFlash("jsMatrixInvert",[this.a,this.b,this.c,this.d,this.e,this.f]); -a=this._handler._stringToMsg(a);return new F(new Number(a.a),new Number(a.b),new Number(a.c),new Number(a.d),new Number(a.e),new Number(a.f),this._handler)},translate:function(){},scale:function(){},scaleNonUniform:function(){},rotate:function(){},rotateFromVector:function(){},flipX:function(){},flipY:function(){},skewX:function(){},skewY:function(){}});O(Y,{SVG_TRANSFORM_UNKNOWN:0,SVG_TRANSFORM_MATRIX:1,SVG_TRANSFORM_TRANSLATE:2,SVG_TRANSFORM_SCALE:3,SVG_TRANSFORM_ROTATE:4,SVG_TRANSFORM_SKEWX:5, -SVG_TRANSFORM_SKEWY:6});q(Y,{type:null,matrix:null,angle:null,setMatrix:function(){},setTranslate:function(){},setScale:function(){},setRotate:function(){},setSkewX:function(){},setSkewY:function(){}});q(I,{matrixTransform:function(a){return new I(a.a*this.x+a.c*this.y+a.e,a.b*this.x+a.d*this.y+a.f,this._formalAccessors)}});window.svgweb=new R})(); From e10e1b6db4c971ff94291e089311c6b50e2f749c Mon Sep 17 00:00:00 2001 From: WrinklyNinja <wrinklyninja1@gmail.com> Date: Wed, 29 Jan 2014 10:07:01 +0000 Subject: [PATCH 07/36] Delete svg.swf Part of issue #90 work. Doing this via the web interface for a change. --- resources/svgweb/svg.swf | Bin 52363 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 resources/svgweb/svg.swf diff --git a/resources/svgweb/svg.swf b/resources/svgweb/svg.swf deleted file mode 100644 index 93695fd387467a79c705349e8f0df227b3b8436e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 52363 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 a_5b&;|J5E^|Gzmj?ukX$?|LTn`&$7yvC;Ve From 46f09906b62107fdbabf83a9744e6a280d57a009 Mon Sep 17 00:00:00 2001 From: WrinklyNinja <wrinklyninja1@gmail.com> Date: Wed, 29 Jan 2014 10:09:21 +0000 Subject: [PATCH 08/36] Updated polyfill.js Using revision b27f7a936e115788d88c8b7b125efc879e8c993a at the https://github.com/inexorabletash/polyfill repository. --- resources/polyfill.js | 507 ++++++++++++++++++++++-------------------- 1 file changed, 261 insertions(+), 246 deletions(-) diff --git a/resources/polyfill.js b/resources/polyfill.js index 350699dd..32f66143 100644 --- a/resources/polyfill.js +++ b/resources/polyfill.js @@ -18,7 +18,7 @@ // since the constructor property is destroyed. if (!Object.getPrototypeOf) { Object.getPrototypeOf = function (o) { - if (o !== Object(o)) { throw new TypeError("Object.getPrototypeOf called on non-object"); } + if (o !== Object(o)) { throw TypeError("Object.getPrototypeOf called on non-object"); } return o.__proto__ || o.constructor.prototype || Object.prototype; }; } @@ -26,7 +26,7 @@ if (!Object.getPrototypeOf) { // // ES5 15.2.3.3 Object.getOwnPropertyDescriptor ( O, P ) // if (typeof Object.getOwnPropertyDescriptor !== "function") { // Object.getOwnPropertyDescriptor = function (o, name) { -// if (o !== Object(o)) { throw new TypeError(); } +// if (o !== Object(o)) { throw TypeError(); } // if (o.hasOwnProperty(name)) { // return { // value: o[name], @@ -41,7 +41,7 @@ if (!Object.getPrototypeOf) { // ES5 15.2.3.4 Object.getOwnPropertyNames ( O ) if (typeof Object.getOwnPropertyNames !== "function") { Object.getOwnPropertyNames = function (o) { - if (o !== Object(o)) { throw new TypeError("Object.getOwnPropertyNames called on non-object"); } + if (o !== Object(o)) { throw TypeError("Object.getOwnPropertyNames called on non-object"); } var props = [], p; for (p in o) { if (Object.prototype.hasOwnProperty.call(o, p)) { @@ -55,15 +55,14 @@ if (typeof Object.getOwnPropertyNames !== "function") { // ES5 15.2.3.5 Object.create ( O [, Properties] ) if (typeof Object.create !== "function") { Object.create = function (prototype, properties) { - "use strict"; - if (typeof prototype !== "object") { throw new TypeError(); } + if (typeof prototype !== "object") { throw TypeError(); } /** @constructor */ function Ctor() {} Ctor.prototype = prototype; var o = new Ctor(); if (prototype) { o.constructor = Ctor; } - if (arguments.length > 1) { - if (properties !== Object(properties)) { throw new TypeError(); } + if (properties !== undefined) { + if (properties !== Object(properties)) { throw TypeError(); } Object.defineProperties(o, properties); } return o; @@ -77,12 +76,10 @@ if (typeof Object.create !== "function") { !(function () { try { Object.defineProperty({}, 'x', {}); return true; } catch (e) { return false; } } ())) { var orig = Object.defineProperty; Object.defineProperty = function (o, prop, desc) { - "use strict"; - // In IE8 try built-in implementation for defining properties on DOM prototypes. if (orig) { try { return orig(o, prop, desc); } catch (e) {} } - if (o !== Object(o)) { throw new TypeError("Object.defineProperty called on non-object"); } + if (o !== Object(o)) { throw TypeError("Object.defineProperty called on non-object"); } if (Object.prototype.__defineGetter__ && ('get' in desc)) { Object.prototype.__defineGetter__.call(o, prop, desc.get); } @@ -100,8 +97,7 @@ if (typeof Object.create !== "function") { // ES 15.2.3.7 Object.defineProperties ( O, Properties ) if (typeof Object.defineProperties !== "function") { Object.defineProperties = function (o, properties) { - "use strict"; - if (o !== Object(o)) { throw new TypeError("Object.defineProperties called on non-object"); } + if (o !== Object(o)) { throw TypeError("Object.defineProperties called on non-object"); } var name; for (name in properties) { if (Object.prototype.hasOwnProperty.call(properties, name)) { @@ -117,7 +113,7 @@ if (typeof Object.defineProperties !== "function") { // https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Object/keys if (!Object.keys) { Object.keys = function (o) { - if (o !== Object(o)) { throw new TypeError('Object.keys called on non-object'); } + if (o !== Object(o)) { throw TypeError('Object.keys called on non-object'); } var ret = [], p; for (p in o) { if (Object.prototype.hasOwnProperty.call(o, p)) { @@ -140,7 +136,7 @@ if (!Object.keys) { // https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Function/bind if (!Function.prototype.bind) { Function.prototype.bind = function (o) { - if (typeof this !== 'function') { throw new TypeError("Bind must be called on a function"); } + if (typeof this !== 'function') { throw TypeError("Bind must be called on a function"); } var slice = [].slice, args = slice.call(arguments, 1), self = this, @@ -182,9 +178,7 @@ Array.isArray = Array.isArray || function (o) { return Boolean(o && Object.proto // From https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/indexOf if (!Array.prototype.indexOf) { Array.prototype.indexOf = function (searchElement /*, fromIndex */) { - "use strict"; - - if (this === void 0 || this === null) { throw new TypeError(); } + if (this === void 0 || this === null) { throw TypeError(); } var t = Object(this); var len = t.length >>> 0; @@ -217,9 +211,7 @@ if (!Array.prototype.indexOf) { // From https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/lastIndexOf if (!Array.prototype.lastIndexOf) { Array.prototype.lastIndexOf = function (searchElement /*, fromIndex*/) { - "use strict"; - - if (this === void 0 || this === null) { throw new TypeError(); } + if (this === void 0 || this === null) { throw TypeError(); } var t = Object(this); var len = t.length >>> 0; @@ -250,13 +242,11 @@ if (!Array.prototype.lastIndexOf) { // From https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/every if (!Array.prototype.every) { Array.prototype.every = function (fun /*, thisp */) { - "use strict"; - - if (this === void 0 || this === null) { throw new TypeError(); } + if (this === void 0 || this === null) { throw TypeError(); } var t = Object(this); var len = t.length >>> 0; - if (typeof fun !== "function") { throw new TypeError(); } + if (typeof fun !== "function") { throw TypeError(); } var thisp = arguments[1], i; for (i = 0; i < len; i++) { @@ -273,13 +263,11 @@ if (!Array.prototype.every) { // From https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/some if (!Array.prototype.some) { Array.prototype.some = function (fun /*, thisp */) { - "use strict"; - - if (this === void 0 || this === null) { throw new TypeError(); } + if (this === void 0 || this === null) { throw TypeError(); } var t = Object(this); var len = t.length >>> 0; - if (typeof fun !== "function") { throw new TypeError(); } + if (typeof fun !== "function") { throw TypeError(); } var thisp = arguments[1], i; for (i = 0; i < len; i++) { @@ -296,13 +284,11 @@ if (!Array.prototype.some) { // From https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/forEach if (!Array.prototype.forEach) { Array.prototype.forEach = function (fun /*, thisp */) { - "use strict"; - - if (this === void 0 || this === null) { throw new TypeError(); } + if (this === void 0 || this === null) { throw TypeError(); } var t = Object(this); var len = t.length >>> 0; - if (typeof fun !== "function") { throw new TypeError(); } + if (typeof fun !== "function") { throw TypeError(); } var thisp = arguments[1], i; for (i = 0; i < len; i++) { @@ -318,13 +304,11 @@ if (!Array.prototype.forEach) { // From https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/Map if (!Array.prototype.map) { Array.prototype.map = function (fun /*, thisp */) { - "use strict"; - - if (this === void 0 || this === null) { throw new TypeError(); } + if (this === void 0 || this === null) { throw TypeError(); } var t = Object(this); var len = t.length >>> 0; - if (typeof fun !== "function") { throw new TypeError(); } + if (typeof fun !== "function") { throw TypeError(); } var res = []; res.length = len; var thisp = arguments[1], i; @@ -342,13 +326,11 @@ if (!Array.prototype.map) { // From https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/Filter if (!Array.prototype.filter) { Array.prototype.filter = function (fun /*, thisp */) { - "use strict"; - - if (this === void 0 || this === null) { throw new TypeError(); } + if (this === void 0 || this === null) { throw TypeError(); } var t = Object(this); var len = t.length >>> 0; - if (typeof fun !== "function") { throw new TypeError(); } + if (typeof fun !== "function") { throw TypeError(); } var res = []; var thisp = arguments[1], i; @@ -370,16 +352,14 @@ if (!Array.prototype.filter) { // From https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/Reduce if (!Array.prototype.reduce) { Array.prototype.reduce = function (fun /*, initialValue */) { - "use strict"; - - if (this === void 0 || this === null) { throw new TypeError(); } + if (this === void 0 || this === null) { throw TypeError(); } var t = Object(this); var len = t.length >>> 0; - if (typeof fun !== "function") { throw new TypeError(); } + if (typeof fun !== "function") { throw TypeError(); } // no value to return if no initial value and an empty array - if (len === 0 && arguments.length === 1) { throw new TypeError(); } + if (len === 0 && arguments.length === 1) { throw TypeError(); } var k = 0; var accumulator; @@ -393,7 +373,7 @@ if (!Array.prototype.reduce) { } // if array contains no values, no initial value to return - if (++k >= len) { throw new TypeError(); } + if (++k >= len) { throw TypeError(); } } while (true); } @@ -414,16 +394,14 @@ if (!Array.prototype.reduce) { // From https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/ReduceRight if (!Array.prototype.reduceRight) { Array.prototype.reduceRight = function (callbackfn /*, initialValue */) { - "use strict"; - - if (this === void 0 || this === null) { throw new TypeError(); } + if (this === void 0 || this === null) { throw TypeError(); } var t = Object(this); var len = t.length >>> 0; - if (typeof callbackfn !== "function") { throw new TypeError(); } + if (typeof callbackfn !== "function") { throw TypeError(); } // no value to return if no initial value, empty array - if (len === 0 && arguments.length === 1) { throw new TypeError(); } + if (len === 0 && arguments.length === 1) { throw TypeError(); } var k = len - 1; var accumulator; @@ -437,7 +415,7 @@ if (!Array.prototype.reduceRight) { } // if array contains no values, no initial value to return - if (--k < 0) { throw new TypeError(); } + if (--k < 0) { throw TypeError(); } } while (true); } @@ -510,54 +488,13 @@ if (!Date.prototype.toISOString) { pad3(this.getUTCMilliseconds()) + 'Z'; }; } - - -//---------------------------------------------------------------------- -// -// Non-standard JavaScript (Mozilla) functions -// -//---------------------------------------------------------------------- - -(function () { - // JavaScript 1.8.1 - String.prototype.trimLeft = String.prototype.trimLeft || function () { - return String(this).replace(/^\s+/, ''); - }; - - // JavaScript 1.8.1 - String.prototype.trimRight = String.prototype.trimRight || function () { - return String(this).replace(/\s+$/, ''); - }; - - // JavaScript 1.? - var ESCAPES = { - //'\x00': '\\0', Special case in FF3.6, removed by FF10 - '\b': '\\b', - '\t': '\\t', - '\n': '\\n', - '\f': '\\f', - '\r': '\\r', - '"' : '\\"', - '\\': '\\\\' - }; - String.prototype.quote = String.prototype.quote || function() { - return '"' + String(this).replace(/[\x00-\x1F"\\\x7F-\uFFFF]/g, function(c) { - if (Object.prototype.hasOwnProperty.call(ESCAPES, c)) { - return ESCAPES[c]; - } else if (c.charCodeAt(0) <= 0xFF) { - return '\\x' + ('00' + c.charCodeAt(0).toString(16).toUpperCase()).slice(-2); - } else { - return '\\u' + ('0000' + c.charCodeAt(0).toString(16).toUpperCase()).slice(-4); - } - }) + '"'; - }; -}()); - - //---------------------------------------------------------------------- // // Browser Polyfills // +// This assumes ES5 or ES3 + es5.js +// (polyfill.js is es5.js + web.js for convenience) +// //---------------------------------------------------------------------- if ('window' in this && 'document' in this) { @@ -581,7 +518,7 @@ if ('window' in this && 'document' in this) { try { return new ActiveXObject("Msxml2.XMLHTTP.6.0"); } catch (e1) { } try { return new ActiveXObject("Msxml2.XMLHTTP.3.0"); } catch (e2) { } try { return new ActiveXObject("Msxml2.XMLHTTP"); } catch (e3) { } - throw new Error("This browser does not support XMLHttpRequest."); + throw Error("This browser does not support XMLHttpRequest."); }; XMLHttpRequest.UNSENT = 0; XMLHttpRequest.OPENED = 1; @@ -589,6 +526,43 @@ if ('window' in this && 'document' in this) { XMLHttpRequest.LOADING = 3; XMLHttpRequest.DONE = 4; + // + // FormData (http://www.w3.org/TR/XMLHttpRequest2/#interface-formdata) + // + if (!('FormData' in window)) { + (function(global) { + function FormData(form) { + this._data = []; + if (!form) return; + for (var i = 0; i < form.elements.length; ++i) + this.append(form.elements[i].name, form.elements[i].value); + } + + FormData.prototype.append = function(name, value /*, filename */) { + if ('Blob' in global && value instanceof global.Blob) throw TypeError("Blob not supported"); + name = String(name); + this._data.push([name, value]); + }; + + FormData.prototype.toString = function() { + return this._data.map(function(pair) { + return encodeURIComponent(pair[0]) + '=' + encodeURIComponent(pair[1]); + }).join('&'); + }; + + global.FormData = FormData; + var send = global.XMLHttpRequest.prototype.send; + global.XMLHttpRequest.prototype.send = function(body) { + if (body instanceof FormData) { + this.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded'); + arguments[0] = body.toString(); + } + return send.apply(this, arguments); + }; + }(this)); + } + + //---------------------------------------------------------------------- // // Performance @@ -597,7 +571,7 @@ if ('window' in this && 'document' in this) { // requestAnimationFrame // http://www.w3.org/TR/animation-timing/ - (function() { + (function(global) { var TARGET_FPS = 60, requests = Object.create(null), raf_handle = 1, @@ -626,7 +600,7 @@ if ('window' in this && 'document' in this) { requests[cb_handle] = {callback: callback, element: element}; if (timeout_handle === -1) { - timeout_handle = window.setTimeout(onFrameTimer, 1000 / TARGET_FPS); + timeout_handle = global.setTimeout(onFrameTimer, 1000 / TARGET_FPS); } return cb_handle; @@ -636,53 +610,53 @@ if ('window' in this && 'document' in this) { delete requests[handle]; if (Object.keys(requests).length === 0) { - window.clearTimeout(timeout_handle); + global.clearTimeout(timeout_handle); timeout_handle = -1; } } - window.requestAnimationFrame = - window.requestAnimationFrame || - window.webkitRequestAnimationFrame || - window.mozRequestAnimationFrame || - window.oRequestAnimationFrame || - window.msRequestAnimationFrame || + global.requestAnimationFrame = + global.requestAnimationFrame || + global.webkitRequestAnimationFrame || + global.mozRequestAnimationFrame || + global.oRequestAnimationFrame || + global.msRequestAnimationFrame || requestAnimationFrame; // NOTE: Older versions of the spec called this "cancelRequestAnimationFrame" - window.cancelAnimationFrame = window.cancelRequestAnimationFrame = - window.cancelAnimationFrame || window.cancelRequestAnimationFrame || - window.webkitCancelAnimationFrame || window.webkitCancelRequestAnimationFrame || - window.mozCancelAnimationFrame || window.mozCancelRequestAnimationFrame || - window.oCancelAnimationFrame || window.oCancelRequestAnimationFrame || - window.msCancelAnimationFrame || window.msCancelRequestAnimationFrame || + global.cancelAnimationFrame = global.cancelRequestAnimationFrame = + global.cancelAnimationFrame || global.cancelRequestAnimationFrame || + global.webkitCancelAnimationFrame || global.webkitCancelRequestAnimationFrame || + global.mozCancelAnimationFrame || global.mozCancelRequestAnimationFrame || + global.oCancelAnimationFrame || global.oCancelRequestAnimationFrame || + global.msCancelAnimationFrame || global.msCancelRequestAnimationFrame || cancelAnimationFrame; - }()); + }(this)); // setImmediate // https://dvcs.w3.org/hg/webperf/raw-file/tip/specs/setImmediate/Overview.html - (function () { - function setImmediate(callback, args) { - var params = [].slice.call(arguments, 1), i; - return window.setTimeout(function() { + (function (global) { + function setImmediate(callback/*, args*/) { + var params = [].slice.call(arguments, 1); + return global.setTimeout(function() { callback.apply(null, params); }, 0); } function clearImmediate(handle) { - window.clearTimeout(handle); + global.clearTimeout(handle); } - window.setImmediate = - window.setImmediate || - window.msSetImmediate || + global.setImmediate = + global.setImmediate || + global.msSetImmediate || setImmediate; - window.clearImmediate = - window.clearImmediate || - window.msClearImmediate || + global.clearImmediate = + global.clearImmediate || + global.msClearImmediate || clearImmediate; - } ()); + }(this)); //---------------------------------------------------------------------- // @@ -728,10 +702,18 @@ if ('window' in this && 'document' in this) { }; } + // Fix for IE8-'s Element.getBoundingClientRect() + if ('TextRectangle' in this && !('width' in TextRectangle.prototype)) { + Object.defineProperties(TextRectangle.prototype, { + 'width': { get: function() { return this.right - this.left; } }, + 'height': { get: function() { return this.bottom - this.top; } } + }); + } + // // DOM Enumerations (http://www.w3.org/TR/DOM-Level-2-Core/) // - window.Node = window.Node || function Node() { throw new TypeError("Illegal constructor"); }; + window.Node = window.Node || function Node() { throw TypeError("Illegal constructor"); }; Node.ELEMENT_NODE = 1; Node.ATTRIBUTE_NODE = 2; Node.TEXT_NODE = 3; @@ -745,7 +727,7 @@ if ('window' in this && 'document' in this) { Node.DOCUMENT_FRAGMENT_NODE = 11; Node.NOTATION_NODE = 12; - window.DOMException = window.DOMException || function DOMException() { throw new TypeError("Illegal constructor"); }; + window.DOMException = window.DOMException || function DOMException() { throw TypeError("Illegal constructor"); }; DOMException.INDEX_SIZE_ERR = 1; DOMException.DOMSTRING_SIZE_ERR = 2; DOMException.HIERARCHY_REQUEST_ERR = 3; @@ -777,108 +759,96 @@ if ('window' in this && 'document' in this) { Event.AT_TARGET = 2; Event.BUBBLING_PHASE = 3; - Object.defineProperty(Event.prototype, 'CAPTURING_PHASE', { get: function() { return 1; } }); - Object.defineProperty(Event.prototype, 'AT_TARGET', { get: function() { return 2; } }); - Object.defineProperty(Event.prototype, 'BUBBLING_HASE', { get: function() { return 3; } }); - - Object.defineProperty(Event.prototype, 'target', { - get: function() { - return this.srcElement; - } + Object.defineProperties(Event.prototype, { + CAPTURING_PHASE: { get: function() { return 1; } }, + AT_TARGET: { get: function() { return 2; } }, + BUBBLING_HASE: { get: function() { return 3; } }, + target: { + get: function() { + return this.srcElement; + }}, + currentTarget: { + get: function() { + return this._currentTarget; + }}, + eventPhase: { + get: function() { + return (this.srcElement === this.currentTarget) ? Event.AT_TARGET : Event.BUBBLING_PHASE; + }}, + bubbles: { + get: function() { + switch (this.type) { + // Mouse + case 'click': + case 'dblclick': + case 'mousedown': + case 'mouseup': + case 'mouseover': + case 'mousemove': + case 'mouseout': + case 'mousewheel': + // Keyboard + case 'keydown': + case 'keypress': + case 'keyup': + // Frame/Object + case 'resize': + case 'scroll': + // Form + case 'select': + case 'change': + case 'submit': + case 'reset': + return true; + } + return false; + }}, + cancelable: { + get: function() { + switch (this.type) { + // Mouse + case 'click': + case 'dblclick': + case 'mousedown': + case 'mouseup': + case 'mouseover': + case 'mouseout': + case 'mousewheel': + // Keyboard + case 'keydown': + case 'keypress': + case 'keyup': + // Form + case 'submit': + return true; + } + return false; + }}, + timeStamp: { + get: function() { + return this._timeStamp; + }}, + stopPropagation: { + value: function() { + this.cancelBubble = true; + }}, + preventDefault: { + value: function() { + this.returnValue = false; + }}, + defaultPrevented: { + get: function() { + return this.returnValue === false; + }} }); - Object.defineProperty(Event.prototype, 'currentTarget', { - get: function() { - return this._currentTarget; - } - }); - - Object.defineProperty(Event.prototype, 'eventPhase', { - get: function() { - return (this.srcElement === this.currentTarget) ? Event.AT_TARGET : Event.BUBBLING_PHASE; - } - }); - - Object.defineProperty(Event.prototype, 'bubbles', { - get: function() { - switch (this.type) { - // Mouse - case 'click': - case 'dblclick': - case 'mousedown': - case 'mouseup': - case 'mouseover': - case 'mousemove': - case 'mouseout': - case 'mousewheel': - // Keyboard - case 'keydown': - case 'keypress': - case 'keyup': - // Frame/Object - case 'resize': - case 'scroll': - // Form - case 'select': - case 'change': - case 'submit': - case 'reset': - return true; - } - return false; - } - }); - - Object.defineProperty(Event.prototype, 'cancelable', { - get: function() { - switch (this.type) { - // Mouse - case 'click': - case 'dblclick': - case 'mousedown': - case 'mouseup': - case 'mouseover': - case 'mouseout': - case 'mousewheel': - // Keyboard - case 'keydown': - case 'keypress': - case 'keyup': - // Form - case 'submit': - return true; - } - return false; - } - }); - - Object.defineProperty(Event.prototype, 'timeStamp', { - get: function() { - return this._timeStamp; - } - }); - - Event.prototype.stopPropagation = function() { - this.cancelBubble = true; - }; - - Event.prototype.preventDefault = function() { - this.returnValue = false; - }; - - Object.defineProperty(Event.prototype, 'defaultPrevented', { - get: function() { - return this.returnValue === false; - } - }); - - // interface EventTarget function addEventListener(type, listener, useCapture) { + if (type === 'DOMContentLoaded') type = 'load'; var target = this; var f = function(e) { - e._timeStamp = Number(new Date); + e._timeStamp = Date.now(); e._currentTarget = target; listener.call(this, e); e._currentTarget = null; @@ -888,6 +858,7 @@ if ('window' in this && 'document' in this) { } function removeEventListener(type, listener, useCapture) { + if (type === 'DOMContentLoaded') type = 'load'; var f = this['_' + type + listener]; if (f) { this.detachEvent('on' + type, f); @@ -895,9 +866,10 @@ if ('window' in this && 'document' in this) { } } - var p1 = Window.prototype, p2 = HTMLDocument.prototype, p3 = Element.prototype; - p1.addEventListener = p2.addEventListener = p3.addEventListener = addEventListener; - p1.removeEventListener = p2.removeEventListener = p3.removeEventListener = removeEventListener; + [Window, HTMLDocument, Element].forEach(function(o) { + o.prototype.addEventListener = addEventListener; + o.prototype.removeEventListener = removeEventListener; + }); }()); @@ -916,7 +888,7 @@ if ('window' in this && 'document' in this) { e.preventDefault = function () { e.returnValue = false; }; e.stopPropagation = function () { e.cancelBubble = true; }; e.target = e.srcElement; - e.timeStamp = Number(new Date); + e.timeStamp = Date.now(); obj["e" + type + fn].call(this, e); }; obj.attachEvent("on" + type, obj[type + fn]); @@ -976,8 +948,8 @@ if ('window' in this && 'document' in this) { contains: { value: function (token) { token = String(token); - if (token.length === 0) { throw new SyntaxError(); } - if (/\s/.test(token)) { throw new Error("InvalidCharacterError"); } + if (token.length === 0) { throw SyntaxError(); } + if (/\s/.test(token)) { throw Error("InvalidCharacterError"); } var tokens = split(o[p]); return tokens.indexOf(token) !== -1; @@ -985,13 +957,13 @@ if ('window' in this && 'document' in this) { }, add: { - value: function (tokens___) { - tokens = Array.prototype.slice.call(arguments).map(String); + value: function (/*tokens...*/) { + var tokens = Array.prototype.slice.call(arguments).map(String); if (tokens.some(function(token) { return token.length === 0; })) { - throw new SyntaxError(); + throw SyntaxError(); } - if (tokens.some(function(token) { return /\s/.test(token); })) { - throw new Error("InvalidCharacterError"); + if (tokens.some(function(token) { return (/\s/).test(token); })) { + throw Error("InvalidCharacterError"); } try { @@ -1001,7 +973,7 @@ if ('window' in this && 'document' in this) { if (tokens.length === 0) { return; } - if (underlying_string.length !== 0 && !/\s$/.test(underlying_string)) { + if (underlying_string.length !== 0 && !(/\s$/).test(underlying_string)) { underlying_string += ' '; } underlying_string += tokens.join(' '); @@ -1014,13 +986,13 @@ if ('window' in this && 'document' in this) { }, remove: { - value: function (tokens___) { - tokens = Array.prototype.slice.call(arguments).map(String); + value: function (/*tokens...*/) { + var tokens = Array.prototype.slice.call(arguments).map(String); if (tokens.some(function(token) { return token.length === 0; })) { - throw new SyntaxError(); + throw SyntaxError(); } - if (tokens.some(function(token) { return /\s/.test(token); })) { - throw new Error("InvalidCharacterError"); + if (tokens.some(function(token) { return (/\s/).test(token); })) { + throw Error("InvalidCharacterError"); } try { @@ -1040,8 +1012,8 @@ if ('window' in this && 'document' in this) { value: function (token, force) { try { token = String(token); - if (token.length === 0) { throw new SyntaxError(); } - if (/\s/.test(token)) { throw new Error("InvalidCharacterError"); } + if (token.length === 0) { throw SyntaxError(); } + if (/\s/.test(token)) { throw Error("InvalidCharacterError"); } var tokens = split(o[p]), index = tokens.indexOf(token); @@ -1114,6 +1086,7 @@ if ('window' in this && 'document' in this) { var attr = this.attributes[i]; if (attr.specified && attr.name.substring(0, 5) === 'data-') { (function(element, name) { + result[name] = element.getAttribute('data-' + name); // Read-only, for IE8- Object.defineProperty(result, name, { get: function() { return element.getAttribute('data-' + name); @@ -1124,7 +1097,7 @@ if ('window' in this && 'document' in this) { }(this, attr.name.substring(5))); } } - return result; + return result; }}); } } @@ -1142,8 +1115,8 @@ if ('window' in this && 'document' in this) { input = input.replace(/\s/g, ''); if ((input.length % 4) === 0) { input = input.replace(/=+$/, ''); } - if ((input.length % 4) === 1) { throw new Error("InvalidCharacterError"); } - if (/[^+/0-9A-Za-z]/.test(input)) { throw new Error("InvalidCharacterError"); } + if ((input.length % 4) === 1) { throw Error("InvalidCharacterError"); } + if (/[^+/0-9A-Za-z]/.test(input)) { throw Error("InvalidCharacterError"); } while (position < input.length) { n = B64_ALPHABET.indexOf(input.charAt(position)); @@ -1179,7 +1152,7 @@ if ('window' in this && 'document' in this) { o1, o2, o3, e1, e2, e3, e4; - if (/[^\x00-\xFF]/.test(input)) { throw new Error("InvalidCharacterError"); } + if (/[^\x00-\xFF]/.test(input)) { throw Error("InvalidCharacterError"); } while (position < input.length) { o1 = input.charCodeAt(position++); @@ -1207,4 +1180,46 @@ if ('window' in this && 'document' in this) { return out.join(''); }; -} (this)); +}(this)); + + +//---------------------------------------------------------------------- +// +// Non-standard JavaScript (Mozilla) functions +// +//---------------------------------------------------------------------- + +(function () { + // JavaScript 1.8.1 + String.prototype.trimLeft = String.prototype.trimLeft || function () { + return String(this).replace(/^\s+/, ''); + }; + + // JavaScript 1.8.1 + String.prototype.trimRight = String.prototype.trimRight || function () { + return String(this).replace(/\s+$/, ''); + }; + + // JavaScript 1.? + var ESCAPES = { + //'\x00': '\\0', Special case in FF3.6, removed by FF10 + '\b': '\\b', + '\t': '\\t', + '\n': '\\n', + '\f': '\\f', + '\r': '\\r', + '"' : '\\"', + '\\': '\\\\' + }; + String.prototype.quote = String.prototype.quote || function() { + return '"' + String(this).replace(/[\x00-\x1F"\\\x7F-\uFFFF]/g, function(c) { + if (Object.prototype.hasOwnProperty.call(ESCAPES, c)) { + return ESCAPES[c]; + } else if (c.charCodeAt(0) <= 0xFF) { + return '\\x' + ('00' + c.charCodeAt(0).toString(16).toUpperCase()).slice(-2); + } else { + return '\\u' + ('0000' + c.charCodeAt(0).toString(16).toUpperCase()).slice(-4); + } + }) + '"'; + }; +}()); From 17eb171b12bd003b1e3944aa565a93185df3aacc Mon Sep 17 00:00:00 2001 From: WrinklyNinja <wrinklyninja1@gmail.com> Date: Wed, 29 Jan 2014 10:10:40 +0000 Subject: [PATCH 09/36] Update README.md Removed references to Graphvis as part of issue #90 work. --- README.md | 34 ---------------------------------- 1 file changed, 34 deletions(-) diff --git a/README.md b/README.md index a32acc61..a9badb06 100644 --- a/README.md +++ b/README.md @@ -40,40 +40,6 @@ BOSS requires the following libraries (version numbers used in latest developmen BOSS expects all libraries' folders to be present alongside the BOSS repository folder that contains this readme, or otherwise installed such that the compiler and linker used can find them without suppling additional paths. All paths below are relative to the folder(s) containing the libraries and BOSS. -BOSS can also make use of [GraphVis](http://www.graphviz.org/Download_windows.php) binaries. If provided, the following binaries should be placed into `resources/graphvis/` in the BOSS repository root: - -* cdt.dll -* cgraph.dll -* dot.exe -* freetype6.dll -* gvc.dll -* gvplugin_core.dll -* gvplugin_dot_layout.dll -* gvplugin_gd.dll -* gvplugin_pango.dll -* iconv.dll -* jpeg62.dll -* libcairo-2.dll -* libexpat.dll -* libfontconfig-1.dll -* libfreetype-6.dll -* libglib-2.0-0.dll -* libgmodule-2.0-0.dll -* libgobject-2.0-0.dll -* libgthread-2.0-0.dll -* libpango-1.0-0.dll -* libpangocairo-1.0-0.dll -* libpangoft2-1.0-0.dll -* libpangowin32-1.0-0.dll -* libpng12.dll -* libpng14-14.dll -* libxml2.dll -* ltdl.dll -* Pathplan.dll -* zlib1.dll - -Once the binaries have been placed there, run `dot.exe -c`. - Alphanum, Libespm and PugiXML do not require any additional setup. The rest of the libraries must be built separately. Instructions for building them and BOSS itself on Windows and Linux are given below. They assume that Visual C++ 2013 is being used on Windows, and mingw-w64 is being used on Linux, though they should be similar for other compilers. ### Windows From d34ede201b7c13a3d023d9d6cdd4da5eae65a67b Mon Sep 17 00:00:00 2001 From: WrinklyNinja <wrinklyninja1@gmail.com> Date: Wed, 29 Jan 2014 10:12:00 +0000 Subject: [PATCH 10/36] Update archive.py Removed packaging of graphvis and svgweb as part of issue #90 work. --- src/archive.py | 6 ------ 1 file changed, 6 deletions(-) diff --git a/src/archive.py b/src/archive.py index ebd28f35..ad4e594b 100644 --- a/src/archive.py +++ b/src/archive.py @@ -6,8 +6,6 @@ # Files and folders that need to go in (relative to repository root): # # build/BOSS.exe -# resources/graphvis -# resources/svgweb # resources/l10n/es/LC_MESSAGES/boss.mo # resources/l10n/es/LC_MESSAGES/wxstd.mo # resources/l10n/ru/LC_MESSAGES/boss.mo @@ -39,10 +37,6 @@ if not os.path.exists(temp_path): # Now copy everything into the temporary folder. shutil.copy( os.path.join('..', 'build', 'BOSS.exe'), temp_path ) -shutil.copytree( os.path.join('..', 'resources', 'graphvis'), os.path.join(temp_path, 'resources', 'graphvis') ) -shutil.copytree( os.path.join('..', 'resources', 'svgweb'), os.path.join(temp_path, 'resources', 'svgweb') ) - - os.makedirs(os.path.join(temp_path, 'resources', 'l10n', 'es', 'LC_MESSAGES')) os.makedirs(os.path.join(temp_path, 'resources', 'l10n', 'ru', 'LC_MESSAGES')) shutil.copy( os.path.join('..', 'resources', 'l10n', 'es', 'LC_MESSAGES', 'boss.mo'), os.path.join(temp_path, 'resources', 'l10n', 'es', 'LC_MESSAGES') ) From b3135c0f23be75b92d31bec29634135045e75c97 Mon Sep 17 00:00:00 2001 From: WrinklyNinja <wrinklyninja1@gmail.com> Date: Wed, 29 Jan 2014 10:14:03 +0000 Subject: [PATCH 11/36] Update installer.nsi Removed references to graphvis and svgweb as part of issue #90 work. --- src/installer.nsi | 14 -------------- 1 file changed, 14 deletions(-) diff --git a/src/installer.nsi b/src/installer.nsi index 3e11b64f..02e333f6 100644 --- a/src/installer.nsi +++ b/src/installer.nsi @@ -249,14 +249,6 @@ FunctionEnd ;File "..\build\libboss32.dll" ;File "..\build\libboss64.dll" - ;Install graphvis files. - SetOutPath "$INSTDIR\resources\graphvis" - File "..\resources\graphvis\*" - - ;Install svgweb files. - SetOutPath "$INSTDIR\resources\svgweb" - File "..\resources\svgweb\*" - ;Install resource files. SetOutPath "$INSTDIR\resources" File "..\resources\polyfill.js" @@ -374,12 +366,6 @@ FunctionEnd Delete "$INSTDIR\resources\script.js" Delete "$INSTDIR\resources\style.css" - ;Remove graphvis files. - RMDir /r "$INSTDIR\resources\graphvis" - - ;Remove svgweb files. - RMDir /r "$INSTDIR\resources\svgweb" - ;Remove language files. Delete "$INSTDIR\resources\l10n\ru\LC_MESSAGES\boss.mo" Delete "$INSTDIR\resources\l10n\ru\LC_MESSAGES\wxstd.mo" From 760ae4f485e884160759dfcec145730bdf8c6565 Mon Sep 17 00:00:00 2001 From: WrinklyNinja <wrinklyninja1@gmail.com> Date: Wed, 29 Jan 2014 10:16:16 +0000 Subject: [PATCH 12/36] Update game.cpp Removed graph image path function as part of issue #90 work. --- src/backend/game.cpp | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/backend/game.cpp b/src/backend/game.cpp index 2b85a09f..acd010bb 100644 --- a/src/backend/game.cpp +++ b/src/backend/game.cpp @@ -225,10 +225,6 @@ namespace boss { return g_path_local / bossFolderName / "report.html"; } - fs::path Game::GraphPath() const { - return g_path_local / bossFolderName / "graph.svg"; - } - void Game::RefreshActivePluginsList() { BOOST_LOG_TRIVIAL(trace) << "Refreshing active plugins list for game: " << _name; From 741e40946ac081e84b3572abca2709398ebb5986 Mon Sep 17 00:00:00 2001 From: WrinklyNinja <wrinklyninja1@gmail.com> Date: Wed, 29 Jan 2014 10:16:44 +0000 Subject: [PATCH 13/36] Update game.h Removed GraphPath function as part of issue #90 work. --- src/backend/game.h | 1 - 1 file changed, 1 deletion(-) diff --git a/src/backend/game.h b/src/backend/game.h index 17d7b46f..387d6b3f 100644 --- a/src/backend/game.h +++ b/src/backend/game.h @@ -68,7 +68,6 @@ namespace boss { boost::filesystem::path MasterlistPath() const; boost::filesystem::path UserlistPath() const; boost::filesystem::path ReportPath() const; - boost::filesystem::path GraphPath() const; bool IsActive(const std::string& plugin) const; From fb73549d7aa9f761cd0207cafa3c5d1bb8022008 Mon Sep 17 00:00:00 2001 From: WrinklyNinja <wrinklyninja1@gmail.com> Date: Wed, 29 Jan 2014 10:19:52 +0000 Subject: [PATCH 14/36] Update generators.h Removed graph image display code as part of issue #90 work. --- src/backend/generators.h | 68 +++------------------------------------- 1 file changed, 4 insertions(+), 64 deletions(-) diff --git a/src/backend/generators.h b/src/backend/generators.h index e33d7de6..8c774297 100644 --- a/src/backend/generators.h +++ b/src/backend/generators.h @@ -50,30 +50,6 @@ namespace boss { } }; - inline void GetGraphWidthHeight(const boost::filesystem::path& filepath, std::string& width, std::string& height) { - BOOST_LOG_TRIVIAL(trace) << "Getting the dimensions of the plugin interactions graph image."; - - boss::ifstream in(filepath); - - std::string line; - while (std::getline(in, line)) { - if (boost::contains(line, "width=\"") && boost::contains(line, "length=\"")) { - - size_t pos1, pos2; - pos1 = line.find("width=\""); - pos2 = line.find("\"", pos1 + 8); - width = line.substr(pos1 + 7, pos2-pos1-7); - - pos1 = line.find("length=\""); - pos2 = line.find("\"", pos1 + 9); - height = line.substr(pos1 + 8, pos2-pos1-8); - - break; - } - } - - } - inline void WriteMessage(pugi::xml_node& listItem, unsigned int type, std::string content) { if (type == g_message_say) @@ -161,15 +137,9 @@ namespace boss { node.set_name("script"); node.append_attribute("src").set_value(ToFileURL(g_path_polyfill).c_str()); node.text().set(" "); - - node = head.append_child(); - node.set_name("script"); - node.append_attribute("src").set_value(ToFileURL(g_path_svgweb).c_str()); - node.append_attribute("data-path").set_value(ToFileURL(g_path_svgweb.parent_path()).c_str()); - node.text().set(" "); } - inline void AppendNav(pugi::xml_node& body, bool createGraphTab) { + inline void AppendNav(pugi::xml_node& body) { BOOST_LOG_TRIVIAL(trace) << "Appending navigation bar to BOSS report."; pugi::xml_node nav, div; @@ -190,14 +160,6 @@ namespace boss { div.append_attribute("data-section").set_value("plugins"); div.text().set(boost::locale::translate("Details").str().c_str()); - if (createGraphTab) { - div = nav.append_child(); - div.set_name("div"); - div.append_attribute("class").set_value("button"); - div.append_attribute("data-section").set_value("graph"); - div.text().set(boost::locale::translate("Graph").str().c_str()); - } - div = nav.append_child(); div.set_name("div"); div.append_attribute("class").set_value("button hidden"); @@ -446,7 +408,6 @@ namespace boss { inline void AppendMain(pugi::xml_node& body, const std::string& oldDetails, const std::string& masterlistVersion, - const std::string& graphPath, bool masterlistUpdateEnabled, const std::list<Message>& messages, const std::list<Plugin>& plugins, @@ -472,26 +433,6 @@ namespace boss { pluginMessageNo = messageNo; AppendSummary(main, hasChanged, masterlistVersion, masterlistUpdateEnabled, messageNo, warnNo, errorNo, messages); - - if (boost::filesystem::exists(graphPath)) { - //Append graph tag. - pugi::xml_node graph = main.append_child(); - graph.set_name("div"); - graph.append_attribute("id").set_value("graph"); - graph.append_attribute("class").set_value("hidden"); - - pugi::xml_node img = graph.append_child(); - img.set_name("object"); - img.append_attribute("data").set_value(ToFileURL(graphPath).c_str()); - img.append_attribute("type").set_value("image/svg+xml"); - - //Also need to set image dimensions, get them from the graph file. - std::string width, height; - GetGraphWidthHeight(graphPath, width, height); - - img.append_attribute("width").set_value(width.c_str()); - img.append_attribute("height").set_value(height.c_str()); - } } inline void AppendFilters(pugi::xml_node& body, int messageNo, int pluginNo) { @@ -601,8 +542,7 @@ namespace boss { const std::list<Plugin>& plugins, const std::string& oldDetails, const std::string& masterlistVersion, - const bool masterlistUpdateEnabled, - const std::string& graphPath) { + const bool masterlistUpdateEnabled) { pugi::xml_document doc; @@ -611,10 +551,10 @@ namespace boss { pugi::xml_node body = doc.append_child(); body.set_name("body"); - AppendNav(body, boost::filesystem::exists(graphPath)); + AppendNav(body); int messageNo=0; - AppendMain(body, oldDetails, masterlistVersion, graphPath, masterlistUpdateEnabled, messages, plugins, messageNo); + AppendMain(body, oldDetails, masterlistVersion, masterlistUpdateEnabled, messages, plugins, messageNo); AppendFilters(body, messageNo, plugins.size()); From d4f878c13bf8697fe243c9c70b0c22d3746f8bb1 Mon Sep 17 00:00:00 2001 From: WrinklyNinja <wrinklyninja1@gmail.com> Date: Wed, 29 Jan 2014 10:20:44 +0000 Subject: [PATCH 15/36] Update globals.cpp Removed graphvis and svgweb paths as part of issue #90 work. --- src/backend/globals.cpp | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/backend/globals.cpp b/src/backend/globals.cpp index daa5f450..5b70a498 100644 --- a/src/backend/globals.cpp +++ b/src/backend/globals.cpp @@ -56,8 +56,6 @@ namespace boss { const boost::filesystem::path g_path_js = boost::filesystem::current_path() / "resources" / "script.js"; const boost::filesystem::path g_path_polyfill = boost::filesystem::current_path() / "resources" / "polyfill.js"; const boost::filesystem::path g_path_l10n = boost::filesystem::current_path() / "resources" / "l10n"; - const boost::filesystem::path g_path_graphvis = boost::filesystem::current_path() / "resources" / "graphvis" / "dot.exe"; - const boost::filesystem::path g_path_svgweb = boost::filesystem::current_path() / "resources" / "svgweb" / "svg.js"; const boost::filesystem::path g_path_local = GetLocalAppDataPath() / "BOSS"; const boost::filesystem::path g_path_settings = g_path_local / "settings.yaml"; const boost::filesystem::path g_path_log = g_path_local / "BOSSDebugLog.txt"; From 3613bb13cc14aa2155c5030e6f888a33a4ed6a90 Mon Sep 17 00:00:00 2001 From: WrinklyNinja <wrinklyninja1@gmail.com> Date: Wed, 29 Jan 2014 10:20:58 +0000 Subject: [PATCH 16/36] Update globals.h Removed graphvis and svgweb paths as part of issue #90 work. --- src/backend/globals.h | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/backend/globals.h b/src/backend/globals.h index 15dbf9ee..839ac388 100644 --- a/src/backend/globals.h +++ b/src/backend/globals.h @@ -60,8 +60,6 @@ namespace boss { extern const boost::filesystem::path g_path_polyfill; extern const boost::filesystem::path g_path_log; extern const boost::filesystem::path g_path_l10n; - extern const boost::filesystem::path g_path_graphvis; - extern const boost::filesystem::path g_path_svgweb; } #endif From 070340182a11b23d8c8c6a80ef364fa23ce8dcc5 Mon Sep 17 00:00:00 2001 From: WrinklyNinja <wrinklyninja1@gmail.com> Date: Wed, 29 Jan 2014 10:21:47 +0000 Subject: [PATCH 17/36] Update graph.cpp Removed graph image writing code as part of issue #90 work. --- src/backend/graph.cpp | 23 ----------------------- 1 file changed, 23 deletions(-) diff --git a/src/backend/graph.cpp b/src/backend/graph.cpp index 6c31c5ed..e5cf3560 100644 --- a/src/backend/graph.cpp +++ b/src/backend/graph.cpp @@ -60,29 +60,6 @@ namespace boss { return false; } - void SaveGraph(const PluginGraph& graph, const boost::filesystem::path outpath) { - //First need to extract vertex names, since their stored as private members otherwise. - vector<string> names; - vertex_it vit, vit_end; - boost::tie(vit, vit_end) = boost::vertices(graph); - - for (vit, vit_end; vit != vit_end; ++vit) { - names.push_back(graph[*vit].Name()); - } - - //Also, writing the graph requires an index map, which std::list-based VertexList graphs don't have, so one needs to be built separately. - - map<vertex_t, string> index_map; - boost::associative_property_map< map<vertex_t, string> > v_index_map(index_map); - BGL_FORALL_VERTICES(v, graph, PluginGraph) - put(v_index_map, v, graph[v].Name()); - - //Now write graph to file. - boss::ofstream out(outpath); - boost::write_graphviz(out, graph, boost::default_writer(), boost::default_writer(), boost::default_writer(), v_index_map); - out.close(); - } - void Sort(const PluginGraph& graph, std::list<Plugin>& plugins) { //Topological sort requires an index map, which std::list-based VertexList graphs don't have, so one needs to be built separately. From 039c86fd24b067a7662f00ab56c8a375785a1460 Mon Sep 17 00:00:00 2001 From: WrinklyNinja <wrinklyninja1@gmail.com> Date: Wed, 29 Jan 2014 10:22:18 +0000 Subject: [PATCH 18/36] Update graph.h Removed SaveGraph function as part of issue #90 work. --- src/backend/graph.h | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/backend/graph.h b/src/backend/graph.h index 09dea24f..fb757fb7 100644 --- a/src/backend/graph.h +++ b/src/backend/graph.h @@ -49,8 +49,6 @@ namespace boss { bool GetVertexByName(const PluginGraph& graph, const std::string& name, vertex_t& vertex); - void SaveGraph(const PluginGraph& graph, const boost::filesystem::path outpath); - void Sort(const PluginGraph& graph, std::list<Plugin>& plugins); void CheckForCycles(const PluginGraph& graph); From 020894b843d62230261e4037b45c1c64afaee5e0 Mon Sep 17 00:00:00 2001 From: WrinklyNinja <wrinklyninja1@gmail.com> Date: Wed, 29 Jan 2014 10:23:40 +0000 Subject: [PATCH 19/36] Update helpers.h Code cleanup. Removed unused RunCommand function. --- src/backend/helpers.h | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/backend/helpers.h b/src/backend/helpers.h index 6d383bfc..686e8009 100644 --- a/src/backend/helpers.h +++ b/src/backend/helpers.h @@ -69,9 +69,6 @@ namespace boss { std::string GetLangString(const unsigned int num); unsigned int GetLangNum(const std::string& str); - //Runs a command using the Win32 API. - bool RunCommand(const std::string& command, std::string& output); - //Version class for more robust version comparisons. class Version { private: From ca23a802dcde61e63da09a6d4096527dd505de85 Mon Sep 17 00:00:00 2001 From: WrinklyNinja <wrinklyninja1@gmail.com> Date: Wed, 29 Jan 2014 10:24:14 +0000 Subject: [PATCH 20/36] Update helpers.cpp Code cleanup. Removed unused RunCommand function. --- src/backend/helpers.cpp | 84 ----------------------------------------- 1 file changed, 84 deletions(-) diff --git a/src/backend/helpers.cpp b/src/backend/helpers.cpp index 06ae475c..eacf3ef7 100644 --- a/src/backend/helpers.cpp +++ b/src/backend/helpers.cpp @@ -274,90 +274,6 @@ namespace boss { return g_lang_any; } - //Runs a command using the Win32 API. - bool RunCommand(const std::string& command, std::string& output) { - HANDLE consoleWrite = NULL; - HANDLE consoleRead = NULL; - - SECURITY_ATTRIBUTES saAttr; - - PROCESS_INFORMATION piProcInfo; - STARTUPINFO siStartInfo; - - CHAR chBuf[BUFSIZE]; - DWORD dwRead; - - DWORD exitCode; - - //Init attributes. - saAttr.nLength = sizeof(SECURITY_ATTRIBUTES); - saAttr.bInheritHandle = TRUE; - saAttr.lpSecurityDescriptor = NULL; - - BOOST_LOG_TRIVIAL(trace) << "Creating a pipe for the process."; - - //Create I/O pipes. - if (!CreatePipe(&consoleRead, &consoleWrite, &saAttr, 0)) { - BOOST_LOG_TRIVIAL(error) << "Could not create pipe for process."; - throw error(error::windows_error, lc::translate("Could not create pipe for process.")); - } - - //Create a child process. - BOOST_LOG_TRIVIAL(trace) << "Creating a child process."; - ZeroMemory(&piProcInfo, sizeof(PROCESS_INFORMATION)); - - ZeroMemory(&siStartInfo, sizeof(STARTUPINFO)); - siStartInfo.cb = sizeof(STARTUPINFO); - siStartInfo.hStdError = consoleWrite; - siStartInfo.hStdOutput = consoleWrite; - siStartInfo.dwFlags |= STARTF_USESTDHANDLES | STARTF_USESHOWWINDOW; - siStartInfo.wShowWindow = SW_HIDE; - - const int utf16Len = MultiByteToWideChar(CP_UTF8, 0, command.c_str(), -1, NULL, 0); - wchar_t * cmdLine = new wchar_t[utf16Len]; - MultiByteToWideChar(CP_UTF8, 0, command.c_str(), -1, cmdLine, utf16Len); - - bool result = CreateProcess(NULL, - cmdLine, // command line - NULL, // process security attributes - NULL, // primary thread security attributes - TRUE, // handles are inherited - CREATE_NO_WINDOW, // creation flags - NULL, // use parent's environment - NULL, // use parent's current directory - &siStartInfo, // STARTUPINFO pointer - &piProcInfo); // receives PROCESS_INFORMATION - - delete [] cmdLine; - - if (!result) { - BOOST_LOG_TRIVIAL(error) << "Could not create process."; - throw error(error::windows_error, lc::translate("Could not create process.")); - } - - BOOST_LOG_TRIVIAL(trace) << "Waiting for process to complete."; - - WaitForSingleObject(piProcInfo.hProcess, INFINITE); - - BOOST_LOG_TRIVIAL(trace) << "Getting the process exit code."; - - if (!GetExitCodeProcess(piProcInfo.hProcess, &exitCode)) { - BOOST_LOG_TRIVIAL(error) << "Could not get process exit code."; - throw error(error::windows_error, lc::translate("Could not get process exit code.")); - } - - BOOST_LOG_TRIVIAL(trace) << "Getting the process output."; - - if (!ReadFile(consoleRead, chBuf, BUFSIZE, &dwRead, NULL)) { - BOOST_LOG_TRIVIAL(error) << "Could not read process output."; - throw error(error::windows_error, lc::translate("Could not read process output.")); - } - - output = string(chBuf, dwRead); - - return exitCode == 0; - } - ////////////////////////////// // Version Class Functions From 840f5849d174e495e63344ec190b2b26a2c92d04 Mon Sep 17 00:00:00 2001 From: WrinklyNinja <wrinklyninja1@gmail.com> Date: Wed, 29 Jan 2014 10:34:15 +0000 Subject: [PATCH 21/36] Update generators.h Forgot to remove setting for generating graph. Issue #90 work. --- src/backend/generators.h | 1 - 1 file changed, 1 deletion(-) diff --git a/src/backend/generators.h b/src/backend/generators.h index 8c774297..a110ad35 100644 --- a/src/backend/generators.h +++ b/src/backend/generators.h @@ -582,7 +582,6 @@ namespace boss { root["Debug Verbosity"] = 0; root["Update Masterlist"] = true; root["View Report Externally"] = false; - root["Generate Graph Image"] = false; games.push_back(Game(g_game_tes4)); games.push_back(Game(g_game_tes5)); From 3ad8cdc876f9614ca2263e07802c973bf9ad4c43 Mon Sep 17 00:00:00 2001 From: WrinklyNinja <wrinklyninja1@gmail.com> Date: Wed, 29 Jan 2014 10:34:39 +0000 Subject: [PATCH 22/36] Update main.cpp Removed graph image code. Part of issue #90 work. --- src/gui/main.cpp | 23 +---------------------- 1 file changed, 1 insertion(+), 22 deletions(-) diff --git a/src/gui/main.cpp b/src/gui/main.cpp index af2b276a..1023e63d 100644 --- a/src/gui/main.cpp +++ b/src/gui/main.cpp @@ -653,26 +653,6 @@ void Launcher::OnSortPlugins(wxCommandEvent& event) { BOOST_LOG_TRIVIAL(trace) << "Adding overlap edges."; AddOverlapEdges(graph); - //First delete any existing graph file. - fs::remove(_game.GraphPath()); - if (_settings["Generate Graph Image"] && _settings["Generate Graph Image"].as<bool>() && fs::exists(g_path_graphvis)) { - BOOST_LOG_TRIVIAL(debug) << "Generating the graph image."; - fs::path temp = fs::path(_game.GraphPath().string() + ".temp"); - boss::SaveGraph(graph, temp); - - string command = g_path_graphvis.string() + " -Tsvg \"" + temp.string() + "\" -o \"" + _game.GraphPath().string() + "\""; - string output; - - try { - system(command.c_str()); - - // if (RunCommand(command, output)) //This hangs for graphvis, for some reason. - fs::remove(temp); - } catch(boss::error& e) { - messages.push_back(boss::Message(boss::g_message_error, (format(loc::translate("Failed to generate graph image. Details: %1%")) % e.what()).str())); - } - } - //Check for back-edges, then perform a topological sort. try { BOOST_LOG_TRIVIAL(debug) << "Checking to see if the graph is cyclic."; @@ -815,8 +795,7 @@ void Launcher::OnSortPlugins(wxCommandEvent& event) { plugins, oldDetails, revision, - doUpdate, - _game.GraphPath().string()); + doUpdate); } catch (boss::error& e) { wxMessageBox( FromUTF8(format(loc::translate("Error: %1%")) % e.what()), From d6f167bf4c9de3f7514b57cb1d5e6f9a72a46201 Mon Sep 17 00:00:00 2001 From: WrinklyNinja <wrinklyninja1@gmail.com> Date: Wed, 29 Jan 2014 10:35:36 +0000 Subject: [PATCH 23/36] Update settings.h Removed UI element for graph image generation setting. Part of issue #90 work. --- src/gui/settings.h | 1 - 1 file changed, 1 deletion(-) diff --git a/src/gui/settings.h b/src/gui/settings.h index ad16fb88..8a0aff42 100644 --- a/src/gui/settings.h +++ b/src/gui/settings.h @@ -47,7 +47,6 @@ private: wxChoice *LanguageChoice; wxCheckBox *UpdateMasterlistBox; wxCheckBox *reportViewBox; - wxCheckBox *displayGraphImageBox; wxListView *gamesList; wxButton * addBtn; From 879faf9f2ec7a7cfed3ee6f0a8dfa1f4f437d712 Mon Sep 17 00:00:00 2001 From: WrinklyNinja <wrinklyninja1@gmail.com> Date: Wed, 29 Jan 2014 10:36:46 +0000 Subject: [PATCH 24/36] Update settings.cpp Removed UI elements for graph image generation setting. Part of issue #90 work. --- src/gui/settings.cpp | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/src/gui/settings.cpp b/src/gui/settings.cpp index 3d1b5dcc..2fdff62c 100644 --- a/src/gui/settings.cpp +++ b/src/gui/settings.cpp @@ -62,7 +62,6 @@ SettingsFrame::SettingsFrame(wxWindow *parent, const wxString& title, YAML::Node UpdateMasterlistBox = new wxCheckBox(this, wxID_ANY, translate("Update masterlist before sorting.")); reportViewBox = new wxCheckBox(this, wxID_ANY, translate("View reports externally in default browser.")); - displayGraphImageBox = new wxCheckBox(this, wxID_ANY, translate("Generate and display plugin graph images.")); //Set up list columns. gamesList->AppendColumn(translate("Name")); @@ -118,8 +117,6 @@ SettingsFrame::SettingsFrame(wxWindow *parent, const wxString& title, YAML::Node bigBox->Add(reportViewBox, wholeItem); - bigBox->Add(displayGraphImageBox, wholeItem); - bigBox->AddSpacer(10); bigBox->Add(new wxStaticText(this, wxID_ANY, translate("Language and game changes will be applied after BOSS is restarted.")), wholeItem); @@ -178,11 +175,6 @@ void SettingsFrame::SetDefaultValues() { reportViewBox->SetValue(view); } - if (_settings["Generate Graph Image"]) { - bool graph = _settings["Generate Graph Image"].as<bool>(); - displayGraphImageBox->SetValue(graph); - } - for (size_t i=0, max=_games.size(); i < max; ++i) { gamesList->InsertItem(i, FromUTF8(_games[i].Name())); gamesList->SetItem(i, 1, FromUTF8(boss::Game(_games[i].Id()).FolderName())); @@ -230,8 +222,6 @@ void SettingsFrame::OnQuit(wxCommandEvent& event) { _settings["View Report Externally"] = reportViewBox->IsChecked(); - _settings["Generate Graph Image"] = displayGraphImageBox->IsChecked(); - for (size_t i=0,max=gamesList->GetItemCount(); i < max; ++i) { string name, folder, master, url, path, registry; unsigned int id; From 7db80185e7f50ad53bf1d940e1ba3477190e09c9 Mon Sep 17 00:00:00 2001 From: WrinklyNinja <wrinklyninja1@gmail.com> Date: Wed, 29 Jan 2014 10:43:05 +0000 Subject: [PATCH 25/36] Update BOSS Readme.html Removed all references to the graph image, graph tab in BOSS report and svgweb from readme as part of issue #90 work. --- docs/BOSS Readme.html | 28 +++++++++------------------- 1 file changed, 9 insertions(+), 19 deletions(-) diff --git a/docs/BOSS Readme.html b/docs/BOSS Readme.html index 9f42d7fe..b58e0c80 100644 --- a/docs/BOSS Readme.html +++ b/docs/BOSS Readme.html @@ -162,9 +162,9 @@ Visual C++ Redistributable for Visual Studio 2013 (x86)</a>. BOSS can be install <p>Provided that masterlist updating <a href="#settingsUpdateMasterlist">is enabled</a> and that an online masterlist URL <a href="#settingsMasterlistURL">is set</a>, BOSS checks for updates to its masterlist and downloads any that are available. If there are any syntax errors in the latest masterlist (due to human error by its maintainers), the updater rolls back one version at a time until it finds a version that works. If any other errors are encountered, updating is cancelled. -<p>During the sorting process, BOSS extracts information from each of the plugins installed in the game's Data folder and combines this information with any relevant metadata provided by the masterlist and userlist. It then uses the combined data to build a graph (as in <i>graph theory</i>, not <i>drawing</i>) of all the interactions between all the installed plugins. A topological sort is then carried out on the graph to produce a list of plugins in their optimal load order, according to BOSS's criteria. If a cycle is detected (eg. A depends on B depends on A), then sorting is cancelled as it becomes impossible to generate a load order that satisfies all conditions. +<p>During the sorting process, BOSS extracts information from each of the plugins installed in the game's Data folder and combines this information with any relevant metadata provided by the masterlist and userlist. It then uses the combined data to build a directed graph of all the interactions between all the installed plugins. A topological sort is then carried out on the graph to produce a list of plugins in their optimal load order, according to BOSS's criteria. If a cycle is detected (eg. A depends on B depends on A), then sorting is cancelled as it becomes impossible to generate a load order that satisfies all conditions. <p>If successful, the calculated load order is then displayed in the dialog shown above, which allows the user to edit the load order before it is applied. Multiple plugins may be selected and moved at once. Plugins which are empty (ie. only contain a header record) are displayed in grey text, and plugins that are not empty and load BSAs are displayed in blue text. If <q>OK</q> button is clicked, it is then applied, and any edits made are recorded in the userlist for re-application when BOSS next sorts the game's plugins. If the <q>Cancel</q> button is clicked, then the load order and any edits made are discarded. -<p>BOSS then generates a report and displays it either in a new window or in your default browser, according to the value of the <a href="#settingsViewReports">relevant setting</a>. Any errors encountered during the sorting process will be displayed in this report, including those due to graph cycles, missing dependencies or installed incompatible plugins. If it <a href="#settingsGenerateGraphImage">is enabled</a>, an SVG image of the graph is generated for display in the report. See the next section for more information on the report. +<p>BOSS then generates a report and displays it either in a new window or in your default browser, according to the value of the <a href="#settingsViewReports">relevant setting</a>. Any errors encountered during the sorting process will be displayed in this report, including those due to graph cycles, missing dependencies or installed incompatible plugins. See the next section for more information on the report. <p>BOSS is able to sort plugins ghosted by <abbr title="Wrye Bash, Wrye Flash or Wrye Flash NV">Wrye *ash</abbr>, and can extract Bash Tags and version numbers from plugin descriptions. Provided that they have the <code>Filter</code> Bash Tag present in their description, BOSS can recognise filter patches and so avoid displaying unnecessary error messages for any of their masters that may be missing. <p>While reading very large plugins, such as the game's main master file, BOSS may appear to stop responding: this is not an issue. The time it takes for BOSS to sort your load order depends primarily on the size of the masterlist being used, the total size of the files in your load order, and the number of plugins in your load order. The first run is likely to be longer than subsequent runs as BOSS needs to download the full masterlist, rather than just the changes made by updates. In testing, it was found that sorting ~90 plugins with a total size of ~350 MB and a 5 MB masterlist takes around 15 seconds, though performance will vary with computer hardware. @@ -181,7 +181,6 @@ Visual C++ Redistributable for Visual Studio 2013 (x86)</a>. BOSS can be install <ul> <li>The <q>Summary</q> tab gives information on the versions of BOSS and the masterlist used, whether masterlist updating is enabled, and breaks down the numbers of each message type in the Summary and Details tabs. It also notifies you if there have been no changes in the <q>Details</q> tab since you last ran BOSS for the same game. Finally, the <q>Summary</q> tab is also where any global messages supplied in the masterlist and any errors encountered during sorting are displayed. <li>The <q>Details</q> tab lists the plugins BOSS sorted in their new load order, along with any messages BOSS has provided for them. BOSS will also display the plugin's <abbr title="Cyclic Redundancy Check">CRC</abbr> value and extract its version if found in the plugin's description field. - <li>The <q>Graph</q> tab displays a graph of all the interactions between the plugins in your load order. It's not very useful to the average user, but may contain information that would aid in debugging any issues encountered, and is also provided as an item of interest. Graph image generation typically takes a long time, so it is disabled by default. </ul> <p>In addition, there are a few filters that can be used to selectively hide items in the <q>Details</q> tab. These filters are: <ul> @@ -267,7 +266,6 @@ Visual C++ Redistributable for Visual Studio 2013 (x86)</a>. BOSS can be install <tr><td>Debug Verbosity<td>Controls the verbosity of the debug output, which is written to <code>%LOCALAPPDATA%\BOSS\BOSSDebugLog.txt</code>. <tr><td id="settingsUpdateMasterlist">Update masterlist before sorting<td>If checked, BOSS will update its masterlist, should an update be available, before sorting plugins. <tr><td id="settingsViewReports">View reports externally in default browser.<td>If checked, BOSS will display its report using your default web browser instead of opening its own window. - <tr><td id="settingsGenerateGraphImage">Generate and display plugin graph images.<td>If checked, BOSS will generate an SVG image of the plugin interaction graph and display it in its report. Image generation can take a long time, so this is disabled by default. </table> <p>The games list allows the customisation of which games BOSS offers support for, trivialising support for multiple copies of a game and Total Conversions. The games listed here will be displayed in the main window's <q>Game</q> menu when BOSS is next run. The <q>Add Game</q>, <q>Edit Game</q> and <q>Remove Game</q> buttons are used to edit the list. Each game has several columns, which are explained below. <table> @@ -376,7 +374,7 @@ To translate the BOSS application: <li>For testing and feedback prior to releases: The Beta Testing &amp; Analysis Guild at <a href="http://tesalliance.org/forums/">TES Alliance</a>, AndalayBay, dAb, dj2005, Dubiousness, hyno111, Invader, matter2003, NightStar, olminator, saebel, Telyn, wiz0floyd, wormheart, Zanderat and zone22. </ul> </ul> -<p>BOSS is written in C++ and makes use of <a href="http://www.graphviz.org/">GraphVis</a> and the <a href="http://www.davekoelle.com/alphanum.html">Alphanum</a>, <a href="http://www.boost.org/">Boost</a>, <a href="http://github.com/WrinklyNinja/libespm">libespm</a>, <a href="http://github.com/libgit2/libgit2">libgit2</a>, <a href="http://github.com/WrinklyNinja/libloadorder">libloadorder</a>, <a href="http://code.google.com/p/pugixml/">PugiXML</a>, <a href="http://www.wxwidgets.org/">wxWidgets</a> and <a href="http://code.google.com/p/yaml-cpp/">yaml-cpp</a> libraries. BOSS's reports are written in XHTML/CSS/Javascript and make use of <a href="http://github.com/inexorabletash/polyfill">Polyfill.js</a> and <a href="https://code.google.com/p/svgweb/">svgweb</a> to provide Internet Explorer 8 compatibility. Copyright license information for all these may be found <a href="licenses/Licenses.txt">here</a>. +<p>BOSS is written in C++ and makes use of the <a href="http://www.davekoelle.com/alphanum.html">Alphanum</a>, <a href="http://www.boost.org/">Boost</a>, <a href="http://github.com/WrinklyNinja/libespm">libespm</a>, <a href="http://github.com/libgit2/libgit2">libgit2</a>, <a href="http://github.com/WrinklyNinja/libloadorder">libloadorder</a>, <a href="http://code.google.com/p/pugixml/">PugiXML</a>, <a href="http://www.wxwidgets.org/">wxWidgets</a> and <a href="http://code.google.com/p/yaml-cpp/">yaml-cpp</a> libraries. BOSS's reports are written in XHTML/CSS/Javascript and make use of <a href="http://github.com/inexorabletash/polyfill">Polyfill.js</a> to provide Internet Explorer 8 compatibility. Copyright license information for all these may be found <a href="licenses/Licenses.txt">here</a>. <h2 id="project">Project Members</h2> @@ -388,30 +386,20 @@ To translate the BOSS application: <tr><th>GitHub<th>Bethesda<th>Nexus<th>Oblivion<th>Skyrim<th>Fallout 3<th>Fallout: New Vegas <tbody class="teamTableBody"> <tr><td>Aellis-BOSS<td colspan="2">Aellis<td>&#x2713;<td><td><td>&#x2713;<td><td> + <tr><td>egocarib<td>egocarib<td>-<td><td><td><td>&#x2713;<td><td> <tr><td colspan="3">Freso<td><td><td><td>&#x2713;<td><td> <tr><td colspan="2">ineedbettername<td>-<td><td><td><td>&#x2713;<td><td> <tr><td colspan="3">LotteryDiscountz<td><td><td><td>&#x2713;<td><td> <tr><td colspan="3">niveuseverto<td><td><td><td><td><td>&#x2713; <tr><td>noxwyll<td colspan="2">iyumichan<td>&#x2713;<td><td><td><td><td>&#x2713; + <tr><td colspan="3">PacificMorrowind<td>&#x2713;<td><td>&#x2713;<td><td><td> <tr><td colspan="3">Sharlikran<td><td><td><td>&#x2713;<td><td> <tr><td colspan="2">SilentSpike<td>SilentSpike69<td><td><td><td>&#x2713;<td><td> <tr><td>TokcDK<td colspan="2">Tokc.D.K.<td><td><td>&#x2713;<td>&#x2713;<td><td> - <tr><td colspan="3">William Imm<td><td><td>&#x2713;<td>&#x2713;<td><td> + <tr><td>William-Imm<td>William Imm<td>WilliamImm<td><td><td>&#x2713;<td>&#x2713;<td><td> <tr><td colspan="3">WrinklyNinja<td>&#x2713;<td>&#x2713;<td><td><td><td> </table> -<p>The status of the following members is currently unknown: - -<table> - <thead> - <tr><th rowspan="2">Member<th rowspan="2">Admin<th rowspan="2">Code<th colspan="4">Contributes To Masterlist - <tr><th>Oblivion<th>Skyrim<th>Fallout 3<th>Fallout: New Vegas - <tbody class="teamTableBody"> - <tr><td>PacificMorrowind<td>&#x2713;<td>&#x2713;<td>&#x2713;<td><td>&#x2713;<td> - <tr><td>Random007<td>&#x2713;<td>&#x2713;<td>&#x2713;<td><td><td> - <tr><td>scrapperrm<td><td><td><td>&#x2713;<td><td> -</table> - <p>Members who have since left the project are credited below: <table> @@ -430,8 +418,10 @@ To translate the BOSS application: <tr><td>Malonn<td><td><td><td><td><td>&#x2713; <tr><td>Peste<td><td><td><td>&#x2713;<td><td> <tr><td>Psymon<td><td><td>&#x2713;<td><td><td> + <tr class="inactive"><td>Random007<td>&#x2713;<td>&#x2713;<td>&#x2713;<td><td><td> <tr><td>Red Eye<td><td><td><td><td><td>&#x2713; <tr><td>RiddlingLynx<td><td><td>&#x2713;<td><td><td> + <tr><td>scrapperrm<td><td><td><td>&#x2713;<td><td> <tr><td>Skyline<td><td><td><td><td><td>&#x2713; <tr><td>Space Oden69<td><td><td><td><td>&#x2713;<td> <tr><td>Televator<td><td><td><td><td>&#x2713;<td> @@ -526,7 +516,7 @@ There are three key pieces of information that are used to accurately describe a <tr><td>Masterlist structure &amp; syntax<td>Uses a custom file format.<td>Uses YAML 1.2, with custom condition string syntax modelled after Python's condition expressions. <tr><td>Userlist structure &amp; syntax<td>Uses a custom file format, different from the masterlist format.<td>Uses the same format and syntax as the masterlist. <tr><td>Morrowind support<td>Technically supports Morrowind, though its masterlist is near-empty.<td>Does not support Morrowind. - <tr><td>BOSS file locations<td>All BOSS's files are stored in the BOSS folder first installed.<td>BOSS stores any files it creates (reports, masterlists, userlists, settings, graphs) in the <code>%LOCALAPPDATA%\BOSS</code> folder. + <tr><td>BOSS file locations<td>All BOSS's files are stored in the BOSS folder first installed.<td>BOSS stores any files it creates (reports, masterlists, userlists, settings) in the <code>%LOCALAPPDATA%\BOSS</code> folder. <tr><td>Game selection on first run.<td>BOSS asks the user to select a game from a list.<td>BOSS selects the first game detected. <tr><td>File CRC calculation<td>File CRC calculation is optional.<td>File CRC calculation is always-on, as it no longer presents any significant additional performance impact. <tr><td>BOSS Log / Report format<td>The BOSS Log can either be generated as plain text or as HTML.<td>The BOSS Report can only be generated as HTML. From 57786493493e5a43371b42540c51f397628aaac8 Mon Sep 17 00:00:00 2001 From: WrinklyNinja <wrinklyninja1@gmail.com> Date: Wed, 29 Jan 2014 10:44:15 +0000 Subject: [PATCH 26/36] Update Licenses.txt Removed graphvis and svgweb license info. --- docs/licenses/Licenses.txt | 7 ------- 1 file changed, 7 deletions(-) diff --git a/docs/licenses/Licenses.txt b/docs/licenses/Licenses.txt index a7beba85..85b03fde 100644 --- a/docs/licenses/Licenses.txt +++ b/docs/licenses/Licenses.txt @@ -9,15 +9,8 @@ BOSS uses a number of libraries, and their licenses are listed in this file. * Libloadorder - GNU GPL v3; see "GNU GPL v3.txt" for the text. * Polyfill.js - This code has been placed in the public domain. * PugiXML - MIT License; see "MIT License (PugiXML).txt" for the text. -* svgweb - Apache License v2.0; see "Apache License v2.0.txt" for the text. * wxWidgets - wxWindows License; the text is not included as allowed by the license. * yaml-cpp - MIT License; see "MIT License (yaml-cpp).txt" for the text. * zlib - zlib license; the text is not included as allowed by the license. -BOSS is also distributed with some binaries for the following programs: - -* GraphViz - Eclipse Public License v1.0; the text is not included as allowed by the license. - -Going by what the EPL FAQ page says, simply running the GraphVis binaries through system calls does not make BOSS a "derivative work", and so it is not bound by the EPL, and so it's OK for BOSS to use GraphVis even though the EPL and GPL are incompatible. - Source code for all libraries and binaries can be found on the websites linked to in the main BOSS readme. From c556d1d7553bef1a8014986eb16d954f3e0f5ede Mon Sep 17 00:00:00 2001 From: WrinklyNinja <wrinklyninja1@gmail.com> Date: Wed, 29 Jan 2014 12:28:33 +0000 Subject: [PATCH 27/36] Removed unnecessary entries from .gitignore. --- .gitignore | 5 ----- 1 file changed, 5 deletions(-) diff --git a/.gitignore b/.gitignore index 36472a3b..035a7bb1 100644 --- a/.gitignore +++ b/.gitignore @@ -44,12 +44,7 @@ Thumbs.db *.suo *.sdf *.opensdf -externals/ build/ docs/html docs/latex -out/ -bin/ -ipch/ -resources/graphvis *.mo From 1b1b8c175ee0bdea4b63fa9121f6af72765d1380 Mon Sep 17 00:00:00 2001 From: WrinklyNinja <wrinklyninja1@gmail.com> Date: Wed, 29 Jan 2014 12:48:44 +0000 Subject: [PATCH 28/36] Fixed formatting of BOSS report in Firefox. --- resources/style.css | 1 + 1 file changed, 1 insertion(+) diff --git a/resources/style.css b/resources/style.css index 4b93c90a..fbec65ba 100644 --- a/resources/style.css +++ b/resources/style.css @@ -53,6 +53,7 @@ noscript div { .button[id] { position:absolute; right:0; + top:0; } #main { position:absolute; From ef26cbfa33a0c1d5f05d8043ce0fd40b8b5e3080 Mon Sep 17 00:00:00 2001 From: WrinklyNinja <wrinklyninja1@gmail.com> Date: Wed, 29 Jan 2014 13:05:32 +0000 Subject: [PATCH 29/36] Fixed issue #91. --- src/gui/viewer.cpp | 7 +++++++ src/gui/viewer.h | 4 ++++ 2 files changed, 11 insertions(+) diff --git a/src/gui/viewer.cpp b/src/gui/viewer.cpp index a449c46c..6e05b552 100644 --- a/src/gui/viewer.cpp +++ b/src/gui/viewer.cpp @@ -29,6 +29,8 @@ Viewer::Viewer(wxWindow *parent, const wxString& title, const std::string& path) : wxFrame(parent, wxID_ANY, title) { wxWebView * web = wxWebView::New(this, wxID_ANY, boss::ToFileURL(path)); + web->Bind(wxEVT_WEBVIEW_NAVIGATING, &Viewer::OnNavigationStart, this); + wxBoxSizer* topsizer = new wxBoxSizer(wxVERTICAL); topsizer->Add(web, 1, wxEXPAND); @@ -37,3 +39,8 @@ Viewer::Viewer(wxWindow *parent, const wxString& title, const std::string& path) SetSize(800,600); SetIcon(wxIconLocation("BOSS.exe")); } + +void Viewer::OnNavigationStart(wxWebViewEvent& event) { + wxLaunchDefaultBrowser(event.GetURL()); + event.Veto(); +} diff --git a/src/gui/viewer.h b/src/gui/viewer.h index 14dd3635..49cb925b 100644 --- a/src/gui/viewer.h +++ b/src/gui/viewer.h @@ -26,9 +26,13 @@ #include "ids.h" +#include <wx/webview.h> + class Viewer : public wxFrame { public: Viewer(wxWindow *parent, const wxString& title, const std::string& path); + + void OnNavigationStart(wxWebViewEvent& event); }; #endif From d67bb2fb55c3b7443b9a6256c9d315211dddf5be Mon Sep 17 00:00:00 2001 From: WrinklyNinja <wrinklyninja1@gmail.com> Date: Wed, 29 Jan 2014 13:57:02 +0000 Subject: [PATCH 30/36] Fixed debug log getting opened in default browser. Should be default application instead, copy/paste error. --- src/gui/main.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/gui/main.cpp b/src/gui/main.cpp index 1023e63d..b3d5d9ac 100644 --- a/src/gui/main.cpp +++ b/src/gui/main.cpp @@ -535,7 +535,7 @@ void Launcher::OnSortPlugins(wxCommandEvent& event) { //Now load userlist. if (fs::exists(_game.UserlistPath())) { - BOOST_LOG_TRIVIAL(debug) << "Parsing userlist..."; + BOOST_LOG_TRIVIAL(debug) << "Parsing userlist at: " << _game.UserlistPath(); try { YAML::Node ulist = YAML::LoadFile(_game.UserlistPath().string()); @@ -1046,7 +1046,7 @@ void Launcher::OnOpenDebugLog(wxCommandEvent& event) { //Look for file. BOOST_LOG_TRIVIAL(debug) << "Opening readme."; if (fs::exists(g_path_log)) { - wxLaunchDefaultBrowser(g_path_log.string()); + wxLaunchDefaultApplication(g_path_log.string()); } else { //No log exists, show a pop-up message saying so. BOOST_LOG_TRIVIAL(error) << "File \"" << g_path_log.string() << "\" could not be found."; wxMessageBox( From 9281ead4557ef89dc8fdc0420800ecb0fafa1783 Mon Sep 17 00:00:00 2001 From: WrinklyNinja <wrinklyninja1@gmail.com> Date: Wed, 29 Jan 2014 14:28:50 +0000 Subject: [PATCH 31/36] Fixed report not getting written to Unicode paths. Part of issue #94. --- src/backend/generators.h | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/src/backend/generators.h b/src/backend/generators.h index a110ad35..b95dd3cf 100644 --- a/src/backend/generators.h +++ b/src/backend/generators.h @@ -537,7 +537,7 @@ namespace boss { } - inline void GenerateReport(const std::string& file, + inline void GenerateReport(const boost::filesystem::path& file, const std::list<Message>& messages, const std::list<Plugin>& plugins, const std::string& oldDetails, @@ -559,11 +559,17 @@ namespace boss { AppendFilters(body, messageNo, plugins.size()); AppendScripts(body); - + //PugiXML's save_file doesn't handle Unicode paths right (it can't open them right), so use a stream instead. + /* if (!doc.save_file(file.c_str(), "\t", pugi::format_default | pugi::format_no_declaration | pugi::format_raw)) { - BOOST_LOG_TRIVIAL(error) << "Could not write BOSS report."; + BOOST_LOG_TRIVIAL(error) << "Could not write BOSS report to: " << file; throw boss::error(boss::error::path_write_fail, boost::locale::translate("Could not write BOSS report.").str()); } + */ + boost::filesystem::path outpath(file); + boss::ofstream out(outpath); + doc.save(out, "\t", pugi::format_default | pugi::format_no_declaration | pugi::format_raw); + out.close(); } From d60ab1fee5bc8eadc730a81f768b6f52c0c1e094 Mon Sep 17 00:00:00 2001 From: WrinklyNinja <wrinklyninja1@gmail.com> Date: Wed, 29 Jan 2014 14:30:28 +0000 Subject: [PATCH 32/36] Viewer now takes wxString URL to try avoiding encoding issues. Part of issue #94. --- src/gui/viewer.cpp | 4 ++-- src/gui/viewer.h | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/gui/viewer.cpp b/src/gui/viewer.cpp index 6e05b552..977633a8 100644 --- a/src/gui/viewer.cpp +++ b/src/gui/viewer.cpp @@ -26,8 +26,8 @@ #include <wx/webview.h> -Viewer::Viewer(wxWindow *parent, const wxString& title, const std::string& path) : wxFrame(parent, wxID_ANY, title) { - wxWebView * web = wxWebView::New(this, wxID_ANY, boss::ToFileURL(path)); +Viewer::Viewer(wxWindow *parent, const wxString& title, const wxString& url) : wxFrame(parent, wxID_ANY, title) { + wxWebView * web = wxWebView::New(this, wxID_ANY, url); web->Bind(wxEVT_WEBVIEW_NAVIGATING, &Viewer::OnNavigationStart, this); diff --git a/src/gui/viewer.h b/src/gui/viewer.h index 49cb925b..aab30f78 100644 --- a/src/gui/viewer.h +++ b/src/gui/viewer.h @@ -30,7 +30,7 @@ class Viewer : public wxFrame { public: - Viewer(wxWindow *parent, const wxString& title, const std::string& path); + Viewer(wxWindow *parent, const wxString& title, const wxString& url); void OnNavigationStart(wxWebViewEvent& event); }; From cd97c41e630de5dbc1603ab9b78ceef2c99a164a Mon Sep 17 00:00:00 2001 From: WrinklyNinja <wrinklyninja1@gmail.com> Date: Wed, 29 Jan 2014 14:32:51 +0000 Subject: [PATCH 33/36] Some encoding safety improvements. However, `ToFileURL` needs to be fixed because it's giving invalid stuff out for Unicode paths. --- src/gui/main.cpp | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/src/gui/main.cpp b/src/gui/main.cpp index b3d5d9ac..3ecf3b45 100644 --- a/src/gui/main.cpp +++ b/src/gui/main.cpp @@ -790,7 +790,7 @@ void Launcher::OnSortPlugins(wxCommandEvent& event) { BOOST_LOG_TRIVIAL(debug) << "Generating report..."; try { - GenerateReport(_game.ReportPath().string(), + GenerateReport(_game.ReportPath(), messages, plugins, oldDetails, @@ -812,10 +812,10 @@ void Launcher::OnSortPlugins(wxCommandEvent& event) { BOOST_LOG_TRIVIAL(debug) << "Displaying report..."; if (_settings["View Report Externally"] && _settings["View Report Externally"].as<bool>()) { - wxLaunchDefaultBrowser(_game.ReportPath().string()); + wxLaunchDefaultBrowser(FromUTF8(ToFileURL(_game.ReportPath().string()))); } else { //Create viewer window. - Viewer *viewer = new Viewer(this, translate("BOSS: Report Viewer"), _game.ReportPath().string()); + Viewer *viewer = new Viewer(this, translate("BOSS: Report Viewer"), FromUTF8(ToFileURL(_game.ReportPath().string()))); viewer->Show(); } @@ -926,11 +926,11 @@ void Launcher::OnEditMetadata(wxCommandEvent& event) { void Launcher::OnViewLastReport(wxCommandEvent& event) { if (_settings["View Report Externally"] && _settings["View Report Externally"].as<bool>()) { BOOST_LOG_TRIVIAL(debug) << "Opening report in external application..."; - wxLaunchDefaultBrowser(_game.ReportPath().string()); + wxLaunchDefaultBrowser(FromUTF8(ToFileURL(_game.ReportPath().string()))); } else { //Create viewer window. BOOST_LOG_TRIVIAL(debug) << "Opening viewer window..."; - Viewer *viewer = new Viewer(this, translate("BOSS: Report Viewer"), _game.ReportPath().string()); + Viewer *viewer = new Viewer(this, translate("BOSS: Report Viewer"), FromUTF8(ToFileURL(_game.ReportPath().string()))); viewer->Show(); } BOOST_LOG_TRIVIAL(debug) << "Report displayed."; @@ -1029,9 +1029,9 @@ void Launcher::OnGameChange(wxCommandEvent& event) { void Launcher::OnHelp(wxCommandEvent& event) { //Look for file. - BOOST_LOG_TRIVIAL(debug) << "Opening readme."; + BOOST_LOG_TRIVIAL(debug) << "Opening readme at: " << g_path_readme; if (fs::exists(g_path_readme)) { - wxLaunchDefaultBrowser(g_path_readme.string()); + wxLaunchDefaultBrowser(FromUTF8(ToFileURL(g_path_readme.string()))); } else { //No readme exists, show a pop-up message saying so. BOOST_LOG_TRIVIAL(error) << "File \"" << g_path_readme.string() << "\" could not be found."; wxMessageBox( @@ -1044,9 +1044,9 @@ void Launcher::OnHelp(wxCommandEvent& event) { void Launcher::OnOpenDebugLog(wxCommandEvent& event) { //Look for file. - BOOST_LOG_TRIVIAL(debug) << "Opening readme."; + BOOST_LOG_TRIVIAL(debug) << "Opening debug log at: " << g_path_log; if (fs::exists(g_path_log)) { - wxLaunchDefaultApplication(g_path_log.string()); + wxLaunchDefaultApplication(FromUTF8(g_path_log.string())); } else { //No log exists, show a pop-up message saying so. BOOST_LOG_TRIVIAL(error) << "File \"" << g_path_log.string() << "\" could not be found."; wxMessageBox( From 9ea3762ca1276b89754a66c5687720f7404e1ed8 Mon Sep 17 00:00:00 2001 From: WrinklyNinja <wrinklyninja1@gmail.com> Date: Wed, 29 Jan 2014 14:52:02 +0000 Subject: [PATCH 34/36] Fixed ToFileURL. Turns out all that encoding stuff is unnecessary anyway, the browsers (IE, Chrome, Firefox tested) just interpret it right anyway. Tested with a Unicode path, part of issue #94 work. --- src/backend/helpers.cpp | 22 +--------------------- 1 file changed, 1 insertion(+), 21 deletions(-) diff --git a/src/backend/helpers.cpp b/src/backend/helpers.cpp index eacf3ef7..c0ada1a0 100644 --- a/src/backend/helpers.cpp +++ b/src/backend/helpers.cpp @@ -229,27 +229,7 @@ namespace boss { //Turns an absolute filesystem path into a valid file:// URL. std::string ToFileURL(const fs::path& file) { BOOST_LOG_TRIVIAL(trace) << "Converting file path " << file << " to a URL."; - //URLs are UTF-8 encoded then any characters (equiv. their corresponding bytes) not in the unreserved set (equiv. their corresponding bytes) are replaced by a percentage sign followed by the hex representation of their binary value. - string unreserved = "-.0123456789:ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz~"; //Unreserved in byte value order, plus the colon character since that's allowed for drive paths. - - string url = "file:///"; - for (boost::filesystem::path::const_iterator it=file.begin(), endit=file.end(); it != endit; ++it) { - string part = it->string(); - if (part == "/") //Skip exta backslash after drive path. - continue; - //String iterator is byte-by-byte, not character-by-character, which is good. - for (string::const_iterator jt=part.begin(), endjt=part.end(); jt != endjt; ++jt) { - if (!binary_search(unreserved.begin(), unreserved.end(), *jt)) - //Replace with percentage-hex value. - url += '%' + IntToHexString(*jt); - else - url += *jt; - } - url += '/'; - } - url.resize(url.length()-1); //Get rid of trailing forward slash. - - return url; + return "file:///" + file.string(); //Seems that we don't need to worry about encoding, tested with Unicode paths. } std::string GetLangString(const unsigned int num) { From 0e6840dfaca63e4cb9fc16aeab2750e8b037b5cf Mon Sep 17 00:00:00 2001 From: WrinklyNinja <wrinklyninja1@gmail.com> Date: Wed, 29 Jan 2014 15:25:15 +0000 Subject: [PATCH 35/36] This should fix the yaml-cpp crashes. Issue #94 work. --- src/api/api.cpp | 8 ++++++-- src/backend/network.cpp | 4 +++- src/gui/main.cpp | 20 +++++++++++++++----- 3 files changed, 24 insertions(+), 8 deletions(-) diff --git a/src/api/api.cpp b/src/api/api.cpp index dbcddd95..ba4a51c5 100644 --- a/src/api/api.cpp +++ b/src/api/api.cpp @@ -259,7 +259,9 @@ BOSS_API unsigned int boss_load_lists (boss_db db, const char * const masterlist try { if (boost::filesystem::exists(masterlistPath)) { if (boost::algorithm::iends_with(masterlistPath, ".yaml")) { - YAML::Node tempNode = YAML::LoadFile(masterlistPath); + boss::ifstream in(masterlistPath); + YAML::Node tempNode = YAML::Load(in); + in.close(); temp = tempNode["plugins"].as< std::list<boss::Plugin> >(); } else { @@ -280,7 +282,9 @@ BOSS_API unsigned int boss_load_lists (boss_db db, const char * const masterlist if (userlistPath != NULL) { if (boost::filesystem::exists(userlistPath)) { if (boost::algorithm::iends_with(userlistPath, ".yaml")) { - YAML::Node tempNode = YAML::LoadFile(userlistPath); + boss::ifstream in(userlistPath); + YAML::Node tempNode = YAML::Load(in); + in.close(); userTemp = tempNode["plugins"].as< std::list<boss::Plugin> >(); } } diff --git a/src/backend/network.cpp b/src/backend/network.cpp index 8545b0dc..c1b5c884 100644 --- a/src/backend/network.cpp +++ b/src/backend/network.cpp @@ -284,7 +284,9 @@ namespace boss { list<boss::Message> messages; list<boss::Plugin> plugins; try { - YAML::Node mlist = YAML::LoadFile(game.MasterlistPath().string()); + boss::ifstream in(game.MasterlistPath()); + YAML::Node mlist = YAML::Load(in); + in.close(); if (mlist["globals"]) messages = mlist["globals"].as< list<boss::Message> >(); diff --git a/src/gui/main.cpp b/src/gui/main.cpp index 3ecf3b45..1bffcb8b 100644 --- a/src/gui/main.cpp +++ b/src/gui/main.cpp @@ -123,7 +123,9 @@ struct masterlist_updater_parser { BOOST_LOG_TRIVIAL(debug) << "Parsing masterlist..."; try { - YAML::Node mlist = YAML::LoadFile(_game.MasterlistPath().string()); + boss::ifstream in(_game.MasterlistPath()); + YAML::Node mlist = YAML::Load(in); + in.close(); if (mlist["globals"]) _messages = mlist["globals"].as< list<boss::Message> >(); @@ -187,7 +189,9 @@ bool BossGUI::OnInit() { } if (fs::exists(g_path_settings)) { try { - _settings = YAML::LoadFile(g_path_settings.string()); + boss::ifstream in(g_path_settings); + _settings = YAML::Load(in); + in.close(); } catch (YAML::ParserException& e) { wxMessageBox( FromUTF8(format(loc::translate("Error: Settings parsing failed. %1%")) % e.what()), @@ -538,7 +542,9 @@ void Launcher::OnSortPlugins(wxCommandEvent& event) { BOOST_LOG_TRIVIAL(debug) << "Parsing userlist at: " << _game.UserlistPath(); try { - YAML::Node ulist = YAML::LoadFile(_game.UserlistPath().string()); + boss::ifstream in(_game.UserlistPath()); + YAML::Node ulist = YAML::Load(in); + in.close(); if (ulist["plugins"]) ulist_plugins = ulist["plugins"].as< list<boss::Plugin> >(); @@ -844,7 +850,9 @@ void Launcher::OnEditMetadata(wxCommandEvent& event) { BOOST_LOG_TRIVIAL(debug) << "Parsing masterlist."; YAML::Node mlist; try { - mlist = YAML::LoadFile(_game.MasterlistPath().string()); + boss::ifstream in(_game.MasterlistPath()); + mlist = YAML::Load(in); + in.close(); } catch (YAML::ParserException& e) { BOOST_LOG_TRIVIAL(error) << "Masterlist parsing failed. " << e.what(); wxMessageBox( @@ -864,7 +872,9 @@ void Launcher::OnEditMetadata(wxCommandEvent& event) { BOOST_LOG_TRIVIAL(debug) << "Parsing userlist."; YAML::Node ulist; try { - ulist = YAML::LoadFile(_game.UserlistPath().string()); + boss::ifstream in(_game.UserlistPath()); + ulist = YAML::Load(in); + in.close(); } catch (YAML::ParserException& e) { BOOST_LOG_TRIVIAL(error) << "Userlist parsing failed. " << e.what(); wxMessageBox( From 3b3e7c7d5871fa893a59a9fd712a6cf51ec44274 Mon Sep 17 00:00:00 2001 From: WrinklyNinja <wrinklyninja1@gmail.com> Date: Wed, 29 Jan 2014 16:10:09 +0000 Subject: [PATCH 36/36] Fixed progress dialog not disappearing if sorting failed. --- src/gui/main.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/gui/main.cpp b/src/gui/main.cpp index 1bffcb8b..019e8bd1 100644 --- a/src/gui/main.cpp +++ b/src/gui/main.cpp @@ -764,7 +764,10 @@ void Launcher::OnSortPlugins(wxCommandEvent& event) { } } catch (std::exception& e) { BOOST_LOG_TRIVIAL(error) << "Failed to calculate the load order. Details: " << e.what(); - messages.push_back(boss::Message(boss::g_message_error, (format(loc::translate("Failed to calculate the load order. Details: %1%")) % e.what()).str())); + messages.push_back(boss::Message(boss::g_message_error, (format(loc::translate("Failed to calculate the load order. Details: %1%")) % e.what()).str())); + + progDia->Destroy(); + progDia = NULL; } //Read the details section of the previous report, if it exists.