2014-03-06 19:23:15 +00:00
/* LOOT
2013-08-09 22:09:27 +01:00
2014-03-06 19:23:15 +00:00
A load order optimisation tool for Oblivion, Skyrim, Fallout 3 and
Fallout: New Vegas.
2013-08-09 22:09:27 +01:00
2014-03-06 19:23:15 +00:00
Copyright (C) 2013-2014 WrinklyNinja
2013-08-09 22:09:27 +01:00
2014-03-06 19:23:15 +00:00
This file is part of LOOT.
2013-08-09 22:09:27 +01:00
2014-03-06 19:23:15 +00:00
LOOT is free software: you can redistribute
2013-08-09 22:09:27 +01:00
it and/or modify it under the terms of the GNU General Public License
as published by the Free Software Foundation, either version 3 of
the License, or (at your option) any later version.
2014-03-06 19:23:15 +00:00
LOOT is distributed in the hope that it will
2013-08-09 22:09:27 +01:00
be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
2014-03-06 19:23:15 +00:00
along with LOOT. If not, see
2013-08-09 22:09:27 +01:00
<http://www.gnu.org/licenses/>.
*/
2013-05-12 19:57:34 +01:00
'use strict' ;
2013-05-13 08:55:12 +01:00
function isStorageSupported () {
try {
return ( 'localStorage' in window && window [ 'localStorage' ] !== null && window [ 'localStorage' ] !== undefined );
} catch ( e ) {
return false ;
}
}
function saveCheckboxState ( evt ) {
if ( evt . currentTarget . checked ) {
try {
2013-06-10 22:58:20 +01:00
localStorage . setItem ( evt . currentTarget . id , true );
2013-05-13 08:55:12 +01:00
} catch ( e ) {
if ( e == QUOTA_EXCEEDED_ERR ) {
alert ( 'Web storage quota for this document has been exceeded. Please empty your browser\'s cache. Note that this will delete all locally stored data.' );
2013-05-12 19:57:34 +01:00
}
}
2013-05-13 08:55:12 +01:00
} else {
localStorage . removeItem ( evt . currentTarget . id );
}
}
function loadSettings () {
var i = localStorage . length - 1 ;
while ( i > - 1 ) {
var elem = document . getElementById ( localStorage . key ( i ));
if ( elem != null && 'defaultChecked' in elem ) {
2013-06-10 22:58:20 +01:00
elem . dispatchEvent ( new MouseEvent ( 'click' ));
2013-05-12 19:57:34 +01:00
}
2013-05-13 08:55:12 +01:00
i -- ;
}
2013-05-12 19:57:34 +01:00
}
function showElement ( element ) {
if ( element != null ) {
if ( element . className . indexOf ( 'hidden' ) != - 1 ) {
2013-05-13 00:44:20 +01:00
element . className = element . className . replace ( 'hidden' , '' );
2013-05-12 19:57:34 +01:00
}
}
}
function hideElement ( element ) {
if ( element != null ) {
2013-05-13 00:44:20 +01:00
if ( element . className . indexOf ( 'hidden' ) == - 1 ) {
2013-05-12 19:57:34 +01:00
element . className += ' hidden' ;
}
}
}
function stepUnhideElement ( element ) {
if ( element != null && element . className . indexOf ( 'hidden' ) != - 1 ) {
element . className = element . className . replace ( 'hidden' , '' );
}
}
function stepHideElement ( element ) {
if ( element != null ) {
element . className += ' hidden' ;
}
}
function toggleDisplayCSS ( evt ) {
var e = document . getElementsByClassName ( evt . target . getAttribute ( 'data-class' ));
if ( evt . target . checked ) {
for ( var i = 0 , z = e . length ; i < z ; i ++ ) {
e [ i ]. className += ' hidden' ;
}
} else {
for ( var i = 0 , z = e . length ; i < z ; i ++ ) {
2013-05-13 00:44:20 +01:00
e [ i ]. className = e [ i ]. className . replace ( 'hidden' , '' );
2013-05-12 19:57:34 +01:00
}
}
}
function toggleFilters ( evt ) {
2013-09-29 18:05:53 +01:00
var filters = document . getElementById ( 'filters' );
2013-05-12 19:57:34 +01:00
if ( document . getElementById ( 'filtersToggle' ). className . indexOf ( 'current' ) == - 1 ) {
showElement ( filters );
evt . target . className += ' current' ;
} else {
hideElement ( filters );
2013-05-13 00:44:20 +01:00
evt . target . className = evt . target . className . replace ( 'current' , '' );
2013-05-12 19:57:34 +01:00
}
}
function showSection ( evt ) {
2013-09-29 18:05:53 +01:00
var elemArr = document . getElementById ( 'nav' ). querySelectorAll ( '.button[data-section]' );
2013-05-13 00:44:20 +01:00
var i = elemArr . length - 1 ;
while ( i > - 1 ) {
hideElement ( document . getElementById ( elemArr [ i ]. getAttribute ( 'data-section' )));
i -- ;
}
2013-05-12 19:57:34 +01:00
showElement ( document . getElementById ( evt . target . getAttribute ( 'data-section' )));
var elem = document . querySelector ( '#nav div.current[data-section]' );
if ( elem != null ) {
2013-05-13 00:44:20 +01:00
elem . className = elem . className . replace ( 'current' , '' );
2013-05-12 19:57:34 +01:00
}
if ( evt . target . className . indexOf ( 'current' ) == - 1 ) {
evt . target . className += ' current' ;
} /*Also enable/disable filters based on current page.*/
2013-09-29 18:05:53 +01:00
if ( evt . target . getAttribute ( 'data-section' ) == 'plugins' ) {
showElement ( document . getElementById ( 'filtersToggle' ));
if ( document . getElementById ( 'filtersToggle' ). className . indexOf ( 'current' ) != - 1 ) {
showElement ( filters );
2013-05-12 19:57:34 +01:00
}
2013-09-29 18:05:53 +01:00
} else {
hideElement ( document . getElementById ( 'filtersToggle' ));
hideElement ( document . getElementById ( 'filters' ));
2013-05-12 19:57:34 +01:00
}
}
function toggleMessages ( evt ) {
var listItems = document . getElementById ( 'plugins' ). getElementsByTagName ( 'li' );
var i = listItems . length - 1 ;
2013-06-10 22:58:20 +01:00
var hiddenNo = parseInt ( document . getElementById ( 'hiddenMessageNo' ). innerHTML );
2013-05-12 19:57:34 +01:00
while ( i > - 1 ) {
var spans = listItems [ i ]. getElementsByTagName ( 'span' );
if ( spans . length == 0 || spans [ 0 ]. className . indexOf ( 'mod' ) == - 1 ) {
var filterMatch = false ;
if ( evt . target . id == 'hideAllPluginMessages' ) {
filterMatch = true ;
2013-05-13 18:37:18 +01:00
} else if ( evt . target . id == 'hideNotes' && listItems [ i ]. className . indexOf ( 'say' ) != - 1 ) {
2013-05-12 19:57:34 +01:00
filterMatch = true ;
2013-06-10 22:58:20 +01:00
} else if ( evt . target . id == 'hideDoNotCleanMessages' && listItems [ i ]. innerHTML . indexOf ( 'Do not clean.' ) != - 1 ) {
2013-05-12 19:57:34 +01:00
filterMatch = true ;
}
if ( filterMatch ) {
if ( evt . target . checked ) {
if ( listItems [ i ]. className . indexOf ( 'hidden' ) == - 1 ) {
hiddenNo ++ ;
}
stepHideElement ( listItems [ i ]);
} else {
stepUnhideElement ( listItems [ i ]);
if ( listItems [ i ]. className . indexOf ( 'hidden' ) == - 1 ) {
hiddenNo -- ;
}
}
}
}
i -- ;
}
2013-06-10 22:58:20 +01:00
document . getElementById ( 'hiddenMessageNo' ). innerHTML = hiddenNo ;
togglePlugins ( evt );
2013-05-12 19:57:34 +01:00
}
function togglePlugins ( evt ) {
var plugins = document . getElementById ( 'plugins' ). getElementsByTagName ( 'ul' )[ 0 ]. childNodes ;
var i = plugins . length - 1 ;
2013-06-10 22:58:20 +01:00
var hiddenNo = parseInt ( document . getElementById ( 'hiddenPluginNo' ). innerHTML );
2013-05-12 19:57:34 +01:00
while ( i > - 1 ) {
if ( plugins [ i ]. nodeType == Node . ELEMENT_NODE ) {
2013-05-15 23:49:06 +01:00
var isMessageless = true ;
2013-05-12 19:57:34 +01:00
var messages = plugins [ i ]. getElementsByTagName ( 'li' );
var j = messages . length - 1 ;
while ( j > - 1 ) {
if ( messages [ j ]. className . indexOf ( 'hidden' ) == - 1 ) {
isMessageless = false ;
break ;
}
j -- ;
}
2013-05-15 23:49:06 +01:00
if ( document . getElementById ( 'hideMessagelessPlugins' ). checked && isMessageless ) {
2013-05-12 19:57:34 +01:00
if ( plugins [ i ]. className . indexOf ( 'hidden' ) == - 1 ) {
hiddenNo ++ ;
hideElement ( plugins [ i ]);
}
} else if ( plugins [ i ]. className . indexOf ( 'hidden' ) != - 1 ) {
hiddenNo -- ;
showElement ( plugins [ i ]);
}
}
i -- ;
}
2013-06-10 22:58:20 +01:00
document . getElementById ( 'hiddenPluginNo' ). innerHTML = hiddenNo ;
2013-05-12 19:57:34 +01:00
}
function setupEventHandlers () {
var i , elemArr ;
2013-05-13 08:55:12 +01:00
if ( isStorageSupported ()) { /*Set up filter value and CSS setting storage read/write handlers.*/
elemArr = document . getElementById ( 'filters' ). getElementsByTagName ( 'input' );
i = elemArr . length - 1 ;
while ( i > - 1 ) {
elemArr [ i ]. addEventListener ( 'click' , saveCheckboxState , false );
i -- ;
}
}
2013-05-12 19:57:34 +01:00
document . getElementById ( 'filtersToggle' ). addEventListener ( 'click' , toggleFilters , false );
/*Set up handlers for section display.*/
elemArr = document . getElementById ( 'nav' ). querySelectorAll ( '.button[data-section]' );
var i = elemArr . length - 1 ;
while ( i > - 1 ) {
elemArr [ i ]. addEventListener ( 'click' , showSection , false );
i -- ;
}
document . getElementById ( 'hideVersionNumbers' ). addEventListener ( 'click' , toggleDisplayCSS , false );
2013-07-27 18:22:32 +01:00
document . getElementById ( 'hideCRCs' ). addEventListener ( 'click' , toggleDisplayCSS , false );
2013-10-02 14:19:41 +01:00
document . getElementById ( 'hideBashTags' ). addEventListener ( 'click' , toggleDisplayCSS , false );
2013-05-12 19:57:34 +01:00
document . getElementById ( 'hideNotes' ). addEventListener ( 'click' , toggleMessages , false );
document . getElementById ( 'hideDoNotCleanMessages' ). addEventListener ( 'click' , toggleMessages , false );
document . getElementById ( 'hideAllPluginMessages' ). addEventListener ( 'click' , toggleMessages , false );
document . getElementById ( 'hideMessagelessPlugins' ). addEventListener ( 'click' , togglePlugins , false );
}
function init () {
setupEventHandlers ();
2013-05-13 08:55:12 +01:00
if ( isStorageSupported ()) {
loadSettings ();
}
2013-05-12 19:57:34 +01:00
showElement ( document . getElementsByTagName ( 'section' )[ 0 ])
}
init ();