﻿// v.0.4.2   Compacted with deleting unnecessary functions by JobGeo.Com (22-Mar-2007)

function handlerr(msg,url,line){
	if(!ka_debug)return;
	alert('Error in file '+url+' at line '+line+' : '+msg);
}
onerror=handlerr;

function showerror(err,func){	
	if(!ka_debug)return;
	alert('error in function '+func+': '+((typeof err.description=='undefined')? err :err.description));
}
function filterByClass(elem,crit){	
	var musthave=true;
	if(crit.charAt(0)=='-'){
		crit=crit.substring(1);
		musthave=false;
	}
	classes=elem.className.split(' ');
	var found=false;
	if(crit != '')
		for(var i in classes){			
			if(crit==classes[i]){
				found=true;
				break;
			}
		}
	return  (found==musthave)?true:false;	
}
Number.prototype.among=function(){
	for(var i=0;i<arguments.length;i++){		
		if(this==arguments[i])return true;
	}
	return false;
}
String.prototype.amongi=function(){
	var tmp=this.toLowerCase();
	for(var i=0;i<arguments.length;i++){		
		if(tmp==arguments[i].toLowerCase())return true;
	}
	return false;
}

function $() {
	var elements = new Array();

	for (var i = 0; i < arguments.length; i++){
		var element = arguments[i];
		if (typeof element == 'string')
			element = document.getElementById(element);
		if (arguments.length == 1) 
			return element;
	elements.push(element);
	}
	
	return elements;
}
function ka_isKbdInput(elem){
	elem=$(elem);
	return (elem.tagName && (elem.tagName.amongi('TEXTAREA')  || (elem.tagName.amongi('INPUT') && elem.type.amongi('text','password'))))?
		true
		:false;		
}



/////////////////////////////
//კლავიატურის გადამყვანი
function kaklav(pars){//constructor 
	pars=(typeof pars!='undefined')? pars: {};
	this.elements=('elements' in pars)? pars.elements : '-';
	if('checkbox' in pars){
		this.checkname=pars.checkbox;
		this.checkbox=document.getElementById(pars.checkbox);
		}
		else this.checkbox=this.checkname=null;		
	this.selectedLayout=('layout' in pars)? pars.layout : 'kalat';
	this.selectedEnc=('enc' in pars)? pars.enc : 'uni';
	this.capitals=('cap' in pars)? pars.cap : 'no';
	this.useOld5=('old5' in pars)? pars.old5 : false;
	this.controllerChar=('ctrlchar' in pars)? pars.ctrlchar : '`';
	this.encSwitcherChar=('switcher' in pars)? pars.switcher : '~';		
	this.active=true;
		
	//tinymce-მზე ვაბამთ.
	if('tinymce' in pars){			
		if(! ('theme' in pars.tinymce))
			pars.tinymce={mode : "textareas",	theme : "simple"};
		var agt=navigator.userAgent.toLowerCase();

		if(agt.indexOf('opera') == -1){
			var me=this;
			var funcname='kaklav'+Math.random().toString().substring(3);		
			window[funcname]=function(e){
				me.tinymceHandler(e);					
			}
			pars.tinymce.handle_event_callback=funcname;	
		}
		tinyMCE.init(pars.tinymce);
	}
	this.bindCheckbox();
	
	//ელემენტზე მიბმა
	document.kakbd=this;
	document.onkeypress=function(e){
		return this.kakbd.keypress(e);	
	}	

	this.layouts={
		kalat:{
			lat:'abgdevzTiklmnopJrstufqRySCcZwWxjh',
			uni:'აბგდევზთიკლმნოპჟრსტუფქღყშჩცძწჭხჯჰ',
			std8:'ÀÁÂÃÄÅÆÈÉÊËÌÍÏÐÑÒÓÔÖ×ØÙÚÛÜÝÞßàáãä'
			},
		kabpg:{
			lat: 'abgdevz[iklmnop\'rstufq.y,;c]w/xjh`\\~#$^&*|',
			uni: 'აბგდევზთიკლმნოპჟრსტუფქღყშჩცძწჭხჯჰ"”\'«»;:?“',
			std8:'ÀÁÂÃÄÅÆÈÉÊËÌÍÏÐÑÒÓÔÖ×ØÙÚÛÜÝÞßàáãä"”\'«»;:?“'
		},
		winka:{
			lat: 'qwertyuiop[]asdfghjkl;\'zxcvbnm,./`1234567890=+QWERTYUO{}ASFX>?~!@#$%^&*()_GHJKLCVB',
			uni: 'ჩპუძჭტთნვშკქხიაეოდმსრბგჯჰყღჟზცლფწ”!¹,;%:?.()“=IVXLCDMჃ[]ჄჂჁჅ჆჻\'1234567890+=@#$^\&*\\`',
			std8:'ÜÐÖÞàÔÈÍÅÛÊØáÉÀÄÏÃÌÓÒÁÂãäÚÙÑÆÝË×ß”!¹,;%:?.()“=IVXLCDMჃ[]ჄჂჁჅ჆჻\'1234567890+=@#$^\&*\\`'
		}
	}

	this.init();				
}

