/**
* Project Name : w3TamilWK - w3Tamil Web Keyboard
* @ Version : 1.2.1 (15 January, 2008)
* @ Version : 1.2 (January, 2008)
* @ Version : 1.1 (December, 2006)
* Author : T.Siva
* Copyright (C) 2006 - 2008 T.Siva (w3tamil AT gmail DOT com) OR (developer AT w3tamil DOT com)
* Project Home Page: http://wk.w3tamil.com
* Latest Versions will be available at: http://sourceforge.net/projects/w3tamilwk/
*/
/**
* ABOUT w3TamilWK v1.2
* + Added all features of the Tamil99 Keyboard standard
* - Gives the virtual/web keyboard interface to easily input Tamil Unicode characters
* based on Tamil99 keyboard layout.
* - Tamil99 is the computer keyboard layout defined as the primary standard layout
* for inputting Tamil in computers.
* - Tamil99 keyboard layout is the computer-input method for Tamil,
* recommended by Tamilnadu Government and by IT institutions in Sri lanka.
* - w3TamilWK runs on latest browsers
* - This is one of the Open Source Software project hosted on Sourceforge.net
*/
/**
* This file is part of w3TamilWK (w3Tamil Web Keyboard).
*
* w3TamilWK is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* w3TamilWK is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with w3TamilWK; if not, write to the Free Software
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*/
/*--------------------------------------------------------------------------
CUSTOMIZATIONS
o- START -o
--------------------------------------------------------------------------*/
var mouseOverStyleVal = "2px inset #ccc"; //Mouse Over Key border Style
var mouseOutStyleVal = "2px outset #E9E9E9"; //Mouse out Key border Style
var keyPressStyleVal = "1px inset #ccc"; //Mouse click Key border Style
var textControlIdValue = "editor"; //ID value of the targeted textbox or textarea
/*--------------------------------------------------------------------------
o- E N D -o
CUSTOMIZATIONS
--------------------------------------------------------------------------*/
var keyCode; // Key value (integer)
var key; // Key value (Character)
var keyCheck; // This object has values replaceKey, newKeyCode, newKey
var prevChar; // Previous character of the current cursor position
var newKey; // Final new Key Value
var toggleEngTam = -1; // If Tamil = -1; If English = 1
var capsLockOn = -1; // capslock on = 1 and off = -1
var shiftOn = 0; // shift on = 1 and off = 0
//new variables in Ver 1.2 w3TamilWK
var consecutiveCons = 0;
var consecutiveConsVal = "";
var disableJoin=0;
var caretOn = 0;
var consecutiveCaretOn = 0;
/*--------------------------------------------------------------------------
Keyboard KEY PRESS CLICK related methods
o- START -o
--------------------------------------------------------------------------*/
//main function
function addCharKeyPress(textControl, evt, keyChecker){
hideStatusBarBottom();
listenCurrentEvent(evt);
toggleShift(keyCode,16,16);
toggleCapsLock(keyCode,20)
if(capsLockOn==1|| shiftOn==1){
keyCode = String.fromCharCode(keyCode).toUpperCase().charCodeAt();
if (keyCode) key = String.fromCharCode(keyCode);
}
if(toggleEngTam == -1 )
{
keyCheck = keyChecker(keyCode, key);
return transKey(textControl, evt, keyChecker);
}
}
function listenCurrentEvent(evt){
if(typeof evt.which != 'undefined') keyCode = evt.which;
else if(typeof evt.keyCode != 'undefined') keyCode = evt.keyCode;
else if(typeof evt.charCode != 'undefined') keyCode = evt.charCode;
else keyCode = 0;
if (keyCode) key = String.fromCharCode(keyCode);
}
function toggleShift(title,val1,val2){
if(title == val1 ||title==val2) shiftOn = 1; //Shift key is in On mode
else shiftOn = 0; //Shift key is in off mode
}
function toggleCapsLock(title,val){
if(title == val) capsLockOn = -(capsLockOn);
}
function hideStatusBarBottom(){
document.getElementById('shiftcaps_status').innerHTML = "";
}
var enterKeyCount=0;
//To find the new values of the keyCode and key.
function engToTam (keyCode, key) {
if( keyCode!= 13 && keyCode!=8 && keyCode!=0) //Enter key's keyCode = 13
cha = langMapping[String.fromCharCode(keyCode)][0];
else
cha = ""; //To fix the "langMapping[..][0] is null or not an object" error when press Enter
if (cha) {
return { replaceKey: true,
newKeyCode: cha.charCodeAt(),
newKey: cha
};
}
else {
return { cancelKey: false };
}
}
function transKey (textControl, evt, keyChecker) {
if (keyCode && window.event && !window.opera) { //for IE
if (keyCheck.cancelKey) {
return false;
}
else if (keyCheck.replaceKey) {
if (window.event.preventDefault) {
window.event.preventDefault();
}
setNewKey(textControl,keyCheck.newKey,engTamExp[key]);
return false;
}
else {
return true;
}
}
else if (typeof textControl.setSelectionRange != 'null') { //for FF
if (keyCheck.cancelKey) {
if (evt.preventDefault) {
evt.preventDefault();
}
return false;
}
else if (keyCheck.replaceKey) {
if (evt.preventDefault) {
evt.preventDefault();
}
setNewKey(textControl,keyCheck.newKey,engTamExp[key]);
return false;
}
else {
return true;
}
}
else if (keyCheck.cancelKey) {
if (evt.preventDefault) {
evt.preventDefault();
}
return false;
}
else {
return true;
}
}
function setNewKey(textControl,newKeyVal,vowGlyph){
var pos = getCursorPosition(textControl);
prevChar = getPrevChar(textControl.value,pos);
newKey = newKeyVal;
//if(newKey == "^" && textControl.value.length==0)
//caretOn = 1;
analyzedNewKey(vowGlyph);
textControl.value = textControl.value.substring(0, pos) + newKey + textControl.value.substring(pos);
textControl.focus();
inc = pos+newKey.length;
setCursorPosition(textControl,inc,inc,oldpos=pos);
}
function getCursorPosition(textControl){
if(document.selection)
return getCursorPositionIE(textControl);
else if(typeof textControl.setSelectionRange != 'undefined')
return getCursorPositionFF(textControl);
else
return textControl.length;
}
function getCursorPositionIE(textControl){
var len = textControl.value.length;
var pos = -1;
if(document.selection)
{
sel = document.selection.createRange();
obj = textControl.createTextRange();
obj.moveToBookmark(sel.getBookmark());
obj.moveEnd('character',textControl.value.length);
pos = len - obj.text.length;
}
return pos;
}
function getCursorPositionFF(textControl){
var currentSelectionStart=-1,currentSelectionEnd=-1;
if(typeof textControl.setSelectionRange != 'undefined'){
currentSelectionStart = textControl.selectionStart;
currentSelectionEnd = textControl.selectionEnd;
//In our case, both has same value
}
return currentSelectionStart;
}
function getPrevChar(txt,currentPosition){
return txt.substring(currentPosition-1,currentPosition);
}
function analyzedNewKey(vowGlyph){
newKeyPerm = newKey;//To keep the original value of newKey
if(prevChar){
//to track the consecutive same constants
if(prevChar==newKey && tamCon.toString().indexOf(prevChar)!=-1 && disableJoin!=1)
consecutiveCons++;
else consecutiveCons = 0;
if(newKey==prevChar && newKey!=consecutiveConsVal && consecutiveConsVal!="")
consecutiveCons=1;
//Tamil99 Rules = 4,5
//to put automatic pulli between two consecutive same consonant
if(newKey==prevChar && tamCon.toString().indexOf(prevChar)!=-1 && consecutiveCons%2 && consecutiveCons!=0 && disableJoin!=1)
{
newKey = "்"+newKey;
consecutiveConsVal = prevChar;
disableJoin = 0;
}
//Tamil99 Rule = 7
//to put automatic pulli between two consecutive soft and hard consonant
if( ((prevChar=="ங" && newKey=="க") || (prevChar=="ஞ" && newKey=="ச")|| (prevChar=="ந" && newKey=="த")|| (prevChar=="ண" && newKey=="ட")|| (prevChar=="ம" && newKey=="ப")|| (prevChar=="ன" && newKey=="ற")) && disableJoin!=1)
{
newKey = "்"+newKey;
consecutiveCons++;
}
//to enter visiri instead of ii
if(tamCon.toString().indexOf(prevChar)!=-1 && tamVow.toString().indexOf(newKey)!=-1 && vowGlyph && disableJoin!=1)
newKey = vowGlyph;
//Tamil99 Rule = 6
//to remove அ after a consonant/ To avoid the join with a consonant
if(newKeyPerm=="அ" && tamCon.toString().indexOf(prevChar)!=-1 )
{
newKey = "";
disableJoin=1;
}else disableJoin = 0;
//to avoid multiple pulli
if(newKey==tamPul && tamCon.toString().indexOf(prevChar)==-1 )
newKey = "ஃ";
}else{
//to remove 1st character pulli
if(newKey==tamPul)
newKey = "";
}
//Tamil99 Rule = 10
if(caretOn && newKeyPerm==".") {newKey = "•";caretOn = 0;}
if(caretOn && newKeyPerm=="௵") {newKey = "©";caretOn = 0;}//v1.2.1
//Tamil99 Rule = 11
if(caretOn && newKeyPerm=="7") {newKey = "‘";caretOn = 0;}
if(caretOn && newKeyPerm=="8") {newKey = "’";caretOn = 0;}
if(caretOn && newKeyPerm=="9") {newKey = "“";caretOn = 0;}
if(caretOn && newKeyPerm=="0") {newKey = "”";caretOn = 0;}
if(caretOn && newKeyPerm=="s") {newKey = " ";caretOn = 0;}
//Tamil99 Rule = 9
if((caretOn && newKeyPerm=="ஆ") || (caretOn && newKeyPerm=="இ")|| (caretOn && newKeyPerm=="ஈ")|| (caretOn && newKeyPerm=="உ")|| (caretOn && newKeyPerm=="ஊ")|| (caretOn && newKeyPerm=="எ")|| (caretOn && newKeyPerm=="ஏ")|| (caretOn && newKeyPerm=="ஐ")|| (caretOn && newKeyPerm=="ஒ")|| (caretOn && newKeyPerm=="ஓ")|| (caretOn && newKeyPerm=="ஔ") ) {newKey = uirVis[newKeyPerm];caretOn = 0;}//v1.2.1
if(caretOn && newKeyPerm =="^"){newKey = "^";caretOn = 0;consecutiveCaretOn=1}
//w3Tamil addition for rule - 9
if(caretOn && newKey=="ஃ") {newKey = "்";caretOn = 0;}
//Tamil99 Rules = 9,10,11
if(consecutiveCaretOn!=1 && newKeyPerm == "^"){
newKey = "";
caretOn = 1
}
consecutiveCaretOn = 0; //Tamil99 Rule = 10
}
function setCursorPosition(textControl,oStart,oEnd,oldpos) {
if( textControl.setSelectionRange ) {
textControl.setSelectionRange(oStart,oEnd);
}
else if( textControl.createTextRange ) {
var obj = textControl.createTextRange();
obj.collapse(true);
obj.moveEnd('character',oEnd);
obj.moveStart('character',oStart);
obj.select();
}
}
/*--------------------------------------------------------------------------
o- END -o
Keyboard KEY PRESS CLICK related methods
--------------------------------------------------------------------------*/
/*--------------------------------------------------------------------------
Keyboard MOUSE CLICK and Other EVENTs related methods
o- START -o
--------------------------------------------------------------------------*/
function addW3Tamil (character) {
var title = parseInt(character.id);
var textControl = document.getElementById(textControlIdValue);
textControl.focus();
character.style.border = keyPressStyleVal;
toggleCapsLock(title,29);
if(!(title==29 || title==42 || title==53)){
if(shiftOn || capsLockOn==1) title = title+500;
newKey = "";
if(clickMapping[title])
if(toggleEngTam == -1){
if(langMapping[clickMapping[title]][0])
newKey = langMapping[clickMapping[title]][0];
}else{
if(clickMapping[title])
newKey = clickMapping[title];
}
setNewKey(textControl,newKey,uirVis[newKey]);
}
toggleShift(title,42,53);
displayStatusBar();
displayStatusBarBottom();
}
function displayStatusBar(){
document.getElementById('lang_status').innerHTML = "<b>Language Mode</b> = <a href='#' title='Indicates the Input Language mode; Click here to change the language mode' onclick='toggleEngTam=-toggleEngTam;displayStatusBar();'>"+((toggleEngTam==-1)?" Tamil":"English")+"</a><i>(To change, click on the link OR press</i> <font color='brown'>F12</font><i> key)</i><br />";
document.getElementById('keyboard_status').style.width = "90%";
document.getElementById('keyboard_status').style.padding = "3px";
document.getElementById('keyboard_status').style.border = "1px solid #fff";
}
function displayStatusBarBottom(){
document.getElementById('shiftcaps_status').innerHTML = "<b>SHIFT</b> = "+((shiftOn==1)?" On":"Off")+"; <b>CAPSLOCK</b> = "+((capsLockOn==1)?" On":"Off");
}
/*--------------------------------------------------------------------------
o- END -o
Keyboard MOUSE CLICK and Other EVENTs related methods
--------------------------------------------------------------------------*/
/*--------------------------------------------------------------------------
Other methods
o- START -o
--------------------------------------------------------------------------*/
function toggleLangMode(evt)
{
listenCurrentEvent(evt);
if(keyCode == 123) toggleEngTam = -(toggleEngTam); //F12 key's keyCode = 123
toggleShift(keyCode,16,16); //shift key's keyCode = 16
toggleCapsLock(keyCode,20) //capslock key's keyCode = 20
displayStatusBar();
}
function keyDownBorder(obj){
if(keyIdCode[keyCode])
document.getElementById(keyIdCode[keyCode]).style.border = mouseOverStyleVal;
}
function keyUpBorder(kid){
for(i=1;i<=60;i++)
document.getElementById(i).style.border = mouseOutStyleVal;
}
function overW3Tamil(obj){
obj.style.border = mouseOverStyleVal;
}
function outW3Tamil(obj){
obj.style.border = mouseOutStyleVal;
}
function copyit() {
var textControl= document.getElementById(textControlIdValue);
var alertMsg1 = "You've selected";
var alertMsg2="";
textControl.focus();
textControl.select();
if(typeof textControl.createTextRange!= 'undefined'){
therange=textControl.createTextRange();
therange.execCommand("Copy");
alertMsg2=" and copied into the clipboard successfully.";
}else alertMsg2=" successfully.\n To copy use one of the following:\n* EDIT->COPY \nor\n* RIGHT MOUSE CLICK->COPY";
alert(alertMsg1+alertMsg2);
}
/*--------------------------------------------------------------------------
o- END -o
Other methods
--------------------------------------------------------------------------*/