var skype_injection_path = 'chrome://skype_ff_toolbar_win/content/';
var skype_tool = null;

/*window.addEventListener("click",skype_click_handler,true);
function skype_click_handler(event)
{
	if (skype_tool)
		skype_tool.closemenu();
	//HideSkypeMenuFull();
} */

//CALL BUTTON
var SkypeActiveCallButtonPart = 0;
function SkypeSetCallButtonPart(obj)
{
	if (obj.getAttribute('id') == '__skype_highlight_id_left')
	{
		SkypeActiveCallButtonPart = 0;
	}
	else if (obj.getAttribute('id') == '__skype_highlight_id_right')
	{
		SkypeActiveCallButtonPart = 1;
	}
}

function SkypeSetCallButton(obj, hl, isInternational, isFax)
{
	var cb_part_l = null;
	var cb_part_ml = null;
	var cb_part_mr = null;
	var cb_part_r = null;
	if (obj.getAttribute('rtl') == 'false')
	{
		cb_part_l = obj.firstChild.firstChild;
		cb_part_ml = obj.firstChild.lastChild;
		cb_part_mr = obj.lastChild.firstChild;
		cb_part_r = obj.lastChild.lastChild;

		cb_flag = obj.firstChild.lastChild.firstChild;
		if (cb_flag && cb_flag.isSameNode(obj.firstChild.firstChild.firstChild) == true)
			cb_flag = null;
	}
	else
	{
		cb_part_l = obj.lastChild.lastChild;
		cb_part_ml = obj.lastChild.firstChild;
		cb_part_mr = obj.firstChild.lastChild;
		cb_part_r = obj.firstChild.firstChild;

		cb_flag = obj.lastChild.firstChild.lastChild;
		if (cb_flag && cb_flag.isSameNode(obj.lastChild.lastChild.lastChild) == true)
			cb_flag = null;
	}

	if (hl == 1)
	{
		cb_part_l.style.backgroundImage = "url('chrome://skype_ff_toolbar_win/content/cb_mouseover_l.gif')";
		if (cb_part_l.isSameNode(cb_part_ml) != true)
			cb_part_ml.style.backgroundImage = "url('chrome://skype_ff_toolbar_win/content/cb_mouseover_m.gif')";
		cb_part_mr.style.backgroundImage = "url('chrome://skype_ff_toolbar_win/content/cb_mouseover_m.gif')";


		if (isInternational == "0")
		{
			if (SkypeActiveCallButtonPart == 0)    //left
			{
				cb_part_r.style.backgroundImage = "url('chrome://skype_ff_toolbar_win/content/cb_mouseonflag_r"+(isFax?"_fax":"")+".gif')";
				//shadow
				if (cb_flag)
				{
					cb_flag.style.top = '1px';
					cb_flag.style.left = '1px';
					/*top right bottom left*/
					cb_flag.style.padding = '1px 0px 0px 1px';//'2px 0px 0px 0px';
				}
			}
			else                            //right
			{
				cb_part_r.style.backgroundImage = "url('chrome://skype_ff_toolbar_win/content/cb_mouseover_r"+(isFax?"_fax":"")+".gif')";
				//flag
				if (cb_flag)
				{
					cb_flag.style.top = '0px';
					cb_flag.style.left = '0px';
					cb_flag.style.padding = '0px 1px 1px 0px';//'0px 1px 1px 0px';
					cb_flag.style.margin = '0px 0px 2px 0px;';
				}
			}
		}
		else
		{
			cb_part_r.style.backgroundImage = "url('chrome://skype_ff_toolbar_win/content/cb_mouseover_r"+(isFax?"_fax":"")+".gif')";
			//flag
			if (cb_flag)
			{
				cb_flag.style.top = '0px';
				cb_flag.style.left = '0px';
				cb_flag.style.padding = '0px 1px 1px 0px';
				cb_flag.style.margin = '0px 0px 2px 0px;';
			}
		}
	}
	else
	{
		cb_part_l.style.backgroundImage = "url('chrome://skype_ff_toolbar_win/content/cb_normal_l.gif')";
		if (cb_part_l.isSameNode(cb_part_ml) != true)
			cb_part_ml.style.backgroundImage = "url('chrome://skype_ff_toolbar_win/content/cb_normal_m.gif')";
		cb_part_mr.style.backgroundImage = "url('chrome://skype_ff_toolbar_win/content/cb_normal_m.gif')";
		cb_part_r.style.backgroundImage = "url('chrome://skype_ff_toolbar_win/content/cb_normal_r"+(isFax?"_fax":"")+".gif')";

		//flag
		if (cb_flag)
		{
			cb_flag.style.top = '0px';
			cb_flag.left = '0px';
			cb_flag.style.padding = '0px 1px 1px 0px';
			cb_flag.style.margin = '0px 0px 2px 0px;';
		}
	}
}
var skype_cb_l = '';
var skype_cb_m = '';
var skype_cb_r = '';

