
var undefined;

var XtrazUtils = new Object;

/********* Browser detection *************/
XtrazUtils.browser = new Object;

var appName = navigator.appVersion.toLowerCase();
var agent = navigator.userAgent.toLowerCase(); 

XtrazUtils.browser.isIE = (appName.indexOf("msie") >= 0);
XtrazUtils.browser.isGecko = (appName.indexOf("gecko") >= 0);
XtrazUtils.browser.isDOM = (typeof(document.getElementById) == "function");
XtrazUtils.browser.isWindows = (agent.indexOf("windows") >= 0);
XtrazUtils.browser.is98 = (agent.indexOf("98") > 0);

/********* End Browser detection *************/

XtrazUtils.gTextPool = null;
XtrazUtils.gLangMap =null;
XtrazUtils.gDir = "ltr" // the langueg direction
XtrazUtils.gXmlDoc = null;

XtrazUtils.isLocalXtra = function() {
	return (window.location.hostname =="");
}

XtrazUtils.getIeVersion = function() {
	var version = window.navigator.appVersion
	var start = version.indexOf("MSIE ") + 5;
	return parseFloat( version.substr(start,3));
}

XtrazUtils.loadLanguage = function(bLocal, connector, xtraID)
{
	var success = false;
	var xmlDoc = XMLUtils.makeDocument();
	if (! xmlDoc) {
		return false;
	}

	var url = null
	if( bLocal || XtrazUtils.isLocalXtra() ) {
		bLocal = true;
		url = "text.xml";
	}
	else {
		url = XtrazUtils.getLanguageXMLPath(connector,xtraID);
	}
	

	success = xmlDoc.load(url);
	XtrazDebug.trace("lang url", url, "doc", typeof(xmlDoc), "success", success);
	
	if (! success && ! bLocal) { // default to English
		url = XtrazUtils.getLanguageXMLPath(connector,xtraID, "Eng");
		success = xmlDoc.load(url);	
	}
	if (success) {
		if (XMLUtils.getParseError(xmlDoc) != 0) {
			
			success = false;
		}
		else {
		  XtrazUtils.gXmlDoc = xmlDoc;
			var productNode = xmlDoc.selectSingleNode("//product");
			if (productNode) {
				var dir = productNode.getAttribute("dir");
				if (XtrazUtils.isNonEmpty(dir))
					XtrazUtils.gDir = dir;
				XtrazUtils.gTextPool = XMLUtils.xmlToHash(productNode,"//product");
				success = true;
			}
			else {
				success = false;
			}
		}
	}
	if (! success) {
		
	}

	return success;
}

XtrazUtils.getLanguageXMLPath = function(connector, xtraID, sLanguage)
{
	if (! XtrazUtils.gLangMap) {
		XtrazUtils.gLangMap = new XtrazUtils.KeyValueMap();
		XtrazUtils.gLangMap.adopt(g_lang);
	}
	if (XtrazUtils.isEmpty(sLanguage)) {
		var lngID = connector.GetIMClientData("LANG_ID") ;
		sLanguage = XtrazUtils.gLangMap.findKey(lngID);
	}
	return "/xtraz/txt/"+ xtraID +"/"+ sLanguage +"/text.xml"

}

XtrazUtils.getIntlStrings = function(/*... */) {
	var ret = new Array;
	var len = arguments.length;
	var str;
	for (var i =0; i < len; i++) {
		str = XtrazUtils.getIntlString(arguments[i], '');
		ret.push(str);
	}
	return ret;
}

XtrazUtils.getIntlString = function(strID, sDefault) {
	var txt = ""
	if (XtrazUtils.isEmpty(sDefault))
		sDefault = '';
	else
		sDefault = String(sDefault);
	try{
		txt = XtrazUtils.gTextPool[strID];
		if(XtrazUtils.isEmpty(txt)) {
			txt = sDefault;
		}
	}
	catch(e) 	{
		if(XtrazUtils.isEmpty(txt)) {
			txt = sDefault;
		}
	}
	return txt;
}

XtrazUtils.getIntlStringWithParams = function(tmpl /*, param1, param2... */) {
	var str = XtrazUtils.getIntlString(tmpl);
	var ret = '';
	if (str.length) {
		var arr = new Array; /* arguments.shift seems not to work on some systems */
		for (var i = 1; i < arguments.length; i++) {
			arr.push(arguments[i]);
		}
		ret = XtrazUtils.sprintf(str, arr);
	}
	return ret;
}

