/* Auto-suggest/auto-complete control
 *
 * original code:
 * (C) 2004-2005 zichun
 *
 * fixes and heavy modifications:
 * (C) 2007 Dmitriy Khudorozhkov (kh_dmitry2001@mail.ru) and contributors.
 *
 * This software is provided "as-is", without any express or implied warranty.
 * In no event will the author be held liable for any damages arising from the
 * use of this software.
 *
 * Permission is granted to anyone to use this software for any purpose,
 * including commercial applications, and to alter it and redistribute it
 * freely, subject to the following restrictions:
 *
 * 1. The origin of this software must not be misrepresented; you must not
 *    claim that you wrote the original software. If you use this software
 *    in a product, an acknowledgment in the product documentation would be
 *    appreciated but is not required.
 *
 * 2. Altered source versions must be plainly marked as such, and must not be
 *    misrepresented as being the original software.
 *
 * 3. This notice may not be removed or altered from any source distribution.
 */ 

var suggesturl = ""; // Global link to the server-side script, that gives you the suggestion list.
                     // Used for controls that do not define their own server script urls.
// pre-load images:
var image = new Array(4);
var activeSuggestions;
var timeoutID;

image[0] = new Image(), image[1] = new Image(),
image[2] = new Image(), image[3] = new Image();

//image[0].src = "Images/arrow-down-d.png", image[1].src = "Images/arrow-down.png";//#3846
image[0].src = "Images/arrow-down-d1.gif", image[1].src = "Images/arrow-down1.gif";
image[2].src = "Images/arrow-up-d.gif",   image[3].src = "Images/arrow-up.gif"; 

function actb(id, ca, url, genericurl, preloadurl, type, startcheck)
{
	// Public Variables:
	this.actb_suggesturl  = url || suggesturl;   // link to the server-side script, that gives you the suggestion list
	this.actb_genericsuggesturl = genericurl //link to server-side script that gives generic list ***Added to get generic list names***
	this.actb_preloadurl = preloadurl //link to server-side script that pre loads mp3 file for selected name ***Added to preload selected bmg name mp3 file***
	this.actb_timeOut     = -1;                  // autocomplete Timeout in ms (-1: autocomplete never time out)
	this.actb_lim         = 15;                   // number of elements autocomplete can show (-1: no limit)
	this.actb_firstText   = true;                // should the auto complete be limited to the beginning of keyword?
	this.actb_useIFrame   = true;               // should the control use an IFrame element to fix suggestion list positioning (MS IE only)?
	this.actb_useScroll   = false;                // should the control use a scroll bar (true) or a up/down buttons (false)?
	this.actb_mouse       = true;                // enable Mouse Support
	this.actb_noDefault   = true;                // should the control omit selecting the 1st item in a suggestion list?
	this.actb_delimiter   = new Array(); // delimiter for multiple autocomplete. Set it to empty array for single autocomplete
	this.actb_startcheck  = startcheck;                   // show widget only after this number of characters is typed in.
    this.actb_fullRefresh = true;// should the script re-send the AJAX request after each entered character?
	
	this.actb_SuggestionType = type;                   // Suggestion type  Names/MSISDN

	this.actb_selectedIndex = -1;                // index (zero-based) of the element last chosen

	// Styles:
	this.actb_arColor   = '#8B0A50';  // background color for the "arrows"
	this.actb_bgColor   = '#FFFFFF';
	this.actb_textColor = '#000000';
	this.actb_hColor    = '#FFBBFF';
	this.actb_fFamily   = 'calibri,arial,helvetica';
	this.actb_arrowSize = "7px";
	this.actb_fSize     = '11px';
	this.actb_hStyle    = 'font-family:calibri,arial,helvetica;';

	// "Private" Variables:
	this.actb_delimwords = [];
	this.actb_cdelimword = 0;
	this.actb_delimchar  = [];
	this.actb_display    = false;

	this.actb_pos    = 0;
	this.actb_total  = 0;
	this.actb_rangeu = 0;
	this.actb_ranged = 0;
	this.actb_bool   = [];
	this.actb_pre    = 0;
	this.actb_toid   = 0;
	this.actb_tomake = false;
	this.actb_Generic=false; // whethere a list is generic or non-generic

	this.cur_x = 0;
	this.cur_y = 0;
	this.cur_w = 0;
	this.cur_h = 0;

	this.actb_mouse_on_list = 1;
	this.actb_caretmove     = false;

	this.actb_base_id  = id;
	this.actb_curr     = document.getElementById(id);
	this.actb_keywords = [];
	
	ca = ca || [];
	for(var i = 0, cl = ca.length; i < cl; i++)
		this.actb_keywords[i] = ca[i];

	return this.construct();
};