function SkypeSetCallButtonPressed(obj, pr, isInternational, isFax)
{
	var cb_part_l = null;
	var cb_part_ml = null;
	var cb_part_mr = null;
	var cb_part_r = null;
	if (obj.getAttribute('rtl') == 'false')
	{
		cb_part_l = obj.firstChild.firstChild;
		cb_part_ml = obj.firstChild.lastChild;
		cb_part_mr = obj.lastChild.firstChild;
		cb_part_r = obj.lastChild.lastChild;

		cb_flag = obj.firstChild.lastChild.firstChild;
		if (cb_flag && cb_flag.isSameNode(obj.firstChild.firstChild.firstChild) == true)
			cb_flag = null;
	}
	else
	{
		cb_part_l = obj.lastChild.lastChild;
		cb_part_ml = obj.lastChild.firstChild;
		cb_part_mr = obj.firstChild.lastChild;
		cb_part_r = obj.firstChild.firstChild;

		cb_flag = obj.lastChild.firstChild.lastChild;
		if (cb_flag && cb_flag.isSameNode(obj.lastChild.lastChild.lastChild) == true)
			cb_flag = null;
	}
	if (pr == 1)
	{
		skype_cb_l = cb_part_l.style.backgroundImage;//getAttribute('src');
		skype_cb_m = cb_part_mr.style.backgroundImage;
		skype_cb_r = cb_part_r.style.backgroundImage;//getAttribute('src');

		if (isInternational == "0")
		{
			if (SkypeActiveCallButtonPart == 0)    //left
			{
				//obj.firstChild.firstChild.setAttribute('src', 'chrome://skype_ff_toolbar_win/content/cb_down_l.gif');
				cb_part_l.style.backgroundImage = "url('chrome://skype_ff_toolbar_win/content/cb_down_l.gif')";
				if (cb_part_l.isSameNode(cb_part_ml) != true)
					cb_part_ml.style.backgroundImage = "url('chrome://skype_ff_toolbar_win/content/cb_down_m.gif')";
			}
			else                            //right
			{
				//obj.firstChild.firstChild.setAttribute('src', 'chrome://skype_ff_toolbar_win/content/cb_down_l.gif');
				cb_part_l.style.backgroundImage = "url('chrome://skype_ff_toolbar_win/content/cb_down_l.gif')";
				if (cb_part_l.isSameNode(cb_part_ml) != true)
					cb_part_ml.style.backgroundImage = "url('chrome://skype_ff_toolbar_win/content/cb_down_m.gif')";
				cb_part_mr.style.backgroundImage = "url('chrome://skype_ff_toolbar_win/content/cb_down_m.gif')";
				//obj.lastChild.lastChild.setAttribute('src', 'chrome://skype_ff_toolbar_win/content/cb_down_r"+(isFax?"_fax":"")+".gif');
				cb_part_r.style.backgroundImage = "url('chrome://skype_ff_toolbar_win/content/cb_down_r"+(isFax?"_fax":"")+".gif')";
			}
		}
		else
		{
			//obj.firstChild.firstChild.setAttribute('src', 'chrome://skype_ff_toolbar_win/content/cb_down_l.gif');
			cb_part_l.style.backgroundImage = "url('chrome://skype_ff_toolbar_win/content/cb_down_l.gif')";
			if (cb_part_l.isSameNode(cb_part_ml) != true)
				cb_part_ml.style.backgroundImage = "url('chrome://skype_ff_toolbar_win/content/cb_down_m.gif')";
			cb_part_mr.style.backgroundImage = "url('chrome://skype_ff_toolbar_win/content/cb_down_m.gif')";
				//obj.lastChild.lastChild.setAttribute('src', 'chrome://skype_ff_toolbar_win/content/cb_down_r"+(isFax?"_fax":"")+".gif');
			cb_part_r.style.backgroundImage = "url('chrome://skype_ff_toolbar_win/content/cb_down_r"+(isFax?"_fax":"")+".gif')";
		}
	}
	else
	{
		//obj.firstChild.firstChild.setAttribute('src', skype_cb_l);
		cb_part_l.style.backgroundImage = skype_cb_l;
		if (cb_part_l.isSameNode(cb_part_ml) != true)
			cb_part_ml.style.backgroundImage = skype_cb_m;
		cb_part_mr.style.backgroundImage = skype_cb_m;
		//obj.lastChild.lastChild.setAttribute('src', skype_cb_r);
		cb_part_r.style.backgroundImage = skype_cb_r;
	}
}

