#!/bin/bash

OBTHEME=$(awk '/<theme>/ {while (getline n) {if (match(n, /<name>/))
          {l=n; exit}}} END {split(l, a, "[<>]"); print a[3]}' "$HOME/.config/openbox/rc.xml")
#echo "$OBTHEME"
THEMEDIR="$HOME/.themes/$OBTHEME/openbox-3"
THEMERC="$HOME/.themes/$OBTHEME/openbox-3/themerc"

#if [[ $OBTHEME = MBcolor* ]];then
#switch to MBcolors theme
#   THEMEDIR="$HOME/.themes/$OBTHEME/openbox-3"
#   THEMERC="$HOME/.themes/$OBTHEME/openbox-3/themerc"  
#   else
#   xmlstarlet ed -L -N o="http://openbox.org/3.4/rc" -u '/o:openbox_config/o:theme/o:name' -v "MBcolors" "$HOME/.config/openbox/rc.xml"
#   THEMEDIR="$HOME/.themes/MBcolors/openbox-3"
#   THEMERC="$HOME/.themes/MBcolors/openbox-3/themerc"
#fi


MBCOLORSDIR="$HOME"/.themes/MBcolors/openbox-3/
if [ ! -d "$MBCOLORSDIR" ]; then
mkdir -p ${MBCOLORSDIR}
rsync -a /usr/share/mabox-colorizer/themes/MBcolors/openbox-3/* ${MBCOLORSDIR}/
fi

    if [ ! -f "${THEMERC}.bak" ]; then
    cp ${THEMERC} ${THEMERC}.bak
    fi

theme () {
    xmlstarlet ed -L -N o="http://openbox.org/3.4/rc" -u '/o:openbox_config/o:theme/o:name' -v "$1" "$HOME/.config/openbox/rc.xml"
}
reset () {
    rm ${THEMERC}
    mv ${THEMERC}.bak ${THEMERC}
}
resetonlycolors () {
    theme MBcolors
    clractivebg "#579c8e"
    clractivebgto "#41756a"
    
    
}
resetMBcolors() {
    theme MBcolors
    rsync -a /usr/share/mabox-colorizer/themes/MBcolors/openbox-3/* ${MBCOLORSDIR}/
    #set font
    nspace="http://openbox.org/3.4/rc"
    cfg="$HOME/.config/openbox/rc.xml"

    xmlstarlet ed -L -N a="$nspace" -u '/a:openbox_config/a:theme/a:font[@place="ActiveWindow"]/a:name' -v "Ubuntu" "$cfg"
    xmlstarlet ed -L -N a="$nspace" -u '/a:openbox_config/a:theme/a:font[@place="ActiveWindow"]/a:size' -v "9" "$cfg"
    xmlstarlet ed -L -N a="$nspace" -u '/a:openbox_config/a:theme/a:font[@place="ActiveWindow"]/a:weight' -v "Bold" "$cfg"
    xmlstarlet ed -L -N a="$nspace" -u '/a:openbox_config/a:theme/a:font[@place="ActiveWindow"]/a:slant' -v "Normal" "$cfg"

    xmlstarlet ed -L -N a="$nspace" -u '/a:openbox_config/a:theme/a:font[@place="InactiveWindow"]/a:name' -v "Ubuntu" "$cfg"
    xmlstarlet ed -L -N a="$nspace" -u '/a:openbox_config/a:theme/a:font[@place="InactiveWindow"]/a:size' -v "9" "$cfg"
    xmlstarlet ed -L -N a="$nspace" -u '/a:openbox_config/a:theme/a:font[@place="InactiveWindow"]/a:weight' -v "Bold" "$cfg"
    xmlstarlet ed -L -N a="$nspace" -u '/a:openbox_config/a:theme/a:font[@place="InactiveWindow"]/a:slant' -v "Normal" "$cfg"
    rm ${THEMERC}.bak
}
    
borderWidth () {
    case "$1" in
        increase)
        read BWIDTH <<< "$(grep border.width: ${THEMERC} | cut -d':' -f2)"
        BWIDTH=$((BWIDTH+1))
        sd "^border.width:.*$" "border.width: ${BWIDTH}" ${THEMERC}
        ;;
        decrease)
        read BWIDTH <<< "$(grep border.width: ${THEMERC} | cut -d':' -f2)"
        if [ "$BWIDTH" -gt "0" ];then
        BWIDTH=$((BWIDTH-1))
        sd "^border.width:.*$" "border.width: ${BWIDTH}" ${THEMERC}
        fi
        ;;
        *)
        sd "^border.width:.*$" "border.width: $1" ${THEMERC}
        ;;
    esac
}
activeborderColor () {
    sd "\.active.border.color:.*$" ".active.border.color: $1" ${THEMERC}
    read BORD <<< "$(grep border.width ${THEMERC} | cut -d':' -f2)"
    [[ "$BORD" == 0 ]] && borderWidth 1
}
inactiveborderColor () {
    sd "\.inactive.border.color:.*$" ".inactive.border.color: $1" ${THEMERC}
    read BORD <<< "$(grep border.width ${THEMERC} | cut -d':' -f2)"
    [[ "$BORD" == 0 ]] && borderWidth 1
}
paddingHeight () {
    case "$1" in
        increase)
        read PHEIGHT <<< "$(grep ^padding.height: ${THEMERC} | cut -d':' -f2)"
        PHEIGHT=$((PHEIGHT+1))
        sd "^padding.height:.*$" "padding.height: ${PHEIGHT}" ${THEMERC}
        sd "^padding.width:.*$" "padding.width: ${PHEIGHT}" ${THEMERC}
        ;;
        decrease)
        read PHEIGHT <<< "$(grep ^padding.height: ${THEMERC} | cut -d':' -f2)"
        if [ "$PHEIGHT" -gt "0" ];then
        PHEIGHT=$((PHEIGHT-1))
        sd "^padding.height:.*$" "padding.height: ${PHEIGHT}" ${THEMERC}
        sd "^padding.width:.*$" "padding.width: ${PHEIGHT}" ${THEMERC}
        fi
        ;;
        0|1|2|3|4|5|6|8|10|12|16|20)
        sd "^padding.height:.*$" "padding.height: $1" ${THEMERC}
        sd "^padding.width:.*$" "padding.width: $1" ${THEMERC}
        ;;
    esac
    
}
paddingWidth () {
    sd "^padding.width:.*$" "padding.width: $1" ${THEMERC}
}
textjustify () {
    sd "\.text.justify:.*$" ".text.justify: $1" ${THEMERC}
}
shadow () {
    case "$1" in
        0|no)
        sd "\.active.label.text.font:.*$" ".active.label.text.font: shadow=n:shadowtint=70:shadowoffset=1" ${THEMERC}
        sd "\.inactive.label.text.font:.*$" ".inactive.label.text.font: shadow=n:shadowtint=20:shadowoffset=1" ${THEMERC}
        ;;
        1|dark)
        sd "\.active.label.text.font:.*$" ".active.label.text.font: shadow=y:shadowtint=70:shadowoffset=1" ${THEMERC}
        #sd "\.inactive.label.text.font:.*$" ".inactive.label.text.font: shadow=y:shadowtint=20:shadowoffset=1" ${THEMERC}
        ;;
        2|light)
        sd "\.active.label.text.font:.*$" ".active.label.text.font: shadow=y:shadowtint=-40:shadowoffset=1" ${THEMERC}
        #sd "\.inactive.label.text.font:.*$" ".inactive.label.text.font: shadow=y:shadowtint=-20:shadowoffset=1" ${THEMERC}
        ;;
    esac

}
handlewidth () {
    sd "\.handle.width:.*$" ".handle.width: $1" ${THEMERC}
}
raised () {
    #flat 0 or raised 1 or sunken 2
    read WINRAISED REST <<< "$(grep .title.bg: ${THEMERC} | cut -d':' -f2)"
    case "$1" in
        0|flat)
        sd "\.title.bg:.*$" ".title.bg: flat ${REST}" ${THEMERC}
        sd "\.handle.bg:.*$" ".handle.bg: flat ${REST}" ${THEMERC}
        sd "\.grip.bg:.*$" ".grip.bg: flat ${REST}" ${THEMERC}
        ;;
        1|raised)
        sd "\.title.bg:.*$" ".title.bg: raised ${REST}" ${THEMERC}
        sd "\.handle.bg:.*$" ".handle.bg: raised ${REST}" ${THEMERC}
        sd "\.grip.bg:.*$" ".grip.bg: raised ${REST}" ${THEMERC}
        ;;
        2|sunken)
        sd "\.title.bg:.*$" ".title.bg: sunken ${REST}" ${THEMERC}
        sd "\.handle.bg:.*$" ".handle.bg: sunken ${REST}" ${THEMERC}
        sd "\.grip.bg:.*$" ".grip.bg: sunken ${REST}" ${THEMERC}
        ;;
    esac
}
gradient_type () {
    #solid or gradient gradient-type
    read WINRAISED REST <<< "$(grep .title.bg: ${THEMERC} | cut -d':' -f2)"
    case "$1" in
        solid)
        sd "\.title.bg:.*$" ".title.bg: ${WINRAISED} solid" ${THEMERC}
        sd "\.handle.bg:.*$" ".handle.bg: ${WINRAISED} solid" ${THEMERC}
        sd "\.grip.bg:.*$" ".grip.bg: ${WINRAISED} solid" ${THEMERC}
        ;;
        *)
        sd "\.title.bg:.*$" ".title.bg: ${WINRAISED} gradient ${1}" ${THEMERC}
        sd "\.handle.bg:.*$" ".handle.bg: ${WINRAISED} gradient ${1}" ${THEMERC}
        sd "\.grip.bg:.*$" ".grip.bg: ${WINRAISED} gradient ${1}" ${THEMERC}
        ;;
    esac
}
random_gradient () {
    GRADIENT_FILE="$HOME"/.config/colorizer/gradients_all.inc
    if [ ! -f $GRADIENT_FILE ]; then
        cp -a /usr/share/mabox-colorizer/gradients_all.inc $GRADIENT_FILE
    fi
    read CLR CLRTO REST <<< "$(shuf -n 1 $GRADIENT_FILE)"
    activegradient "$CLR" "$CLRTO"
}
activegradient () {
    # ACTIVE
    
    # ACTIVE GRIP and HANDLE
    colorTo=$(pastel darken 0.1 "${1}"|pastel format hex)
    #activehandle?
    ###read ABG <<< "$(grep .active.title.bg.color: ${THEMERC} | cut -d':' -f2)"
    ###read AHBG <<< "$(grep .active.handle.bg.color: ${THEMERC} | cut -d':' -f2)"
    ###if [ "$ABG" == "$AHBG" ];then
    
    ###fi
    sd "\.active.grip.bg.color:.*$" ".active.grip.bg.color: ${1}" ${THEMERC}
    sd "\.active.grip.bg.colorTo:.*$" ".active.grip.bg.colorTo: ${colorTo}" ${THEMERC}
    sd "^window.active.title.bg.color:.*$" "window.active.title.bg.color: ${1}" ${THEMERC}
    sd "\.active.border.color:.*$" ".active.border.color: ${1}" ${THEMERC}
    
    sd "^window.active.title.bg.colorTo:.*$" "window.active.title.bg.colorTo: ${colorTo}" ${THEMERC}
    
    
    #sd "\.active.handle.bg.color:.*$" ".active.handle.bg.color: ${1}" ${THEMERC}
    sd "^window.active.title.bg.color:.*$" "window.active.title.bg.color: ${1}" ${THEMERC}
    sd "^window.active.title.bg.colorTo:.*$" "window.active.title.bg.colorTo: ${2}" ${THEMERC}
    
    ## split.To - only used if gradient = splitvertical
    splitTo=$(pastel lighten 0.275 "${1}"|pastel format hex)
    ## 1 color (top one)
    sd "window.active.title.bg.color.splitTo:.*$" "window.active.title.bg.color.splitTo: ${splitTo}"  ${THEMERC}
    
    splitTo2=$(pastel lighten 0.12 "${2}"|pastel format hex)
    #splitTo2=$(pastel lighten 0.09 "${1}"|pastel format hex)
    ## 4 color (bottom one)
    sd "window.active.title.bg.colorTo.splitTo:.*$" "window.active.title.bg.colorTo.splitTo: ${splitTo2}" ${THEMERC}
    
    
    # Border color = active.title.bg.color (gradient start color)
    sd "\.active.border.color:.*$" ".active.border.color: $1" ${THEMERC}
    
    #### INACTIVE
    icolor=$(pastel mix -s RGB -f 0.3 ${1} '#000000' |pastel format hex)
    icolorTo=$(pastel mix -s RGB -f 0.3 ${2} '#000000' |pastel format hex)
    
    
    sd "^window.inactive.title.bg.color:.*$" "window.inactive.title.bg.color: ${icolor}" ${THEMERC}
    sd "^window.inactive.title.bg.colorTo:.*$" "window.inactive.title.bg.colorTo: ${icolorTo}" ${THEMERC}
    # Border color = active.title.bg.color (gradient start color)
    sd "\.inactive.border.color:.*$" ".inactive.border.color: ${icolor}" ${THEMERC}
    
    ## INACTIVE GRIP and HANDLE
    #normalhandle?
    ###read IBG <<< "$(grep .inactive.title.bg.color: ${THEMERC} | cut -d':' -f2)"
    ###read IHBG <<< "$(grep .inactive.handle.bg.color: ${THEMERC} | cut -d':' -f2)"
    ###if [ "$IBG" == "$IHBG" ];then
    sd "\.inactive.handle.bg.color:.*$" ".inactive.handle.bg.color: ${icolor}" ${THEMERC}
    sd "\.inactive.handle.bg.colorTo:.*$" ".inactive.handle.bg.colorTo: ${icolorTo}" ${THEMERC}
    ###fi
    sd "\.inactive.grip.bg.color:.*$" ".inactive.grip.bg.color: ${icolor}" ${THEMERC}
    sd "\.inactive.grip.bg.colorTo:.*$" ".inactive.grip.bg.colorTo: ${icolorTo}" ${THEMERC}
    sd "^window.inactive.title.bg.color:.*$" "window.inactive.title.bg.color: ${icolor}" ${THEMERC}
    sd "\.inactive.border.color:.*$" ".inactive.border.color: ${icolor}" ${THEMERC}
    sd "^window.inactive.title.bg.colorTo:.*$" "window.inactive.title.bg.colorTo: ${icolorTo}" ${THEMERC}
    
    ## Active handle always have inactive colors
    sd "\.active.handle.bg.color:.*$" ".active.handle.bg.color: ${icolor}" ${THEMERC}
    sd "\.active.handle.bg.colorTo:.*$" ".active.handle.bg.colorTo: ${icolorTo}" ${THEMERC}
    
    
    # calculate color for title.fg and buttons
    TITLE_FG=$(pastel textcolor ${2}|pastel format hex)
    if [[ "${TITLE_FG}" == *"ffffff"* ]];then
        TITLE_FG="#E5E5E5"
    else
        TITLE_FG="#222222"
    fi
    sd "\.active.label.text.color:.*$" ".active.label.text.color: ${TITLE_FG}" ${THEMERC}
    
    # Button colors
    activebuttonscolors "${TITLE_FG}"
    # Shadow
    read SHADOW <<< "$(grep .active.label.text.font: ${THEMERC} | cut -d':' -f2| cut -d'=' -f2)"
    if [ "$SHADOW" == "y" ];then
        if [ "$TITLE_FG" == "#E5E5E5" ];then
        shadow dark
        else
        shadow light
        fi
    fi
}
gradient () {
    sd "^window.active.title.bg.color:.*$" "window.active.title.bg.color: ${1}" ${THEMERC}
    sd "^window.active.title.bg.colorTo:.*$" "window.active.title.bg.colorTo: ${2}" ${THEMERC}
    
    ## split.To - only used if gradient = splitvertical
    splitTo=$(pastel lighten 0.275 "${1}"|pastel format hex)
    ## 1 color (top one)
    sd "window.active.title.bg.color.splitTo:.*$" "window.active.title.bg.color.splitTo: ${splitTo}"  ${THEMERC}
    
    splitTo2=$(pastel lighten 0.12 "${2}"|pastel format hex)
    #splitTo2=$(pastel lighten 0.09 "${1}"|pastel format hex)
    ## 4 color (bottom one)
    sd "window.active.title.bg.colorTo.splitTo:.*$" "window.active.title.bg.colorTo.splitTo: ${splitTo2}" ${THEMERC}
    
    # Border color = active.title.bg.color (gradient start color)
    sd "\.active.border.color:.*$" ".active.border.color: $1" ${THEMERC}
    
    #### INACTIVE
    icolor=$(pastel darken 0.5 ${1}|pastel format hex)
    icolorTo=$(pastel darken 0.5 ${2}|pastel format hex)
    
    sd "^window.inactive.title.bg.color:.*$" "window.inactive.title.bg.color: ${icolor}" ${THEMERC}
    sd "^window.inactive.title.bg.colorTo:.*$" "window.inactive.title.bg.colorTo: ${icolorTo}" ${THEMERC}
    # Border color = active.title.bg.color (gradient start color)
    sd "\.inactive.border.color:.*$" ".inactive.border.color: ${icolor}" ${THEMERC}
    
    
    
    # calculate color for title.fg and buttons
    TITLE_FG=$(pastel textcolor ${2}|pastel format hex)
    if [[ "${TITLE_FG}" == *"ffffff"* ]];then
        TITLE_FG="#E5E5E5"
    else
        TITLE_FG="#222222"
    fi
    sd "\.active.label.text.color:.*$" ".active.label.text.color: ${TITLE_FG}" ${THEMERC}
    
    # Button colors
    activebuttonscolors "${TITLE_FG}"
    # Shadow
    read SHADOW <<< "$(grep .active.label.text.font: ${THEMERC} | cut -d':' -f2| cut -d'=' -f2)"
    if [ "$SHADOW" == "y" ];then
        if [ "$TITLE_FG" == "#E5E5E5" ];then
        shadow dark
        else
        shadow light
        fi
    fi
    
}
gradient_reverse () {
:
}
activehandle () {
    case "$1" in
        no) #no
        read NBG <<< "$(grep inactive.title.bg.color: ${THEMERC} | cut -d':' -f2)"
        read NBGTO <<< "$(grep inactive.title.bg.colorTo: ${THEMERC} | cut -d':' -f2)"
        #notify-send.sh "Normal" "${NBG} ${NBGTO}"
        sd "\.active.handle.bg.color:.*$" ".active.handle.bg.color: ${NBG}" ${THEMERC}
        sd "\.active.handle.bg.colorTo:.*$" ".active.handle.bg.colorTo: ${NBGTO}" ${THEMERC}
        sd "\.active.grip.bg:.*$" ".active.grip.bg: parentrelative" ${THEMERC}
        sd "\.active.grip.bg.color:.*$" ".active.grip.bg.color: ${NBG}" ${THEMERC}
        sd "\.active.grip.bg.colorTo:.*$" ".active.grip.bg.colorTo: ${NBGTO}" ${THEMERC}
        ;;
        yes) #yes
        read ABG <<< "$(grep window.active.title.bg.color: ${THEMERC} | cut -d':' -f2)"
        read ABGTO <<< "$(grep window.active.title.bg.colorTo: ${THEMERC} | cut -d':' -f2)"
        #notify-send.sh "Active" "${ABG} ${ABGTO}"
        sd "\.active.handle.bg.color:.*$" ".active.handle.bg.color: ${ABG}" ${THEMERC}
        sd "\.active.handle.bg.colorTo:.*$" ".active.handle.bg.colorTo: ${ABGTO}" ${THEMERC}
        sd "\.active.grip.bg:.*$" ".active.grip.bg: parentrelative" ${THEMERC}
        sd "\.active.grip.bg.color:.*$" ".active.grip.bg.color: ${ABG}" ${THEMERC}
        sd "\.active.grip.bg.colorTo:.*$" ".active.grip.bg.colorTo: ${ABGTO}" ${THEMERC}
        ;;
        grip)
        read GRAD <<< "$(grep .title.bg: ${THEMERC} | cut -d':' -f2)"
        read ABG <<< "$(grep window.active.title.bg.color: ${THEMERC} | cut -d':' -f2)"
        read ABGTO <<< "$(grep window.active.title.bg.colorTo: ${THEMERC} | cut -d':' -f2)"
        read NBG <<< "$(grep inactive.title.bg.color: ${THEMERC} | cut -d':' -f2)"
        read NBGTO <<< "$(grep inactive.title.bg.colorTo: ${THEMERC} | cut -d':' -f2)"
        sd "\.active.grip.bg:.*$" ".active.grip.bg: ${GRAD}" ${THEMERC}
        sd "\.active.grip.bg.color:.*$" ".active.grip.bg.color: ${ABG}" ${THEMERC}
        sd "\.active.grip.bg.colorTo:.*$" ".active.grip.bg.colorTo: ${ABGTO}" ${THEMERC}
        sd "\.active.handle.bg.color:.*$" ".active.handle.bg.color: ${NBG}" ${THEMERC}
        sd "\.active.handle.bg.colorTo:.*$" ".active.handle.bg.colorTo: ${NBGTO}" ${THEMERC}
        ;;
        esac
}
clractivebg_only () {
    sd "^window.active.title.bg.color:.*$" "window.active.title.bg.color: ${1}" ${THEMERC}
    # calculate color for title.fg and buttons
    TITLE_FG=$(pastel textcolor ${1}|pastel format hex)
    if [[ "${TITLE_FG}" == *"ffffff"* ]];then
        TITLE_FG="#E5E5E5"
    else
        TITLE_FG="#222222"
    fi
    sd "\.active.label.text.color:.*$" ".active.label.text.color: ${TITLE_FG}" ${THEMERC}
    
    # Button colors
    activebuttonscolors "${TITLE_FG}"
}
clractivebg () {
    colorTo=$(pastel darken 0.14 "${1}"|pastel format hex)
    #activehandle?
    read ABG <<< "$(grep .active.title.bg.color: ${THEMERC} | cut -d':' -f2)"
    read AHBG <<< "$(grep .active.handle.bg.color: ${THEMERC} | cut -d':' -f2)"
    if [ "$ABG" == "$AHBG" ];then
    sd "\.active.handle.bg.color:.*$" ".active.handle.bg.color: ${1}" ${THEMERC}
    sd "\.active.handle.bg.colorTo:.*$" ".active.handle.bg.colorTo: ${colorTo}" ${THEMERC}
    fi
    sd "\.active.grip.bg.color:.*$" ".active.grip.bg.color: ${1}" ${THEMERC}
    sd "\.active.grip.bg.colorTo:.*$" ".active.grip.bg.colorTo: ${colorTo}" ${THEMERC}
    sd "^window.active.title.bg.color:.*$" "window.active.title.bg.color: ${1}" ${THEMERC}
    sd "\.active.border.color:.*$" ".active.border.color: ${1}" ${THEMERC}
    
    sd "^window.active.title.bg.colorTo:.*$" "window.active.title.bg.colorTo: ${colorTo}" ${THEMERC}
    
    ## split.To - only used if gradient = splitvertical
    splitTo=$(pastel lighten 0.275 "${1}"|pastel format hex)
    ## 1 color (top one)
    sd "window.active.title.bg.color.splitTo:.*$" "window.active.title.bg.color.splitTo: ${splitTo}"  ${THEMERC}
    
    splitTo2=$(pastel lighten 0.12 "${colorTo}"|pastel format hex)
    #splitTo2=$(pastel lighten 0.09 "${1}"|pastel format hex)
    ## 4 color (bottom one)
    sd "window.active.title.bg.colorTo.splitTo:.*$" "window.active.title.bg.colorTo.splitTo: ${splitTo2}" ${THEMERC}
    
    #menu (Openbox menu - not really used in Mabox)
    sd "menu.title.bg.color:.*$" "menu.title.bg.color: ${1}" ${THEMERC}
    sd "menu.title.bg.colorTo:.*$" "menu.title.bg.colorTo: ${colorTo}" ${THEMERC}
    
    sd "menu.items.active.bg.color:.*$" "menu.items.active.bg.color: ${1}" ${THEMERC}
    sd "menu.items.active.bg.colorTo:.*$" "menu.items.active.bg.colorTo: ${colorTo}" ${THEMERC}
    
    # calculate color for title.fg and buttons
    TITLE_FG=$(pastel textcolor ${colorTo}|pastel format hex)
    if [[ "${TITLE_FG}" == *"ffffff"* ]];then
        TITLE_FG="#E5E5E5"
    else
        TITLE_FG="#222222"
    fi
    sd "\.active.label.text.color:.*$" ".active.label.text.color: ${TITLE_FG}" ${THEMERC}
    
    # Button colors
    activebuttonscolors "${TITLE_FG}"
    
}

clrnormalbg_only () {
    sd "^window.inactive.title.bg.color:.*$" "window.inactive.title.bg.color: ${1}" ${THEMERC}
}

clrnormalbg () {
    colorTo=$(pastel darken 0.1 "${1}"|pastel format hex)

    ###sd "\.inactive.handle.bg.color:.*$" ".inactive.handle.bg.color: ${1}" ${THEMERC}
    ###sd "\.inactive.handle.bg.colorTo:.*$" ".inactive.handle.bg.colorTo: ${colorTo}" ${THEMERC}
    sd "\.handle.bg.color:.*$" ".handle.bg.color: ${1}" ${THEMERC}
    sd "\.handle.bg.colorTo:.*$" ".handle.bg.colorTo: ${colorTo}" ${THEMERC}

    sd "\.inactive.grip.bg.color:.*$" ".inactive.grip.bg.color: ${1}" ${THEMERC}
    sd "\.inactive.grip.bg.colorTo:.*$" ".inactive.grip.bg.colorTo: ${colorTo}" ${THEMERC}
    sd "^window.inactive.title.bg.color:.*$" "window.inactive.title.bg.color: ${1}" ${THEMERC}
    sd "^window.inactive.title.bg.colorTo:.*$" "window.inactive.title.bg.colorTo: ${colorTo}" ${THEMERC}
    
    ## split.To - only used if gradient = splitvertical
    splitTo=$(pastel lighten 0.275 "${1}"|pastel format hex)
    ## 1 color (top one)
    sd "window.inactive.title.bg.color.splitTo:.*$" "window.inactive.title.bg.color.splitTo: ${splitTo}"  ${THEMERC}
    
    splitTo2=$(pastel lighten 0.12 "${colorTo}"|pastel format hex)
    #splitTo2=$(pastel lighten 0.09 "${1}"|pastel format hex)
    ## 4 color (bottom one)
    sd "window.inactive.title.bg.colorTo.splitTo:.*$" "window.inactive.title.bg.colorTo.splitTo: ${splitTo2}" ${THEMERC}
    
    
    
    sd "\.inactive.border.color:.*$" ".inactive.border.color: ${1}" ${THEMERC}
}

clractivebgto () {
    sd "^window.active.title.bg.colorTo:.*$" "window.active.title.bg.colorTo: ${1}" ${THEMERC}
    
    splitTo2=$(pastel lighten 0.12 "${1}"|pastel format hex)
    #splitTo2=$(pastel lighten 0.09 "${1}"|pastel format hex)
    ## 4 color (bottom one)
    sd "window.active.title.bg.colorTo.splitTo:.*$" "window.active.title.bg.colorTo.splitTo: ${splitTo2}" ${THEMERC}
    
    #activehandle?
    ###read ABG <<< "$(grep .active.title.bg.color: ${THEMERC} | cut -d':' -f2)"
    ###read AHBG <<< "$(grep .active.handle.bg.color: ${THEMERC} | cut -d':' -f2)"
    ###if [ "$ABG" == "$AHBG" ];then
    sd "\.active.handle.bg.colorTo:.*$" ".active.handle.bg.colorTo: ${1}" ${THEMERC}
    ###fi
    sd "\.active.grip.bg.colorTo:.*$" ".active.grip.bg.colorTo: ${1}" ${THEMERC}
}

clrnormalbgto () {
    sd "^window.inactive.title.bg.colorTo:.*$" "window.inactive.title.bg.colorTo: ${1}" ${THEMERC}
    splitTo2=$(pastel lighten 0.12 "${1}"|pastel format hex)
    #splitTo2=$(pastel lighten 0.09 "${1}"|pastel format hex)
    ## 4 color (bottom one)
    sd "window.active.title.bg.colorTo.splitTo:.*$" "window.active.title.bg.colorTo.splitTo: ${splitTo2}" ${THEMERC}
    
    sd "\.inactive.handle.bg.colorTo:.*$" ".inactive.handle.bg.colorTo: ${1}" ${THEMERC}
    sd "\.inactive.grip.bg.colorTo:.*$" ".inactive.grip.bg.colorTo: ${1}" ${THEMERC}
}
activetextcolor () {
    sd "\.active.label.text.color:.*$" ".active.label.text.color: ${1}" ${THEMERC}
    activebuttonscolors ${1}
}
inactivetextcolor () {
    sd "\.inactive.label.text.color:.*$" ".inactive.label.text.color: ${1}" ${THEMERC}
}
buttons () {
    rm $THEMEDIR/*.xbm
    cp -a /usr/share/mabox-colorizer/themes/obbuttons/${1}/*.xbm $THEMEDIR/
    #save buttons name to file
    echo "${1}" > $THEMEDIR/.buttons
    #if buttons big check font size also
    case "$1" in
        big-12)
        nspace="http://openbox.org/3.4/rc"
        cfg="$HOME/.config/openbox/rc.xml"
        SIZE=$(xmlstarlet sel -N a="$nspace" -t -v '/a:openbox_config/a:theme/a:font[@place="ActiveWindow"]/a:size'  "$cfg")
        if [ "$SIZE" -lt "12" ]; then
        xmlstarlet ed -L -N a="$nspace" -u '/a:openbox_config/a:theme/a:font[@place="ActiveWindow"]/a:size' -v "12" "$cfg"
        xmlstarlet ed -L -N a="$nspace" -u '/a:openbox_config/a:theme/a:font[@place="InactiveWindow"]/a:size' -v "12" "$cfg"
        fi
        ;;
        big-14)
        nspace="http://openbox.org/3.4/rc"
        cfg="$HOME/.config/openbox/rc.xml"
        SIZE=$(xmlstarlet sel -N a="$nspace" -t -v '/a:openbox_config/a:theme/a:font[@place="ActiveWindow"]/a:size'  "$cfg")
        if [ "$SIZE" -lt "14" ]; then
        xmlstarlet ed -L -N a="$nspace" -u '/a:openbox_config/a:theme/a:font[@place="ActiveWindow"]/a:size' -v "14" "$cfg"
        xmlstarlet ed -L -N a="$nspace" -u '/a:openbox_config/a:theme/a:font[@place="InactiveWindow"]/a:size' -v "14" "$cfg"
        fi
        ;;
        *) : ;;
    esac
}
ndslimc() {
    xmlstarlet ed -L -N o="http://openbox.org/3.4/rc" -u '/o:openbox_config/o:theme/o:titleLayout' -v "$1" "$HOME/.config/openbox/rc.xml"
}
activebuttonscolors () {
    sd "^window.active.button.*.unpressed.image.color:.*$" "window.active.button.*.unpressed.image.color: ${1}" ${THEMERC}
    # Calculate colors for other button states (mix of ${1} and clractivebg
    #read ABG <<< "$(grep .active.title.bg.color: ${THEMERC} | cut -d':' -f2)"
    #hover=$(pastel mix -f 0.2 "${1}" "${ABG}"|pastel format hex)
    #pressed=$()
    #disabled=$()
    if [[ "${1}" == *"E5E5E5"* ]];then
        hover="#FFFFFF"
        else
        hover="#000000"
    fi
    #notify-send.sh "${1}" "${hover}"
    sd "^window.active.button.*.hover.image.color:.*$" "window.active.button.*.hover.image.color: ${hover}" ${THEMERC}
}
fontfamily () {
    nspace="http://openbox.org/3.4/rc"
    cfg="$HOME/.config/openbox/rc.xml"

    xmlstarlet ed -L -N a="$nspace" -u '/a:openbox_config/a:theme/a:font[@place="ActiveWindow"]/a:name' -v "${1}" "$cfg"
    xmlstarlet ed -L -N a="$nspace" -u '/a:openbox_config/a:theme/a:font[@place="InactiveWindow"]/a:name' -v "${1}" "$cfg"
}
fontsize () {
    nspace="http://openbox.org/3.4/rc"
    cfg="$HOME/.config/openbox/rc.xml"
    case "$1" in
        inc|increase)
        SIZE=$(xmlstarlet sel -N a="$nspace" -t -v '/a:openbox_config/a:theme/a:font[@place="ActiveWindow"]/a:size'  "$cfg")
        if [ "$SIZE" -lt "21" ];then
        ((SIZE=SIZE+1))
        xmlstarlet ed -L -N a="$nspace" -u '/a:openbox_config/a:theme/a:font[@place="ActiveWindow"]/a:size' -v "$SIZE" "$cfg"
        xmlstarlet ed -L -N a="$nspace" -u '/a:openbox_config/a:theme/a:font[@place="InactiveWindow"]/a:size' -v "$SIZE" "$cfg"
        fi
        ;;
        dec|decrease)
        SIZE=$(xmlstarlet sel -N a="$nspace" -t -v '/a:openbox_config/a:theme/a:font[@place="ActiveWindow"]/a:size'  "$cfg")
        if [ "$SIZE" -gt "7" ];then
            ((SIZE=SIZE-1))
            xmlstarlet ed -L -N a="$nspace" -u '/a:openbox_config/a:theme/a:font[@place="ActiveWindow"]/a:size' -v "$SIZE" "$cfg"
            xmlstarlet ed -L -N a="$nspace" -u '/a:openbox_config/a:theme/a:font[@place="InactiveWindow"]/a:size' -v "$SIZE" "$cfg"
        fi
        ;;
        *)
        xmlstarlet ed -L -N a="$nspace" -u '/a:openbox_config/a:theme/a:font[@place="ActiveWindow"]/a:size' -v "$1" "$cfg"
        xmlstarlet ed -L -N a="$nspace" -u '/a:openbox_config/a:theme/a:font[@place="InactiveWindow"]/a:size' -v "$1" "$cfg"
        ;;
    esac
}
fontweight () {
    nspace="http://openbox.org/3.4/rc"
    cfg="$HOME/.config/openbox/rc.xml"
    xmlstarlet ed -L -N a="$nspace" -u '/a:openbox_config/a:theme/a:font[@place="ActiveWindow"]/a:weight' -v "${1}" "$cfg"
    xmlstarlet ed -L -N a="$nspace" -u '/a:openbox_config/a:theme/a:font[@place="InactiveWindow"]/a:weight' -v "${1}" "$cfg"
    
}
fontweight_inactive () {
    nspace="http://openbox.org/3.4/rc"
    cfg="$HOME/.config/openbox/rc.xml"
    xmlstarlet ed -L -N a="$nspace" -u '/a:openbox_config/a:theme/a:font[@place="InactiveWindow"]/a:weight' -v "${1}" "$cfg"
}
fontweighttoggle (){
    nspace="http://openbox.org/3.4/rc"
    cfg="$HOME/.config/openbox/rc.xml"
    WEIGHT=$(xmlstarlet sel -N a="$nspace" -t -v '/a:openbox_config/a:theme/a:font[@place="ActiveWindow"]/a:weight'  "$cfg")
    if [ "$WEIGHT" = "Normal" ];then
    xmlstarlet ed -L -N a="$nspace" -u '/a:openbox_config/a:theme/a:font[@place="ActiveWindow"]/a:weight' -v "Bold" "$cfg"
    else
    xmlstarlet ed -L -N a="$nspace" -u '/a:openbox_config/a:theme/a:font[@place="ActiveWindow"]/a:weight' -v "Normal" "$cfg"
    fi
}
fontslant (){
    nspace="http://openbox.org/3.4/rc"
    cfg="$HOME/.config/openbox/rc.xml"
    xmlstarlet ed -L -N a="$nspace" -u '/a:openbox_config/a:theme/a:font[@place="ActiveWindow"]/a:slant' -v "${1}" "$cfg"
    xmlstarlet ed -L -N a="$nspace" -u '/a:openbox_config/a:theme/a:font[@place="InactiveWindow"]/a:slant' -v "${1}" "$cfg"
}
fontslant_inactive (){
    nspace="http://openbox.org/3.4/rc"
    cfg="$HOME/.config/openbox/rc.xml"
    xmlstarlet ed -L -N a="$nspace" -u '/a:openbox_config/a:theme/a:font[@place="InactiveWindow"]/a:slant' -v "${1}" "$cfg"
}

fontslanttoggle (){
    nspace="http://openbox.org/3.4/rc"
    cfg="$HOME/.config/openbox/rc.xml"
    SLANT=$(xmlstarlet sel -N a="$nspace" -t -v '/a:openbox_config/a:theme/a:font[@place="ActiveWindow"]/a:slant'  "$cfg")
    if [ "$SLANT" = "Normal" ];then
    xmlstarlet ed -L -N a="$nspace" -u '/a:openbox_config/a:theme/a:font[@place="ActiveWindow"]/a:slant' -v "Italic" "$cfg"
    else
    xmlstarlet ed -L -N a="$nspace" -u '/a:openbox_config/a:theme/a:font[@place="ActiveWindow"]/a:slant' -v "Normal" "$cfg"
    fi
}
randomizer () {
    
    # TODO: - maybe put all options to cnf file and let users customize options???
    
    ### ensure we use MBColors at the moment
    theme MBcolors
    ### SHADOW (here, because we must know if is set later when title font color is calculated)
    ### Maybe better is not to change shadow? for now
    #SHADOWS=(no dark light)
    #rand=$((RANDOM%3))
    #SHADOW="${SHADOWS[$rand]}"
    
    #shadow "${SHADOW}"
    shadow no
    
    ### RANDOM GRADIENT COLORS
    GRADIENT_FILE="$HOME"/.config/colorizer/gradients_all.inc
    if [ ! -f $GRADIENT_FILE ]; then
        cp -a /usr/share/mabox-colorizer/gradients_all.inc $GRADIENT_FILE
    fi
    read CLR CLRTO GRAD_NAME <<< "$(shuf -n 1 $GRADIENT_FILE)"
    #obtctl random_gradient
    activegradient "$CLR" "$CLRTO"
    
    ### rand gradient type
    TYPES=(solid vertical horizontal mirrorhorizontal diagonal mirrorhorizontal)
    rand=$((RANDOM%6))
    G_TYPE="${TYPES[$rand]}"
    gradient_type "${G_TYPE}"
    #rand
    
    ### Random border
    BORDERS=(0 0 1 2 4 6)
    rand=$((RANDOM%5))
    BORDER="${BORDERS[$rand]}"
    
    borderWidth "${BORDER}"
    
    HANDLES=(0 0 2 4)
    rand=$((RANDOM%4))
    HANDLE="${HANDLES[$rand]}"
    
    handlewidth "${HANDLE}"
    
    ### Random padding
    PADDINGS=(2 4 8 12)
    rand=$((RANDOM%4))
    PADDING="${PADDINGS[$rand]}"
    
    paddingHeight "${PADDING}"
    
    ### TITLEBAR STYLE
    STYLES=(flat raised raised sunken)
    rand=$((RANDOM%4))
    STYLE="${STYLES[$rand]}"
    
    raised "${STYLE}"
    
       
    ### TEXT ALIGN
    ALIGNS=(left center right)
    rand=$((RANDOM%3))
    ALIGN="${ALIGNS[$rand]}"
    
    textjustify "${ALIGN}"
    
    ### FONT FAMILY
    FAMILIES=(Ubuntu "Noto Sans" "Roboto Condensed" "GE Inspira" "JetBrains Mono")
    rand=$((RANDOM%5))
    FAMILY="${FAMILIES[$rand]}"
    
    fontfamily "${FAMILY}"
    
    ### FONT WEIGHT
    WEIGHTS=(Bold Normal)
    rand=$((RANDOM%2))
    WEIGHT="${WEIGHTS[$rand]}"
    
    fontweight "${WEIGHT}"
    
    ### FONT SLANT
    SLANTS=(Italic Normal)
    rand=$((RANDOM%2))
    SLANT="${SLANTS[$rand]}"
    
    fontslant "${SLANT}"
    
    
    
    ### FONT SIZE
    FONTSIZES=(8 10 11 12 14 16)
    rand=$((RANDOM%6))
    FONTSIZE="${FONTSIZES[$rand]}"
    
    fontsize "${FONTSIZE}"
    
    ### Buttons
    BUTTONS=(tiny normal bold dots big-12 big-14)
    rand=$((RANDOM%6))
    BUTTON="${BUTTONS[$rand]}"
    
    buttons "${BUTTON}"
    
    ### Buttons layout
    LAYOUTS=(NDSLIMC NDSLIMC NLIMC LIMC)
    rand=$((RANDOM%4))
    LAYOUT="${LAYOUTS[$rand]}"
    
    ndslimc "${LAYOUT}"
    
    
#MSG="
#Openbox Window Decoration settings
#Gradient
#name:   <b>${GRAD_NAME}</b>
#colors: <b>${CLR}</b> to <b>${CLRTO}</b>
#type:   <b>$G_TYPE</b>
   
#Border: <b>${BORDER}</b>
#Padding: <b>${PADDING}</b>
   
#Titlebar style: <b>${STYLE}</b>
#Buttons: <b>${BUTTON}</b>
#Title align: <b>${ALIGN}</b>
#Font: <b>${FAMILY} ${WEIGHT} ${SLANT} ${FONTSIZE}</b>
#"
#    notify-send.sh -R /tmp/randomizer_notify -t 10000 -i mbcc "Mabox Colorizer" "${MSG}" \
#    -o "Regenerate:randomizer ob" -o "Customize:colorizer-ob -s" 
}

tweak() {
    case "$1" in
        large)
        fontsize 14
        paddingHeight 8
        buttons big-14
        borderWidth 6
        handlewidth 6
        ;;
        big)
        fontsize 12
        paddingHeight 6
        buttons big-12
        borderWidth 4
        handlewidth 4
        ;;
        normal)
        fontsize 11
        paddingHeight 4
        buttons tiny
        borderWidth 1
        handlewidth 3
        ;;
        small)
        fontsize 10
        paddingHeight 2
        buttons dots
        borderWidth 0
        handlewidth 2
        ;;
        tiny)
        fontsize 9
        paddingHeight 1
        buttons normal
        borderWidth 0
        handlewidth 0
        ;;
        *):;;
    esac
}
savetheme () {
    case "$LANG" in
        pl*)SAVE_AS="Nowy motyw Openbox"
            DESC="Zapisz obecne ustawionia Openbox jako nowy motyw..."
            LABEL="Nazwa:"
            NAME="nazwa";;
        *)  SAVE_AS="New Openbox theme"
            DESC="Save current Openbox window decoration setup as theme..."
            LABEL="Name:"
            NAME="theme-name";;
    esac
    # ask for scheme name
    schemename=$(yad --center --width=300 --borders=20 --window-icon=mbcc --title "$SAVE_AS" --text="$DESC" --entry --entry-label="$LABEL" --entry-text="$NAME") || exit 1
    
    echo "${1}${schemename}" >> "$HOME/.config/colorizer/openbox/userthemes.csv"
}
applyscheme () {
    theme MBcolors
    case "$1" in
        sys) SCHEMEFILE="/usr/share/mabox-colorizer/colorschemes/ob.csv";;
        usr) SCHEMEFILE="$HOME/.config/colorizer/openbox/userthemes.csv";;
    esac
    while IFS="|" read -r abg abgto afg aline nbg nbgto nfg nline grad txtjust pheight pwidth handle bord bevel button fsize fname ndslim weight slant scheme_name
    do
    clractivebg "${abg}"
    clractivebgto "${abgto}"
    activetextcolor "${afg}"
    activeborderColor "${aline}"
    clrnormalbg "${nbg}"
    clrnormalbgto "${nbgto}"
    inactivetextcolor "${nfg}"
    inactiveborderColor "${nline}"
    gradient_type "${grad}"
    done < <(awk 'NR == n' n=$2 "$SCHEMEFILE")
}
applytheme() {
    case "$1" in
        sys) SCHEMEFILE="/usr/share/mabox-colorizer/colorschemes/ob.csv";;
        usr) SCHEMEFILE="$HOME/.config/colorizer/openbox/userthemes.csv";;
    esac
    applyscheme "$1" "$2"
    while IFS="|" read -r abg abgto afg aline nbg nbgto nfg nline grad txtjust pheight pwidth handle bord bevel button fsize fname ndslim weight slant scheme_name
    do
    textjustify "${txtjust}"
    paddingHeight "${pheight}"
    paddingWidth "${pwidth}"
    handlewidth "${handle}"
    borderWidth "${bord}"
    raised "${bevel}"
    buttons "${button}"
    fontsize "${fsize}"
    fontfamily "${fname}"
    ndslimc  "${ndslim}"
    fontweight "${weight}"
    fontslant "${slant}"
    done < <(awk 'NR == n' n=$2 "$SCHEMEFILE")
}
delscheme() {
    sed -i ${1}d "$HOME/.config/colorizer/openbox/userthemes.csv"
}
mono() {
lighten=(0.92 0.8 0.65 0.45 0.28)
darken=(0.9 0.74 0.54 0.38 0.18)

if [ "${1}" == pick ];then 
    color=$(gpick -pso 2>/dev/null)
else
    color="${1}"
fi

if [ "${#color}" == 7 ];then
    for i in "${lighten[@]}"
    do
    pal+=("$(pastel mix -f $i "#ffffff" "$color"|pastel format hex)")
    done
    pal+=("$color")

    for i in "${darken[@]}"
    do
    pal+=("$(pastel mix -f $i "$color" "#000000"|pastel format hex)")
    done
else
    exit 0
fi

#colorize OB
if [ "$2" == "dark" ];then
    clractivebg "${pal[5]}"
    #clractivebgto "${pal[6]}"
    activeborderColor "${pal[2]}"
    activetextcolor "${pal[1]}"
    clrnormalbg "${pal[9]}"
    clrnormalbgto "${pal[10]}"
    inactiveborderColor "${pal[8]}"
    inactivetextcolor "${pal[4]}"
else #light
    clractivebg "${pal[4]}"
    #clractivebgto "${pal[4]}"
    activeborderColor "${pal[0]}"
    activetextcolor "${pal[9]}"
    clrnormalbg "${pal[9]}"
    clrnormalbgto "${pal[10]}"
    inactiveborderColor "${pal[7]}"
    inactivetextcolor "${pal[5]}"
fi
openbox --reconfigure
case "$3" in
    col)colorizer-ob -s 2>/dev/null;;
    stylemenu)jgwallpaperchanger -s obox;;
    *):;;
esac
}

case "$1" in
    theme) theme "$2";;
    reset) reset;;
    resetonlycolors) resetonlycolors;;
    resetMBcolors) resetMBcolors;;
    borderWidth) borderWidth "$2";;
    activeborderColor) activeborderColor "$2";;
    inactiveborderColor) inactiveborderColor "$2";;
    paddingHeight) paddingHeight "$2";;
    paddingWidth) paddingWidth "$2";;
    textjustify) textjustify "$2";;
    shadow) shadow "$2";;
    handlewidth) handlewidth "$2";;
    raised) raised "$2";;
    gradient_type) gradient_type "$2";;
    random_gradient) random_gradient;;
    activegradient) activegradient "$2" "$3";;
    gradient_reverse) gradient_reverse;;
    activehandle) activehandle "$2";;
    clractivebg_only) clractivebg_only "$2";; #ADVANCED - do not calculate colorTo
    clractivebg) clractivebg "$2";;
    clractivebgto) clractivebgto "$2";;
    clrnormalbg_only) clrnormalbg_only "$2";;
    clrnormalbg) clrnormalbg "$2";;
    clrnormalbgto) clrnormalbgto "$2";;
    activetextcolor) activetextcolor "$2";;
    inactivetextcolor) inactivetextcolor "$2";;
    buttons) buttons "$2";;
    ndslimc) ndslimc "$2";;
    activebuttonscolors) activebuttonscolors "$2";;
    fontfamily) fontfamily "$2";;
    fontweight) fontweight "$2";;
    fontweight_inactive) fontweight_inactive "$2";;
    fontslant) fontslant "$2";;
    fontslant_inactive) fontslant_inactive "$2";;
    fontsize) fontsize "$2";;
    fontweighttoggle) fontweighttoggle;;
    fontslanttoggle) fontslanttoggle;;
    randomizer) randomizer;;
    tweak) tweak "$2";;
    mono) mono "$2" "$3" "$4";;
    savetheme) savetheme "$2";;
    applyscheme) applyscheme "$2" "$3";;
    applytheme) applytheme "$2" "$3";;
    delscheme) delscheme "$2";;
    *) : ;;
esac

openbox --reconfigure