XtrazUtils.makeLocalURL = function(sURL, bProtocol) {
	var url = '';
	if (bProtocol == undefined)
		bProtocol = true;

	if (bProtocol) {
		url += window.location.protocol + '//';
	}
	url += window.location.hostname;
	var path = window.location.pathname;
	if (window.location.hostname == '')
		path = path.replace(/\\/g, "/");
		
	var ind = path.lastIndexOf("/");
	url += path.substring(0, path.lastIndexOf("/") + 1);
	url += sURL;
	return url;
}

XtrazUtils.paramsObject = null;

XtrazUtils.getParams = function(str) {
	var bUseDefault = XtrazUtils.isEmpty(str);
	if (bUseDefault) {
		if (this.paramsObject)
			return XtrazUtils.paramsObject;
		str = window.location.search;
	}
	var obj = new Object();

	if (str.length > 1) {
		str = str.substring(1, str.length);
		var pairs = str.split("&");
		for( var i = 0; i < pairs.length; i++ ) {
			var pair = pairs[i];
			var ind = pair.indexOf('=');
			if (ind > 0) {
				var key = pair.substring(0, ind);
				var val = pair.substring(ind + 1, pair.length);
				obj[key] = val;
//				myAlert("found parameter " + key + " value " + val);
			}
		}
	}
	else {
		XtrazDebug.trace('getparams: no search string');
	}
	if (bUseDefault)
		XtrazUtils.paramsObject = obj;
	return obj;
}

XtrazUtils.indexOfKey = function(arr, key, value) {
	for (var i = arr.length - 1; i >=0; i--) {
		if (arr[i][key] == value) {
			return i;
		}
	}
	return -1;
}

XtrazUtils.sprintf = function(tmpl) {
	var ret = '';
	var ind = 0;
	var nextInd = 0;
	var args;
	var nextArg;
	if ((arguments.length == 2) && (arguments[1] instanceof Array)) {
		nextArg = 0;
		args = arguments[1];
	}
	else {
		nextArg = 1;
		args = arguments;
	}
	for (var nArgs = args.length;
		nextArg < nArgs; nextArg++) {
		nextInd = tmpl.indexOf("%s", ind);
		if (nextInd >= 0) {
			ret += tmpl.substring(ind, nextInd);
			ret += args[nextArg];
			ind = nextInd + 2;
		}
		else { // no more substitute sites
			break;
		}
	}
	if (ind <= (tmpl.length - 1)) {
		ret += tmpl.substring(ind);
	}
	return ret;
}

XtrazUtils.applyStyleToObject = function(obj, styleName, bAdd) {
	if (arguments.length < 3) {
		bAdd = true;
	}
	if (bAdd)
		XtrazUtils.addStyleToObject(obj, styleName);
	else
		XtrazUtils.removeStyleFromObject(obj, styleName);
}

XtrazUtils.addStyleToObject = function(obj, styleName, bRemove) {
	obj = DOMUtils.getObject(obj);
	if (obj) {
		var theClass = DOMUtils.getObjectClass(obj);

		if (typeof(theClass) == "string") {
			var arr = theClass.split(' ');
			for (var i = arr.length - 1; i >= 0; i--) {
				if (arr[i] == styleName)
					return;
			}
			arr.push(styleName);
			var strclass = arr.join(' ');
			DOMUtils.setObjectClass(obj, strclass);
		}
		else {
			XtrazDebug.trace("addStyle", styleName,": class not found");
			DOMUtils.setObjectClass(obj, styleName);
		}
	}
	else {
		XtrazDebug.trace("addStyleToObject: not found");
	}
}

XtrazUtils.removeStyleFromObject = function(obj, styleName) {
	obj = DOMUtils.getObject(obj);
	if (obj) {
		var theClass = obj.className;
		if (typeof(theClass) == "string") {
			var arr = theClass.split(' ');
			for (var i = arr.length - 1; i >= 0; i--) {
				if (arr[i] == styleName) {
					arr.splice(i, 1);
					break;
				}
			}
			obj.className = arr.join(' ');
		}
	}
}

XtrazUtils.insertToCommandChain = function(obj, bAddHandler) {
	obj = DOMUtils.getObject(obj);
	if (obj) {
		if (arguments.length < 2)
			bAddHandler = true;
		if (XtrazUtils.isEmpty(obj.Command))
			obj.Command = null;
		if (XtrazUtils.isEmpty(obj.SuperCommander))
			obj.SuperCommander = null;
		if (typeof(obj.obeyCommand) != "function") {
			obj.obeyCommand = XtrazUtils.dispatchCommand;
		}
		obj.dispatchCommand = XtrazUtils.dispatchCommand;
		obj.doCommand = XtrazUtils.doCommand;
		if (bAddHandler) {
			var f = function() {
				arguments.callee.commander.doCommand();
			}
			f.commander = obj;
			XtrazUI.addEventListener(obj, "mouseup", f);
		}
	}
	else {
		XtrazDebug.trace("insertToCommandChain: bad object",obj);
	}
}

