var objLipikaarGlbLanguage = Array();
//@todo : commeinting to the newer classes
function LipikaarUtility()
{	
	//flag for error reporting 
	this.debugMode = true;
	//flag for sending error to lipikaar server
	this.sendError = true;

	this.arrMappingPair = eval(﻿{'arabic' : 'arabic',
			'bengali' : 'bengali',
			'devanagari' : 'devanagari',
			'hindi' : 'devanagari',
			'sanskrit' : 'devanagari',
			'marathi' : 'devanagari',
			'kashmiri' : 'arabic',
			'konkani' : 'devanagari',
			'nepali' : 'devanagari',
			'sindhi' : 'devanagari',
			'gujarati' : 'gujarati',
			'kannada' : 'kannada',
			'malayalam' : 'malayalam',
			'punjabi' : 'punjabi',
			'tamil' : 'tamil',
			'telugu' : 'telugu',
			'oriya' : 'oriya',
			'assamese' : 'bengali',
			'urdu' : 'urdu'
				  });
	this.arrMappingHelp = eval(﻿{'bengali' : {"charMap":"কি",'url':"http://www.lipikaar.com/webmodule/img/helpicons/bengali-letter.png","k":"ক","kk":"খ","kxya":"ক্যা","kxrm":"ক্রম","hz":"হং","jzzz":"জঁ"},
		          'sanskrit' : {"charMap":"कि",'url':"http://www.lipikaar.com/webmodule/img/helpicons/devanagari-letter.png","k":"क","kk":"ख","kxya":"क्या","kxrm":"क्रम","hz":"हं","jzzz":"जँ"},
		          'hindi' : {"charMap":"कि",'url':"http://www.lipikaar.com/webmodule/img/helpicons/devanagari-letter.png","k":"क","kk":"ख","kxya":"क्या","kxrm":"क्रम","hz":"हं","jzzz":"जँ"},
		          'marathi' : {"charMap":"कि",'url':"http://www.lipikaar.com/webmodule/img/helpicons/devanagari-letter.png","k":"क","kk":"ख","kxya":"क्या","kxrm":"क्रम","hz":"हं","jzzz":"जँ"},
				  'konkani' : {"charMap":"कि",'url':"http://www.lipikaar.com/webmodule/img/helpicons/devanagari-letter.png","k":"क","kk":"ख","kxya":"क्या","kxrm":"क्रम","hz":"हं","jzzz":"जँ"},
		          'nepali' : {"charMap":"कि",'url':"http://www.lipikaar.com/webmodule/img/helpicons/devanagari-letter.png","k":"क","kk":"ख","kxya":"क्या","kxrm":"क्रम","hz":"हं","jzzz":"जँ"},
		          'sindhi' : {"charMap":"कि",'url':"http://www.lipikaar.com/webmodule/img/helpicons/devanagari-letter.png","k":"क","kk":"ख","kxya":"क्या","kxrm":"क्रम","hz":"हं","jzzz":"जँ"},
		          'gujarati' : {"charMap":"કિ",'url':"http://www.lipikaar.com/webmodule/img/helpicons/gujarati-letter.png","k":"ક","kk":"ખ","kxya":"ક્યા","kxrm":"ક્રમ","hz":"હં","jzzz":"જઁ"},
		          'kannada' : {"charMap":"ಕಿ",'url':"http://www.lipikaar.com/webmodule/img/helpicons/kannada-letter.png","k":"ಕ","kk":"ಖ","kxya":"ಕ್ಯಾ","kxrm":"ಕ್ರಮ","hz":"ಹಂ","jzzz":"ಜ।"},
				  'malayalam' : {"charMap":"കെ",'url':"http://www.lipikaar.com/webmodule/img/helpicons/malayalam-letter.png","k":"ക","kk":"ഖ","kxya":"ക്യാ","kxrm":"ക്രമ","hz":"ഹം","jzzz":"ജഽ"},
		          'punjabi' : {"charMap":"ਕਿ",'url':"http://www.lipikaar.com/webmodule/img/helpicons/punjabi-letter.png","k":"ਕ","kk":"ਖ","kxya":"ਕ੍ਯਾ","kxrm":"ਕ੍ਰਮ","hz":"ਹਂ","jzzz":"ਜਁ"},
		          'tamil' : {"charMap":"கே",'url':"http://www.lipikaar.com/webmodule/img/helpicons/tamil-letter.png","k":"க","kk":"க்த","kxya":"க்யா","kxrm":"க்ரம","hz":"ஹஂ","jzzz":"ஜ।"},
		          'telugu' : {"charMap":"యీ",'url':"http://www.lipikaar.com/webmodule/img/helpicons/telugu-letter.png","k":"క","kk":"ఖ","kxya":"క్యా","kxrm":"క్రమ","hz":"హం","jzzz":"జః"},
		          'oriya' : {"charMap":"କେ",'url':"http://www.lipikaar.com/webmodule/img/helpicons/oriya-letter.png","k":"କ","kk":"ଖ","kxya":"କ୍ଯା","kxrm":"କ୍ରମ","hz":"ହଂ","jzzz":"ଜଁ"},
		          'assamese' : {"charMap":"কি",'url':"http://www.lipikaar.com/webmodule/img/helpicons/oriya-letter.png","k":"ক","kk":"খ","kxya":"ক্যা","kxrm":"ক্রম","hz":"হং","jzzz":"জঁ"},
				  'arabic' : {"charMap":"كi",'url':"http://www.lipikaar.com/webmodule/img/helpicons/arabic-letter.png","k":"ك","kk":"خ","kxya":"كٔيا","kxrm":"كٔرم","hz":"ءز","jzzz":"جظز"},
			   	  'urdu' : {"charMap":"كi",'url':"http://www.lipikaar.com/webmodule/img/helpicons/arabic-letter.png","k":"ك","kk":"خ","kxya":"كٔيا","kxrm":"كٔرم","hz":"ءز","jzzz":"جظز"},
				  'kashmiri' : {"charMap":"كi",'url':"http://www.lipikaar.com/webmodule/img/helpicons/arabic-letter.png","k":"ك","kk":"خ","kxya":"كٔيا","kxrm":"كٔرم","hz":"ءز","jzzz":"جظز"}

				  });
	
	cacheImages =  Array('http://www.lipikaar.com/webmodule/img/langicons/devanagari.gif',
								'http://www.lipikaar.com/webmodule/img/english-off.gif',
								'http://www.lipikaar.com/webmodule/img/toolbar-tooltip.gif',
								'http://www.lipikaar.com/webmodule/img/help.gif',
								'http://www.lipikaar.com/webmodule/img/toolbar-badge.gif',
								'http://www.lipikaar.com/webmodule/img/toolbar-right-arrow.gif',
								'http://www.lipikaar.com/webmodule/img/toolbar-left-arrow.gif',
								'http://www.lipikaar.com/webmodule/img/toolbar-background.gif',
								'http://www.lipikaar.com/webmodule/img/lipikaar-signature.gif'
								);
		var tempImg = Array()

		for(var x=0;x<cacheImages.length;x++) {
			tempImg[x] = new Image(200,200)
			tempImg[x].src = cacheImages[x];
		}
}