//COMMANDS
function SkypeToolBarInit(tb)
{
	skype_tool = tb;
}

function doRunCMDSkype(event, link, id, name)
{
	if (skype_tool)
	{
		if (link == 'chdial')
		{
			var obj=event.originalTarget;
			if (!obj)
				obj=event;

			/*var brd=SkypeGetBounds(obj);
		   var docelem = document.documentElement;
		   if ((docelem.scrollTop == 0 && document.body.scrollTop != 0) || (docelem.scrollLeft == 0 && document.body.scrollLeft != 0))
			   docelem=document.body;
   
		   scrollY=docelem.scrollTop;
		   scrollX=docelem.scrollLeft;
   
		   var my=brd.top+16, mx=brd.left;/*brd.height*/

			//var oDoc = obj.ownerDocument;

			/*var obj2 = document.getBoxObjectFor(element);
   
		   var html_box = new XPCNativeWrapper(obj2).wrappedJSObject;
		   if (!html_box)
			 html_box = obj2;
   
		   var screenX = html_box.screenX;
		   var screenY = html_box.screenY;
			   */

			SkypeFlagColor='rgb(184, 203, 255)';
			skype_tool.chprefix(id, document, obj, screenY);
		}
		else if (link == 'copy')
			skype_tool.copy_num(id, document);
		else if (link == 'sms')
			skype_tool.sms(id);
		else if (link == 'add')
			skype_tool.add(id, name);
		else
			skype_tool.call(id);
	}
}

function runCMDSkype(link)
{
	HideSkypeFull();
	doRunCMDSkype(null, link, skype_curid, skype_cur_name);
}

//FLAG TOOLTIP
function HideSkypeFull()
{
	//   skype_active=false;
	document.getElementById('skype_dc').style.visibility = "hidden";
}

function ShowSkype(event, title)
{
	//  skype_active=true;
	DoShowSkype(event.pageX, event.pageY + 20, title);
}

function DoShowSkype(cX, cY, title)
{
	var menu = document.getElementById('skype_dc');
	menu.firstChild.nodeValue = title;
	menu.style.visibility = "visible";

	menu.style.left = cX + 'px';
	menu.style.top = cY + 'px';

}
var SkypeFlagColor = 'rgb(184, 203, 255)';
function doSkypeFlag(obj, brd)
{
	SkypeFlagColor = brd;
}

//MENU
var skype_curid = 0,skype_active = false,skype_showseed = 0,skype_ctm = 0,skype_cur_name = '';
var skype_curbutton = null;
function SkypeCheckCallButton(obj)
{
	var res = false;
	if (skype_curbutton && skype_curbutton.isSameNode(obj) == true)
		res = true;

	skype_curbutton = obj;
	return res;
}

function HideSkypeMenu()
{                       //skype_tool.sd('HideSkypeMenu skype_active='+skype_active);
	if (!skype_active)
		HideSkypeMenuFull();
	else
		setTimeout("HideSkypeMenu()", 1000);
}

function HideSkypeMenu2(event)
{
	skype_showseed = 0;
	if (!skype_active)
		HideSkypeMenuFull();
	else
	{
		skype_active = false;
		setTimeout("HideSkypeMenu()", 1000);
	}
}

function HideSkypeMenuFull()
{                                 //skype_tool.sd('HideSkypeMenuFull skype_active='+skype_active);
	/*   skype_active=false;
	document.getElementById('skype_menu').style.visibility="hidden";*/
}

function CheckSkype()
{
	skype_active = true;
}

