მედიავიკი: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);