LipikaarUtility.prototype = {

	//simple method to call ajax urls.call back functions to be provided on success of the request.
	simpleAjax : function(url,onSuccess)
	{
		var httpRequest;
		try 
		{
			httpRequest = new ActiveXObject('Msxml2.XMLHTTP');
		}
		catch (e1) 
		{
			try 
			{
				 httpRequest = new ActiveXObject('Microsoft.XMLHTTP');
			}
			catch (e2) 
			{
				try 
				{
					httpRequest = new XMLHttpRequest();
				}
				catch (e3) 
				{
					httpRequest = false;
				}
			}
		}
		httpRequest.open('GET', url, false);
		httpRequest.send(null);
		return httpRequest.responseText;
		onSuccess.call(this,httpRequest);

		//check the status of the request
		if (httpRequest.readystate == 4)
		{
			if (httpRequest.status == 200)
			{
				
				//call the user defined function 	
				onSuccess.call(this,httpRequest);
				return true;
			}
		}

	}, 
	$:function(id)
	{
		return document.getElementById(id);
	},
	logError:function(message)
	{
		if(this.debugMode && !this.sendError)
		{
			console.log(message);
		}
		else
		{
			//send error + config to lipikaar server 
		}
	},
	getX: function(obj)
	{
		return( obj.offsetParent==null ? obj.offsetLeft : obj.offsetLeft+  this.getX(obj.offsetParent) );
	},
	getY:function (obj)
	{
		return( obj.offsetParent==null ? obj.offsetTop : obj.offsetTop+  this.getY(obj.offsetParent) );
	}
	,
	getWindowSize:function() 
	{
	  var myWidth = 0, myHeight = 0;
	  if( typeof( window.innerWidth ) == 'number' ) {
		//Non-IE
		myWidth = window.innerWidth;
		myHeight = window.innerHeight;
	  } else if( document.documentElement && ( document.documentElement.clientWidth || document.documentElement.clientHeight ) ) {
		//for IE 6+
		myWidth = document.documentElement.clientWidth;
		myHeight = document.documentElement.clientHeight;
	  } else if( document.body && ( document.body.clientWidth || document.body.clientHeight ) ) {
		//IE 4 compatible
		myWidth = document.body.clientWidth;
		myHeight = document.body.clientHeight;
	  }
	  
	  return {'width':myWidth,'height':myHeight};
    }
    ,
	getSelection :function ( el )
	{
		if ( el.selectionStart == undefined )
		{
		var r = document.selection.createRange();

		return new Array( r.start, r.end );
		}
		else
		{
		return new Array( el.selectionStart, el.selectionEnd );
		}
	},
	/**
	* @desc method to overcome single domain origin policy from the browsers.it imitates ajax but works cross-domain. 
	* @param scriptUrl String  url to be called from the remote server
	* @param method String  function name to be called on the remote server
	* @param params Array  associative array of parameters
	* @param callback Function  callback function
	* @param parent Object  arent object
	* @return 	
	**/
	simpleRC:function(scriptUrl,method,params,callback,parent) 
	{
		 
		
		try{
			
			var dynScriptTag = document.createElement('script');
			paramString = '';
			for (key in params)
			{
				paramString += "&"+key + "="+ params[key];
			}
			var url = scriptUrl+ "?method="+method+paramString;
			dynScriptTag.setAttribute("src", url);
			dynScriptTag.setAttribute("type", "text/javascript");
			dynScriptTag.id = 'lipikaarRC';
			dynScriptTag.setAttribute("charset", "utf-8");
			var headTag = document.getElementsByTagName("head")[0];
			setTimeout(function(){headTag.appendChild(dynScriptTag)},500);
			
		}
		catch(e)
		{
			alert("loading Error" + e);
		}
		
	   dynScriptTag.onreadystatechange= function () {
		   if (this.readyState == 'complete')
		   {
 				callback.call(parent);
		   }
		}
		dynScriptTag.onload= function () {
	      callback.call(parent);
		}

	},//simpleRC
	getCursorCoordinates:function(elem)
	{
		var objTmp=this.getRange(elem);
		if(!objTmp)
		{
			var objTmp =elem;
			//return null
		}
		var c=this.getLeftOffset(objTmp),e=this.getPScroll(objTmp);
		return{x:c.x+e.x,y:c.y+ 17 +e.y}
	},
	getRange :function(elem)
	{	
		return window.document.selection.createRange();
		
	},
	getLeftOffset:function(a)
	{	
		var objTmp=a.offsetLeft,c=a.offsetTop;
		if(a.offsetParent!=null)
		{
			var e=this.getLeftOffset(a.offsetParent);objTmp+=e.x;c+=e.y
		}
		return{x:objTmp,y:c}
	},
	getPScroll:function(a)
	{
		//e=window.document.body.scrollLeft;
		//f=window.document.body.scrollTop
		//for the Doctype fix added below code.
		e = (document.documentElement && document.documentElement.scrollLeft) ?
			 document.documentElement.scrollLeft : document.body.scrollLeft;
		f = (document.documentElement && document.documentElement.scrollTop) ?
			 document.documentElement.scrollTop : document.body.scrollTop;
		return new this.objXy(e,f);
	}
	,
	chkVar:function(a)
	{
		return typeof a!="undefined"
	}, 
	objXy:function(a,objTmp)
	{
		this.x=oLU.chkVar(a)?Number(a):undefined;
		this.y=oLU.chkVar(objTmp)?Number(objTmp):undefined
		
	},
	setCursorCoordinatesFf :function(elm)
    {
		var elm,range=elm.selectionStart
		elm.style.lineHeight="13px";
		if(oLU.$('lipikaar_temp_'+elm.id)==null)
		{
			tempDiv = document.createElement("div")
			tempDiv.id='lipikaar_temp_'+elm.id;	
			//tempDiv.style.fontSize=elm.style.fontSize||"10px";
			tempDiv.style.lineHeight="12.5px";
			tempDiv.style.fontFamily= "monospace";
			tempDiv.style.whiteSpace= "pre-wrap";
			tempDiv.style.position= "absolute";
			document.body.appendChild(tempDiv);
		}
		else
		{
			tempDiv =oLU.$('lipikaar_temp_'+elm.id)
		}
		tip = oLU.$('lipikaarToolTip')

 		var cord=this.getLeftOffset(elm);
		tempDiv.style.top = cord.y+  elm.offsetHeight+ "px";
		tempDiv.style.left = cord.x + "px";
		tempDiv.style.width = elm.offsetWidth + "px";
		tempDiv.style.height = elm.offsetHeight + "px";
		this.doMask(elm.value.substring(0,range),cord.x,cord.y,elm,tempDiv,tip)
		tip.style.display="block";
		document.body.removeChild(tempDiv)
		return;
  },
  doMask:function(val,x,y,elm,tempDiv,tip)
  {

	tempDiv.innerHTML = "";
	arrVal = val.split("\n");
	if(arrVal.length>1)
	{
		for(key in arrVal)
		{
			span = document.createElement("span");
 			span.innerHTML = arrVal[key]+"<br>";;
			tempDiv.appendChild(span)
		}
		
	}
	else
	{	
		span = document.createElement("span");
		span.innerHTML = val ;
		tempDiv.appendChild(span)

	
	}
	
	var spanCord=this.getLeftOffset(span);

	 

	if(tempDiv.offsetHeight >elm.scrollHeight || (elm.type=="text"&&elm.offsetWidth >span.offsetWidth))
	{
	
		tip.style.top = ((spanCord.y - tempDiv.offsetHeight) +20 ) +  "px";
	}
	if((tempDiv.offsetWidth >elm.scrollWidth) || (elm.type=="text"&&elm.offsetWidth >span.offsetWidth) )
	{
		tip.style.left = (spanCord.x + span.offsetWidth+ 5) + "px";
	}
 	tempDiv.innerHTML = "";
	 
  },
  createElem:function(elemName,parentElm,attrib,value,style)
  {
	 
	try
	{
		var dynElm = document.createElement(elemName);
	
		for (key in attrib)
		{
			dynElm.setAttribute(key,attrib[key]);
		}
		for (key in value)
		{
			eval("dynElm."+key+"='"+value[key]+"';");
		}
		for (key in style)
		{
			eval("dynElm.style."+key+"='"+style[key]+"';");
		}

		parentElm.appendChild(dynElm);	
	}
	catch (e)
	{
		alert(e);
	}
	return dynElm
  }
  ,
  getParam:function( param )
  {
	  param = param.replace(/[\[]/,"\\\[").replace(/[\]]/,"\\\]");
	  var regexS = "[\\?&]"+param+"=([^&#]*)";
	  var regex = new RegExp( regexS );
	  var paramValue = regex.exec( oLU.$('lipikaarLanguageCM').src );
	  if( paramValue == null )
		return "";
	  else
		return paramValue[1];
  },
  uCFirst:function(str)
  {
	return str.slice(0,1).toUpperCase() + str.slice(1);
  },

  onDOMReady:function (fn, ctx){
	var ready, timer;
	var onStateChange = function(e){
		if(e && e.type == "DOMContentLoaded"){
			fireDOMReady();
		}else if(e && e.type == "load"){
			fireDOMReady();
		}else if(document.readyState){
			if(document.readyState == "loaded" || document.readyState == "complete"){
				fireDOMReady();
			}else if(!!document.documentElement.doScroll){
				try{
					ready || document.documentElement.doScroll('left');
				}catch(e){
					return;
				}
				fireDOMReady();
			}
		}
	};

	var fireDOMReady = function(){
		if(!ready){
			ready = true;
			fn.call(ctx || window);
			if(document.removeEventListener)
				document.removeEventListener("DOMContentLoaded", onStateChange, false);
			document.onreadystatechange = null;
			window.onload = null;
			clearInterval(timer);
			timer = null;
		}
	};

	if(document.addEventListener)
		document.addEventListener("DOMContentLoaded", onStateChange, false);
	document.onreadystatechange = onStateChange;
	timer = setInterval(onStateChange, 5);
	window.onload = onStateChange;
}
}