XtrazUtils.doCommand = function(param) {
	if (! XtrazUtils.isEmpty(this.Command))
		this.dispatchCommand(this.Command, this, param);
	else {
		XtrazDebug.trace("docommand: empty command");
	}
	return false;
}

XtrazUtils.dispatchCommand = function(cmd, p1, p2, p3, p4, p5) {
	try {
		this.SuperCommander.obeyCommand(cmd, p1, p2, p3, p4, p5);
	}
	catch (e) {
	
	}
}

XtrazUtils.cloneObject = function(obj, level) {
	var t = typeof(obj);
	if (undefined == level)
		level = 0;
	else if (level > 10) // probably endless recursion because of a circular reference
		return null;
	var ret;
	switch (t) {
		case "string":
			ret = new String(obj);
			break;
		case "number":
		case "boolean":
			ret = obj;
			break;
		default:
			if (obj instanceof Array) {
				ret = new Array(obj.length);
				for (var i = 0; i < obj.length; i++) {
					ret[i] = XtrazUtils.cloneObject(obj[i], level + 1);
				}
			}
			else if (obj instanceof Date) {
				ret = new Date();
				ret.setTime(obj.getTime());
			}
			else if (obj instanceof (Object)) {
				ret = new Object;
				for (var key in obj) {
					ret[key] = XtrazUtils.cloneObject(obj[key], level + 1);
				}
			}
			
			break;
	}
	return ret;	
}


XtrazUtils.ucFirst = function(str) {
	var ret = '';
	if (XtrazUtils.isNonEmpty(str)) {
		str = String(str);
		ret = str.charAt(0).toUpperCase();
		ret += str.substring(1);
	}
	return ret;
}

XtrazUtils.trimString = function(sInString, bFront, bBack) {
	var len = arguments.length;
	if (len < 3)
		bBack = true;
	if (len < 2)
		bFront = true;
	if (bFront)
		sInString = sInString.replace( /^\s+/g, "" );// strip leading
	if (bBack)
		sInString = sInString.replace( /\s+$/g, "" );// strip trailing
	return sInString;
}

XtrazUtils.isNull = function (obj) {
	return (obj == null) || (obj == undefined);
}

XtrazUtils.makeString = function(obj) {
	var ret = '';
	if (XtrazUtils.isNonEmpty(obj))
		ret = String(obj);
	return ret;		
}


XtrazUtils.isEmpty = function(obj) {
	var t = typeof(obj);
	if (t == "string") {
		ret = (obj.length == 0);
	}
	else {
		ret = XtrazUtils.isNull(obj);
	}
	return ret;
}

XtrazUtils.isNonEmpty = function(obj) {
	var ret = false;
	try {
		var t = typeof(obj);
		switch (t) {
			case "number":
			case "boolean":
				ret = true;
				break;
			case "string":
				ret = (obj.length > 0);
				break;
		}
	}
	catch (e) {
	
	}
	return ret;
}

XtrazUtils.random = function(from, to) {
	switch (arguments.length) {
		case 0:
			from = 0;
			to =0xEFFFFFFF;
			break;
		case 1:
			to =Number(from);
			from = 0;
			break;
		default:
			from = Number(from);
			to = Number(to);
			break;
	}
	if (from == to)
		return from;

	var seed;
	do {
		seed = Math.random();
	} while (seed == 0);
	var limit = to - from;
	if (limit < 0)
		limit = -limit;
	seed = Math.round(0xEFFFFFF / seed);
	seed %= limit;
	return seed + from;
}


XtrazUtils.getLastDayOfMonth = function(aDate) {
	var d = new Date;
	d.setTime(aDate.getTime());

	var m = d.getMonth();
	if (m < 11)
		m++;
	else {
		m = 0;
		d.setFullYear(d.getFullYear() + 1);
	}
	d.setMonth(m);
	d.setDate(1);
	d.setHours(0);
	d.setMinutes(0);
	d.setSeconds(1);

	d.setTime(d.getTime() - 80000);
	return d;
}

//********* Array functions ************//

