493 lines
18 KiB
JavaScript
493 lines
18 KiB
JavaScript
|
React.LS = (function () {
|
||
|
var Lang = function (defaultLangfile, defaultLang) {
|
||
|
var self = this;
|
||
|
|
||
|
if (defaultLangfile) {
|
||
|
if (defaultLang) {
|
||
|
self.dLang = defaultLang;
|
||
|
self.dLangFile = defaultLangfile;
|
||
|
}
|
||
|
else {
|
||
|
self.dLang = defaultLangfile;
|
||
|
self.dLangFile = null;
|
||
|
}
|
||
|
|
||
|
if (self.get_setting('lang', self.dLang) != self.dLang) {
|
||
|
self.set_load_lang(self.get_setting('lang', defaultLang), self.get_setting('langfile', defaultLangfile));
|
||
|
}
|
||
|
}
|
||
|
};
|
||
|
|
||
|
Lang.prototype.dLangFile = '';
|
||
|
Lang.prototype.dLang = '';
|
||
|
Lang.prototype.pack = [];
|
||
|
Lang.prototype.loadedfiles = [];
|
||
|
|
||
|
Array.prototype.contains = function (obj) {
|
||
|
var i = this.length;
|
||
|
while (i--) {
|
||
|
if (this[i] === obj) {
|
||
|
return true;
|
||
|
}
|
||
|
}
|
||
|
return false;
|
||
|
};
|
||
|
|
||
|
Lang.prototype.ready = function (fn) {
|
||
|
if (document.readyState != 'loading') {
|
||
|
fn();
|
||
|
} else {
|
||
|
document.addEventListener('DOMContentLoaded', fn);
|
||
|
}
|
||
|
};
|
||
|
|
||
|
Lang.prototype.currentLang = function () {
|
||
|
var self = this;
|
||
|
return self.get_setting('lang', self.dLang);
|
||
|
};
|
||
|
|
||
|
Lang.prototype.loadLangPack = function (callback, myLangFile) {
|
||
|
var self = this;
|
||
|
|
||
|
if (!self.loadedfiles.contains(myLangFile)) {
|
||
|
self.loadJSON(function (response) {
|
||
|
var result = JSON.parse(response);
|
||
|
if (self.pack) {
|
||
|
for (var i = 0; i < result.length; i++) {
|
||
|
self.pack.push(result[i]);
|
||
|
}
|
||
|
} else {
|
||
|
self.pack = result;
|
||
|
}
|
||
|
self.set_setting('langfile', myLangFile);
|
||
|
callback();
|
||
|
}, myLangFile);
|
||
|
} else {
|
||
|
self.set_setting('langfile', myLangFile);
|
||
|
callback();
|
||
|
}
|
||
|
};
|
||
|
|
||
|
Lang.prototype.set_lang = function (myLang) {
|
||
|
|
||
|
var self = this;
|
||
|
var num = 0;
|
||
|
var oldelem;
|
||
|
|
||
|
for (var i = 0; i < self.pack.length; i++) {
|
||
|
if (self.pack[i].lang == myLang) {
|
||
|
|
||
|
var noderesult = document.evaluate(self.pack[i].elem, document, null, XPathResult.ORDERED_NODE_ITERATOR_TYPE, null);
|
||
|
|
||
|
var thisNode = noderesult.iterateNext();
|
||
|
if (i != 0) {
|
||
|
if (self.pack[i].elem == oldelem) {
|
||
|
num++;
|
||
|
}
|
||
|
if (num != 0) {
|
||
|
for (var x = 0; x < num; x++) {
|
||
|
thisNode = noderesult.iterateNext();
|
||
|
}
|
||
|
} else {
|
||
|
}
|
||
|
|
||
|
/*
|
||
|
var child1 = React.SHP.createElement(thisNode.outerHTML, self.pack[i].text, null);
|
||
|
React.render(child1, thisNode.parentNode);
|
||
|
*/
|
||
|
|
||
|
try {
|
||
|
React.SHP.render(thisNode.outerHTML, self.pack[i].text, self.pack[i].attr, true, thisNode.parentNode);
|
||
|
}
|
||
|
catch (err) {
|
||
|
console.log("Error on elem: " + self.pack[i].elem);
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
} else {
|
||
|
|
||
|
/*
|
||
|
var child1 = React.SHP.createElement(thisNode.outerHTML, self.pack[i].text, null);
|
||
|
React.render(child1, thisNode.parentNode);
|
||
|
*/
|
||
|
try {
|
||
|
React.SHP.render(thisNode.outerHTML, self.pack[i].text, self.pack[i].attr, true, thisNode.parentNode);
|
||
|
}
|
||
|
catch (err) {
|
||
|
console.log("Error on elem: " + self.pack[i].elem);
|
||
|
}
|
||
|
|
||
|
|
||
|
}
|
||
|
|
||
|
oldelem = self.pack[i].elem;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
self.set_setting('lang', myLang);
|
||
|
};
|
||
|
|
||
|
Lang.prototype.set_load_lang = function (myLang, myLangFile, isfirst) {
|
||
|
var self = this;
|
||
|
|
||
|
self.loadLangPack(function () {
|
||
|
if (isfirst == true) {
|
||
|
self.ready(function () {
|
||
|
self.set_lang(myLang);
|
||
|
})
|
||
|
} else {
|
||
|
self.set_lang(myLang);
|
||
|
}
|
||
|
}, myLangFile, isfirst);
|
||
|
|
||
|
};
|
||
|
|
||
|
Lang.prototype.get_setting = function (setKey, defaultval) {
|
||
|
var temp = null;
|
||
|
if (typeof(Storage) !== "undefined") {
|
||
|
temp = localStorage[setKey] || defaultval;
|
||
|
} else {
|
||
|
temp = defaultval;
|
||
|
}
|
||
|
return temp;
|
||
|
};
|
||
|
|
||
|
Lang.prototype.set_setting = function (setKey, setVal) {
|
||
|
if (typeof(Storage) !== "undefined") {
|
||
|
localStorage.setItem(setKey, setVal);
|
||
|
}
|
||
|
};
|
||
|
|
||
|
Lang.prototype.loadJSON = function (callback, myfile) {
|
||
|
var self = this;
|
||
|
var xmlhttp = new XMLHttpRequest();
|
||
|
|
||
|
try {
|
||
|
xmlhttp.open('GET', myfile, true);
|
||
|
xmlhttp.overrideMimeType("application/json");
|
||
|
xmlhttp.setRequestHeader('Content-Type', 'application/json');
|
||
|
xmlhttp.setRequestHeader('Accept-Encoding', 'gzip');
|
||
|
xmlhttp.send(null);
|
||
|
|
||
|
xmlhttp.onreadystatechange = function () {
|
||
|
if (xmlhttp.readyState == 4 && xmlhttp.status == 200) {
|
||
|
|
||
|
self.loadedfiles.push(myfile);
|
||
|
callback(xmlhttp.responseText);
|
||
|
}
|
||
|
};
|
||
|
}
|
||
|
catch (e) {
|
||
|
localStorage.clear();
|
||
|
}
|
||
|
|
||
|
};
|
||
|
|
||
|
Lang.prototype.UI = React.createClass({
|
||
|
displayName: "ReactLanguageSelectorUI",
|
||
|
propTypes: {
|
||
|
items: React.PropTypes.array.isRequired,
|
||
|
openMode: React.PropTypes.string,
|
||
|
hoverTimeout: React.PropTypes.number,
|
||
|
gridColumns: React.PropTypes.oneOfType([
|
||
|
React.PropTypes.number,
|
||
|
React.PropTypes.func
|
||
|
]),
|
||
|
showFlag: React.PropTypes.bool,
|
||
|
selectedLang: React.PropTypes.oneOfType([
|
||
|
React.PropTypes.string,
|
||
|
React.PropTypes.func
|
||
|
]),
|
||
|
onPopupOpening: React.PropTypes.func,
|
||
|
onPopupOpened: React.PropTypes.func,
|
||
|
onPopupClosing: React.PropTypes.func,
|
||
|
onPopupClosed: React.PropTypes.func,
|
||
|
onLanguageChanged: React.PropTypes.func
|
||
|
},
|
||
|
getDefaultProps: function () {
|
||
|
return {
|
||
|
gridColumns: 1,
|
||
|
showFlag: true,
|
||
|
openMode: 'click',
|
||
|
hoverTimeout: 200,
|
||
|
selectedLang: null,
|
||
|
onPopupOpening: null,
|
||
|
onPopupOpened: null,
|
||
|
onPopupClosing: null,
|
||
|
onPopupClosed: null,
|
||
|
onLanguageChanged: null
|
||
|
};
|
||
|
},
|
||
|
getInitialState: function () {
|
||
|
var itemsProp = this.props.items;
|
||
|
var selectedLangProp = this.props.selectedLang;
|
||
|
var selectedLang = null;
|
||
|
for (var i = 0; i < itemsProp.length; i++) {
|
||
|
var item = itemsProp[i];
|
||
|
if (selectedLangProp === item.id) {
|
||
|
selectedLang = item;
|
||
|
}
|
||
|
}
|
||
|
return {
|
||
|
popupOpened: false,
|
||
|
selectedLang: selectedLang ? selectedLang : itemsProp[0],
|
||
|
closePopupTimeout: -1
|
||
|
};
|
||
|
},
|
||
|
_documentClickHandler: function (evt) {
|
||
|
this._processEvent({id: 'onPopupClosing'});
|
||
|
this.setState({popupOpened: false});
|
||
|
this._processEvent({id: 'onPopupClosed'});
|
||
|
},
|
||
|
_documentKeyHandler: function (evt) {
|
||
|
if (evt.keyCode === 27) {
|
||
|
this._processEvent({id: 'onPopupClosing'});
|
||
|
this.setState({popupOpened: false});
|
||
|
this._processEvent({id: 'onPopupClosed'});
|
||
|
}
|
||
|
},
|
||
|
_processEvent: function (evt) {
|
||
|
var onPopupOpeningProp = this.props.onPopupOpening;
|
||
|
var onPopupOpenedProp = this.props.onPopupOpened;
|
||
|
var onPopupClosingProp = this.props.onPopupClosing;
|
||
|
var onPopupClosedProp = this.props.onPopupClosed;
|
||
|
var onLanguageChangedProp = this.props.onLanguageChanged;
|
||
|
|
||
|
if (evt.id === 'onPopupOpening') {
|
||
|
if (onPopupOpeningProp) {
|
||
|
onPopupOpeningProp(this);
|
||
|
}
|
||
|
} else if (evt.id === 'onPopupOpened') {
|
||
|
document.addEventListener('click', this._documentClickHandler);
|
||
|
document.addEventListener('keydown', this._documentKeyHandler);
|
||
|
if (onPopupOpenedProp) {
|
||
|
onPopupOpenedProp(this);
|
||
|
}
|
||
|
} else if (evt.id === 'onPopupClosing') {
|
||
|
document.removeEventListener('click', this._documentClickHandler);
|
||
|
document.removeEventListener('keydown', this._documentKeyHandler);
|
||
|
if (onPopupClosingProp) {
|
||
|
onPopupClosingProp(this);
|
||
|
}
|
||
|
} else if (evt.id === 'onPopupClosed') {
|
||
|
if (onPopupClosedProp) {
|
||
|
onPopupClosedProp(this);
|
||
|
}
|
||
|
} else if (evt.id === 'onLanguageChanged') {
|
||
|
if (onLanguageChangedProp) {
|
||
|
onLanguageChangedProp(evt.selectedLang);
|
||
|
}
|
||
|
} else if (evt.id === 'clearClosePopupTimeout') {
|
||
|
if (this.state.closePopupTimeout > -1) {
|
||
|
clearTimeout(this.state.closePopupTimeout);
|
||
|
this.state.closePopupTimeout = -1;
|
||
|
}
|
||
|
}
|
||
|
},
|
||
|
_onLanguageSelected: function (lang, evt) {
|
||
|
evt.stopPropagation();
|
||
|
this._processEvent({id: 'clearClosePopupTimeout'});
|
||
|
this._processEvent({id: 'onPopupClosing'});
|
||
|
this.setState({selectedLang: lang, popupOpened: false});
|
||
|
this._processEvent({id: 'onPopupClosed'});
|
||
|
this._processEvent({id: 'onLanguageChanged', selectedLang: lang});
|
||
|
return false;
|
||
|
},
|
||
|
_onClick: function (evt) {
|
||
|
evt.stopPropagation();
|
||
|
if (this.state.popupOpened) {
|
||
|
this._processEvent({id: 'onPopupClosing'});
|
||
|
this.setState({popupOpened: false});
|
||
|
this._processEvent({id: 'onPopupClosed'});
|
||
|
} else {
|
||
|
this._processEvent({id: 'onPopupOpening'});
|
||
|
this.setState({popupOpened: true});
|
||
|
this._processEvent({id: 'onPopupOpened'});
|
||
|
}
|
||
|
return false;
|
||
|
},
|
||
|
_onHover: function (enter, evt) {
|
||
|
var _this = this;
|
||
|
var hoverTimeoutProp = this.props.hoverTimeout;
|
||
|
evt.stopPropagation();
|
||
|
if (enter) {
|
||
|
this._processEvent({id: 'clearClosePopupTimeout'});
|
||
|
if (!this.state.popupOpened) {
|
||
|
this._processEvent({id: 'onPopupOpening'});
|
||
|
this.setState({popupOpened: true});
|
||
|
this._processEvent({id: 'onPopupOpened'});
|
||
|
}
|
||
|
} else {
|
||
|
if (this.state.closePopupTimeout < 0) {
|
||
|
this.state.closePopupTimeout = setTimeout(function () {
|
||
|
_this._processEvent({id: 'onPopupClosing'});
|
||
|
_this.setState({popupOpened: false});
|
||
|
_this._processEvent({id: 'onPopupClosed'});
|
||
|
}, hoverTimeoutProp);
|
||
|
}
|
||
|
}
|
||
|
return false;
|
||
|
},
|
||
|
render: function () {
|
||
|
var _this = this;
|
||
|
var itemsProp = this.props.items;
|
||
|
var openMode = this.props.openMode;
|
||
|
var gridColumnsProp = this.props.gridColumns;
|
||
|
var showFlagsProp = this.props.showFlag;
|
||
|
var langPerColumn = Math.round(itemsProp.length / gridColumnsProp);
|
||
|
var selectedLang = this.state.selectedLang;
|
||
|
var popupOpened = this.state.popupOpened;
|
||
|
var liElements = [];
|
||
|
|
||
|
var getTableColumns = function () {
|
||
|
var myStyles = {};
|
||
|
myStyles.cursor = 'pointer';
|
||
|
var tableColumns = [];
|
||
|
for (var i = 0; i < itemsProp.length; i++) {
|
||
|
var item = itemsProp[i];
|
||
|
var selectedItemClass = '';
|
||
|
if (item.id === selectedLang.id) {
|
||
|
selectedItemClass = 'rlsui-selected-locale';
|
||
|
}
|
||
|
if (showFlagsProp) {
|
||
|
liElements.push(React.createElement("li", {role: "presentation"},
|
||
|
React.createElement("a", {
|
||
|
className: selectedItemClass,
|
||
|
title: item.title,
|
||
|
onClick: _this._onLanguageSelected.bind(_this, item),
|
||
|
style: myStyles,
|
||
|
role: "menuitem"
|
||
|
},
|
||
|
React.createElement("img", {src: item.flagImg, alt: item.flagTitle}), " ", item.name)
|
||
|
));
|
||
|
} else {
|
||
|
liElements.push(React.createElement("li", {role: "presentation"},
|
||
|
React.createElement("a", {
|
||
|
className: selectedItemClass,
|
||
|
title: item.title,
|
||
|
onClick: _this._onLanguageSelected.bind(_this, item),
|
||
|
style: myStyles,
|
||
|
role: "menuitem"
|
||
|
}, " ", item.name)
|
||
|
));
|
||
|
}
|
||
|
if (((i + 1) % langPerColumn) === 0) {
|
||
|
tableColumns.push(liElements);
|
||
|
liElements = [];
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if (liElements.length > 0) {
|
||
|
tableColumns.push(liElements);
|
||
|
liElements = [];
|
||
|
}
|
||
|
|
||
|
return tableColumns;
|
||
|
};
|
||
|
|
||
|
var getSelectedLanguage = function () {
|
||
|
var myStyles = {};
|
||
|
myStyles.cursor = 'pointer';
|
||
|
var flagEl = '';
|
||
|
var caretEl = '';
|
||
|
caretEl = React.createElement("div", { className: 'expand_caret' });
|
||
|
if (showFlagsProp) {
|
||
|
flagEl = React.createElement("img", {src: selectedLang.flagImg, alt: selectedLang.flagTitle});
|
||
|
}
|
||
|
if (openMode === 'hover') {
|
||
|
return React.createElement("a", {
|
||
|
className: "rlsui-selected-locale dropdown-toggle",
|
||
|
onMouseEnter: _this._onHover.bind(_this, true),
|
||
|
onMouseLeave: _this._onHover.bind(_this, false),
|
||
|
style: myStyles,
|
||
|
id: "drop_rls",
|
||
|
'data-toggle': "dropdown",
|
||
|
'aria-haspopup': "true",
|
||
|
role: "button",
|
||
|
'aria-expanded': "false"
|
||
|
}, flagEl, " ", selectedLang.name, caretEl);
|
||
|
} else {
|
||
|
|
||
|
if (popupOpened) {
|
||
|
return React.createElement("a", {
|
||
|
className: "rlsui-selected-locale dropdown-toggle nav-link navbar-textsmall",
|
||
|
onClick: _this._onClick,
|
||
|
style: myStyles,
|
||
|
id: "drop_rls",
|
||
|
'data-toggle': "dropdown",
|
||
|
'aria-haspopup': "true",
|
||
|
role: "button",
|
||
|
'aria-expanded': "true"
|
||
|
}, flagEl, " ", selectedLang.name, caretEl);
|
||
|
}
|
||
|
else {
|
||
|
return React.createElement("a", {
|
||
|
className: "rlsui-selected-locale dropdown-toggle nav-link navbar-textsmall",
|
||
|
onClick: _this._onClick,
|
||
|
style: myStyles,
|
||
|
id: "drop_rls",
|
||
|
'data-toggle': "dropdown",
|
||
|
'aria-haspopup': "true",
|
||
|
role: "button",
|
||
|
'aria-expanded': "false"
|
||
|
}, flagEl, " ", selectedLang.name, caretEl);
|
||
|
}
|
||
|
|
||
|
}
|
||
|
};
|
||
|
|
||
|
var getPopup = function () {
|
||
|
var popupStyles = {};
|
||
|
if (!popupOpened) {
|
||
|
popupStyles.display = 'none';
|
||
|
}
|
||
|
if (openMode === 'hover') {
|
||
|
return React.createElement("ul", {
|
||
|
className: "rlsui-language-container-scrollable dropdown-menu navbar-lang pull-right",
|
||
|
|
||
|
onMouseEnter: _this._onHover.bind(_this, true),
|
||
|
onMouseLeave: _this._onHover.bind(_this, false),
|
||
|
'aria-labelledby': "drop_rls",
|
||
|
role: "menu"
|
||
|
},
|
||
|
|
||
|
getTableColumns()
|
||
|
);
|
||
|
} else {
|
||
|
if (popupOpened) {
|
||
|
return React.createElement("ul", {
|
||
|
className: "rlsui-language-container-scrollable dropdown-menu navbar-lang show pull-right",'aria-labelledby': "drop_rls",
|
||
|
role: "menu"
|
||
|
},
|
||
|
|
||
|
getTableColumns()
|
||
|
);
|
||
|
}
|
||
|
else {
|
||
|
return React.createElement("ul", {
|
||
|
className: "rlsui-language-container-scrollable navbar-lang dropdown-menu pull-right",
|
||
|
|
||
|
'aria-labelledby': "drop_rls",
|
||
|
role: "menu"
|
||
|
},
|
||
|
|
||
|
getTableColumns()
|
||
|
);
|
||
|
}
|
||
|
|
||
|
}
|
||
|
};
|
||
|
|
||
|
if (popupOpened) {
|
||
|
return React.createElement("li", {className: "react-language-selector-ui nav-item dropdown show"}, getSelectedLanguage(), " ", getPopup());
|
||
|
}
|
||
|
else {
|
||
|
return React.createElement("li", { className: "react-language-selector-ui nav-item dropdown"}, getSelectedLanguage(), " ", getPopup());
|
||
|
}
|
||
|
}
|
||
|
});
|
||
|
|
||
|
return Lang;
|
||
|
})();
|