მედიავიკი:ConvertInput.js
შენიშვნა: შენახვის შემდეგ შესაძლოა დაგჭირდეთ ბრაუზერის ქეშის გაწმენდა ცვლილებების სანახავად. Google Chrome, Firefox, Microsoft Edge და Safari: დააჭირეთ ⇧ Shift ღილაკს და შემდეგ - ღილაკს Reload.
/**
* Allows input to be converted to Georgian (for edit and search forms)
* Can be disabled using check boxes or permanently by adding:
var disableConvertInput = true;
* to your personal JS
*/
(function() {
/**
* GeoKBD 0.3.3 - Georgian keyboard and text convertation library
*
* Copyright (c) 2007 Ioseb Dzmanashvili (http://www.code.ge)
* Licensed under the MIT (http://www.opensource.org/licenses/mit-license.php)
* Altered by [[m:User:Hoo man]]
*/
String.prototype.pasteTo = function(field) {
field.focus();
if (document.selection) {
var range = document.selection.createRange();
if (range) {
range.text = this;
}
} else if (field.selectionStart !== undefined) {
var scrollTop = field.scrollTop, start = field.selectionStart, end = field.selectionEnd;
var value = field.value.substring(0, start) + this + field.value.substring(end, field.value.length);
field.value = value;
field.scrollTop = scrollTop;
field.setSelectionRange(start + this.length, start + this.length);
} else {
field.value += this;
field.setSelectionRange(field.value.length, field.value.length);
}
};
String.prototype.translateToKA = function() {
/**
* Original idea by Irakli Nadareishvili
* http://www.sapikhvno.org/viewtopic.php?t=47&postdays=0&postorder=asc&start=10
*/
var index, chr, text = [], symbols = "abgdevzTiklmnopJrstufqRySCcZwWxjh";
for (var i = 0; i < this.length; i++) {
chr = this.substr(i, 1);
if ((index = symbols.indexOf(chr)) >= 0) {
text.push(String.fromCharCode(index + 4304));
} else {
text.push(chr);
}
}
return text.join('');
};
GeoKBD = {
pasteSelection: function(field) {
try {
var selection = document.selection ? document.selection.createRange().text : document.getSelection();
selection.pasteTo(field);
} catch(e) {}
return false;
},
KA: 'ka',
EN: 'en',
lang: 'ka',
formLangs: {},
bodyHandler: false,
setLanguage: function(lang, formName) {
formName ? this.formLangs[formName] = lang : this.lang = lang;
},
getLanguage: function(formName) {
return this.formLangs[formName] || this.lang || this.KA;
},
setGlobalHandler: function(flag, switcher) {
this.bodyHandler = flag;
var el = document.getElementById(switcher);
if (el) {
document.body.ka = el.checked;
} else {
document.body.ka = this.lang == this.KA;
}
if (flag && !document.body.onkeypress) {
document.body.onkeypress = function(e) {
e = GeoKBD.event.get(e);
if ((e.keyCode || e.which) == 96) {
this.ka = !this.ka;
if (el) el.checked = this.ka;
for (var i = 0; i < document.forms.length; i++) {
var form = document.forms[i];
if (form.onkeypress) {
form.ka = this.ka;
if (form[form.switcher]) {
form[form.switcher].checked = form.ka;
}
form.onkeypress(e);
var x = 0;
}
}
}
};
}
},
browser: {
isOpera: navigator.userAgent.toLowerCase().indexOf('opera') > -1,
isIe: navigator.userAgent.toLowerCase().indexOf('msie') > -1,
isIe6: navigator.userAgent.toLowerCase().indexOf('msie 6') > -1,
isIe7: navigator.userAgent.toLowerCase().indexOf('msie 7') > -1
},
event: {
get: function(e) {
return e || window.event;
},
getKeyCode: function(e) {
e = this.get(e);
return e.keyCode || e.which;
},
targetIs: function(e, tagName) {
e = this.get(e);
var t = e.target || e.srcElement;
return t.tagName.toLowerCase() == tagName ? t : null;
},
attach: function(obj, eventName, fnc, capture) {
if (obj.addEventListener) {
obj.addEventListener(eventName, fnc, capture);
} else if (obj.attachEvent) {
return obj.attachEvent('on' + eventName, fnc);
} else {
obj['on' + eventName] = fnc;
}
},
detach: function(obj, eventName, fnc, capture) {
if (obj.removeEventListener) {
obj.removeEventListener(eventName, fnc, capture);
} else if (obj.detachEvent) {
obj.detachEvent('on' + eventName, fnc);
} else {
obj['on' + eventName] = null;
}
},
cancel: function(e) {
e = this.get(e);
if (e.stopPropagation) {
e.stopPropagation();
e.preventDefault();
} else {
e.cancelBubble = true;
e.returnValue = false;
}
}
},
keyHandlers: {},
addKeyHandler: function(key, callback) {
if (typeof key == 'string') {
key = key.charCodeAt(0);
}
if (!this.keyHandlers[key]) {
this.keyHandlers[key] = [];
}
this.keyHandlers[key].push(callback);
},
handleKey: function(key) {
if (GeoKBD.keyHandlers[key]) {
var handler = null;
for (var i = 0; i < GeoKBD.keyHandlers[key].length; i++) {
handler = GeoKBD.keyHandlers[key][i];
if (handler.constructor && handler.constructor == Array) {
return handler[0][handler[1]].call(handler[0], key);
} else {
return handler(key);
}
}
}
return null;
},
map: function(form, fieldName, switcher) {
var self = this, names = [], forms = [];
if (form) {
if (form.constructor) {
if (form.constructor == String) {
names.push(form);
} else if (form.constructor == Array) {
names = form;
}
if (names.length) {
for (var idx in names) {
if (document.forms[names[idx]]) {
forms.push(document.forms[names[idx]]);
}
}
}
} else {
forms.push(form);
}
} else {
forms = document.forms;
}
for (idx = 0; idx < forms.length; idx++) {
form = forms[idx];
if (!form.fields || form.fields === undefined) form.fields = {};
if (form.ka === undefined) {
form.ka = form[switcher] ?
form[switcher].checked :
this.getLanguage(form.name || null) == this.KA;
}
if (fieldName) {
if (typeof fieldName == 'string') fieldName = [fieldName];
for (var i = 0; i < fieldName.length; i++) {
if (form[fieldName[i]] && !form.fields[fieldName[i]]) form.fields[fieldName[i]] = fieldName[i];
}
} else {
var name, type;
for (var i = 0; i < form.elements.length; i++) {
if (form.elements[i].type) {
name = form.elements[i].name || form.elements[i].id;
type = form.elements[i].type.toLowerCase();
if (name && (type == 'text' || type == 'textarea')) {
form.fields[name] = name;
}
}
}
}
switcher = switcher || 'geo';
form.switcher = switcher;
form.onkeypress = function(e) {
e = self.event.get(e);
if (e.altKey || e.ctrlKey) return;
if (!self.browser.isIe && !self.browser.isOpera && !e.charCode) {
return;
}
var target, _switcher = switcher, keyCode = self.event.getKeyCode(e);
if (GeoKBD.bodyHandler) {
if (keyCode == 96) {
if (this[_switcher]) {
this.ka = this[_switcher].checked = !this[_switcher].checked;
} else {
this.ka = !this.ka;
}
} else if (this[_switcher]) {
this.ka = this[_switcher].checked;
}
}
if (this.ka) {
if ((target = (self.event.targetIs(e, 'textarea') || self.event.targetIs(e, 'input')))) {
if (!this.fields[target.name || target.id]) return;
text = String.fromCharCode(keyCode);
kaText = text.translateToKA();
if (kaText != text) {
if (GeoKBD.browser.isIe) {
e.keyCode = kaText.charCodeAt(0);
} else {
kaText.pasteTo(target);
return false;
}
}
}
}
if (keyCode == 96) {
return false;
} else {
return GeoKBD.handleKey(keyCode);
}
};
}
form = forms = names = null;
}
};
window.GeoKBD = GeoKBD;
})();
convertInput = {
/**
* Converts input using GeoKBD from http://www.code.ge
* Creator: [[m:User:Hoo man]]
*/
//config
checkboxLabel : 'ქართულად წერა',
cookieExpiration : 31, //in days, set to undefined to create session cookies
//Don't touch anything below here unless you know what you're doing
main : function() {
if(typeof(disableConvertInput) != 'undefined' && disableConvertInput) {
return false;
}
//checkbox to enable/ disable it
var html, tmp;
if(skin == 'vector') {
html = '<input type="checkbox" id="searchInputConvert" value="searchInput" onClick="convertInput.checkboxClick(this.checked)"><chkboxlabel> ' + convertInput.checkboxLabel + '</chkboxlabel></form>';
tmp = document.createElement('div');
tmp.style.position = 'relative';
tmp.style.fontSize = '0.7em';
tmp.style.top = '-4.5em';
tmp.innerHTML = html;
document.getElementById('searchform').appendChild(tmp);
}else{
html = '<input type="checkbox" id="searchInputConvert" value="searchInput" onClick="convertInput.checkboxClick(this.checked)">' + convertInput.checkboxLabel + '<br>';
tmp = document.createElement('p');
tmp.innerHTML = html;
document.getElementById('searchform').insertBefore(tmp, document.getElementById('searchInput'));
}
if(mw.config.get('wgAction') == 'edit' || mw.config.get('wgAction') == 'submit') {
html = '<span><input type="checkbox" id="editInputConvert" value="searchInput" onClick="convertInput.checkboxClick(this.checked)">' + convertInput.checkboxLabel + '</span> ';
$('.editCheckboxes').html(html + $('.editCheckboxes').html());
}
if($.cookie('convertInput') == 'disabled') {
return false;
}
convertInput.active = true;
document.getElementById('searchInputConvert').checked = true;
//map the search and edit form
GeoKBD.map('searchform');
if(mw.config.get('wgAction') == 'edit' || mw.config.get('wgAction') == 'submit') {
GeoKBD.map('editform');
document.getElementById('editInputConvert').checked = true;
}
},
checkboxClick : function(checked) {
if(convertInput.active && !checked) {
document.getElementById('searchInputConvert').checked = false;
if(mw.config.get('wgServer').indexOf('secure.wikimedia') == -1) {
$.cookie('convertInput', 'disabled', { expires: convertInput.cookieExpiration, path: '/' });
}else{
//secure.wikimedia
$.cookie('convertInput', 'disabled', { expires: convertInput.cookieExpiration, path: '/wikipedia/ka/' });
}
convertInput.active = false;
document.getElementById('searchform').onkeypress = function() {};
if(mw.config.get('wgAction') == 'edit' || mw.config.get('wgAction') == 'submit') {
document.getElementById('editform').onkeypress = function() {};
document.getElementById('editInputConvert').checked = false;
}
}else if(!convertInput.active && checked) {
convertInput.active = true;
document.getElementById('searchInputConvert').checked = true;
if(mw.config.get('wgServer').indexOf('secure.wikimedia') == -1) {
$.cookie('convertInput', null, { expires: convertInput.cookieExpiration, path: '/' });
}else{
//secure.wikimedia
$.cookie('convertInput', null, { expires: convertInput.cookieExpiration, path: '/wikipedia/ka/' });
}
GeoKBD.map('searchform');
if(mw.config.get('wgAction') == 'edit' || mw.config.get('wgAction') == 'submit') {
GeoKBD.map('editform');
document.getElementById('editInputConvert').checked = true;
}
}
},
active : false
};
$(document).ready(convertInput.main);