///
namespace RegionSelection {
function foreach(data, callback: (value: any, key?: number | string, array?: Array) => void) {
Array.prototype.forEach.call(data, callback);
}
class RegionSelectionBox {
private selector: JQuery;
private regions: Region[] = [];
private box: JQuery;
constructor(selector: JQuery) {
this.selector = selector;
if (this.selector.data('regions') !== undefined) {
this.fillRegions(this.selector.data('regions'));
}
this.selector.on('click', this.showBox.bind(this));
}
private fillRegions(data) {
foreach(eval(data), (value: RegionInterface) => {
this.regions.push(new Region(value));
});
}
private showBox(e: JQueryEventObject) {
e.preventDefault();
if (this.box === undefined) {
this.renderBox();
}
this.box.toggle();
}
private renderBox() {
let box = $('');
let itemTemplate = '{name}';
foreach(this.regions, (region: Region) => {
let item = $(itemTemplate
.replace('{link}', region.link)
.replace('{name}', region.caption)
);
box.append(item);
});
box.css('display', 'none');
this.selector.parent().append(box);
this.box = box;
}
}
interface RegionInterface {
id: number;
caption: string;
link: string;
icon: string;
}
class Region {
constructor(data: RegionInterface) {
this._id = data.id;
this._caption = data.caption;
this._link = data.link;
this._icon = data.icon;
}
private _id: number;
get id() {
return this._id;
}
private _caption: string;
get caption() {
return this._caption;
}
private _link: string;
get link(): string {
return this._link;
}
private _icon: string;
get icon(): string {
return this._icon;
}
}
export function createSelectionBox($object: JQuery) {
return new RegionSelectionBox($object);
}
}