XtrazUtils.indexInArray = function(arr, val, field, start) {
	if (arguments.length < 4)
		start = 0;
	try {
		var len = arr.length;
		var bFound = false;
		for (var i = start; i < len; i++) {
			if (field != undefined)
				bFound = arr[i][field] == val;
			else
				bFound = arr[i] == val;
			if (bFound)
				return i;
		}
	}
	catch (e) {
	
	}
	return -1;
}

XtrazUtils.arrayContains = function(arr, val, field) {
	var ind = XtrazUtils.indexInArray(arr, val, field);
	return (ind >= 0);
}

XtrazUtils.findInArray = function(arr, val, field) {
	var ret = null;
	var ind = XtrazUtils.indexInArray(arr, val, field);
	if (ind >= 0) {
		ret = arr[ind];
	}
	return ret;
}

XtrazUtils.removeFromArray = function(arr, val, field, bAll) {
	if (arguments.length < 4)
		bAll = true;
	var bOnce = ! bAll;
	var ret = null;
	var start = 0;
	while (1) {
		var ind = XtrazUtils.indexInArray(arr, val, field, start);
		if (ind >= 0) {
			ret = arr[ind];
			arr.splice(ind, 1);
		}
		if (bOnce || (ind < 0))
			break;
		start = ind;
	}
	return ret;
}

//********* End Array functions ************//


//*********** KeyValueMap helper object *********//
XtrazUtils.KeyValueMap = function() {
	this._map = new Object;
}

XtrazUtils.KeyValueMap.prototype = new Object;

XtrazUtils.KeyValueMap.prototype.adopt = function(obj) {
	if (this._map) {
		delete this._map;
	}
	this._map = obj;
}

XtrazUtils.KeyValueMap.prototype.map = function() {
	var arg1, arg2;
	if (arguments.length == 1) {
		arg1 = arguments[0];
		for (var key in arg1) {
			this._map[key] = arg1[key];
		}
	}
	else {
		for (var i = 1; i < arguments.length; i+=2) {
			this._map[arguments[i-1]] = arguments[i];
		}
	}
}

XtrazUtils.KeyValueMap.prototype.findValue = function(sKey) {
	var ret = this._map[sKey];
	if (undefined == ret)
		ret = null;
	return ret;
}

XtrazUtils.KeyValueMap.prototype.findKey = function(sValue) {
	for (var key in this._map) {
		if (this._map[key] == sValue)
			return key;
	}
	return null;
}

//*********** Cookies *********//

XtrazUtils.SetCookie = function( name, value, expires, path, domain, secure )
{
    alert('SetCookie-SMSkey--|'+XtrazUtils.GetCookie('SMSkey'))
    
	if ( name.length == 0 ) return;

	document.cookie = name + "=" + escape (value) +
    ((expires) ? "; expires=" + expires.toGMTString() : "Never") +
    ((path) ? "; path=" + path : "") +
    ((domain) ? "; domain=" + domain : "") +
    ((secure) ? "; secure" : "");
    
}

XtrazUtils.GetCookie = function( 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 XtrazUtils.getCookieVal (j);

		i = document.cookie.indexOf(" ", i) + 1;
		if ( i == 0 ) break;
	}

	return 0;
}


XtrazUtils.getCookieVal = function( offset )
{
	var endstr = document.cookie.indexOf (";", offset);
	if ( endstr == -1 )
		endstr = document.cookie.length;

	return unescape(document.cookie.substring(offset, endstr));
}

//*********** End Cookies *********//

//************** XML ****************//

XtrazUtils.getXml = function (async)
{
	var l_xmlDoc = new ActiveXObject("Msxml.DOMDocument");
	l_xmlDoc.async = async;
	return l_xmlDoc
}

//************** End XML ****************//

//************* Preferences ******************//

XtrazUtils.GetPreferences = function (global,plugin,tag,connector)
{
   	if(XtrazUtils.isEmpty(connector))
		connector = icqConnector

	if (XtrazUtils.isEmpty(global))
        global = false;

    var xmlDoc = XtrazUtils.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;
}


XtrazUtils.SavePreferences = function (global,plugin,tag,xmlData,connector)
{
    if (XtrazUtils.isEmpty(global))
        global = false;
	if(XtrazUtils.isEmpty(connector))
		connector = icqConnector

    var xmlDoc = XtrazUtils.getXml(false)
    var xmlPrefs = '';
    var data = false;

    try
    {
    	var xmlPrefs = connector.GetPrefsValues(global,plugin);
    	data = xmlDoc.loadXML(xmlPrefs);
    }
    catch (e) {}

    if (XtrazUtils.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 = XtrazUtils.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);
}

//************* End Preferences ******************//