actb.prototype = {

	callLater: function(func, obj)
	{ return function() { func.call(obj) }; },

	construct: function()
	{
	    if(this.actb_curr!=null)
		    this.actb_curr.actb = this;
		    
		// pre-create event functions
		this.funcClick = this.actb_mouseclick;
		this.funcCheck = this.actb_checkkey;

		this.funcHighlight = this.actb_table_highlight;
		
		this.funcClear = this.callLater(this.actb_clear,    this);
		this.funcPress = this.callLater(this.actb_keypress, this);

		this.funcUp   = this.callLater(this.actb_goup,   this);
		this.funcDown = this.callLater(this.actb_godown, this);

		this.funcFocus   = this.callLater(this.actb_table_focus,   this);
		this.funcUnfocus = this.callLater(this.actb_table_unfocus, this);
		
		//Ramana - Scroll Down Functionality
		this.funcLPanelMouseUp = this.actb_lpanel_mouseup;
		this.funcLPanelMouseDown   = this.callLater(this.actb_lpanel_mousedown,   this);
		
        //Ramana - Scroll Up Functionality
		this.funcUPanelMouseUp = this.actb_upanel_mouseup;
		this.funcUPanelMouseDown   = this.callLater(this.actb_upanel_mousedown,   this);
				
		addEvent(this.actb_curr, "focus", this.callLater(this.actb_setup, this));

		return this;
	},

	actb_setup: function()
	{
		addEvent(document,       "keydown",  this.funcCheck);
		addEvent(this.actb_curr, "blur",     this.funcClear);
		addEvent(document,       "keypress", this.funcPress);
		//addEvent(this.actb_curr,       "onmouseover", this.funcMouseOver); //veeru
		//addEvent(this.actb_curr,       "onmouseout", this.funcMouseOut); //veeru
	},

	actb_clear: function()
	{
		var msie  = (document.all && !window.opera) ? true : false;
		var event = window.event;

		var doblur = true;
		if(msie && event && this.cur_h)
		{
			var x = event.x, y = event.y;

			if(((x > this.cur_x) && (x < (this.cur_x + this.cur_w))) && ((y > this.cur_y) && (y < (this.cur_y + this.cur_h))))
			{
				this.actb_curr.focus();
				doblur = false;
			}
		}

		if(doblur)
		{
			removeEvent(document,       "keydown",  this.funcCheck);
			removeEvent(this.actb_curr, "blur",     this.funcClear);
			removeEvent(document,       "keypress", this.funcPress);

			this.actb_removedisp();
		}
	},

	actb_parse: function(n)
	{
	    var t, plen;
		if(this.actb_delimiter.length > 0)
		{
			   t = this.actb_delimwords[this.actb_cdelimword].trim().addslashes();
			   plen = this.actb_delimwords[this.actb_cdelimword].trim().length;
		}
		else
		{
			   t = this.actb_curr.value.addslashes();
			   plen = this.actb_curr.value.length;
		}

		var tobuild = '';

		var re = this.actb_firstText ? new RegExp("^" + t, "i") : new RegExp(t, "i");
		var p = n.search(re);

		tobuild = n.substr(0, p);

		tobuild += "<u><font style='" + (this.actb_hStyle) + "'>";

		tobuild += n.substring(p, plen + p);

		tobuild += "</font></u>";

		tobuild += n.substring(plen + p, n.length);

		return tobuild;
	},

	actb_generate: function()
	{
		if(document.getElementById('tat_table_' + this.actb_base_id))
		{
		  this.actb_display = false;
		  document.body.removeChild(document.getElementById('tat_table_' + this.actb_base_id));
		}

		if(this.actb_total == 0)
		{
			this.actb_display = false;
			return;
		}

		var msie = (document.all && !window.opera) ? true : false;

		var bb = document.createElement('div');
		bb.id  = 'tat_table_' + this.actb_base_id;
		bb.style.position = 'absolute';
		bb.style.border = '#000000 solid 1px';
		var pos = findPos(document.getElementById(this.actb_base_id));
		this.cur_y = bb.style.top = (pos[1] + this.actb_curr.offsetHeight) + "px";
		this.cur_x = bb.style.left = pos[0] + "px";
		 if(this.actb_SuggestionType == 'msisdn')
		    this.cur_w = bb.style.width = "200px"; //to match the width of down arrow image (with "More..." text)
		else 
            this.cur_w = bb.style.width = this.actb_curr.offsetWidth + "px";
		var cc = null;
		if(msie && this.actb_useIFrame)
		{
			var cc = document.createElement('iframe');

			cc.src = "";
			cc.scrolling = "no";
			cc.frameBorder = "0";

			cc.style.position = "absolute";

			cc.style.zIndex = -1;
			cc.style.filter = "progid:DXImageTransform.Microsoft.Alpha(opacity=0);";
		}

		var a = document.createElement('table');
		a.cellSpacing ='1px';
		a.cellPadding ='2px';
		a.style.width  = "100%";
		a.style.backgroundColor = this.actb_bgColor;
		a.id = 'tat_table2_' + this.actb_base_id;

		if(this.actb_useScroll && (this.actb_total > this.actb_lim))
		{
			this.cur_h = bb.style.height = (this.actb_lim * parseInt(this.actb_fSize) + 3) + 2 + "px";

			bb.style.overflow  = "auto";
			bb.style.overflowX = "hidden";
		}

		this.cur_y = parseInt(this.cur_y);
		this.cur_h = parseInt(this.cur_h);
		this.cur_x = parseInt(this.cur_x);
		this.cur_w = parseInt(this.cur_w);

		document.body.appendChild(bb);
		if(cc)
		{
			cc.style.top  = a.offsetTop;
			cc.style.left = a.offsetLeft -1;

			bb.appendChild(cc);
		}
		bb.appendChild(a);

		var first = true, j = 1;

		if(this.actb_mouse)
		{
			a.onmouseout = this.funcUnfocus;
			a.onmouseover = this.funcFocus;
		}

		var counter = 0;
		for(var i = 0; i < this.actb_keywords.length; i++)
		{
			if(!this.actb_useScroll && ((this.actb_keywords.length > this.actb_lim) && (this.actb_total > this.actb_lim) && !i))
			{
				var r = a.insertRow(-1);
				r.style.backgroundColor = this.actb_arColor;

				var c = r.insertCell(-1);
				c.style.color = this.actb_textColor;
				c.style.fontFamily = 'arial narrow';
				c.style.fontSize = this.actb_arrowSize;
				c.style.cursor = 'default';
				c.align = 'center';

				replaceHTML(c, image[3]);
	          	addEvent(c, "mousedown", this.funcUPanelMouseDown); //Ramana
              	addEvent(c, "mouseup", this.funcUPanelMouseUp); //Ramana
				//addEvent(c, "mouseover", this.funcUp);				
			}

			if(this.actb_bool[i] && (this.actb_useScroll || (counter < this.actb_lim)))
			{
				counter++;
				var r = a.insertRow(-1);
				if(first && !this.actb_noDefault && !this.actb_tomake)
				{
					r.style.backgroundColor = this.actb_hColor;
					first = false;
					this.actb_pos = counter;
				}
				else if(this.actb_pre == i)
				{
					r.style.backgroundColor = this.actb_hColor;
					first = false;
					this.actb_pos = counter;
				}
				else
				{
					r.style.backgroundColor = this.actb_bgColor;
				}

				r.id = 'tat_tr_' + this.actb_base_id + j;

				var c = r.insertCell(-1);
				c.style.color = this.actb_textColor;
				c.style.fontFamily = this.actb_fFamily;
				c.style.fontSize = this.actb_fSize;
				c.innerHTML = this.actb_keywords[i];//this.actb_parse(this.actb_keywords[i]);//*** Changed for not underlining typed word ***//
				c.id = 'tat_td_' + this.actb_base_id + j;
				c.actb = this; 
				c.setAttribute('pos', j);

				if(this.actb_mouse)
				{
					c.style.cursor = 'pointer';
					addEvent(c, "click", this.funcClick);
					c.onmouseover = this.funcHighlight;					
				}

				j++;
			}
		}

		if(!this.actb_useScroll && (this.actb_total > this.actb_lim))
		{
			var r = a.insertRow(-1);
			r.style.backgroundColor = this.actb_arColor;

			var c = r.insertCell(-1);
			c.style.color = this.actb_textColor;
			c.style.fontFamily = 'arial narrow';
			c.style.fontSize = this.actb_arrowSize;
			c.style.cursor = "pointer";
			c.align = 'left';
			replaceHTML(c, image[0]);
          	addEvent(c, "mousedown", this.funcLPanelMouseDown); //Ramana
          	addEvent(c, "mouseup", this.funcLPanelMouseUp); //Ramana
			//addEvent(c, "mouseover", this.funcDown);			
		}

		this.actb_rangeu = 1;
		this.actb_ranged = j - 1;
		this.actb_display = true;
		if(!this.actb_Generic)
		    hideAlternatetooltip();
	},
	
	actb_remake: function()
	{
		var a = document.getElementById('tat_table2_' + this.actb_base_id);

		if(this.actb_mouse)
		{
			a.onmouseout  = this.funcUnfocus;
			a.onmouseover = this.funcFocus;
		}

		var i, k = 0;
		var first = true;
		var j = 1;

		if(this.actb_total > this.actb_lim)
		{
		    var b = (this.actb_rangeu > 1);

			var r = a.rows[k++];
			r.style.backgroundColor = this.actb_arColor;

			var c = r.firstChild;
			c.style.color = this.actb_textColor;
			c.style.fontFamily = 'arial narrow';
			c.style.fontSize = this.actb_arrowSize;
			c.style.cursor = 'default';
			c.align = 'center';

			replaceHTML(c, b ? image[2] : image[3]);

			if(b)
			{
				//addEvent(c, "mouseover", this.funcUp);
				c.style.cursor = 'pointer';
			}
			else
			{
				c.style.cursor = 'default';
			}
		}

		for(var i = 0; i < this.actb_keywords.length; i++)
		{
			if(this.actb_bool[i])
			{
				if(j >= this.actb_rangeu && j <= this.actb_ranged)
				{
					var r = a.rows[k++];
					r.style.backgroundColor = this.actb_bgColor;
					r.id = 'tat_tr_' + this.actb_base_id + j;

					var c = r.firstChild;
					c.style.color = this.actb_textColor;
					c.style.fontFamily = this.actb_fFamily;
					c.style.fontSize = this.actb_fSize;
					c.innerHTML = this.actb_keywords[i];//this.actb_parse(this.actb_keywords[i]); //*** Changed for not underlining typed word ***//
					c.id = 'tat_td_' + this.actb_base_id + j;
					c.setAttribute('pos', j);
					j++;
				}
				else
				{
					j++;
				}
			}

			if(j > this.actb_ranged) break;
		}

		if(this.actb_keywords.length > this.actb_lim)
		{
			var b = ((j - 1) < this.actb_total);

			var r = a.rows[k];
			r.style.backgroundColor = this.actb_arColor;

			var c = r.firstChild;
			c.style.color = this.actb_textColor;
			c.style.fontFamily = 'arial narrow';
			c.style.fontSize = this.actb_arrowSize;
			c.style.cursor = 'default';
			c.align = 'left';

			replaceHTML(c, b ? image[0] : image[1]);

			if(b)
			{
				//addEvent(c, "mouseover", this.funcDown);
				c.style.cursor = 'pointer';
			}
			else
			{
				c.style.cursor = 'default';
			}
		}
	},
 
	actb_goup: function()
	{	
		this.actb_curr.focus(); 

		if(!this.actb_display) return;
		if(this.actb_pos <= 1) return;

		var t = document.getElementById('tat_tr_' + this.actb_base_id + this.actb_pos);
		if(t && t.style) t.style.backgroundColor = this.actb_bgColor;

		this.actb_pos--;
		t = document.getElementById('tat_tr_' + this.actb_base_id + this.actb_pos);

		if(this.actb_useScroll)
		{
			var base = document.getElementById('tat_table_' + this.actb_base_id);
			base.scrollTop = t.offsetTop;
		}
		else
		{
			if(this.actb_pos < this.actb_rangeu)
			{
				this.actb_rangeu--;
				this.actb_ranged--;
				this.actb_remake();
			}
		}

		if(t && t.style) t.style.backgroundColor = this.actb_hColor;

		if(this.actb_toid)
		{
			clearTimeout(this.actb_toid);
			this.actb_toid = 0;
		}

		if(this.actb_timeOut > 0)
		  this.actb_toid = setTimeout(function() { this.actb_mouse_on_list = 1; this.actb_removedisp(); }, this.actb_timeOut);

		this.actb_curr.focus(); 
	},

	actb_upanel_mousedown: function()
	{	
		this.actb_curr.focus(); 

		if(!this.actb_display) return;
		if(this.actb_pos <= 1) return;

		var t = document.getElementById('tat_tr_' + this.actb_base_id + this.actb_pos);
		if(t && t.style) t.style.backgroundColor = this.actb_bgColor;

		this.actb_pos--;
		t = document.getElementById('tat_tr_' + this.actb_base_id + this.actb_pos);

		if(this.actb_useScroll)
		{
			var base = document.getElementById('tat_table_' + this.actb_base_id);
			base.scrollTop = t.offsetTop;
		}
		else
		{
			if(this.actb_pos < this.actb_rangeu)
			{
				this.actb_rangeu--;
				this.actb_ranged--;
				this.actb_remake();
			}
		}

		if(t && t.style) t.style.backgroundColor = this.actb_hColor;

		if(this.actb_toid)
		{
			clearTimeout(this.actb_toid);
			this.actb_toid = 0;
		}

		if(this.actb_timeOut > 0)
		  this.actb_toid = setTimeout(function() { this.actb_mouse_on_list = 1; this.actb_removedisp(); }, this.actb_timeOut);
		
		timeoutID = setInterval(this.funcUp, 100);

		this.actb_curr.focus(); 
	},

    actb_upanel_mouseup: function()
    {
        clearInterval(timeoutID);
    },
    
	actb_godown: function()
	{
		this.actb_curr.focus(); 

		if(!this.actb_display) return;
		if(this.actb_pos == this.actb_total) return;

		if(this.actb_pos >= 1)
		{
			var t = document.getElementById('tat_tr_' + this.actb_base_id + this.actb_pos);
			if(t && t.style) t.style.backgroundColor = this.actb_bgColor;
		}
		else
		{
			this.actb_pos = 0;
		}

		this.actb_pos++;
		t = document.getElementById('tat_tr_' + this.actb_base_id + this.actb_pos);

		if(this.actb_useScroll)
		{
			var base = document.getElementById('tat_table_' + this.actb_base_id);
			base.scrollTop = t.offsetTop;
		}
		else
		{
			if(this.actb_pos > this.actb_ranged)
			{
				this.actb_rangeu++;
				this.actb_ranged++;
				this.actb_remake();
			}
		}

		if(t && t.style) t.style.backgroundColor = this.actb_hColor;

		if(this.actb_toid)
		{
			clearTimeout(this.actb_toid);
			this.actb_toid = 0;
		}

		if(this.actb_timeOut > 0)
			this.actb_toid = setTimeout(function() { this.actb_mouse_on_list = 1; this.actb_removedisp(); }, this.actb_timeOut);

		this.actb_curr.focus();
	},

	actb_lpanel_mousedown: function()
	{
		this.actb_curr.focus(); 
        
		if(!this.actb_display) return;
		if(this.actb_pos == this.actb_total) return;		
		if(this.actb_pos >= 1)
		{
			var t = document.getElementById('tat_tr_' + this.actb_base_id + this.actb_pos);
			if(t && t.style) t.style.backgroundColor = this.actb_bgColor;
		}
		else
		{
			this.actb_pos = 0;
		}
        
		this.actb_pos++;
		t = document.getElementById('tat_tr_' + this.actb_base_id + this.actb_pos);

		if(this.actb_useScroll)
		{
			var base = document.getElementById('tat_table_' + this.actb_base_id);
			base.scrollTop = t.offsetTop;
		}
		else
		{
			if(this.actb_pos > this.actb_ranged)
			{
				this.actb_rangeu++;
				this.actb_ranged++;
				this.actb_remake();
			}
		}
        
		if(t && t.style) t.style.backgroundColor = this.actb_hColor;

		if(this.actb_toid)
		{
			clearTimeout(this.actb_toid);
			this.actb_toid = 0;
		}
        
		if(this.actb_timeOut > 0)
			this.actb_toid = setTimeout(function() { this.actb_mouse_on_list = 1; this.actb_removedisp(); }, this.actb_timeOut);
			
		       
        timeoutID = setInterval(this.funcDown, 100);        
		this.actb_curr.focus();
	},
	
	actb_lpanel_mouseup: function()
	{	    
	    clearInterval(timeoutID);
    },    
	actb_mouseclick: function(event)
	{
		var elem = getTargetElement(event);
		if(!elem.id) elem = elem.parentNode;

		var obj = elem.actb; 
		if(!obj.actb_display) return;

		obj.actb_mouse_on_list = 0;
		obj.actb_pos = elem.getAttribute('pos');
		obj.actb_selectedIndex = obj.actb_pos - 1;
		obj.actb_penter();
	},

	actb_table_focus: function()
	{ this.actb_mouse_on_list = 1; },

	actb_table_unfocus: function()
	{
		this.actb_mouse_on_list = 0;

		if(this.actb_toid)
		{
			clearTimeout(this.actb_toid);
			this.actb_toid = 0;
		}

		if(this.actb_timeOut > 0)
			this.actb_toid = setTimeout(function() { obj.actb_mouse_on_list = 0; this.actb_removedisp(); }, this.actb_timeOut);
	},
	
	actb_table_highlight: function(event)
	{
		var elem = getTargetElement(event);

		var obj = elem.actb;
		if(!obj) return;

		obj.actb_mouse_on_list = 1;

		var row = document.getElementById('tat_tr_' + obj.actb_base_id + obj.actb_pos);
		if(row && row.style) row.style.backgroundColor = obj.actb_bgColor;

		obj.actb_pos = elem.getAttribute('pos');

		row = document.getElementById('tat_tr_' + obj.actb_base_id + obj.actb_pos);
		if(row && row.style)
			row.style.backgroundColor = obj.actb_hColor;

		if(obj.actb_toid)
		{
			clearTimeout(obj.actb_toid);
			obj.actb_toid = 0;
		}

		if(obj.actb_timeOut > 0)
			obj.actb_toid = setTimeout(function() { obj.actb_mouse_on_list = 0; obj.actb_removedisp(); }, obj.actb_timeOut);
	},
 
 	actb_penter: function()
	{
		if(!this.actb_display) return;
		if(this.actb_pos < 1) return;

		this.actb_display = false;

		var word = '', c = 0;
		
		for(var i = 0; i <= this.actb_keywords.length; i++)
		{
			if(this.actb_bool[i]) c++;
			if(c == this.actb_pos)
			{
				word = this.actb_keywords[i];
				break;
			}
		}
        
        if(this.actb_SuggestionType == 'msisdn')
        {
            var index = word.indexOf('[')
            var countrycode=word.substring(index)
            if(index > 0)
            { 
                var newword = word.split('[')
                word = newword[0];
            }
           countrycode=countrycode.substring(1,countrycode.indexOf(']')); 
           //Add conditons here based upon country codes 
           if(countrycode == "+44 UK") 
                document.getElementById('ctl00_ContentPlaceHolder1_ddlCountryCode').selectedIndex = 0;
           else if(countrycode == "+91 IN") 
                document.getElementById('ctl00_ContentPlaceHolder1_ddlCountryCode').selectedIndex = 1;
        }
        
		this.actb_insertword(word);
		this.actb_preloadmp3file(word);
	},

	actb_insertword: function(a)
	{
		if(this.actb_delimiter.length > 0)
		{
			var str = '';

			for(var i = 0; i < this.actb_delimwords.length; i++)
			{
				if(this.actb_cdelimword == i)
				{
					prespace = postspace = '';
					gotbreak = false;
					for(var j = 0; j < this.actb_delimwords[i].length; ++j)
					{
						if(this.actb_delimwords[i].charAt(j) != ' ')
						{
							gotbreak = true;
							break;
						}

						prespace += ' ';
					}

					for(j = this.actb_delimwords[i].length - 1; j >= 0; --j)
					{
						if(this.actb_delimwords[i].charAt(j) != ' ') break;
						postspace += ' ';
					}

					str += prespace;
					str += a;
					if(gotbreak) str += postspace;
				}
				else
				{
					str += this.actb_delimwords[i];
				}

				if(i != this.actb_delimwords.length - 1)
					str += this.actb_delimchar[i];
			}

			this.actb_curr.value = str;
			setCaret(this.actb_curr, this.actb_curr.value.length);
		}
		else
		{
			this.actb_curr.value = a;
		}

		this.actb_mouse_on_list = 0;
		this.actb_removedisp();
	},

	actb_removedisp: function()
	{
		if(this.actb_mouse_on_list == 0)
		{
			this.actb_display = 0;

			var base = document.getElementById('tat_table_' + this.actb_base_id);
			if(base)
			  document.body.removeChild(base);

			if(this.actb_toid)
			{
			  clearTimeout(this.actb_toid);
			  this.actb_toid = 0;
			}

			this.cur_x = 0;
			this.cur_y = 0;
			this.cur_w = 0;
			this.cur_h = 0;
		}
	},

	actb_keypress: function(e)
	{
		if(this.actb_caretmove) stopEvent(e);
		return !this.actb_caretmove;
	},

	actb_checkkey: function(event)
	{
		event = event || window.event;

		var code = event.keyCode;
		var obj = getTargetElement(event).actb; 
		obj.actb_caretmove = 0;

		var term = "";

		if(obj.actb_toid)
		{
			clearTimeout(obj.actb_toid);
			obj.actb_toid = 0;
		}
		switch(code)
		{
			case 38:
				obj.actb_goup();
				obj.actb_caretmove = 1;
				return false;
				break;

			case 40:
				obj.actb_godown();
				obj.actb_caretmove = 1;
				return false;
				break;

			case 27:
				term = obj.actb_curr.value;

				obj.actb_mouse_on_list = 0;
				obj.actb_removedisp();
				break;

			case 13:
				if(obj.actb_display)
				{
					obj.actb_caretmove = 1;
					obj.actb_penter();
					return false;
				}
				break;

			case 9:
				if(obj.actb_display || obj.actb_toid)
				{
					obj.actb_caretmove = 1;
					obj.actb_penter();

					setTimeout(function() { obj.actb_curr.focus(); }, 25);
					return false;
				}
				break;

			default:
				obj.actb_toid = setTimeout(function() { obj.actb_tocomplete.call(obj, code) }, 500);
				break;
		}

		if(term.length) setTimeout(function() { obj.actb_curr.value = term; }, 25);
		return true;
	},

	actb_tocomplete: function(kc)
	{
	    this.actb_Generic = false;
	    activeSuggestions = this.actb_base_id;
		if(this.actb_toid)
		{
			clearTimeout(this.actb_toid);
			this.actb_toid = 0;
		}
		else
		{
			return;
		}

		if(kc == 38 || kc == 40 || kc == 13) return;

		if(this.actb_display)
		{ 
			var word = 0;
			var c = 0;

			for(var i = 0; i <= this.actb_keywords.length; i++)
			{
				if(this.actb_bool[i]) c++;

				if(c == this.actb_pos)
				{
					word = i;
					break;
				}
			}
			
			this.actb_pre = word;
		}
		else
		{
			this.actb_pre = -1;
		}
		
		if(this.actb_curr.value == '')
		{
			this.actb_mouse_on_list = 0;
			this.actb_removedisp();
		}

		var ot, t;

		if(this.actb_delimiter.length > 0)
		{
			var caret_pos_end = this.actb_curr.value.length;

			var delim_split = '';
			for(var i = 0; i < this.actb_delimiter.length; i++)
				delim_split += this.actb_delimiter[i];

		    delim_split = delim_split.addslashes();
			var delim_split_rx = new RegExp("([" + delim_split + "])");
			c = 0;
			this.actb_delimwords = [];
			this.actb_delimwords[0] = '';

			for(var i = 0, j = this.actb_curr.value.length; i < this.actb_curr.value.length; i++, j--)
			{
				if(this.actb_curr.value.substr(i, j).search(delim_split_rx) == 0)
				{
					ma = this.actb_curr.value.substr(i,j).match(delim_split_rx);
					this.actb_delimchar[c] = ma[1];
					c++;
					this.actb_delimwords[c] = '';
				}
				else
				{
					this.actb_delimwords[c] += this.actb_curr.value.charAt(i);
				}
			}

			var l = 0;
			this.actb_cdelimword = -1;
			for(i = 0; i < this.actb_delimwords.length; i++)
			{
				if((caret_pos_end >= l) && (caret_pos_end <= l + this.actb_delimwords[i].length))
					this.actb_cdelimword = i;

				l += this.actb_delimwords[i].length + 1;
			}

			ot = this.actb_delimwords[this.actb_cdelimword].trim(); 
			 t = this.actb_delimwords[this.actb_cdelimword].addslashes().trim();
		}
		else
		{
			ot = this.actb_curr.value;
			 t = this.actb_curr.value.addslashes();
		}

		if(ot.length == 0)
		{
			this.actb_mouse_on_list = 0;
			this.actb_removedisp();
			hideAlternatetooltip();  ////Internal Issue ###3 added by Lakshmi
		}
		else if((ot.length == 1) || this.actb_fullRefresh ||
		       ((ot.length > 1) && !this.actb_keywords.length) ||
		       ((ot.length > 1) && (this.actb_keywords[0].substr(0, 1).toLowerCase() != ot.substr(0, 1).toLowerCase())))
		{
			var ot_ = ((ot.length > 1) && !this.actb_fullRefresh) ? ot.substr(0, 1) : ot;

			if(this.actb_suggesturl.length)
			{
				// create xmlhttprequest object:
				var http = null;
				if(typeof XMLHttpRequest != 'undefined')
				{
					try
					{
						http = new XMLHttpRequest();
					}
					catch (e) { http = null; }
				}
				else
				{
					try
					{
						http = new ActiveXObject("Msxml2.XMLHTTP") ;
					}
					catch (e)
					{
						try
						{
							http = new ActiveXObject("Microsoft.XMLHTTP") ;
						}
						catch (e) {	http = null; }
					}
				}

				if(http)
				{
					// For local debugging in Mozilla/Firefox only!
					/*try
					{
						netscape.security.PrivilegeManager.enablePrivilege("UniversalBrowserRead");
					} catch (e) { }*/

					if(http.overrideMimeType)
						http.overrideMimeType('text/xml');

					http.open("GET", this.actb_suggesturl + ot_ + "&ran="+Math.floor(Math.random()*101), true);

					var obj = this;
					http.onreadystatechange = function(n)
					{
						if(http.readyState == 4)
						{
							if((http.status == 200) || (http.status == 0))
							{
								var xmlDocument = null, tmpinfo = null;

								try
								{
									xmlDocument = http.responseXML;
									tmpinfo = xmlDocument.getElementsByTagName('listdata').item(0).firstChild.data;
								}
								catch(e)
								{
									try
									{
										xmlDocument = (new DOMParser()).parseFromString(http.responseText, "text/xml");
										tmpinfo = xmlDocument.getElementsByTagName('listdata').item(0).firstChild.data;
									}
									catch(ee) {}
								}
								if(tmpinfo!=null)
                                    obj.actb_keywords = tmpinfo.split('|');
                                else
                                     obj.actb_keywords = "";
								obj.done.call(obj, ot_, t);
							}
						}
					}

					http.send(null);
				}

				// xmlhttp object creation failed
				return;
			}
			else
			{
				this.done(ot, t);
			}
		}
		else
		{
			this.done(ot, t);
		}
	},

	done: function(ot, t)
	{
		if(ot.length < this.actb_startcheck) return;
        
        if(this.actb_SuggestionType=='names')
        {
            if(!this.actb_keywords.length)
            {
                // Show error bubble
                showerrorbubble(this.actb_base_id,'error')
                // call the list creation procedure one more time:
                this.actb_toidGeneric = 1;
                this.actb_Generic = true;  //Set generic list true
                this.actb_tocompleteGeneric(0);          
            }
        }
        
		var re = new RegExp("^" + t, "i");

		this.actb_total = 0;
		this.actb_tomake = false;

		var al = this.actb_keywords.length;

        if((!this.actb_Generic)&&(this.actb_SuggestionType != 'msisdn')) //If not generic list, filter source based on user input
        {
		    for(var i = 0; i < al; i++)
		    {
			    this.actb_bool[i] = false;
			    if(re.test(this.actb_keywords[i]))
			    {
				    this.actb_total++;
				    this.actb_bool[i] = true;

				    if(this.actb_pre == i) this.actb_tomake = true;
			    }
		    }
		}
		else if((this.actb_Generic)||(this.actb_SuggestionType == 'msisdn')) //If generic/msisdn, show all source without filtering
		{
		    for(var i = 0; i < al; i++)
		    {
			    this.actb_total++;
			    this.actb_bool[i] = true;

			    if(this.actb_pre == i) this.actb_tomake = true;
		    }
		}

		if(!this.actb_firstText)
		{
			var tmp = [];

			for(i = 0; i < al; i++)
			{
				if(this.actb_bool[i])
					tmp[tmp.length] = this.actb_keywords[i];
			}

			re = new RegExp(t, "i");

			for(i = 0; i < al; i++)
			{
				if(re.test(this.actb_keywords[i]) && !this.actb_bool[i])
				{
					this.actb_total++;
					this.actb_bool[i] = true;

					if(this.actb_pre == i) this.actb_tomake = true;

					tmp[tmp.length] = this.actb_keywords[i];
				}
			}

			for(i = 0; i < al; i++)
			{
				if(!this.actb_bool[i])
					tmp[tmp.length] = this.actb_keywords[i];
			}

			for(i = 0; i < al; i++)
				this.actb_keywords[i] = tmp[i];

			for(i = 0; i < al; i++)
				this.actb_bool[i] = (i < this.actb_total) ? true : false;
		}

		if(this.actb_timeOut > 0)
		  this.actb_toid = setTimeout(function(){ this.actb_mouse_on_list = 0; this.actb_removedisp(); }, this.actb_timeOut);

		this.actb_generate();
	},

    
   //*** Newly added function to fetch generic names***//
   
    actb_tocompleteGeneric: function(kc)
    {
	    if(this.actb_toidGeneric)
	    {
		    clearTimeout(this.actb_toidGeneric);
		    this.actb_toidGeneric = 0;
	    }
	    else
	    {
		    return;
	    }

	    if(kc == 38 || kc == 40 || kc == 13) return;

	    if(this.actb_display)
	    { 
		    var word = 0;
		    var c = 0;

		    for(var i = 0; i <= this.actb_keywords.length; i++)
		    {
			    if(this.actb_bool[i]) c++;

			    if(c == this.actb_pos)
			    {
				    word = i;
				    break;
			    }
		    }
    		
		    this.actb_pre = word;
	    }
	    else
	    {
		    this.actb_pre = -1;
	    }
    	
	    if(this.actb_curr.value == '')
	    {
		    this.actb_mouse_on_list = 0;
		    this.actb_removedisp();
	    }

	    var ot, t;

	    if(this.actb_delimiter.length > 0)
	    {
		    var caret_pos_end = this.actb_curr.value.length;

		    var delim_split = '';
		    for(var i = 0; i < this.actb_delimiter.length; i++)
			    delim_split += this.actb_delimiter[i];

	        delim_split = delim_split.addslashes();
		    var delim_split_rx = new RegExp("([" + delim_split + "])");
		    c = 0;
		    this.actb_delimwords = [];
		    this.actb_delimwords[0] = '';

		    for(var i = 0, j = this.actb_curr.value.length; i < this.actb_curr.value.length; i++, j--)
		    {
			    if(this.actb_curr.value.substr(i, j).search(delim_split_rx) == 0)
			    {
				    ma = this.actb_curr.value.substr(i,j).match(delim_split_rx);
				    this.actb_delimchar[c] = ma[1];
				    c++;
				    this.actb_delimwords[c] = '';
			    }
			    else
			    {
				    this.actb_delimwords[c] += this.actb_curr.value.charAt(i);
			    }
		    }

		    var l = 0;
		    this.actb_cdelimword = -1;
		    for(i = 0; i < this.actb_delimwords.length; i++)
		    {
			    if((caret_pos_end >= l) && (caret_pos_end <= l + this.actb_delimwords[i].length))
				    this.actb_cdelimword = i;

			    l += this.actb_delimwords[i].length + 1;
		    }

		    ot = this.actb_delimwords[this.actb_cdelimword].trim(); 
		     t = this.actb_delimwords[this.actb_cdelimword].addslashes().trim();
	    }
	    else
	    {
		    ot = this.actb_curr.value;
		     t = this.actb_curr.value.addslashes();
	    }

	    if(ot.length == 0)
	    {
		    this.actb_mouse_on_list = 0;
		    this.actb_removedisp();
	    }
	    else if((ot.length == 1) || this.actb_fullRefresh ||
	           ((ot.length > 1) && !this.actb_keywords.length) ||
	           ((ot.length > 1) && (this.actb_keywords[0].substr(0, 1).toLowerCase() != ot.substr(0, 1).toLowerCase())))
	    {
		    var ot_ = ((ot.length > 1) && !this.actb_fullRefresh) ? ot.substr(0, 1) : ot;

		    // create xmlhttprequest object:
		    var http = null;
		    if(typeof XMLHttpRequest != 'undefined')
		    {
			    try
			    {
				    http = new XMLHttpRequest();
			    }
			    catch (e) { http = null; }
		    }
		    else
		    {
			    try
			    {
				    http = new ActiveXObject("Msxml2.XMLHTTP") ;
			    }
			    catch (e)
			    {
				    try
				    {
					    http = new ActiveXObject("Microsoft.XMLHTTP") ;
				    }
				    catch (e) {	http = null; }
			    }
		    }

		    if(http)
		    {
			    // For local debugging in Mozilla/Firefox only!
			    /*try
			    {
				    netscape.security.PrivilegeManager.enablePrivilege("UniversalBrowserRead");
			    } catch (e) { }*/

			    if(http.overrideMimeType)
				    http.overrideMimeType('text/xml');

			    http.open("GET", this.actb_genericsuggesturl, true);

			    var obj = this;
			    http.onreadystatechange = function(n)
			    {
				    if(http.readyState == 4)
				    {
					    if((http.status == 200) || (http.status == 0))
					    {
						    var xmlDocument = null, tmpinfo = null;

						    try
						    {
							    xmlDocument = http.responseXML;
							    tmpinfo = xmlDocument.getElementsByTagName('listdata').item(0).firstChild.data;
						    }
						    catch(e)
						    {
							    try
							    {
								    xmlDocument = (new DOMParser()).parseFromString(http.responseText, "text/xml");
								    tmpinfo = xmlDocument.getElementsByTagName('listdata').item(0).firstChild.data;
							    }
							    catch(ee) {}
						    }
                            if(tmpinfo!=null)
                           { 
						        obj.actb_keywords = tmpinfo.split('|');
    						    obj.done.call(obj, ot_, t);
						   }
                            else
                                obj.actb_keywords = "";
					    }
				    }
			    }

			    http.send(null);
		    }

		    // xmlhttp object creation failed
		    return;
	    }
	    else
	    {
		    this.done(ot, t);
	    }
    },
   actb_preloadmp3file: function(word) 
   {
        var http = null;
		if(typeof XMLHttpRequest != 'undefined')
		{
			try
			{
				http = new XMLHttpRequest();
			}
			catch (e) { http = null; }
		}
		else
		{
			try
			{
				http = new ActiveXObject("Msxml2.XMLHTTP") ;
			}
			catch (e)
			{
				try
				{
					http = new ActiveXObject("Microsoft.XMLHTTP") ;
				}
				catch (e) {	http = null; }
			}
		}

		if(http)
		{
			// For local debugging in Mozilla/Firefox only!
			/*try
			{
				netscape.security.PrivilegeManager.enablePrivilege("UniversalBrowserRead");
			} catch (e) { }*/

			if(http.overrideMimeType)
				http.overrideMimeType('text/xml');

			http.open("GET", this.actb_preloadurl + word, true);

			var obj = this;
			http.onreadystatechange = function(n)
			{
				if(http.readyState == 4)
				{
					if((http.status == 200) || (http.status == 0))
					{
						var filepath = null;						
						filepath = http.responseText;
						preFile(filepath);
                        hideTooltip();
                        hideAlternatetooltip();
					}
				}
			}

			http.send(null);
		}

		// xmlhttp object creation failed
		return;
   }
}