// make the common utilities avalible 
var oLU = new LipikaarUtility()

/**
 * Main class responsible for Lipikaar processing
 **/
function Lipikaar(accessCode,defaultLanguage) 
{
	//initialize 
	this.accessCode = accessCode||null;
	this.objLipikaarConfig = null;
	this.baseURL = "http://www.lipikaar.com/xss/";
	// make the common utilities avalible 
	//this.oLU = new LipikaarUtility()

}
Lipikaar.prototype = {

	
	//enable Lipikaar 
	enable:function()
	{
 
		try
		{
			
			//add default language
			hidCurLanguage = document.createElement('input');
			hidCurLanguage.setAttribute("type", "hidden");
			hidCurLanguage.id = 'lipikaarCurrentLanguage';
			hidCurLanguage.value = oLU.arrMappingPair[defaultLanguage] || "english";


			hidCurLanguageName = document.createElement('input');
			hidCurLanguageName.setAttribute("type", "hidden");
			hidCurLanguageName.id = 'lipikaarCurrentLanguageName';
			hidCurLanguageName.value = defaultLanguage || "english";
			
			
			
			window.document.body.appendChild(hidCurLanguage );
			window.document.body.appendChild(hidCurLanguageName);
		 
			//Authenticate the client	
			this.objAuth = new Authenticate()
			if(this.objAuth.authenticate(this.accessCode))
			{
				/*url = this.baseURL + "porter.php";
				//get the configuration loaded
				oLU.simpleRC(url,'getConfig',{'accessCode':'foo'},this.start,this);*/
				url = this.baseURL  + "get_configuration";
				//get the configuration loaded
				oLU.simpleRC(url,'getConfig',{'access':this.accessCode,'ring':encodeURIComponent(window.location.href)},this.start,this);
			}
		}
		catch(e)
		{
	
			oLU.logError("Authentication Error: "+e.toString())
		}
		
	},
	start:function()
	{

		try
		{
			
			if(typeof oLU.arrMappingPair[defaultLanguage] != 'undefined')
			{
				objLipikaarConfig.enabled = true;
			}
			else
			{
				objLipikaarConfig.enabled = false;
			}
			var arrLanguages = objLipikaarConfig.getLanguage();
			faultyDefault = true;
			for(LanguageNum in arrLanguages)
			{
				if(arrLanguages[LanguageNum] == defaultLanguage)
				{
					faultyDefault = false;
				}
			}
			
			if(faultyDefault)
			{
				oLU.$("lipikaarCurrentLanguage").value =   "english";
				oLU.$("lipikaarCurrentLanguageName").value=  "english";
			}
			objLipikaarConfig.helpEnabled = true;
			objLipikaarConfig.baseURL =this.baseURL;
			//objLipikaarConfig.languagePath = "sites/dubzi/modules/lipikaar_live";
			//create the output manager with current configuration
			this.objOpHandler = new OpHandler(objLipikaarConfig);

			//add css
			var headTag = document.getElementsByTagName("head")[0];
			var dynScriptTag = document.createElement('link');
			dynScriptTag.setAttribute("type", "text/css");
			dynScriptTag.setAttribute("rel", "stylesheet");
			dynScriptTag.id = 'lipikaarCSS';
			dynScriptTag.href = "http://www.lipikaar.com/webmodule/css/lipikaarMainStyle.css";
			headTag.appendChild(dynScriptTag);


			//create help element
			contextHelp = window.document.createElement("span");
			contextHelp.id="lipikaarToolTip";
			window.document.body.appendChild(contextHelp);

		}
		catch(e)
		{
			//fail 
		}
	}, 
	changeLang:function(language,accessCode)
	{
		this.objOpHandler.changeLang(language,accessCode);
	}
	
}

/**
 * class responsible for Lipikaar authentication
 **/
function Authenticate()
{
	return true;
}

Authenticate.prototype = {

 	authenticate : function(accessCode) {
		
		//authenticate..
		return true;
	},

	getConfig :function(accessCode)
	{
		//create a configuration object with server parameters
		return new Config(null,null,'ALL',null);
	}

}

/**
 * class holding Lipikaar configuration
 **/
function Config(language,theme,privilege,ids)
{
	this.language = language||new Array("hindi","devanagari");
	
	if(!theme)
	{
		this.theme=new Array();
		this.theme['bgcolor'] = "#FFCCFF";
		this.theme['fontcolor'] = "#000000";
		this.theme['fontsize'] = "8pt";
	}
	else
	{
		this.theme=theme;
	}
	this.privilege =privilege||"ALL";
	this.ids= ids||new Array();

}

Config.prototype = {

	//set the value of language property
	setLanguage : function(value) {
		this.language=value;
		return true;
	},
	//get the value of language property
	getLanguage : function() {
		return this.language;
	},
	
	//set the value of theme property
	setTheme : function(value) {
		this.theme=value;
		return true;
	},
	//get the value of theme property
	getTheme : function() {
		return this.theme;
	},

	//set the value of language property
	setPrivilege : function(value) {
		this.privilege=value;
		return true;
	},
	//get the value of language property
	getPrivilege : function() {
		return this.privilege;
	},
	//set the value of ids(HTML input elements) property
	setIds : function(value) {
		this.ids=value;
		return true;
	},
	//get the value of ids(HTML input elements) property
	getIds : function() {
		return this.ids;
	}
 
}

