var LocaleSwitcher = function(el) {
this.el = document.getElementById(el);
var defferedHideTimeout = false;
if (!this.el) {
return;
}
this.locale_elements = this.el.getElementsByTagName('li');
for (var i = 0; i < this.locale_elements.length; i++) {
JSLib.Event.addListener(this.locale_elements[i].getElementsByTagName('a')[0], 'click', function(e, el) {
if (JSLib.CSS.hasClass(el.parentNode, 'current')) {
JSLib.CSS.toggleClass(el.parentNode.parentNode, 'active');
} else {
var location = window.document.location || window.location;
location.href = (el.href.replace(/((https?\:\/\/([\w]+\.)*[\w]+))[\/\s]+$/, '$1') + location.pathname);
}
e.preventDefault();
});
}
JSLib.Event.addListener(this.el, 'mouseover', function(e, el) {
if (defferedHideTimeout) {
clearTimeout(defferedHideTimeout);
defferedHideTimeout = false;
}
}, {delay: 300});
JSLib.Event.addListener(this.el, 'mouseout', function(e, el) {
if (!defferedHideTimeout) {
defferedHideTimeout = setTimeout(this.hide.createDelegate(this), 500);
}
}.createDelegate(this));
JSLib.Event.addListener(window.document, 'click', function(e) {
var el = e.getTarget();
while (el && el.nodeType !== 'HTML' && el.nodeType !== 'BODY' && el.id !== this.el.id) {
el = el.parentNode;
}
if (!el || el.id != this.el.id) {
if (defferedHideTimeout) {
clearTimeout(defferedHideTimeout);
defferedHideTimeout = false;
}
this.hide();
}
}.createDelegate(this));
};
LocaleSwitcher.prototype = {
/**
* TODO: make visible first active locale by default
* @param locale
*/
correctLocale: function(locale) {
return locale.replace(/^(..)_(..)$/, function(s, m1, m2) {
return m1.toLowerCase() + '-' + m2.toUpperCase();
});
},
/**
* One of the locales can be "en", "en-AU", but not "AU"
*/
setActiveLocales: function (locales, invert) {
var i;
locales = locales.split(/[,\s\r\n]+/);
if (!locales.length) {
JSLib.CSS.addClass(this.el, 'disabled');
return;
}
for (i = 0; i < locales.length; i++) {
locales[i] = this.correctLocale(locales[i]);
}
var re = new RegExp('^(' + locales.join('|') + ')(-|$)', 'i');
for (i = 0; i < this.locale_elements.length; i++) {
if (this.locale_elements[i].lang && re.test(this.locale_elements[i].lang)) {
if (invert) {
JSLib.CSS.addClass(this.locale_elements[i], 'disabled');
} else {
JSLib.CSS.removeClass(this.locale_elements[i], 'disabled');
}
} else if (!invert) {
JSLib.CSS.addClass(this.locale_elements[i], 'disabled');
} else {
JSLib.CSS.removeClass(this.locale_elements[i], 'disabled');
}
}
return this;
},
setInactiveLocales: function (locales) {
this.setActiveLocales(locales, true);
return this;
},
/**
* Current locale automatically becomes active (visible) if it was previously disabled.
* @param locale
*/
setCurrentLocale: function (locale) {
locale = this.correctLocale(locale);
for (var i = 0; i < this.locale_elements.length; i++) {
if (this.locale_elements[i].lang && this.locale_elements[i].lang.toLowerCase() === locale.toLowerCase()) {
JSLib.CSS.removeClass(this.locale_elements[i], 'disabled');
JSLib.CSS.addClass(this.locale_elements[i], 'current');
} else {
JSLib.CSS.removeClass(this.locale_elements[i], 'current');
}
}
return this;
},
hide: function() {
JSLib.CSS.removeClass(this.el, 'active');
return this;
}
};
