////
///
/// @group components/button
///
////
/* extends .v-button */

/// Basic button style for all theme variants. Includes valo-button-style from valo source theme.
@mixin os-button {
	@include valo-button-style(
		$unit-size: $os-button-height,
		$padding: null, // floor($v-unit-size/5),
		$font-color: valo-font-color($os-button-color), //$v-app-background-color,
		$font-weight: $v-font-weight + 300,
		$font-size: null,
		$cursor: null,
		$background-color: $os-button-color,
		$border: 0px,
		$border-radius: $v-border-radius,
		$gradient: null,
		$bevel: $v-bevel,
		$shadow: $v-shadow,
		$states: (normal disabled)); /* hover focus active disabled ));*/
	@if $os-button-uppercase == true {
		text-transform: uppercase;
	    //letter-spacing: floor($v-font-size/10);
		}
/* 	border-color: $os-button-color; */
	margin-left: floor($v-unit-size/5);

	&.v-pressed {
		background-color: get_color_mix($v-focus-color, #fff, 70) !important;
		border-color: get_color_mix($v-focus-color, #fff, 70) !important;
		//color: valo-font-color(get_color_mix($v-focus-color, #fff, 70)) !important;
		}
	&:after {
		transition: none;
		}
	&:hover, &:focus, &:active {
		background-color: $os-odd-highlight;
		border-color: $os-odd-highlight;
		color: valo-font-color($os-odd-highlight);
		}
	&:focus:after {
		border-color: transparent;
		transition: none;
		}
	}


/// Button style modifier for header-area (tab-style buttons).
@mixin os-button-perspectivepanel  {
	.v-button {
		@if $os-theme-desig == "cxo" {
			/* border-bottom bleeds across edges, thus using this workaround: */
/* 			@include linear-gradient(to top, $os-mid-contrast 1px, $os-button-as-tab-inactive 1px);*/
/* 			background: $os-button-as-tab-inactive; */
/* 			color: valo-font-color($os-button-as-tab-inactive); */
			border-radius: $v-border-radius*2 $v-border-radius*2 0px 0px;
			@include box-shadow(2px 1px 7px rgba(0,0,0,0.35));
			}
		@if $os-bordered==true {
/* 			height: ceil(1.6 * $v-unit-size); */
			height: ceil(1.6 * $v-unit-size) - $os-splitter-size;
			}
		@else {
			@include box-shadow($os-shadow-reversed);
			}
		}
	}


/// Button style modifier for toolbars inside views.
@mixin os-button-toolbar {
	background: $v-app-background-color;
	border: none;
	&:hover, &:focus, &:active {
		background: get_color_mix($v-focus-color, #fff, 50);
		}
		/*
	&.v-pressed {
		background: get_color_mix($v-focus-color, #fff, 70);
		}*/
	}

/// Button style modifier for header-area user-menu.
@mixin os-button-usermenu {

	@if $os-theme-desig == "cxo" or $os-theme-desig == "osbp"{
		border: none;
 		padding: 0px;
		height: $v-unit-size - 2 * first-number($v-border) !important;
		width: $v-unit-size - 2 * first-number($v-border) !important;
		margin: first-number($v-border);
		border-radius: 50% !important;
		}
	@else {
		//hover etc. on icon-font (can't use calculated valo-font-color color from above)
		&:after {
			transition: none;
			}
		&:hover, &:focus, &:active {
			color: $v-focus-color;
			background: transparent;
			}
		&:hover:after {
			transition: none;
			}
		&:focus:after {
			transition: none;
			}
		&:active:after {
			transition: none;
			}
		}
	}

/// Button style modifier for os-data-component
/// @todo find me!
@mixin os-button-data {
	margin-right: 12px;
	}

/// Button style modifier for Fileupload
/// @todo is it what I think it is?
@mixin os-button-no-margin {
	margin: 0px;
	}

/*/// Button style modifier for toolbars inside views.
/// @deprecated maybe...
@mixin os-button-trimbar($variant: os) {
	background: transparent;
	border-radius: 0px;
	border-color: $v-app-background-color;
	border-width: 0px;
	border-bottom-width: 1px;
	@if $variant == cx {
		height: $v-unit-size + floor($v-unit-size/3);
		}
	@else {
  		height: $os-button-height;
		}
	}
*/

/// Button style modifier for buttons appearing in a table's column filter row. They should look the same as inputs in the same row.  
@mixin os-button-filterspanel {
	color: valo-font-color($os-textfield-shade);
	white-space: normal;
	background: $os-textfield-shade;
	padding-top: 1px;
	border-right-width: 0px;
	border-top-width: 0px;
	border-left-width: 1px;
	border-left-color: $v-app-background-color;
	border-bottom: $v-border;
	margin-left: 0px;
	font-weight: normal;
	@if $os-button-uppercase == true {
		text-transform: none;
		}

	&:after {
		/* for some reason there's a second border on this element */
		border-bottom-width: 0px;
		}

	&:focus, &:hover {
		background-color: $os-focus-color;
		color: valo-font-color($os-focus-color);
		border-bottom-color: $v-focus-color;
		border-left: $v-border;
		border-left-color: $v-app-background-color;
		}
	&:focus:after {
		border-right-width: 0px;
		border-top-width: 0px;
		border-left: $v-border;
		border-left-color: $v-app-background-color;
		}
	&:hover:after {
		border-left: $v-border;
		border-left-color: $v-app-background-color;
		}
	/*
	&:nth-child(1) {
		border-left-color: transparent;
		}*/

	.v-popup-indicator {
		display: none;
		}
	.v-button-caption {
		@include os-icon-font($content: '\F078',
							  $placement: after,
							  $size: $v-font-size);
		&:after {
			font-style: normal;
			padding-left: $v-font-size *0.5;
			}
		@if $os-button-uppercase == true {
			text-transform: none;
			}
		}
	}


/// Button style modifier for sidebar component.
@mixin os-button-sidebar-table-variant {
	border: 0px;
	width: 100%;
	background-color: $v-app-background-color;
	cursor: pointer;
	height: $os-button-height;
	white-space: inherit;
	border-bottom: $v-border;
    font-weight: normal;
    text-align: left;

	.badge {
		position: relative;
		float: right;
		display: inline-block;
		line-height: $v-line-height;
		color: valo-font-color($v-focus-color);//$v-app-background-color;
		//text-shadow: 0 1px 1px rgba(0,0,0,.3);
		padding: 0em .4em 0em;
		background: $v-focus-color;
		}

	&:active {
		background: rgba(0,0,0,.1);
		}
	&:focus, &:hover {
		outline:0;
		border-bottom-color: $v-focus-color;
		}
	}


/// Button style modifier for buttons in line with textfields
@mixin os-button-formlayout {
   	height: $v-unit-size; 
   }

/// Button style modifier.
@mixin os-button-error {
	border-color: first-color($v-border) !important;
	/*
	border-style: dashed;
	*/
	color: $v-error-indicator-color;
	}


/// @deprecated probably...
@mixin os-button-gridlayout {
	margin: 4px 0px 4px 0px; //trbl
	}


/// Button style modifier for buttons in ...
/// @todo find out where l-beansearchfield is
@mixin os-button-l-beansearch {
	button { 
		@include os-icon-font($content: '\f0b0');
		margin-left: 0px;
		font-weight: normal;
		color: valo-font-color($os-light-contrast);
		border-width: 0px;
		background-color: $os-light-contrast;
		border-left: $v-border;
		border-bottom: $v-border;
		outline:0;
		height: $v-unit-size;
		width: $v-unit-size !important;
		cursor: pointer;
		img {display:none;}
		}
	}

/// Sets button dimensions for POS/cash register application.
/// @param {number} $height-mod - [0] Factor 1-4 by which to increase the base height. 
/// @param {number} $width-mod - [0] Factor (1-4) by which to increase the base width. 
/// @param {string} $prefer	- [null] Set "\!important" if you need it.
/// @param {number} $set-font - [0] If this is set to 1, fonts will increase or decrease relative to button-size. 
/// Set 'os-font-flex' on buttons you want to have flexible font sizes. 
@mixin os-button-set-dimensions($height-mod: 0, $width-mod: 0, $prefer: null, $set-font: 0) {
	@if $height-mod !=0 {
		$calculated-button-height: $cash-button-base-height * $height-mod + ($height-mod - 1) * $v-layout-spacing-vertical;
   		height: $calculated-button-height  #{$prefer};
   		img.v-icon {
   			max-height: ($v-unit-size * $os-cash-zoom-factor * $height-mod) - (2 * first-number($v-border))  #{$prefer};
   			}
   		@if $set-font == 1 {	//.os-font-flex
   			@if $height-mod == 1 {
   				font-size: make_even($calculated-button-height / 2);
   				}
   			@else {
   				font-size: $calculated-button-height - $cash-button-base-height;
   				} 
   			}
   		}
   	@if $width-mod != 0 {
   		$new-width: $v-unit-size * 2 * $os-cash-zoom-factor * $width-mod + (($width-mod - 1) * $v-layout-spacing-horizontal);
   		width: $new-width #{$prefer};
/*    		.v-button-wrap {  if word-wrap active */
/*  			width: $v-unit-size * 2 * $os-cash-zoom-factor * $width-mod + (($width-mod - 1) * $v-layout-spacing-horizontal) #{$prefer}; */
/* 			} */
   		img.v-icon {
   			max-width:  ($v-unit-size * 2 * $os-cash-zoom-factor * $width-mod) - (2 * first-number($v-border))  #{$prefer};
   			}
   		}
	}
/* color, size and hover variant (so far only for os-cash)*/
/* extends .v-button */
/// Button style modifier for specific button field compositions as used in POS/cash register application.
/// @param {string|optional} $col-1 [''] - Modifies the button's background color.
/// @param {integer|optional} $height-mod modifies the button's height by a factor defined by the class descriptor this mod is called from.
/// Don't use height-mod and width-mod at the same time.
/// @param {integer|optional} $width-mod modifies the button's height by a factor defined by the class descriptor this mod is called from
/// Don't use height-mod and width-mod at the same time.
/// @todo describe this better.
@mixin os-button-mod($col-1:'', $height-mod: 0, $width-mod: 0, $primary-stylename: 'container') {
	/* possibly needs font-size, too */
	@if $col-1 != '' {
		background: $col-1;
		border-color: $col-1;
		color: valo-font-color($col-1);
		&.v-pressed {
			color: valo-font-color(get_color_mix($col-1, #fff, 70)) !important;
			background: get_color_mix($col-1, #fff, 70) !important;
			border-color: rgba(255,255,255,0.8);
			border-left-color:  rgba(0,0,0,0.5);
			border-top-color: rgba(0,0,0,0.5);

/* 			get_color_mix($col-1, #fff, 70) !important; */
			box-shadow: inset 0px -2px -2px rgba(255,255,255,0.8), /*bottom internal shadow*/
						inset 0px 2px 2px rgba(0,0,0,0.5); /*top internal highlight*/
			/*bordercolor:
			border-left-color:
			border-left-color:*/
			}
		&.os-pushed {
			background: mix($col-1, #000, 85%);
			color: get_contrast(25, mix($col-1, #000, 85%), $desaturate: false);
/* 			text-shadow: 2px 2px #ff0000; */
			$strength: 12px * $os-cash-zoom-factor;
			@include box-shadow(inset 0px 0px $strength rgba(0, 0, 0, 0.5));
/* 			.v-button-caption { */
/* 				outline: 1px solid black; */
/* 				}  */
			}	
		&:hover  /*, &:focus, &:active */{
			background: $os-odd-highlight;
			border-color: $os-odd-highlight;
			color: valo-font-color($os-odd-highlight);
			}
		}

	@if $primary-stylename == 'container' {
		/* set button style globally/for entire container. */
		> .v-gridlayout-slot > .v-button ,.v-button {
			@include os-button-set-dimensions($height-mod: $height-mod, $width-mod: $width-mod);
			}
		@if $height-mod != 0 {
			/// Button fonts zoom with button height. 
			&.os-font-flex > .v-gridlayout-slot > .v-button , .os-font-flex .v-button {
				@include os-button-set-dimensions($height-mod: $height-mod, $set-font: 1);
				}
			.os-font-flex.v-button {
				@include os-button-set-dimensions($height-mod: $height-mod, $set-font: 1, $prefer: \!important);
				}
			}
		}
	@else {
		/* set button style for specific button */
		.#{$primary-stylename} {
			@include os-button-set-dimensions($height-mod: $height-mod, $width-mod: $width-mod, $prefer: \!important);
			}
		}

    margin: 0px;
	}

/// Button style modifier for POS/cash register application.
/// This defines the base size/looks for cash register buttons, which can afterwards be refined/modified with os-button-mod.
@mixin os-button-cash () {
	/* basic button size that can be modded with os-button-mod mixin */
	.v-button {
		/* height slightly reduced for alignment with -double -triple etc. buttons */
		height: $cash-button-base-height;// - $v-layout-spacing-vertical/2;

		&:before {
			/* overrides valo-button-vertical-centering */
			content: none;
			}
		/* center and wrap text with this:*/
		white-space: normal;
/* 		word-wrap: break-word; needs v-button-wrap dimensions set */
		display: flex;
		justify-content: center;
		align-items: center;
		
		text-transform: none;
		
		.v-button-caption {
			/* add a bit of spacing between lines */
			line-height:  $v-font-size * $os-cash-zoom-factor;
			}
		

		min-width: $v-unit-size * 2 * $os-cash-zoom-factor;
		padding: make_even(($v-unit-size * 2 * $os-cash-zoom-factor) * 0.07) * $os-cash-zoom-factor;
		
		
		$font: $v-font-size * $os-cash-zoom-factor;
		@if $os-cash-zoom-factor < $v-scaling-factor--huge {$font: $v-font-size * $v-scaling-factor--huge; }
		@if $os-cash-zoom-factor < $v-scaling-factor--large {$font: $v-font-size * $v-scaling-factor--large; }
		@if $os-cash-zoom-factor <= 1 {$font: $v-font-size;}
		font-size: $font;
		}
		
	/* colors */
	.v-gridlayout-slot .v-button.os-color-1, .v-slot-l-control .v-button.os-color-1, .os-color-1 .v-button   {
	    @include os-button-mod($col-1: $os-color-1); 
	    }
	.v-gridlayout-slot .v-button.os-color-2, .v-slot-l-control .v-button.os-color-2, .os-color-2 .v-button   {
	    @include os-button-mod($col-1: $os-color-2); 
	    }
	.v-gridlayout-slot .v-button.os-color-3, .v-slot-l-control .v-button.os-color-3, .os-color-3 .v-button   {
	    @include os-button-mod($col-1: $os-color-3); 
	    }
	.v-gridlayout-slot .v-button.os-color-4, .v-slot-l-control .v-button.os-color-4, .os-color-4 .v-button   {
	    @include os-button-mod($col-1: $os-color-4); 
	    }
	.v-gridlayout-slot .v-button.os-color-5, .v-slot-l-control .v-button.os-color-5, .os-color-5 .v-button   {
	    @include os-button-mod($col-1: $os-color-5); 
	    }
	.v-gridlayout-slot .v-button.os-color-6, .v-slot-l-control .v-button.os-color-6, .os-color-6 .v-button   {
	    @include os-button-mod($col-1: $os-color-6); 
	    }
	.v-gridlayout-slot .v-button.os-color-7, .v-slot-l-control .v-button.os-color-7, .os-color-7 .v-button   {
	    @include os-button-mod($col-1: $os-color-7); 
	    }
	.v-gridlayout-slot .v-button.os-color-8, .v-slot-l-control .v-button.os-color-8, .os-color-8 .v-button   {
	    @include os-button-mod($col-1: $os-color-8); 
	    }
	.v-gridlayout-slot .v-button.os-color-9, .v-slot-l-control .v-button.os-color-9, .os-color-9 .v-button   {
	    @include os-button-mod($col-1: $os-color-9); 
	    }
	.v-gridlayout-slot .v-button.os-color-10, .v-slot-l-control .v-button.os-color-10, .os-color-10 .v-button {
	    @include os-button-mod($col-1: $os-color-10); 
	    }
	.v-gridlayout-slot .v-button.os-color-11, .v-slot-l-control .v-button.os-color-11, .os-color-11 .v-button {
	    @include os-button-mod($col-1: $os-color-11); 
	    }
	.v-gridlayout-slot .v-button.os-color-12, .v-slot-l-control .v-button.os-color-12, .os-color-12 .v-button {
	    @include os-button-mod($col-1: $os-color-12); 
	    }
	.v-gridlayout-slot .v-button.os-color-13, .v-slot-l-control .v-button.os-color-13, .os-color-13 .v-button {
	    @include os-button-mod($col-1: $os-color-13); 
	    }
	.v-gridlayout-slot .v-button.os-color-14, .v-slot-l-control .v-button.os-color-14, .os-color-14 .v-button {
	    @include os-button-mod($col-1: $os-color-14); 
	    }

	 .os-button-with-image {
		.v-button {
		 	@include os-button-mod($col-1: #cc5353);
			}
		}
	.os-button-no-text {
		.v-button {
			}
		}
	}