// Supplementary functions

// Add an event to the obj given
// event_name refers to the event trigger, without the "on", like click or mouseover
// func_name refers to the function callback when event is triggered
function addEvent(obj, event_name, func_ref)
{
    if(obj!=null)
   { 
        if(obj.addEventListener && !window.opera)
        {
	        obj.addEventListener(event_name, func_ref, true);
        }
        else
        {
	        obj["on" + event_name] = func_ref;
        }
   } 
}

// Removes an event from the object
function removeEvent(obj, event_name, func_ref)
{
	if(obj.removeEventListener && !window.opera)
	{
		obj.removeEventListener(event_name, func_ref, true);
	}
	else
	{
		obj["on" + event_name] = null;
	}
}

// Stop an event from bubbling up the event DOM
function stopEvent(event)
{
	event = event || window.event;
	
	if(event.stopPropagation) event.stopPropagation();
	if(event.preventDefault) event.preventDefault();

	if(typeof event.cancelBubble != "undefined")
	{
		event.cancelBubble = true;
		event.returnValue = false;
	}

	return false;
}

// Get the obj that triggers off the event
function getTargetElement(event)
{
	event = event || window.event;
	return event.srcElement || event.target;
}
   
// Sets the caret position to l in the object
function setCaret(obj, l)
{
	obj.focus();

	if(obj.setSelectionRange)
	{
		obj.setSelectionRange(l, l);
	}
	else if(obj.createTextRange)
	{
		m = obj.createTextRange();		
		m.moveStart('character', l);
		m.collapse();
		m.select();
	}
}

// String functions
String.prototype.addslashes = function() { return this.replace(/(["\\\.\|\[\]\^\*\+\?\$\(\)])/g, '\\$1'); }

String.prototype.trim = function () { return this.replace(/^\s*(\S*(\s+\S+)*)\s*$/, "$1"); };

// Offset position from top of the screen
function curTop(obj)
{
	var toreturn = 0;
	while(obj)
	{
		toreturn += obj.offsetTop - (window.opera ? 0 : obj.scrollTop);
		obj = obj.offsetParent;
	}

	return toreturn;
}

// Offset position from left of the screen
function curLeft(obj)
{
	var toreturn = 0;
	while(obj)
	{
		toreturn += obj.offsetLeft - (window.opera ? 0 : obj.scrollLeft);
		obj = obj.offsetParent;
	}

	return toreturn;
}

// Image installation
function replaceHTML(obj, oImg)
{
	var el = obj.childNodes[0];
	while(el)
	{
		obj.removeChild(el);
		el = obj.childNodes[0];
	}

	obj.appendChild(oImg);
}

function removeSuggestions()
{
    var base = document.getElementById('tat_table_' + activeSuggestions);
	if(base)
	  document.body.removeChild(base);
}