battles/js/h.js
2018-01-28 18:40:49 +02:00

281 lines
8.5 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

function H(isOutBox){
this.document = document;
this.isOutBox = isOutBox;
this.iframe = this.isOutBox ? $('#mainbox') : $('body');
// DOM-элемент, который перехватывает клик по логину
//this.grabLogin = null;
// DOM-элемент, который перехватывает клик по названию шмотки
//this.grabItem = null;
this.grabLogin = new Grabber({inputClass: 'grabLogin'});
this.grabItem = new Grabber({inputClass: 'grabLogin'});
// storage
this.data = {};
}
H.prototype.toString = function(){
return 'This is H-object';
}
H.prototype.getMainBox = function(){
return this.isOutBox ? this.iframe.contents().find('body') : $('body');
}
H.prototype.loadMainBox = function(location){
location = location || '/main.php';
this.iframe.attr('src',location);
}
H.prototype.loadDocument = function(location){
this.document.location = location;
}
// ======== storage
H.prototype.set = function(key, value){
this.data[key] = value;
}
H.prototype.get = function(key, defaultValue){
return undefined == this.data[key] ? defaultValue : this.data[key];
}
H.prototype.setHP = function(id, curHP, maxHP){
curHP = curHP || 0;
maxHP = maxHP || 0;
var hp = this.getMainBox().find('#hpKey_'+id);
if(hp.length < 1){
return false;
}
var hpA = $('img:eq(1)', hp);
var hpB = $('img:eq(2)', hp);
var redHP = 0.33; // меньше 30% красный цвет
var yellowHP = 0.66; // меньше 60% желтый цвет, иначе зеленый
if(curHP > maxHP){
curHP = maxHP;
}
var text = curHP + '/' + maxHP;
var lengthHP = 170 - (text.length - 1) * 8;
var sizeFirst = Math.round((lengthHP / maxHP) * curHP);
var sizeSecond = lengthHP - sizeFirst;
hpA.attr('width', sizeFirst);
hpB.attr('width', sizeSecond);
if(curHP / maxHP < redHP){
hpA.attr('src', '/i/1red.gif');
}else{
if(curHP / maxHP < yellowHP){
hpA.attr('src', '/i/1yellow.gif');
}else{
hpA.attr('src', '/i/1green.gif');
}
}
hp.html(hp.html().substring(0, hp.html().lastIndexOf(':') + 1) + Math.round(curHP) + "/" + maxHP);
}
/* ------------------ перехват клика по логину юзера -------------------------------------------- * /
H.prototype.setGrabLogin = function(input){
var obj = this;
this.clearGrabLogin();
var tmp = $(input);
if(tmp.length > 0){
this.grabLogin = tmp.get(0);
$(this.grabLogin)
.addClass('grabLogin')
.dblclick(function(){obj.toggleGrabLogin(this)})
.select();
return true;
}
return false;
}
H.prototype.clearGrabLogin = function(){
$(this.grabLogin).removeClass('grabLogin');
this.grabLogin = null;
},
H.prototype.toggleGrabLogin = function(input){
if($(input).hasClass('grabLogin')){
this.clearGrabLogin();
}else{
this.setGrabLogin($(input));
}
}
/* -------------------------------- простые диалоги --------------------------------------------- */
H.prototype.sdOptionsDefault = {
formMethod: 'POST',
formAction: '',
formClass: '',
title: 'заголовок не указан',
width: 250,
data: {},
content: '<span>контент не указан</span>',
onSubmit: function(){return true;},
onClose: function(){this.remove()}
}
H.prototype._sd = function(options){
options = $.extend({}, this.sdOptionsDefault, options);
var m = $('<div class="sd-container"></div>').css('width',options.width);
var t = $('<div class="sd-title">').text(options.title);
var c = $('<img class="sd-closer" src="/i/clear.gif" title="Закрыть окно" alt="X">')
.click(function(){return options.onClose.call($(this).closest('div.sd-container'))});
var f = $('<form class="sd-form"></form>')
.attr('method', options.formMethod)
.attr('action', options.formAction)
.submit(function(){return options.onSubmit.call($(this).closest('div.sd-container'))});
for(var i in options.data){
$('<input type=hidden>').attr('name',i).val(options.data[i]).appendTo(f);
}
if(options.formClass){
f.addClass(options.formClass);
}
$('div.sd-container', this.getMainBox()).remove();
return m.append(t.prepend(c)).append(f.append(options.content));
}
H.prototype.sd = function(options){
var tmp = this._sd(options);
return this.getMainBox().append(tmp);
}
H.prototype.sdOneInput = function(options){
var onSubmit2 = options.onSubmit;
options = $.extend({},this.sdOptionsDefault, {inputName: 'target', inputValue: '', grabber: null}, options);
var i = $('<input type="text" class="text">')
.css({'width': options.width - 45})
.attr('name',options.inputName)
.val(options.inputValue);
if(options.grabber && this[options.grabber] instanceof Grabber){
this[options.grabber].set(i);
}else{
i.select();
}
options.content.append($('<div></div>')
.append(i)
.append('<input type="submit" class="button" style="width:33px;" value=" »» ">'));
options.onSubmit = function(){
var v = i.val($.trim(i.val())).val();
if(v.length <= 0){
alert('Не заполнено обязательное поле');
return false
}
if(typeof onSubmit2 == 'function'){
return onSubmit2.call(this);
}
return true;
}
return this.sd(options);
}
H.prototype.sdLogin = function(options){
options.content = $('<div>Укажите логин персонажа:<br><small>(можно кликнуть по логину в чате)</small></div>');
options.grabber = 'grabLogin';
return this.sdOneInput(options);
}
H.prototype.sdItem = function(options){
options.content = $('<div>Укажите название или s/n предмета:<br><small>(можно кликнуть по названию в рюкзаке)</small></div>');
options.grabber = 'grabItem';
options.width = 270;
return this.sdOneInput(options);
}
/**
* Функция для обратной совместимости
* Не надо её использовать в новом коде!
*/
H.prototype.sdFindLogin = function(title, formAction, inputName, inputValue){
return this.sdLogin({
title: title,
formAction: formAction,
inputName: inputName,
inputValue: inputValue});
}
/**
* Функция для обратной совместимости
* Не надо её использовать в новом коде!
*/
H.prototype.sdFindItem = function(title, formAction, inputName, inputValue){
return this.sdItem({
title: title,
formAction: formAction,
inputName: inputName,
inputValue: inputValue});
}
/* ----------------------- вывод системных сообщений -------------------------------------------- */
H.prototype._popupConfig = {
'd':[10000, 'Отладочное сообщение'],
'i':[3000 , 'Сообщение'],
'w':[5000 , 'Предупреждение'],
'e':[0 , 'Ошибка']
}
H.prototype.msgPopup = function(type, text){
if(this._popupConfig[type] == undefined){
type = 'w';
}
var conf = this._popupConfig[type];
$.jGrowl(text,{
header: '<img src="/i/jgrowl_moover.png" alt="<>" class="jgrowl-moover" title="Передвинуть"> ' + conf[1],
glue: 'before',
life: conf[0],
sticky: conf[0] <= 0,
theme: 'msg_' + type
});
}
/* ================== перехват клика на логине/шмотке и т.п. ==================================== */
function Grabber(options){
this.options = $.extend({}, this.optionsDef, options);
this.input = null;
}
Grabber.prototype.toString = function(){
return 'This is Grabber-object';
}
Grabber.prototype.optionsDef = {
inputClass: 'grab'
}
Grabber.prototype.get = function(){
return this.input;
}
Grabber.prototype.isActive = function(){
return $(this.input).is(':visible');
}
Grabber.prototype.set = function(input){
var obj = this;
this.clear();
var tmp = $(input);
if(tmp.length > 0){
this.input = tmp.get(0);
$(this.input)
.addClass(this.options.inputClass)
.dblclick(function(){obj.toggle(this)})
.select();
return true;
}
return false;
}
Grabber.prototype.clear = function(){
$(this.input).removeClass(this.options.inputClass);
this.input = null;
},
Grabber.prototype.toggle = function(input){
if($(input).hasClass(this.options.inputClass)){
this.clear();
}else{
this.set($(input));
}
}