///
namespace RegionFilter {
export class RegionFilter {
private $selector: JQuery;
private selected: {} = {};
private strings = ['район', 'района', 'районов'];
private typeName = 'районы';
private config: FilterConfigInterface;
public constructor($selector: JQuery, config: FilterConfigInterface) {
this.$selector = $selector;
let strings = $selector.data('strings');
let typeName = $selector.data('type-name');
if (strings !== undefined) {
this.strings = eval(strings);
}
if (typeName !== undefined) {
this.typeName = typeName;
}
this.config = config;
this.$selector.click(this.onSelectorClick.bind(this));
this.loadSelected();
}
private onSelectorClick(event) {
event.preventDefault();
let context = this;
let itemsContainer = this.$selector.parent().find('.' + this.config.itemsContainerClass);
if (itemsContainer.length) {
itemsContainer.fadeOut(200, function () {
$(this).remove();
});
} else {
this.$selector.parent().append(this.createContainer());
}
}
private createContainer(): JQuery {
let itemsContainer = $(`
`);
let context = this;
let field = $(this.$selector.data('field'));
field.find('option').each(function () {
let id = $(this).attr('value');
itemsContainer.append(
// create container
$(``)
// create item
.append($(``)
// select items
.attr('checked', $(this).prop('selected'))
// bind change event
.on('change', function () {
field.find(`option[value=${id}]`).prop('selected', $(this).prop('checked'));
context.setCount(field.find('option:selected').length);
}))
// create label
.append($(``)));
});
return itemsContainer;
}
private loadSelected() {
}
private static declOfNum(number, titles) {
let cases = [2, 0, 1, 1, 1, 2];
return titles[(number % 100 > 4 && number % 100 < 20) ? 2 : cases[(number % 10 < 5) ? number % 10 : 5]];
}
public checkChecked(id) {
return this.selected.hasOwnProperty(id);
}
public setCount(count: number = 0) {
this.$selector.html('Все ' + this.typeName);
if (count > 0) {
this.$selector.html(count + ' ' + RegionFilter.declOfNum(count, this.strings));
}
}
}
interface FilterConfigInterface {
itemsContainerClass: string;
itemCheckboxClass: string;
itemContainerClass: string;
itemLabelClass: string;
}
}