var baseHref = "/xtraz/js/consts.js";
var WorkingHost = "xtraz.icq.com";
var gDebug = false;

document.write('<script language="javascript" src="' +baseHref + '"></script>');

var icqConnector;
var gPlugin = new PlugIn(icqConnector);
var gSrv = new clsService();

// service obj
function TrimString(sInString) {
  sInString = sInString.replace( /^\s+/g, "" );// strip leading
  return sInString.replace( /\s+$/g, "" );// strip trailing
}

function getBrowserVer()
{
	var index = window.navigator.appVersion.indexOf("MSIE ") 	
	
	return parseFloat(window.navigator.appVersion.substr(index+5,3));
}


function isPrili()
{
	try{
		if(	top.icqConnector.GetIMClientData("CLIENT_VERSION") > 2029)
			return true
	}catch(e){}

	return false
}

function clsService()
{
	this.changeCapability = function(PluginID,guid)
	{
		//var parameters = params.split(",");
		var xmlParam = 	"<srv>" +
					  	"<id>capabilitysSrv</id>" +
						"<func>changeCapability</func>" +
						"<PluginID>"+ PluginID +"</PluginID>" +
						"<guid>"+ guid +"</guid>" +
						"</srv>";
		var qXml = "<Q><PluginID>srvMng</PluginID></Q>"
		var nCount = top.icqConnector.NotifyPlugin(qXml,xmlParam);
	}
}

// send remote function call to other xtraz, impliment doNotifyPlugin on plugin_OnPluginNotification event
function sendNotifyPlugin(xtrazId,funcName,params)
{
		var parameters = params.split(",");
		var xmlParam = "<Root><func>" + funcName + "</func>";
		for(var i=0;i<parameters.length; i++)
			xmlParam +=  "<param>" + parameters[i] + "</param>"
		xmlParam +="</Root>";
		var qXml = "<Q><PluginID>"+xtrazId+"</PluginID></Q>"
		try{
			icqConnector.NotifyPlugin(qXml,xmlParam);
		}catch(e){trace(e,"sendNotifyPlugin")}


}


// sNotify = "<Root><func>funcName</func><param>param1</param><param>param2</param></Root>"
function doNotifyPlugin(targetObj,sNotify)
{
	var xmlDoc = new ActiveXObject("Msxml.DOMDocument");
	xmlDoc.async = false;
	xmlDoc.loadXML(sNotify);
	var funcNode = xmlDoc.selectSingleNode("//Root/func")
	if(!funcNode)
		return
	var funcName = funcNode.text
	var params = xmlDoc.selectNodes("//Root/param")
	var param =""
	for (var i=0 ; i<params.length ; i++)
		{
			param += "'" +  params[i].text + "'";
			if(i<params.length-1)
				param += ",";
		}

	if(funcName.length > 15 || funcName.indexOf('/') > 0 || funcName.indexOf('(') > 0 || funcName.indexOf(')') > 0 )
		return false

	if(param.indexOf('/') > 0 || param.indexOf('(') > 0 || param.indexOf(')') > 0 )
		return false

	var func =  funcName + "(" + param + ")";
	try{
		if(targetObj)
			targetObj.eval(func)
		else
			eval(func)
	}
	catch(e)
	{
		trace(e,"error while doing:" + func)
	}
}
//

function trace(e,msg)
{
	var inMsg ="";
	if(!e)
	{
		e = {name:"general error" , description:""}
	}
	if(msg)
		inMsg = msg
    if(gDebug)
		alert(e + ": " + e.name +  "\n" + e.description + "\n" + inMsg);
}



function PlugIn ( connectorInit ) {
	this.icq = connectorInit;
	this.owner = null;
	this.sessionKey = null;
	this.SkinId = null;
	this.debug = true;
}
/// global functions

function isSwf(src) {
   	var s = src;
   	var re = /.swf/i;            //Create regular expression pattern.
   	if( s.search(re) > -1 )
   		return true
	return false;
}

function getWorkingHostName()
{
	return WorkingHost;
}

function getHostName()
{
	var l_hostName = document.location.hostname;
	if(l_hostName != "")
		return l_hostName
	return getWorkingHostName();
}

function isAimUser(screenName)
{
	if(!isNaN(screenName))
		return false;
	return true;
}

function sortBuddies(a, b) {
	if ( a.Online && !b.Online )
		return -1;
	else if ( b.Online && !a.Online )
		return 1;
	else if ( a.DisplayName > b.DisplayName)
		return 1;
	else if ( a.DisplayName == b.DisplayName )
		return 0;
	else
		return -1;
}