function OpHandler(objLipikaarConfig)
{
	this.ipElements = new Array()
	try
	{
		this.languageObj =  new LanguageHandler();	
		
	}
	catch (e)
	{
		alert(e);
	}
	
	//identify ,seperate & store the targeted input elements
	var elems = this.getIpElements(objLipikaarConfig);
	//create the output manager with current configuration
	var objTextHandler = new textHandler(this.languageObj);
	objTextHandler.attachHandlers(elems['TEXTAREA']);
	objTextHandler.attachHandlers(elems['INPUT']);
	

}
OpHandler.prototype = {

	getIpElements:function(objLipikaarConfig)
	{
		//read config 
		if(objLipikaarConfig.privilege=="ALL")
		{	

			 this.ipElements['TEXTAREA'] =   document.getElementsByTagName('TEXTAREA');
			 this.ipElements['INPUT'] =		 document.getElementsByTagName('INPUT');
			 this.ipElements['IFRAME'] =	 document.getElementsByTagName('IFRAME');
		}
		else
		{
			
			arrTextTemp = new Array();
			arrInputTemp = new Array();
			for (key in objLipikaarConfig.ids )
			{	
				tempEl = oLU.$(objLipikaarConfig.ids[key]);	
				if(typeof(tempEl)!='undefined')
				{
					if(tempEl.nodeName=="TEXTAREA")
					{
						arrTextTemp[arrTextTemp.length] = tempEl;
					}
					if(tempEl.nodeName=="INPUT")
					{
						arrInputTemp[arrInputTemp.length] = tempEl;
					}
				
				}
			}	
			this.ipElements['TEXTAREA'] =arrTextTemp;
			this.ipElements['INPUT'] = arrInputTemp;
		}	
		return this.ipElements;
	},
	changeLang:function(language,accessCode)
	{

		this.languageObj.initMapping(language,accessCode);
				 
	}


}

/**
 * Responsible to the language related processing.
 */