function ShowSkypeMenu(event, call_msg, id, callto, isMobile, name, x, y)
{
	try {
		/*  	skype_active=true;       						//skype_tool.sd('ShowSkypeMenu skype_curid='+skype_curid+'   callto='+callto+'  id='+id);
		if(document.getElementById('skype_menu').style.visibility!="hidden" && skype_curid==callto)//id
		  return;
		skype_showseed=Math.random();
		clearTimeout(skype_ctm);
	  var obj=event.originalTarget;
	  if (!obj)
		  obj=event;
  //  	var brd=SkypeGetBounds(obj);
		//var pcx=brd.left, pcy=brd.top+16;/*brd.height;* /   //alert(pcx+'--'+pcy);
  
	  scrolls=SkypeGetDivScroll(obj);
  
		var pcx = x+scrolls.left, pcy = y+scrolls.top;
  
		skype_ctm=setTimeout('DoShowSkypeMenu(\''+call_msg+'\','+skype_showseed+',"'+callto+'",'+pcx+','+pcy+','+isMobile+',"'+name+'")',0);*/
	} catch(e) {
	}
}

function DoShowSkypeMenu(call_msg, seed, callto, pcx, pcy, isMobile, name)
{
	try {                                                        //skype_tool.sd('DoShowSkypeMenu seed='+seed+'   skype_showseed='+skype_showseed);
		/*  	if(seed!=skype_showseed)
		  return;
		skype_showseed=0;
		skype_curid=callto;
	  skype_cur_name=name;
		var menu=document.getElementById('skype_menu');
  
		var my=pcy, mx=pcx;
  
	  var menubox=document.getBoxObjectFor(menu);
	  //var docelem = document.documentElement;
									//alert(menubox.height);
									//alert('doc h='+document.height + ' y='+my+' menu h='+menubox.height);
	  var docH=document.height;
	  if (docH < document.documentElement.clientHeight) docH=document.documentElement.clientHeight;
	  if (docH < document.documentElement.scrollHeight) docH=document.documentElement.scrollHeight;
	  if (docH < document.body.clientHeight) docH=document.body.clientHeight;
	  if (docH < document.body.scrollHeight) docH=document.body.scrollHeight;
	  if ((my + menubox.height) > docH)
		  my=my - 16 - menubox.height;
	  if (my < 0) my=0;
  //    if (document.height != 0 && (my + menubox.height) > document.height && (my + menubox.height) > document.documentElement.scrollHeight)//docelem.clientHeight)
		  //my=document.height - menubox.height;
  
	  var docW=document.width;
	  if (docW < document.documentElement.clientWidth) docW=document.documentElement.clientWidth;
	  if (docW < document.documentElement.scrollWidth) docW=document.documentElement.scrollWidth;
	  if (docW < document.body.clientWidth) docW=document.body.clientWidth;
	  if (docW < document.body.scrollWidth) docW=document.body.scrollWidth;
	  if ((mx + menubox.width) > docW)
		  mx=document.width - menubox.width;
	  if (mx < 0) mx=0;
  //	if (document.width != 0 && (mx + menubox.width) > document.width && (mx + menubox.width) > document.documentElement.scrollWidth)//docelem.clientWidth)
  
		menu.style.left=mx+'px';
		menu.style.top=my+'px';
  
	  skype_tool.doFixMenu(menu, isMobile, document);
  
	  menu.style.visibility="visible";  */
	} catch(e) {
	}
}

function SkypeSetBgColor(obj, color)
{
	try {
		obj.lastChild.style.backgroundColor = color;
	} catch(e) {
	}
}

//UTIL
function SkypeGetBounds(element)
{
	try {
		var left = element.left;
		var top = element.top;
		while (!(element.tagName.toLowerCase() == 'span' && element.getAttribute('id') == '__skype_highlight_id'))
		{
			element = element.parentNode;
		}
		left = element.offsetLeft;
		top = element.offsetTop;
		for (var parent = element.offsetParent; parent; parent = parent.offsetParent)
		{
			left += parent.offsetLeft;
			top += parent.offsetTop;
			if (parent.tagName.toLowerCase() == 'div')
			{
				left -= parent.scrollLeft;
				top -= parent.scrollTop;
			}
		}


		return {left: left, top: top, width: element.offsetWidth, height: element.offsetHeight};
	} catch(e) {
	}
}

function SkypeGetDivScroll(element)
{
	try {
		var left = 0;
		var top = 0;
		while (!(element.tagName.toLowerCase() == 'span' && element.getAttribute('id') == '__skype_highlight_id'))
		{
			element = element.parentNode;
		}

		for (var parent = element.offsetParent; parent; parent = parent.offsetParent)
		{
			if (parent.tagName.toLowerCase() == 'div')
			{
				left -= parent.scrollLeft;
				top -= parent.scrollTop;
			}
		}


		return {left: left, top: top};
	} catch(e) {
	}
}