function sortOnlineFirst ( pluginConnector,buddies )
{
	var tmp = new Array();
	var tmp2 = new Array();
	var buddiesCounte = buddies.count;

	for ( var i = 0 ; i < buddiesCounte ; i++ )
	{
		if ( buddies(i).Online )
			tmp[tmp.length] = buddies(i);
		else
			tmp2[tmp2.length] = buddies(i);
	}

	//sortBuddy(tmp);
	//sortBuddy(tmp2);
	return tmp.concat(tmp2);
}

function sortByCarlo ( pluginConnector,buddies,onLineOnly ) {
	var tmp = new Array();	// = Plugin.icq.GetObject("MISBBuddiesCollection");
	var tmp2 = new Array();
	var buddiesCounte = buddies.count;

	//if(onLineOnly == undefined)
	//	onLineOnly = true;


	for ( var i = 0 ; i < buddiesCounte ; i++ ) {
		if (onLineOnly && !buddies(i).Online )
		{
			continue;
		}

		var isSupprotExtra =  pluginConnector.GetBuddyData(buddies(i).ScreenName,"SUPPORTS_XTRAZ");
		if( isSupprotExtra )
			tmp[tmp.length] = buddies(i);
		else
			tmp2[tmp2.length] = buddies(i);
	}

	sortBuddy(tmp);
	sortBuddy(tmp2);
	return tmp.concat(tmp2);
}

function sortBuddy(arr)
{
	var tmp;
	for ( var i = 0 ; i < arr.length ; i++ )
	{
		if(i+1 < arr.length)
		{
			var name1 = arr[i].DisplayName
			var name2 = arr[i+1].DisplayName

			try
			{
				name1 = name1.toLocaleLowerCase();
				name2 = name2.toLocaleLowerCase()
			}
			catch(e){}
			if( name1 > name2 )
			{
				tmp = arr[i+1];
				arr[i+1] = arr[i];
				arr[i] = tmp;
				i = -1;
			}
		}
	}
}

function getIcqConnector () {
		window.focus();
		icqConnector = document.getElementById("plugin");
		connectorInit(icqConnector);
//		gPlugin = new PlugIn(connectorInit);
		return icqConnector;
}

function connectorInit ( connector ) {
	var parms = getParams();
	var id =  parms.id;
	var mode = parms.mode;
	if( !id )
		return;
	try {
		connector.Initialize(id);
	} catch(e) {
		  alert(e.name + ": " + e.message);
		  alert(e.number + ": " + e.description);
	}
}

function getParams () {
	var spliteBy = "?";
	if( document.location.href.indexOf("#") != -1)
		spliteBy = "#";
		
	var tmp = document.location.href.split(spliteBy);
	var obj = {id:"",mode:""};
	if ( tmp.length < 2 ) {
		alert("there are no params in the url");
		return obj;
	}

	var url = tmp[1].split("&");
	for( var i = 0; i < url.length; i++ ) {
		var param = url[i].split("=");
		if ( param[0] == "id" )
			obj.id = param[1];
		if ( param[0] == "mode" )
			obj.mode = param[1];
	}

	return obj;
}

	// return true when this xtra is local cached
function isLocal()
{
	if(document.location.hostname =="")
		return true;
	return false;
}


var gTextsXml = null  // the languag texts xml
var gTexts = null  // the languag texts hash
var gDir = "ltr" // the langueg direction

/*
 ***** this function loades the language text xml to a global array ****
 the text can be acceced with getTxt("tagName") function
 Note: the function should be fired befor the page that uses the text is loaded.
*/

function loadLanguage(isXtrazLocalDhtml,connector,xtraID)
{
	var success
	gTextsXml = new ActiveXObject("Msxml.DOMDocument");
	gTexts = new Array();
	gTextsXml.async = false;

	var url = null
	if(isXtrazLocalDhtml || isLocal())
		url = "text.xml"
	else
		url = gerLengXml(connector,xtraID);

	success = gTextsXml.load(url);

	if(!success)
	{
		alert("Language is not supported!");
		return false;
	}


	// insert else for the server based xtraz
	gTexts = fromXmlToHash(gTextsXml);
	return true;
}

function getDir(inXml)
{
	var element = inXml.documentElement.firstChild.attributes
	for(var i=0;i<element.length;i++)
		if(element[i].name == "dir")
			return element[i].nodeValue
	return "ltr";
}

/* Test if an object is null */
function isNull(obj)
{
    return ( (typeof obj == 'object') && !obj );
}