function LanguageHandler()
{
	this.keyStack = new Array();
	this.targetDOMElement = {};
	this.mapping = {};
	this.languages = [];
	languageKey = oLU.$('lipikaarCurrentLanguage').value;
	this.initMapping(languageKey,lipikaarHandler.accessCode);
	// make the common utilities avalible 
	//this.oLU = oLU;
}
LanguageHandler.prototype = {

	//class methods
	initMapping : function(languageKey,accessCode) {

	 
		if(languageKey=='english')
		{
				return true;
		}
		try
		{
			this.currentLanguage = languageKey;
			this.getMapping(languageKey,accessCode);
			this.clearStack(); // Always clear keyStack when changing language maps
			
		}
		catch (e)
		{
			alert(e);
		}
	},

	getMapping : function(script,accessCode)
	{
		if (this.languages[script]==undefined)
		{
		  try
		  {
			var url =objLipikaarConfig.baseURL + "get_language";
			 
			oLU.simpleRC(url,'getConfig',{'access':accessCode,'ring':encodeURIComponent(window.location.href),'language':script} ,this.setJSMapping,this);
		  }
		  catch(e)
		  {
			alert(e);
		  }
			
		}
		else
		{
			this.mapping = this.languages[script];
		}
		
	},
	setJSMapping: function()
	{
		
		selectedLanguage =this.currentLanguage;
		try
		{	

			if(typeof objLipikaarGlbLanguage[selectedLanguage] != 'undefined')
			{
				
				this.languages[this.currentLanguage]= objLipikaarGlbLanguage[selectedLanguage];
				this.mapping = this.languages[selectedLanguage];
				var headTag = document.getElementsByTagName("head")[0];
			}
			else 
			{
				oLU.$("lipikaarHelpIcon0").src = "http://www.lipikaar.com/sites/www.lipikaar.com/files/webmodule/img/langicons/devanagari.gif";
				objLipikaarConfig.enabled=false;
				oLU.$("lipikaarHelpIcon1").src = "http://www.lipikaar.com/webmodule/img/english-on.gif";
				oLU.$("lipikaarHelpIcon1").title = "Switch to " + oLU.uCFirst(oLU.$('lipikaarCurrentLanguageName').value);
				oLU.$('lipikaarCurrentLanguageName').value='english'
				alert("Problem in loading language.");

			}
			
					
	   }
		catch (e)
		{
			
			 //alert("setMapping Error : " + e)	;
		}


	},
	addToStack : function(value) {
		this.keyStack[this.keyStack.length] = value;
	},

	clearStack : function() {
		this.keyStack = new Array();
	},

	processKeyEvent : function(lipiCode) {
	 
 		if (this.keyStack.length == 1) { // New element added
			this.insertChar(this.mappingOf(String.fromCharCode(lipiCode)));
		} else { // element added again

			// First test if the string is mapped
			if (this.mappingOf(this.readKeyStackAsString())) {
				this.removeChar();
				this.insertChar(this.mappingOf(this.readKeyStackAsString()));
			} else { // Second, since the string is not mapped, just map the
				// single keypress and insert.
				this.clearStack();
				this.insertChar(this.mappingOf(String.fromCharCode(lipiCode)));
				this.addToStack(lipiCode);
			}
		}
	},
   isEventToBeIgnored : function(ev) {
		var lipiCode = ev.charCode ? ev.charCode : ev.keyCode;
		
		if (ev.altKey || ev.ctrlKey || lipiCode == 13 || lipiCode == 32) {
			return true;
		}

		if (!document.selection) { // handle the special keys in FF
			if (ev.charCode == 0) {
				return true;
			}
		}
		return false;
	},

	readKeyStackAsString : function(length) {
		var retStr = "";
		var limit = length || this.keyStack.length;
		for (var i = 0;i < limit; i++) {
			retStr += String.fromCharCode(this.keyStack[i]);
		}
		return retStr;
	},

	getPossibleSequences : function(character) {
		var retArr = Array();
		var i = 0;
		var str = character || "";
		while (this.mappingOf(str)) {
			retArr[i] = this.mappingOf(str);
			i++;
			str += character;
		}
		return retArr;
	},

	mappingOf : function(strToMap) {
		return this.mapping[strToMap] || false;
	},
	insertChar : function(myValue) {
		var myField = this.targetDOMElement;

		if (document.selection) {// IE support
			myField.focus();
			sel = document.selection.createRange();
			sel.text = myValue;
			sel.moveStart('character', myValue.length);
		} else { // MOZILLA/NETSCAPE support
			if (myField.selectionStart || myField.selectionStart == '0') {
				var startPos = myField.selectionStart;
				var endPos = myField.selectionEnd;
				myField.value = myField.value.substring(0, startPos) + myValue
						+ myField.value.substring(endPos, myField.value.length);
				myField.selectionStart = startPos + myValue.length;
				myField.selectionEnd = myField.selectionStart;
			}
		}
	},

	removeChar : function() {
		myValue = this.mappingOf(this.readKeyStackAsString(this
				.readKeyStackAsString().length
				- 1));
		myField = this.targetDOMElement;

		if (document.selection) {// IE support
			myField.focus();
			sel = document.selection.createRange();
			if (sel.text.length > 0) {
				sel.text = '';
			} else {
				sel.moveStart('character', -myValue.length);
				sel.text = '';
			}
			sel.select();
		} else if (myField.selectionStart || myField.selectionStart == '0') {// MOZILLA/NETSCAPE
			// support
			var startPos = myField.selectionStart;
			var endPos = myField.selectionEnd;
			myField.value = myField.value.substring(0, startPos
					- myValue.length)
					+ myField.value.substring(endPos, myField.value.length);

			myField.selectionStart = startPos - myValue.length;
			myField.selectionEnd = startPos - myValue.length;
		}
	},

	getSpecialKeys : function() {
		return {
			keys : [18, 8, 20, 17, 46, 40, 35, 13, 27, 36, 37, 224, 144, 34,
					33, 19, 44, 39, 145, 16, 32, 9, 38]
		};
	},

	ignoreIeSpecialEvent : function(type, args, me) {
		this.clearStack();
		return true; // These do not interest us.
	},
	/**
	 * Function returns the curently mapped character
	 */
	getCurrMappedCharacter : function() {
		var curStr = this.readKeyStackAsString();
		return this.mappingOf(curStr);
	}

}
//text input handler
function textHandler(languageObj)
{
	this.languageObj =  languageObj;
	try
	{
		this.dialog = this.createDialouge();	
	}
	catch (errr)
	{
		alert(errr);
	}
	this.setDialogPosIner();
	
}	
textHandler.prototype ={

	//attach event handler
	attachHandlers:function(eleArray){
	
	 	for(key in eleArray)
		{
			 
		 
			if(typeof(eleArray[key])=='object')
			{
				this.setEventHandler(eleArray[key], 'keypress',this.handleTextInput,this.languageObj);
				this.setEventHandler(eleArray[key], 'focus',this.setDialogPos,this.languageObj);
				this.setEventHandler(eleArray[key], 'blur',this.hideContextHelp,this.languageObj);
				this.setEventHandler(eleArray[key], 'keydown',this.fixBackspace,this.languageObj);
			}
		}
	},
	toggleToolbarPanel:function()
	{
		if(oLU.$('LipikaartoolbarTable').style.display =='none')
		{
			oLU.$('lipikaarHelpIcon6').style.display='none';
			oLU.$('lipi-DialogContentId').style.width= '';
			oLU.$('LipikaartoolbarTable').style.display =''
		}
		else
		{
			oLU.$('LipikaartoolbarTable').style.display ='none'
			oLU.$('lipi-DialogContentId').style.width= "40px";
			oLU.$('lipikaarHelpIcon6').style.display='';
			oLU.$('lipikaarHelpIcon6').style.width='26px';
			oLU.$("lipi-DialogContentId").style.left =((screen.availWidth - 68 ) +offSetWidth)+ "px" ;
			return;
			

		}
	},
	createDialouge:function()
	{
		arrToolBarIcons = Array('http://www.lipikaar.com/webmodule/img/langicons/devanagari.gif',
								'http://www.lipikaar.com/webmodule/img/english-off.gif',
								'http://www.lipikaar.com/webmodule/img/toolbar-tooltip.gif',
								'http://www.lipikaar.com/webmodule/img/help.gif',
								'http://www.lipikaar.com/webmodule/img/toolbar-badge.gif',
								'http://www.lipikaar.com/webmodule/img/toolbar-right-arrow.gif'
								);
		var tempImg = Array();
		
		for(var x=0;x<arrToolBarIcons.length;x++) {
			tempImg[x] = new Image(200,200)
			tempImg[x].src = arrToolBarIcons[x]
		}

			
		arrToolBarHandler = Array(this.toggleLanguageDropdown,
								this.toggleLipikaar,
								this.toggleContextHelp,
								this.showHelpPanel,
								this.goBadge,
								this.toggleToolbarPanel
								);
		arrToolBarTip = Array("Select Language",
								"Switch to English",
								"Disable Help Popup",
								"Show Typing Help",
								"Get this Widget",
								"Minimize this Toolbar"
								);
		
		lipiDialogContentDiv = oLU.createElem("div",window.document.body,{'id':'lipi-DialogContentId'},{'className':'lipikaarBlur lipikaarFloat lipikaarToolBox'},{'display':'none'});
	 	lipiDialogShadowDiv = oLU.createElem("div",lipiDialogContentDiv,{},{'className':'lipikaarShadow'},{});
		lipiDialogInnerContentDiv = oLU.createElem("div",lipiDialogShadowDiv,{'id':'lipikaarContent'},{'className':'lipikaarContent'},{});
		lipiDialogInnerContentOpenIcon = oLU.createElem("img",lipiDialogInnerContentDiv,{'id':'lipikaarHelpIcon6','src':'http://www.lipikaar.com/webmodule/img/toolbar-left-arrow.gif','title':'Maximize this toolbar'},{},{'display':'none'});
		lipiDialogInnerContentOpenIcon.onclick = this.toggleToolbarPanel;
		lipiDialogInnerContentOpenIcon.onmouseup =this.hideHelpPanel;
		
		
		lipiDialogInnerContentTable = oLU.createElem("table",lipiDialogInnerContentDiv,{'id':'LipikaartoolbarTable'},{},{});
		lipiDialogInnerContentTbody = oLU.createElem("tbody",lipiDialogInnerContentTable,{},{},{});
		lipiDialogInnerContentTr = oLU.createElem("tr",lipiDialogInnerContentTbody,{},{},{});
		
		for(i=0;i<6;i++)
		{
			lipiDialogInnerContentTd = oLU.createElem("td",lipiDialogInnerContentTr,{},{},{});
			lipiDialogInnerContentIcon = oLU.createElem("img",lipiDialogInnerContentTd,{'src':arrToolBarIcons[i],'title':arrToolBarTip[i],'id':'lipikaarHelpIcon'+i},{},{'cursor':'pointer','width':'26px'});
			lipiDialogInnerContentIcon.onclick = arrToolBarHandler[i];
		}
		//for the last image - hide help enabled
		lipiDialogInnerContentIcon.onmouseup =this.hideHelpPanel;

		//no tooltip for english
		if(oLU.$('lipikaarCurrentLanguage').value=='english')
		{
			oLU.$("lipikaarHelpIcon2").title = "Help Popup not available for English";
		}

		oLU.$('lipikaarHelpIcon0').style.width='52px';

		lipiDialogInnerContentTr = oLU.createElem("tr",lipiDialogInnerContentTbody,{},{},{});	
		lipiDialogInnerContentTd = oLU.createElem("td",lipiDialogInnerContentTr,{'colspan':'6'},{'innerHTML':'<span class="powBy">Powered By </span><img src="http://www.lipikaar.com/webmodule/img/lipikaar-signature.gif" align="absmiddle">','align':'right'},{'fontSize':"8pt"});	
		lipiDialogInnerContentTd.colSpan ="6";
		this.drawLanguageDropDown(this);
		this.drawHelpPanel(this)
		if(typeof(defaultLanguage)=="undefined" || (defaultLanguage== "english"))
		{
				oLU.$("lipikaarHelpIcon1").src = "http://www.lipikaar.com/webmodule/img/english-on.gif";
				oLU.$("lipikaarHelpIcon1").title = "English is On";
		}
		else
		{
				oLU.$("lipikaarHelpIcon1").src = "http://www.lipikaar.com/webmodule/img/english-off.gif";
				oLU.$("lipikaarHelpIcon1").title = "Switch to English";
		}
		return lipiDialogContentDiv;

	},
	goBadge:function()
	{
		window.open('http://www.lipikaar.com/get-lipikaar-for-your-website');
	},
	drawHelpPanel:function(parentObj)
	{
			currentLanguage = 'bengali';

			lipiDialogContentDiv = oLU.createElem("div",oLU.$('lipikaarContent'),{'id':'lipi-HelpContentId'},{'className':'lipikaarBlur lipikaarFloat lipikaarToolBox'},{'top':'75px','left':'-97px','width':'320px','display':'none'});
	 		lipiDialogShadowDiv = oLU.createElem("div",lipiDialogContentDiv,{},{'className':'lipikaarHelpShadow'},{});
			lipiDialogInnerContentDiv = oLU.createElem("div",lipiDialogShadowDiv,{'id':'lipikaarContent'},{'className':'lipikaarHelpContent'},{});

			lipiDialogInnerContentTable = oLU.createElem("table",lipiDialogInnerContentDiv,{'id':'LipikaarHelpTable'},{},{});
			lipiDialogInnerContentTbody = oLU.createElem("tbody",lipiDialogInnerContentTable,{},{},{});
			lipiDialogInnerContentTr = oLU.createElem("tr",lipiDialogInnerContentTbody,{},{},{});
			lipiDialogInnerContentTd = oLU.createElem("td",lipiDialogInnerContentTr,{},{'className':'lipikaarHelpTitle lipikaarOrangeText'},{});
			HelpTitle = document.createTextNode(' How to Type ');
			lipiDialogInnerContentTd.appendChild(HelpTitle);

			lipiDialogInnerContentTd = oLU.createElem("td",lipiDialogInnerContentTr,{},{'width':"5%",'align':'right'},{});
			lipiDialogInnerContentIcon = oLU.createElem("img",lipiDialogInnerContentTd,{'src':'http://www.lipikaar.com/sites/www.lipikaar.com/files/webmodule/img/close-window.png','id':'lipikaarCloseIcon'},{},{});
			lipiDialogInnerContentIcon.onclick = parentObj.showHelpPanel;
			lipiDialogTitleCenterCont = oLU.createElem("div",lipiDialogInnerContentDiv,{},{'innerHTML':"Lipikaar is based on intutive SMS-like typing."},{'textAlign':'center'});
			 
			helpTextSpan = oLU.createElem("span",lipiDialogInnerContentDiv,{},{'className':'lipikaarOrangeText'},{});
			
			helpText1 = document.createTextNode("1. Repeatedly type the closest sounding key till you see the correct script character.");
			helpTextSpan.appendChild(helpText1); 
			centeredTextExample = oLU.createElem("center",lipiDialogInnerContentDiv,{'id':'LipikaarRule1'},{},{});
			

			helpTextSpan = oLU.createElem("span",lipiDialogInnerContentDiv,{},{'className':'lipikaarOrangeText'},{});
			helpText2 = document.createTextNode("2. Type x after the character to get its half-character.");
			helpTextSpan.appendChild(helpText2); 
			centeredTextExample = oLU.createElem("center",lipiDialogInnerContentDiv,{'id':'LipikaarRule2'},{},{});
			 

			helpTextSpan = oLU.createElem("span",lipiDialogInnerContentDiv,{'id':'lipikaarRuleTitle3'},{'className':'lipikaarOrangeText'},{});
			helpText3 = document.createTextNode("3. Type z after the character to add a special \n symbol of the script.");
			helpTextSpan.appendChild(helpText3); 
			centeredTextExample = oLU.createElem("div",lipiDialogInnerContentDiv,{'id':'LipikaarRule3'},{},{'textAlign':'center','lineHeight':'17px'});
			//centeredTextExample.innerHTML = "hz = ह &nbsp;&nbsp;&nbsp; jzzz = जँ"; //dynamic content

			centeredTextExample = oLU.createElem("div",lipiDialogInnerContentDiv,{'id':'LipikarHelpPageLinkContaner'},{},{'textAlign':'center'});
			helpHref1 = oLU.createElem("a",centeredTextExample,{'href':'','id':'LipikaarHelpPageLink'},{},{});
			helpHref1Span = oLU.createElem("div",helpHref1,{'id':'LipikaarHelpLinkText'},{'innerHTML':""},{});
			helpHref1.appendChild(helpHref1Span) ;

			lipiDialogHelpImageTable = oLU.createElem("table",lipiDialogInnerContentDiv,{'id':'LipikaarHelpImageTable','align':'center'},{},{});
			lipiDialogHelpImageTableTbody = oLU.createElem("tbody",lipiDialogHelpImageTable,{},{},{});
			lipiDialogHelpImageTr = oLU.createElem("tr",lipiDialogHelpImageTableTbody,{},{},{});
			lipiDialogHelpImageTd = oLU.createElem("td",lipiDialogHelpImageTr,{},{},{});


			centeredImageHelp = oLU.createElem("div",lipiDialogHelpImageTd,{},{},{'textAlign':'center'});
			imgPath = "http://www.lipikaar.com/sites/www.lipikaar.com/files/webmodule/img/helpicons/"+currentLanguage+"-letter.png"
			helpImage = oLU.createElem("img",centeredImageHelp,{'src':imgPath,'align':'top','id':'lipikaarImgHelpSrc'},{},{});
			lipiDialogHelpImageTd = oLU.createElem("td",lipiDialogHelpImageTr,{},{},{});
			centeredTextExample = oLU.createElem("span",lipiDialogHelpImageTd,{'id':'lipikaarImgHelp'},{},{'fontSize':'13pt','fontWeight':'bold'});
			 
			
			centeredTextExample = oLU.createElem("center",lipiDialogInnerContentDiv,{'id':'lipikaarFixScriptText'},{},{});
			centeredTextExample.appendChild(document.createTextNode('Can\'t see script correctly ? '));
			helpHref1 = oLU.createElem("a",centeredTextExample,{'href':'http://www.lipikaar.com/help/indic-support-and-browser-help','target':'_blank'},{},{});
			helpHref1.appendChild(document.createTextNode('Click here to fix this'));
	},
	showHelpPanel:function()
	{
		 
		currentLanguage = oLU.$("lipikaarCurrentLanguageName").value; 
		if(oLU.$("lipi-HelpContentId").style.display=="block")
		{
			oLU.$("lipi-HelpContentId").style.display="none";
		}
		else if(currentLanguage!="english")
		{
			
			oLU.$("LipikaarRule1").style.display ='block';
			oLU.$("LipikaarRule2").style.display ='block';
			oLU.$("LipikarHelpPageLinkContaner").style.display ='block';
			oLU.$("lipikaarFixScriptText").style.display='block';
			k = charMap= eval("oLU.arrMappingHelp."+currentLanguage+".k");
			kk = charMap= eval("oLU.arrMappingHelp."+currentLanguage+".kk");
			kxya = charMap= eval("oLU.arrMappingHelp."+currentLanguage+".kxya");
			kxrm = charMap= eval("oLU.arrMappingHelp."+currentLanguage+".kxrm");
			hz = charMap= eval("oLU.arrMappingHelp."+currentLanguage+".hz");
			jzzz = charMap= eval("oLU.arrMappingHelp."+currentLanguage+".jzzz");
			
			oLU.$("lipi-HelpContentId").style.display="block";
			oLU.$("LipikaarRule1").innerHTML = "k = "+k+" &nbsp;,&nbsp;  kk = "+kk; //dynamic content 
			oLU.$("LipikaarRule2").innerHTML = "kxya = "+kxya+" &nbsp;,&nbsp; kxrm = "+kxrm; //dynamic content
			currentLanguageCP = oLU.uCFirst(currentLanguage);
			oLU.$("LipikaarHelpLinkText").innerHTML = 'View Help Page for '+currentLanguageCP
			oLU.$("LipikaarHelpPageLink").href = "http://www.lipikaar.com/help/"+currentLanguageCP+"/lipikaar-"+currentLanguageCP+"-typing-software-faq"
			oLU.$("LipikaarHelpPageLink").target = "_blank";

			oLU.$("lipikaarImgHelpSrc").style.display ="none";
			oLU.$("lipikaarImgHelp").innerHTML = "" ;	
			
		}
		else
		{
			oLU.$("LipikaarRule1").innerHTML='';
			oLU.$("LipikaarRule2").innerHTML ='';
			oLU.$("LipikarHelpPageLinkContaner").style.display ='none';
			oLU.$("lipikaarFixScriptText").style.display='none';
			oLU.$("lipi-HelpContentId").style.display="block";
			oLU.$("lipikaarImgHelpSrc").style.display ="none";
			oLU.$("LipikaarRule3").innerHTML = '<br><a href="http://www.lipikaar.com/download/desktop" target="_blank">Get Lipikaar for your Desktop</a> - Create Word documents, Presentations, Excel Sheets, Memos, write e-mails, or simply chat in your language.'
			oLU.$("lipikaarImgHelp").innerHTML = "" ;	
			return false;
		}
		 
		if(currentLanguage=='urdu'||currentLanguage=="arabic"||currentLanguage=="kashmiri")
		{
			oLU.$("lipikaarRuleTitle3").style.display='none';
			oLU.$("LipikaarRule3").innerHTML ="";
			oLU.$("lipikaarImgHelpSrc").style.display='none';
			oLU.$("lipikaarFixScriptText").style.display='none';
		}
		else if(currentLanguage!='english' )
		{	
			imgPath= eval("oLU.arrMappingHelp."+currentLanguage+".url");
			charMap= eval("oLU.arrMappingHelp."+currentLanguage+".charMap");
			oLU.$("lipikaarRuleTitle3").style.display=''
			oLU.$("lipikaarImgHelpSrc").src =imgPath;
			oLU.$("lipikaarImgHelp").innerHTML = "&nbsp; = &nbsp;" +charMap;	
			oLU.$("lipikaarImgHelpSrc").style.display='block'
			oLU.$("LipikaarRule3").innerHTML = "hz = "+hz+"&nbsp;,&nbsp; jzzz = "+jzzz; //dynamic content
	
		}
	
	},
	hideHelpPanel:function()
	{
		oLU.$("lipi-HelpContentId").style.display="none";
	},

		
	drawLanguageDropDown:function(parentObj)
	{	

		arrMappingPair = oLU.arrMappingPair;
		leftDrop = oLU.getX(oLU.$('lipikaarHelpIcon0')) +'px';
		topDrop =  oLU.getY(oLU.$('lipikaarHelpIcon0')) +'px';
		
		leftDrop = 10 +'px';
		topDrop =  40 +'px';

		lipiLanguageDropDownDiv = oLU.createElem("div",oLU.$('lipikaarHelpIcon0').parentNode,{'id':'LipikaarLangContainer'},{},{'position':'absolute','top':topDrop,'left':leftDrop,'display':'none','zIndex':'2000'});
	 	lipiLanguageDropDownDiv.onblur =parentObj.toggleLanguageDropdown;
		window.document.body.onmouseup = function(){if(oLU.$('LipikaarLangContainer').style.display==''){parentObj.toggleLanguageDropdown();}  }
	 	lipiLipiLanguageDropDownUL = oLU.createElem("ul",lipiLanguageDropDownDiv,{'id':'LipikaarLangUL'},{},{});
		var arrLanguages = objLipikaarConfig.language;
		 
		lipiLipiLanguageOptionHref = Array();
	 
		for(LanguageNum=0;LanguageNum<arrLanguages.length;LanguageNum++)
		{

			if(arrLanguages[LanguageNum])
			{
				lipiLipiLanguageDropDownLi = oLU.createElem("li",lipiLipiLanguageDropDownUL,{'id':arrLanguages[LanguageNum]},{},{});
				lipiLipiLanguageOptionHref[LanguageNum] = oLU.createElem("a",lipiLipiLanguageDropDownLi,{'href':'javascript:void(0)','id':arrLanguages[LanguageNum]},{},{});
				optionLable = document.createTextNode(oLU.uCFirst(arrLanguages[LanguageNum]));
				lipiLipiLanguageOptionHref[LanguageNum].appendChild(optionLable);
				lipiLipiLanguageOptionHref[LanguageNum].languageObj =this.languageObj;
				 
				lipiLipiLanguageOptionHref[LanguageNum].language =arrMappingPair[arrLanguages[LanguageNum].toLowerCase()];
				
				lipiLipiLanguageOptionHref[LanguageNum].languageName = arrLanguages[LanguageNum].toLowerCase();
				lipiLipiLanguageOptionHref[LanguageNum].onclick =parentObj.switchLanguage;
				lipiLipiLanguageOptionHref[LanguageNum].onmouseup =parentObj.toggleLanguageDropdown;
			}
		}

		//showLanguageDropDown
	},
	toggleLanguageDropdown:function()
	{
 
		if(oLU.$('LipikaarLangContainer').style.display=='none')
		{
			oLU.$('LipikaarLangContainer').style.display='';
		}
		else
		{
			oLU.$('LipikaarLangContainer').style.display='none';
		}
		oLU.$("lipi-HelpContentId").style.display="none";
	},
	switchLanguage:function()
	{
		oLU.$('lipikaarCurrentLanguage').value = this.language;
		oLU.$('lipikaarCurrentLanguageName').value = this.languageName;
		language  = this.language ;
		 
		try
		{
			 
			
			if(language !="english")
			{	
				objLipikaarConfig.enabled = true;
				oLU.$("lipikaarHelpIcon1").src = "http://www.lipikaar.com/webmodule/img/english-off.gif";
				oLU.$("lipikaarHelpIcon1").title = "Switch to English";
				
				if(typeof language !='undefined')
				{
					oLU.$("lipikaarHelpIcon0").src = "http://www.lipikaar.com/sites/www.lipikaar.com/files/webmodule/img/langicons/"+language+".gif";
					objLipikaarConfig.currentLanguage = language;
					objLipikaarConfig.currentLanguageName = this.languageName;
				}
				else
				{
					oLU.$("lipikaarHelpIcon0").src = "http://www.lipikaar.com/sites/www.lipikaar.com/files/webmodule/img/langicons/devanagari.gif";
					objLipikaarConfig.currentLanguage = 'devanagari';
				}

				if(objLipikaarConfig.helpEnabled)
				{
					oLU.$("lipikaarHelpIcon2").title = "Disable Help Popup"; 
				}
				else
				{
					oLU.$("lipikaarHelpIcon2").title = "Enable Help Popup";
				}

			}
			else
			{
				oLU.$("lipikaarHelpIcon1").title = "Switch to " + oLU.uCFirst(oLU.$('lipikaarCurrentLanguageName').value);
				objLipikaarConfig.enabled = false;
			}
			this.languageObj.initMapping(language,lipikaarHandler.accessCode)
		 
			return false;
		}
		catch (e)
		{
			alert(e);
		}
		
		

	},
	toggleLipikaar:function()
	{
		if(oLU.$('lipikaarCurrentLanguage').value=='english')
		{
			return;
		}

		if(objLipikaarConfig.enabled ==true)
		{
			objLipikaarConfig.enabled = false;
			oLU.$("lipikaarHelpIcon1").src = "http://www.lipikaar.com/webmodule/img/english-on.gif";
			oLU.$("lipikaarHelpIcon1").title = "Switch to " + oLU.uCFirst(oLU.$('lipikaarCurrentLanguageName').value);
			oLU.$('lipikaarCurrentLanguageName').value='english'
			oLU.$("lipikaarHelpIcon2").title = "Help Popup not available for English";
		}
		else
		{
			objLipikaarConfig.enabled = true;
			oLU.$("lipikaarHelpIcon1").src = "http://www.lipikaar.com/webmodule/img/english-off.gif";
			oLU.$("lipikaarHelpIcon1").title = "Switch to English";
			oLU.$('lipikaarCurrentLanguageName').value = objLipikaarConfig.currentLanguageName;
			oLU.$('lipikaarCurrentLanguage').value = objLipikaarConfig.currentLanguage;
			if(objLipikaarConfig.helpEnabled)
			{
				oLU.$("lipikaarHelpIcon2").title = "Disable Help Popup"; 
			}
			else
			{
				oLU.$("lipikaarHelpIcon2").title = "Enable Help Popup";
			}

		}

	},
	toggleContextHelp:function()
	{
		 
		if(oLU.$('lipikaarCurrentLanguage').value=='english'||objLipikaarConfig.enabled==false)
		{
			return false;
		}
		if(objLipikaarConfig.helpEnabled ==true)
		{
			objLipikaarConfig.helpEnabled = false;
			 
			oLU.$("lipikaarHelpIcon2").title = "Enable Help Popup";
		}
		else
		{
			objLipikaarConfig.helpEnabled = true;
			oLU.$("lipikaarHelpIcon2").title = "Disable Help Popup";
		}

	},
	setDialogPos : function(e)
	{
		var e = e || window.event;
		var tgt = e.target || e.srcElement;

		if(tgt.type=="text"||tgt.type=="textarea")
		{
			tgt.ownerObj.languageObj.clearStack();
			oLU.$("lipi-DialogContentId").style.display='block';
			offSetHeight =document.documentElement.scrollTop|| document.body.scrollTop;
			oLU.$("lipi-DialogContentId").style.top =offSetHeight+ "px" ;
		}

	},
	setDialogPosIner : function(e)
	{
			setFunction = function(){
 				offSetHeight =document.documentElement.scrollTop|| document.body.scrollTop;
				offSetWidth = document.documentElement.scrollLeft|| document.body.scrollLeft;
				oLU.$("lipi-DialogContentId").style.top =offSetHeight+ "px" ;
				if(oLU.$('lipi-DialogContentId').style.width.length)
				{
					oLU.$("lipi-DialogContentId").style.left =((screen.availWidth - 68 ) +offSetWidth)+ "px" ;
				}
				else
				{
					oLU.$("lipi-DialogContentId").style.left =((screen.availWidth - 250 ) +offSetWidth)+ "px" ;
				}

			}

			self.setInterval(setFunction,500);
	},
	setEventHandler : function setEventHandler (target, eventType,handler,ownerObj ) {
	  if (target) {
		//attach event for firefox
		if (target.addEventListener) {
		  target.addEventListener(
			eventType,
			handler,
			false
		  );
		 
		}
		//attach evenet for IE
		else if (target.attachEvent) {
		  target.attachEvent ('on'+eventType, handler);
		}
		else {
		  target.onkeypress = handler;
		}
		 target.ownerObj = this;
	  }
	},
	handleTextInput:function(e)
	{
		
		if(!objLipikaarConfig.enabled)
		{
			return true;
		}
		 
		var e = e || window.event;
		var tgt = e.target || e.srcElement;

		tgt.ownerObj.languageObj.targetDOMElement = tgt;
		 
		var lipiCode = e.charCode || e.keyCode;
		// standard ascii value across browsers
		 

		if (tgt.ownerObj.languageObj.isEventToBeIgnored(e)) {
			tgt.ownerObj.languageObj.clearStack();
			return true; // These do not interest us.
		}
		
		tgt.ownerObj.languageObj.addToStack(lipiCode);
		 
		// First check if a mapping exists.
		if (!tgt.ownerObj.languageObj.mappingOf(String.fromCharCode(lipiCode))) {

			tgt.ownerObj.languageObj.clearStack();

			// Prevent Default Action.
			if (!document.selection) { // IE workaround
				e.preventDefault();
			}
			return false;
		}
		 
		var scrollTop = tgt.ownerObj.languageObj.targetDOMElement.scrollTop; // FF AutoScrolling Fix
		
		tgt.ownerObj.languageObj.processKeyEvent(lipiCode);

		tgt.ownerObj.languageObj.targetDOMElement.scrollTop = scrollTop;
		// Prevent Default Action.
		if (!document.selection) { // IE workaround
			e.preventDefault();
		}

		if(objLipikaarConfig.helpEnabled)
		{
			tgt.ownerObj.updateContextHelp(tgt);
		}
		return false;
	}
	,
	fixBackspace: function()
	{	
 
		var e = e || window.event;
		var lipiCode = e.charCode || e.keyCode;
		
		if(lipiCode==8)
		{
				
				var tgt = e.target || e.srcElement;
				if(objLipikaarConfig.enabled)
				{
					try
					{
						tgt.ownerObj.languageObj.clearStack();
						oLU.$('lipikaarToolTip').style.display='none';
					}
					catch(e)
					{
						alert(e);
					}
					return true;
				}
		}
	}
	,
	showContextHelp: function (x, y) 
	{
		oLU.$('lipikaarToolTip').style.display='block';
		oLU.$('lipikaarToolTip').style.left =x + "px";
		oLU.$('lipikaarToolTip').style.top = y + "px";
		
    },
	hideContextHelp: function () 
	{
		if(oLU.$('lipikaarToolTip'))
		{
			oLU.$('lipikaarToolTip').style.display='none';
		}
		if(oLU.$("lipi-DialogContentId"))
		{
			//oLU.$("lipi-DialogContentId").style.display='none';
		}
		 
    },

    updateContextHelp: function(textEl) //@todo : put the hardcoded numbers in constants.
	{
		var oPositionLeft =  0;
		var oPositionTop =   0;
		
		var mappings = textEl.ownerObj.languageObj.getPossibleSequences(textEl.ownerObj.languageObj.readKeyStackAsString(1));
		contextHelpWin = oLU.$('lipikaarToolTip')
		if(!contextHelpWin)
		{
			return false;
		}

		contextHelpWin.innerHTML = "";
		
		for (var i = 0;i < mappings.length; i++) 
		{
 			contextHelpWin.style.border='1px solid black';
			contextHelpWin.style.fontSize = "18px";
			contextHelpWin.style.padding = "2px";
 
			contextHelpWin.style.position = "absolute";

			 
			contextHelpWin.style.textAlign = "left";
			contextHelpWin.style.backgroundColor = "#FFFFFF";
			contextHelpWin.style.color = "Black";
			fcolor ="Black"
			if (textEl.ownerObj.languageObj.getCurrMappedCharacter() == mappings[i]) 
			{
				fcolor = "#E86E01";
			}
		   
			contextHelpWin.innerHTML  = contextHelpWin.innerHTML + "<span style='color:"+fcolor+"' >"+mappings[i]+"&nbsp;</span>";
			
		}
		var tipText = "<table cellspacing='0' cellpadding='0' style='font-size:8pt;font-family:verdana;'><tr><td >Type <u><b>"+ textEl.ownerObj.languageObj.readKeyStackAsString(1)+ "</u></b> again for next character.</td><td rowspan='2'><img src= 'http://www.lipikaar.com/sites/www.lipikaar.com/files/webmodule/img/lipikaar-context-help-logo.png' border='0' valign='top' ></td></tr><tr><td><b><u>x</u></b> - half character <b><u>z</u></b> - special symbols</td></tr></table>";
		contextHelpWin.innerHTML += tipText;
		if(textEl.type=='textarea')
		{
			if(window.getSelection)
			{
				oLU.setCursorCoordinatesFf(textEl);
			}
			else
			{
				oPositionLeft =  oLU.getCursorCoordinates(this).x +2
				oPositionTop = 	 oLU.getCursorCoordinates(this).y ||(oLU.getY(textEl) + textEl.scrollHeight) +6 
				this.showContextHelp(oPositionLeft,oPositionTop);
			}
		}
		else
		{	 
			
			if(window.getSelection)
			{
				 
				oLU.setCursorCoordinatesFf(textEl);
			}
			else
			{ 
			  oPositionLeft =  oLU.getCursorCoordinates(this).x + 12 + oLU.getX(textEl);
			  if((textEl.offsetWidth + oLU.getX(textEl)) < oPositionLeft )
			  {
				oPositionLeft = (textEl.offsetWidth + oLU.getX(textEl)) ;
			  }
			  
			  oPositionTop =   oLU.getY(textEl) + 22;
			  this.showContextHelp(oPositionLeft,oPositionTop);	
			}
		}
     }
 }
try
{
	accessCode = oLU.getParam('accesscode');
	defaultLanguage = oLU.getParam('defaultlang');
	var lipikaarHandler = new Lipikaar(accessCode,defaultLanguage);
	//oLU.onDOMReady(function(){lipikaarHandler.enable();});
	//setTimeout(function(){lipikaarHandler.enable()},2000);
	//oLU.simpleAddEvent(window.document.body, "load", lipikaarHandler.enable());	
	
}
catch (e)
{
	alert(e);
} 

