/*******************************************************************************

    µMatrix - a Chromium browser extension to black/white list requests.
    Copyright (C) 2014  Raymond Hill

    This program is free software: you can redistribute 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.

    This program is distributed in the hope that it will 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
    along with this program.  If not, see {http://www.gnu.org/licenses/}.

    Home: https://github.com/gorhill/uMatrix
*/

/* global vAPI, uDom */
/* jshint multistr: true */

/******************************************************************************/

(function() {

'use strict';

/******************************************************************************/

var messager = vAPI.messaging.channel('settings.js');

var cachedUserSettings = {};

/******************************************************************************/

var subframeDemoBackgroundImage = 'repeating-linear-gradient(\
-45deg,\
{{color}},{{color}} 24%,\
transparent 26%,transparent 49%,\
{{color}} 51%,{{color}} 74%,\
transparent 76%,transparent\
)';

var updateSubframeDemo = function() {
    var demo = uDom('#subframe-color-demo');
    var color = uDom('#subframe-color').val();
    demo.css('border-color', color);
    var re = new RegExp('\{\{color\}\}', 'g');
    demo.css('background-image', subframeDemoBackgroundImage.replace(re, color));
    demo.css('opacity', (parseInt(uDom('#subframe-opacity').val(), 10) / 100).toFixed(1));
};

var onSubframeColorChanged = function() {
    var color = uDom('#subframe-color').val();
    if ( color === '' ) {
        uDom('#subframe-color').val(color);
    }
    changeUserSettings('subframeColor', color);
    var opacity = parseInt(uDom('#subframe-opacity').val(), 10);
    if ( Number.isNaN(opacity) ) {
        opacity = 100;
    }
    changeUserSettings('subframeOpacity', opacity);
    updateSubframeDemo();
};

/******************************************************************************/

function changeUserSettings(name, value) {
    messager.send({
        what: 'userSettings',
        name: name,
        value: value
    });
}

/******************************************************************************/

function prepareToDie() {
    onSubframeColorChanged();
}

/******************************************************************************/

var installEventHandlers = function() {
    // `data-range` allows to add/remove bool properties without 
    // changing code.
    uDom('input[data-range="bool"]').on('change', function() {
        changeUserSettings(this.id, this.checked);
    });

    uDom('input[name="displayTextSize"]').on('change', function(){
        changeUserSettings('displayTextSize', this.value);
    });
    uDom('#smart-auto-reload').on('change', function(){
        changeUserSettings('smartAutoReload', this.value);
    });
    uDom('#subframe-color').on('change', function(){ onSubframeColorChanged(); });
    uDom('#subframe-opacity').on('change', function(){ onSubframeColorChanged(); });

    // https://github.com/gorhill/httpswitchboard/issues/197
    uDom(window).on('beforeunload', prepareToDie);
};

/******************************************************************************/

uDom.onLoad(function() {
    var onUserSettingsReceived = function(userSettings) {
        // Cache copy
        cachedUserSettings = userSettings;

        // `data-range` allows to add/remove bool properties without 
        // changing code.
        uDom('input[data-range="bool"]').forEach(function(elem) {
            elem.prop('checked', userSettings[elem.attr('id')] === true);
        });

        uDom('input[name="displayTextSize"]').forEach(function(elem) {
            elem.prop('checked', elem.val() === userSettings.displayTextSize);
        });
        uDom('#smart-auto-reload').val(userSettings.smartAutoReload);
        uDom('#subframe-color').val(userSettings.subframeColor);
        uDom('#subframe-opacity').val(userSettings.subframeOpacity);
        updateSubframeDemo();

        installEventHandlers();
    };
    messager.send({ what: 'getUserSettings' }, onUserSettingsReceived);
});

/******************************************************************************/

})();