// parse the xml into hash
function fromXmlToHash(inXml)
{
	var currNode = inXml.documentElement.firstChild.childNodes;
	gDir = getDir(inXml);

	var tempArray = new Array();
	for(var i=0;i < currNode.length ; i++)
	{
		try{
		    if (!isNull(currNode(i).firstChild.nodeValue))
		    {
				tempArray[currNode(i).tagName] = currNode(i).firstChild.nodeValue
		    }
			else
			{
			    tempArray[currNode(i).tagName] = currNode(i);
			}
		}
		catch(e){}
	}
	return  tempArray;
}

function gerLengXml(connector,xtraID)
{
	var lngID = connector.GetIMClientData("LANG_ID") ;
	var country = getHashByValue(g_lang,lngID)
	return "/xtraz/txt/"+ xtraID +"/"+ country +"/text.xml"

}

function getHashByValue(arr,value)
{
	for (key in arr)
    {
		if(value == arr[key])
	  		return key;
	}
	return null;


}

function drewTxt(key)
{
	var txt = ""
	try{
		txt = top.gTexts[key]
	}
	catch(e)
	{

	}

	document.write(txt);
}

function getTxt(key)
{
	var txt = ""
	try{
		txt = top.gTexts[key]
		if(isEmpty(txt))
		return ""
	}
	catch(e)
	{

	}

	return txt;
}

// returns the version number of the ie
function getIeVersion()
{
	var version = window.navigator.appVersion
	var start = version.indexOf("MSIE ") + 5;
	return parseFloat( version.substr(start,3));
}

function errorHandler(errType, errURL,errLineNum)
{
	if(gDebug)
		alert("errType:" + errType + ", errURL:" + errURL + ", errLineNum:" + errLineNum)
	else
		return true
}

function getXml(async)
{
	var l_xmlDoc = new ActiveXObject("Msxml.DOMDocument");
	l_xmlDoc.async = async;
	return l_xmlDoc
}


function getContentUrl(connector,fileName)
{
	var ver = connector.GetIMClientData("CLIENT_VERSION");
	var dist = connector.GetIMClientData("DISTRIBUTION_ID");
	return "http://xtraz.icq.com/xtraz/content/" + g_versionMap[ver] + "/" + dist +"/" + fileName;
}


function GetPreferences(global,plugin,tag,connector)
{
   	if(isEmpty(connector))
		connector = icqConnector

	if (isEmpty(global))
        global = false;

    var xmlDoc = getXml(false)
    var xmlPrefs = '';
    var data = false;
    
    try
    {
    	var xmlPrefs = connector.GetPrefsValues(global,plugin);
    	data = xmlDoc.loadXML(xmlPrefs);
    }
    catch (e) {}

	if(!data)
		return xmlPrefs

    data_xml = xmlDoc.documentElement;
    var DadyNodeChilds = xmlDoc.selectNodes("//"+tag+"/*");

    resxml = '';

    if (DadyNodeChilds.length > 0)
    	for (var i=0; i < DadyNodeChilds.length; i++)
      		resxml = resxml + DadyNodeChilds.item(i).xml;
	else
	{
	    CurrentNode = xmlDoc.selectSingleNode("//"+tag);
	    //alert(CurrentNode.xml)
	    if (CurrentNode)
	    	resxml = CurrentNode.text;
	}
    return resxml;
}


function SavePreferences(global,plugin,tag,xmlData,connector)
{
    if (isEmpty(global))
        global = false;
	if(isEmpty(connector))
		connector = icqConnector

    var xmlDoc = getXml(false)
    var xmlPrefs = '';
    var data = false;

    try
    {
    	var xmlPrefs = connector.GetPrefsValues(global,plugin);
    	data = xmlDoc.loadXML(xmlPrefs);
    }
    catch (e) {}

    if (isEmpty(tag) || tag == "" )
    {
        connector.SetPrefsValues( global , xmlData , plugin);
        return;
    }

    data_xml = xmlDoc.documentElement;

    if(data_xml == null)
    	prefsxml = '';
    else
    	prefsxml = data_xml.xml
    	
    var xmlDoc2 = getXml(false)
	data2 = xmlDoc2.loadXML(xmlData);
	data2_xml = xmlDoc2.documentElement;

    dady_node_name = tag;
    try
	{
		data2_xml.xml;
		Node2Insert = xmlDoc2.selectSingleNode("/*");
	}
	catch(e)
	{
    	Node2Insert = null;
	}

    var DadyNode = xmlDoc.selectSingleNode("//"+dady_node_name);
    var DadyNodeChilds = xmlDoc.selectNodes("//"+dady_node_name+"/*");
    for (var i=0; i < DadyNodeChilds.length; i++)
	    DadyNode.removeChild(DadyNodeChilds.item(i));

	try
	{
	    // If the "tag" isn't present in the xml we go to catch...
		DadyNode.text = '';
		
	    if (Node2Insert != null)
			DadyNode = DadyNode.appendChild(Node2Insert);
		else
			DadyNode.text = xmlData;

	    outData = data_xml.xml;
	    
	}
	catch(e)
	{
	    data2 = xmlDoc2.loadXML('<'+tag+'>'+xmlData+'</'+tag+'>');
	    Node2Insert = xmlDoc2.selectSingleNode("/*");
	    DadyNode = xmlDoc.selectSingleNode("//"+plugin);
	    
	    if (DadyNode != null)
	    {
	    	DadyNode = DadyNode.appendChild(Node2Insert);
			outData = data_xml.xml;
	    }
	    else
			outData = '<'+tag+'>'+xmlData+'</'+tag+'>';
	}

	connector.SetPrefsValues( global , outData , plugin);
}


