calculator WIP

This commit is contained in:
Alexander Yakovlev 2018-08-10 01:08:56 +07:00
parent c987c39dca
commit 10218fcd01
2 changed files with 185 additions and 5 deletions

180
page-calculator.php Normal file
View file

@ -0,0 +1,180 @@
<?php
/**
* Калькулятор призов.
*
* @package kril
*/
?>
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/ion-rangeslider/2.2.0/css/ion.rangeSlider.min.css">
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/ion-rangeslider/2.2.0/css/ion.rangeSlider.skinHTML5.min.css">
<?php while ( have_posts() ) : the_post(); ?>
<?php get_template_part( 'loop-templates/content', 'page' ); ?>
<?php
// If comments are open or we have at least one comment, load up the comment template.
if ( comments_open() || get_comments_number() ) :
comments_template();
endif;
?>
<?php endwhile; // end of the loop. ?>
<form>
<div class="form-group">
<label for="formControlRange">Призовой фонд конкурса</label>
<input type="range" class="form-control-range" id="fundRange" min=11000 max=100000 value="14000">
</div>
<div class="form-group">
<label for="formControlRange">Размер основной номинации</label>
<input type="range" class="form-control-range" id="gameRange" min=10 max=100>
</div>
<div class="form-group">
<label for="formControlRange">Размер номинации переводов</label>
<input type="range" class="form-control-range" id="translateRange" min=10 max=100>
</div>
</form>
<h3>Основная номинация</h3>
<table class="table">
<thead>
<tr>
<th scope="col">#</th>
<th scope="col">Награда</th>
</tr>
</thead>
<tbody id="gameTable">
</tbody>
</table>
<h3>Номинация переводов</h3>
<table class="table">
<thead>
<tr>
<th scope="col">#</th>
<th scope="col">Награда</th>
</tr>
</thead>
<tbody id="translateTable">
</tbody>
</table>
</div>
</div>
<script
src="https://code.jquery.com/jquery-3.3.1.min.js"
integrity="sha256-FgpCb/KJQlLNfOu91ta32o/NMZxltwRo8QtmkMRdAu8="
crossorigin="anonymous"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/ion-rangeslider/2.2.0/js/ion.rangeSlider.min.js"></script>
<script>
$(document).ready(function(){
// округление для денег, до 100 рублей
// потому что бутербродик стоит уже 99
function roundup(value){
var retval = Math.round( value / 100) * 100;
if (retval <= 0) { // если игр МНОГО, а в фонде нет денег
return 0;
}
return retval;
}
// Функция величины приза. Точно из скриптов IFComp.
function prizefn(value) {
return 1.0 * value * value - 2.0 * value + 1.0;
}
// Вычисление призов для номинации.
function recalNom(maxPrize, minPrize, count, prizeCount, fund, table) {
$(table).empty();
for (var i = 1; i <= prizeCount; i++) {
if (fund === 0) { // а тут копилка и кончилась
break;
}
var prize = roundup(maxPrize * prizefn((i-0.5)/count) + minPrize);
fund = fund - prize;
if (i === count) {
prize += fund; // добавляем ошибку округления
}
$(table).append("<tr><th scope='row'>"+i+"</th><td>"+prize+" руб.</td></tr>");
}
}
function calcMaxPrize(fund, minPrize, count) {
if (count === 1) {
return fund;
}
if (fund > (minPrize * count)) {
return roundup(3 * (fund - minPrize * count) / count);
} else { // вот он, русский КРИЛ - много игр и мало денег
if (count > 1) {
return calcMaxPrize(fund, minPrize, count - 1);
} else { // да за что ж вы так с авторами
return calcMaxPrize(fund, minPrize - 500, count);
}
}
}
var recalculate = function(){
// общий фонд
var fund = $("#fundRange").prop("value");
// фонды номинаций
var gameFund = roundup( fund * 0.66 );
var translateFund = roundup( fund * 0.33 );
// размеры номинаций
var games = $("#gameRange").prop("value");
var translations = translateRange.result;//.from_percent;
console.log(translations);
if (translations === undefined) {
return;
}
// кол-во призовых мест
var prizeGames = Math.ceil(games * 0.1);
var prizeTranslations = Math.ceil(translations * 0.2);
if (prizeTranslations > translations) {
prizeTranslations = translations;
}
if (prizeGames > games) {
prizeGames = games;
}
// минимальный приз
var minPrize = 1000;
var maxPrizeGames = calcMaxPrize(gameFund, minPrize, prizeGames);
var maxPrizeTranslations = calcMaxPrize(translateFund, minPrize, prizeTranslations);
recalNom(maxPrizeGames, minPrize, games, prizeGames, gameFund, "#gameTable");
recalNom(maxPrizeTranslations, minPrize, translations, prizeTranslations, translateFund, "#translateTable");
}
$("#fundRange").ionRangeSlider({
grid: true,
min: 10000,
max: 50000,
step: 500,
prettify_enabled: true,
postfix: "руб.",
onChange: recalculate,
});
$("#gameRange").ionRangeSlider({
onChange: recalculate,
});
$("#translateRange").ionRangeSlider({
min: 1,
max: 30,
onChange: recalculate,
});
var fundRange = $("#fundRange").data("ionRangeSlider");
var gameRange = $("#gameRange").data("ionRangeSlider");
var translateRange = $("#translateRange").data("ionRangeSlider");
recalculate();
});
</script>
<div class="wrapper" id="wrapper-hero">
<?php get_template_part( 'sidebar-templates/sidebar', 'hero' ); ?>
<?php get_template_part( 'sidebar-templates/sidebar', 'herocanvas' ); ?>
<?php get_template_part( 'sidebar-templates/sidebar', 'statichero' ); ?>
</div>

View file

@ -27,16 +27,16 @@
@import "../../src/sass/bootstrap4/card";
@import "../../src/sass/bootstrap4/breadcrumb";
@import "../../src/sass/bootstrap4/pagination";
@import "../../src/sass/bootstrap4/badge";
@import "../../src/sass/bootstrap4/jumbotron";
//@import "../../src/sass/bootstrap4/badge";
//@import "../../src/sass/bootstrap4/jumbotron";
@import "../../src/sass/bootstrap4/alert";
@import "../../src/sass/bootstrap4/progress";
@import "../../src/sass/bootstrap4/media";
@import "../../src/sass/bootstrap4/list-group";
@import "../../src/sass/bootstrap4/close";
@import "../../src/sass/bootstrap4/modal";
//@import "../../src/sass/bootstrap4/modal";
@import "../../src/sass/bootstrap4/tooltip";
@import "../../src/sass/bootstrap4/popover";
@import "../../src/sass/bootstrap4/carousel";
//@import "../../src/sass/bootstrap4/carousel";
@import "../../src/sass/bootstrap4/utilities";
@import "../../src/sass/bootstrap4/print";
@import "../../src/sass/bootstrap4/print";