var Button = { Button: function(options) { if(typeof options.cooldown == 'number') { this.data_cooldown = options.cooldown; } this.data_remaining = 0; if(typeof options.click == 'function') { this.data_handler = options.click; } var el = $('
') .attr('id', typeof(options.id) != 'undefined' ? options.id : "BTN_" + Engine.getGuid()) .addClass('button') .text(typeof(options.text) != 'undefined' ? options.text : "button") .click(function() { if(!$(this).hasClass('disabled')) { Button.cooldown($(this)); $(this).data("handler")($(this)); } }) .data("handler", typeof options.click == 'function' ? options.click : function() { Engine.log("click"); }) .data("remaining", 0) .data("cooldown", typeof options.cooldown == 'number' ? options.cooldown : 0) .data('boosted', options.boosted ?? (() => false)); el.append($("
").addClass('cooldown')); // waiting for expiry of residual cooldown detected in state Button.cooldown(el, 'state'); if(options.cost) { var ttPos = options.ttPos ? options.ttPos : "bottom right"; var costTooltip = $('
').addClass('tooltip ' + ttPos); for(var k in options.cost) { $("
").addClass('row_key').text(_(k)).appendTo(costTooltip); $("
").addClass('row_val').text(options.cost[k]).appendTo(costTooltip); } if(costTooltip.children().length > 0) { costTooltip.appendTo(el); } } if(options.width) { el.css('width', options.width); } return el; }, saveCooldown: true, setDisabled: function(btn, disabled) { if(btn) { if(!disabled && !btn.data('onCooldown')) { btn.removeClass('disabled'); } else if(disabled) { btn.addClass('disabled'); } btn.data('disabled', disabled); } }, isDisabled: function(btn) { if(btn) { return btn.data('disabled') === true; } return false; }, cooldown: function(btn, option) { var cd = btn.data("cooldown"); if (btn.data('boosted')()) { cd /= 2; } var id = 'cooldown.'+ btn.attr('id'); if(cd > 0) { if(typeof option == 'number') { cd = option; } // param "start" takes value from cooldown time if not specified var start, left; switch(option){ // a switch will allow for several uses of cooldown function case 'state': if(!$SM.get(id)){ return; } start = Math.min($SM.get(id), cd); left = (start / cd).toFixed(4); break; default: start = cd; left = 1; } Button.clearCooldown(btn); if(Button.saveCooldown){ $SM.set(id,start); // residual value is measured in seconds // saves program performance btn.data('countdown', Engine.setInterval(function(){ $SM.set(id, $SM.get(id, true) - 0.5, true); },500)); } var time = start; if (Engine.options.doubleTime){ time /= 2; } $('div.cooldown', btn).width(left * 100 +"%").animate({width: '0%'}, time * 1000, 'linear', function() { Button.clearCooldown(btn, true); }); btn.addClass('disabled'); btn.data('onCooldown', true); } }, clearCooldown: function(btn, cooldownEnded) { var ended = cooldownEnded || false; if(!ended){ $('div.cooldown', btn).stop(true, true); } btn.data('onCooldown', false); if(btn.data('countdown')){ window.clearInterval(btn.data('countdown')); $SM.remove('cooldown.'+ btn.attr('id')); btn.removeData('countdown'); } if(!btn.data('disabled')) { btn.removeClass('disabled'); } } };