kaklav.prototype.bindCheckbox = function(){
	if(this.checkbox === null && this.checkname !== null)	
	this.checkbox=$(this.checkname);
	if(!this.checkbox) return;
	this.checkbox.kakbd=this;
		this.checkbox.onclick=function(){
			this.kakbd.active=!this.kakbd.active;			
			if(this.kakbd.tinyemce_target){
				tinyMCE.execCommand('mceFocus', false,this.kakbd.tinyemce_target);					
			}			
		}
}

kaklav.prototype.flipEncoding=function(){
	var enc = [];
	for(var i in this.layouts){
		enc.push(i);
		if (i==this.selectedLayout)
			var cur=enc.length-1;
	}	
	var newenc = enc[(cur+1)%enc.length];
	this.setLayout(newenc);
}

kaklav.prototype.keypress=function(e){
try{
	this.bindCheckbox();
	var key=(window.event)?event : e;	
	symb=('which' in key)? key.which : key.keyCode;	 	
	
	
	if(key.altKey || key.ctrlKey) return true;		
	if(symb<32) return true;		
	if((symb == 35 || symb == 36) && !key.shiftKey) return true;
	
	
	if(symb==this.controllerChar.charCodeAt(0)){			
		this.active=!this.active;
		if(this.checkbox)this.checkbox.checked=!this.checkbox.checked;
		return false;
	}
	if(!this.active)return true;
	
	if(symb==this.encSwitcherChar.charCodeAt(0)){
		this.flipEncoding();
		return false;
	}		

	if('which' in key){	//ესეგი მელა ან ოპერაა		
		var elem=e.target;		
		if(!filterByClass(elem,this.elements) || !ka_isKbdInput(elem)) return true;
		if('scrollTop' in elem)var scrollTop=elem.scrollTop;
		var start=elem.selectionStart;
		elem.value=elem.value.substring(0, start)+this.convert(symb)+elem.value.substring(elem.selectionEnd); 
		elem.setSelectionRange(++start,start);
		if('scrollTop' in elem) elem.scrollTop=scrollTop;		
		return false;	
	}		
	if(filterByClass(event.srcElement,this.elements))
		event.keyCode=this.convert(symb).charCodeAt(0);				
	return true;
}
catch(err){
	showerror(err,'kaklav::keypress()');
}	
}

kaklav.prototype.tinymceHandler=function(e){	
		this.tinyemce_target=e.target.editorId;
		this.bindCheckbox();				
		if(e.type!='keypress') return true;		
		var elem=$(tinyMCE.getInstanceById(this.tinyemce_target).formTargetElementId);
		if(!filterByClass(elem,this.elements)) return true;

		var symb=('which' in e)? e.which : e.keyCode;
		if(e.altKey || e.ctrlKey) return true;		
		
		if(symb<32) return true;

		if(symb==this.controllerChar.charCodeAt(0)){
			this.active=!this.active;
			if(this.checkbox)this.checkbox.checked=!this.checkbox.checked;			
			if('preventDefault' in e) e.preventDefault();
			else e.returnValue=false;
			return false;
		}
		if(!this.active)return true;		
		if(symb==this.encSwitcherChar.charCodeAt(0)){			
			this.flipEncoding();
			if('preventDefault' in e) e.preventDefault();
			else e.returnValue=false;						
			return false;
		}		


		if('preventDefault' in e){
			tinyMCE.execInstanceCommand(e.target.editorId, 'mceInsertContent', false, this.convert(symb));		
			e.preventDefault();
			return false;
		}
		else{
			e.keyCode=this.convert(symb).charCodeAt(0);
			return false;	
		}
}



kaklav.prototype.init=function(){//private; გადაყვანის ცხრილის შევსება
try{	
	this.convTable=new Array(65536);
	//main	
	for(var i=0;i<this.layouts[this.selectedLayout].lat.length;i++)						
		this.convTable[this.layouts[this.selectedLayout].lat.charCodeAt(i)]=this.layouts[this.selectedLayout][this.selectedEnc].charAt(i);
	//caps	
	if((this.capitals=='tosmall')|| (this.capitals=='tocap')) 
		for(var i=0;i<this.capLayouts[this.capitals][this.selectedLayout].lat.length;i++){
			this.convTable[this.capLayouts[this.capitals][this.selectedLayout].lat.charCodeAt(i)]=
			this.capLayouts[this.capitals][this.selectedLayout][this.selectedEnc].charAt(i); 
		}
	if(this.useOld5=='true'){			
			for(i=0;i<this.capLayouts.old5.lat.length;i++){
			this.convTable[this.capLayouts.old5.lat.charCodeAt(i)]=
			this.capLayouts.old5[this.selectedEnc].charAt(i); 
		}
	}
}
catch(err){
	showerror(err,'kaklav::init()');
}	
}


kaklav.prototype.convert=function(k){//private. k:charcode; აბრუნებს: გადაყვანილ ჩარს;
try{
	return (!this.convTable[k])? String.fromCharCode(k)  : this.convTable[k];
}
catch(err){
	showerror(err,'kaklav::convert()');
}
}


kaklav.prototype.setLayout=function(layout){//public	
	this.selectedLayout=layout;
	this.init();
}

kaklav.prototype.setEnc=function(enc){//public
	this.selectedEnc=enc;
	this.init();	
}

kaklav.prototype.setCap=function(cap){//public
	this.capitals=cap;
	this.init();
}

kaklav.prototype.setUseOld5=function(use){//public
	this.useOld5=use;	
	this.init();	
}