function isEmpty(param)
{
	if(	typeof(param) == "undefined" )
		return true;
	return false;
}

function AppendPreferences(global,plugin,tag,xmlData,connector)
{
    if (isEmpty(global))
        global = false;
	if(isEmpty(connector))
		connector = icqConnector


    var xmlDoc = getXml(false)
    var xmlPrefs = connector.GetPrefsValues(global,plugin);
    data = xmlDoc.loadXML(xmlPrefs);


    if (isEmpty(tag) || tag == "" )
    {
        connector.SetPrefsValues( global , xmlData , plugin);
        return;
    }

    data_xml = xmlDoc.documentElement;
    var xmlDoc2 = getXml(false)
	data2 = xmlDoc2.loadXML(xmlData);
	data2_xml = xmlDoc2.documentElement;

    dady_node_name = tag;
    try
	{
		data2_xml.xml;
		Node2Insert = xmlDoc2.selectSingleNode("/*");
	}
	catch(e)
	{
    	Node2Insert = null;
	}

    var DadyNode = xmlDoc.selectSingleNode("//"+dady_node_name);
    var DadyNodeChilds = xmlDoc.selectNodes("//"+dady_node_name+"/*");

	try
	{

	    if (Node2Insert != null)
			DadyNode = DadyNode.appendChild(Node2Insert);
		else
			DadyNode.text = xmlData;

	    outData = data_xml.xml;
	}
	catch(e)
	{
		outData = '<'+tag+'>'+xmlData+'</'+tag+'>';
	}

	connector.SetPrefsValues( global , outData , plugin);
}

function SetCookie ( name, value, expires, path, domain, secure )
{
	if ( name.length == 0 ) return;

	document.cookie = name + "=" + escape (value) +
    ((expires) ? "; expires=" + expires.toGMTString() : "Never") +
    ((path) ? "; path=" + path : "") +
    ((domain) ? "; domain=" + domain : "") +
    ((secure) ? "; secure" : "");
}

function GetCookie ( name )
{
	if ( name.length == 0 ) return 0;
	var arg = name + "=";
	var alen = arg.length;
	var clen = document.cookie.length;
	var i = 0;

	while ( i < clen )
	{
		var j = i + alen;
		if ( document.cookie.substring(i, j) == arg )
			return getCookieVal (j);

		i = document.cookie.indexOf(" ", i) + 1;
		if ( i == 0 ) break;
	}

	return 0;
}


function getCookieVal ( offset )
{
	var endstr = document.cookie.indexOf (";", offset);
	if ( endstr == -1 )
		endstr = document.cookie.length;

	return unescape(document.cookie.substring(offset, endstr));
}

function isUndefined(variable)
{
    // works on ie 5
	if (typeof(variable) == "undefined")
		return true;
	else
	    return false;
}

function isInt(chaine)
{
	var ch;

	if ( chaine == null || chaine == "" )
		return false;

	for (i = 0; i < chaine.length; i++)
	{
		ch = chaine.charAt(i);
		if ( ch < "0" || ch > "9" )
			return false;
	}
	return true;
}


// this adds to xml tags and value and makes a valid xml
function addElement(root,tagName,value)
{
	var lXml = top.getXml(false)
	newElemet = lXml.createElement(tagName);
	if(!top.isEmpty(value))
		newElemet.text = value;
	root.appendChild(newElemet);
	return newElemet
}

function CheckState(xmldoc)
{
  var state = xmldoc.readyState;
  if (state == 4)
  {
    var err = xmldoc.parseError;
    if (err.errorCode != 0)
      return false
    else return true
  }
}

function gIsTargeted (pId)
	{
		try
		{
			if ( top.icqConnector.IsShortcut(pId) == -1 )
				return false
		}
		catch(e){return false}
		
		return true
	}


window.onload = getIcqConnector;

document.onerror = errorHandler;
