/*
	pitutil.js
	
	This file is part of the Pixeltamer Internet Toolkit. Copyright (C) 2007 pixeltamer.net	
*/

var i_Pit_sLogDiv=null;
var i_Pit_iMaxLines=30;
var i_Pit_axLogLines=new Array();
var i_Pit_xLogTimeStart=new Date();

var g_axScriptLoaded=new Object();
var g_axPitConfigS;
var g_axPitConfigU;
var g_sPitConfigAppName="";
var g_iPitConfigTimerID=-1;

/*
var xN=document.createElement("img");
xN.style.position="absolute";
xN.style.left="-100px";
xN.style.top="0px";
document.body.appendChild(xN);
xN.setAttribute("src","/test.jpg");
if(xN.src.length<8)
{
	alert("This site requires the right to set image elements.\nYour browser configuration prevents this.\nPlease open http://about:config and disable the dom.disable_image_src_set switch.");
};
*/

/*
	Unbelievable, but true: Original javascript arrays don't have a search method
*/
if(!Array.prototype.indexOf)
{
	Array.prototype.indexOf = function(p_xVal) {
		if(!p_xVal){return -1;};
		for(var iIdx in this)
		{
			if(this[iIdx]==p_xVal)
			{
				return iIdx;
			};
		};
		return -1;		
	};
};

if(typeof Array.prototype.push != "function"){
	Array.prototype.push = function (){
		for(var i=0; i<arguments.length; i++){
        	this[this.length] = arguments[i];
        }
		return this.length;
	}
}

if(typeof Array.prototype.exclude != "function"){
	Array.prototype.exclude = function (p_xVal){
		var iIdx=this.indexOf(p_xVal);
		if(iIdx!=-1) {this.splice(iIdx,1);};
	}
}

if(typeof Array.prototype.include != "function"){
	Array.prototype.include = function (p_xVal){
		var iIdx=this.indexOf(p_xVal);
		if(iIdx!=-1) {this.push(p_xVal);};
	}
}

if(typeof Array.prototype.equal != "function"){
	Array.prototype.equal = function (p_xA){
		var i,iC=this.length;
		if(iC!=p_xA.length){return false;};
		for(i=0;i<iC;i++)
		{
			if(this[i]!==p_xA[i]){return false;};
		};
		return true;
	}
}

function $(name)
{
	return document.getElementById(name);
};

function Node_getChildByAttrib(p_xNode,p_sName,p_sValue)
{
	var i,iC=p_xNode.childNodes.length;
	for (i=0;i<iC;i++)
	{
		var xCh=p_xNode.childNodes[i];
		if(xCh&&xCh.getAttribute&&xCh.getAttribute(p_sName)==p_sValue) {return xCh;};
	};
	return null;
};

function pit_CloneObj(what) {
	if(!what){return null;};
	if(what.hasOwnProperty)
	{
	    for (i in what)
	    {
	    	if(what.hasOwnProperty(i))
	    	{
		        if (typeof what[i] == 'object') {
		            this[i]=new pit_CloneObj(what[i]);
		        }
		        else
		        {
		            this[i] = what[i];
		        };
		    };
	    }
	}
	else
	{
	    for (i in what)
	    {
	        if (typeof what[i] == 'object') {
	            this[i]=new pit_CloneObj(what[i]);
	        }
	        else
	        {
	            this[i] = what[i];
	        };
	    }
	};
}

function pit_Clone(what) {
	if(typeof(what)=="object"){
		return new pit_CloneObj(what);
	}else{return what;};
};

function pit_MergeObjs(p_xA,p_xB)
{
	for(i in p_xB)
	{
		if(p_xB.hasOwnProperty(i))
		{
			p_xA[i]=p_xB[i];
		};
	};
};

if(typeof Object.prototype.GetSize != "function"){
	Object.prototype.GetSize = function () {
		var iRet=0;
		for (i in this) {iRet++;};
		return iRet;
	};
};


// JSON stuff
if (!Object.prototype.ToJSONString) {
    Array.prototype.ToJSONString = function () {
        var a = ['['], b, i, l = this.length, v;
        function p(s) {
            if (b) {
                a.push(',');
            }
            a.push(s);
            b = true;
        }
        for (i = 0; i < l; i += 1) {
            v = this[i];
            switch (typeof v) {
            case 'undefined':
            case 'function':
            case 'unknown':
                break;
            case 'object':
                if (v) {
                    if (typeof v.ToJSONString === 'function') {
                        p(v.ToJSONString());
                    }
                } else {
                    p("null");
                }
                break;
            default:
                p(v.ToJSONString());
            }
        }
        a.push(']');
        return a.join('');
    };

    Boolean.prototype.ToJSONString = function () {
        return String(this);
    };

    Date.prototype.ToJSONString = function () {
        function f(n) {
            return n < 10 ? '0' + n : n;
        }
        return '"' + this.getFullYear() + '-' +
                f(this.getMonth() + 1) + '-' +
                f(this.getDate()) + 'T' +
                f(this.getHours()) + ':' +
                f(this.getMinutes()) + ':' +
                f(this.getSeconds()) + '"';
    };
    Number.prototype.ToJSONString = function () {
        return isFinite(this) ? String(this) : "null";
    };
    Object.prototype.ToJSONString = function () {
        var a = ['{'], b, i, v;
        function p(s) {
            if (b) {
                a.push(',');
            }
            a.push(i.ToJSONString(), ':', s);
            b = true;
        }
        for (i in this) {
            if (this.hasOwnProperty(i)) {
                v = this[i];
                switch (typeof v) {
                case 'undefined':
                case 'function':
                case 'unknown':
                    break;
                case 'object':
                    if (v) {
                        if (typeof v.ToJSONString === 'function') {
                            p(v.ToJSONString());
                        }
                    } else {
                        p("null");
                    }
                    break;
                default:
                    p(v.ToJSONString());
                }
            }
        }
        a.push('}');
        return a.join('');
    };

    (function (s) {
        var m = {
            '\b': '\\b',
            '\t': '\\t',
            '\n': '\\n',
            '\f': '\\f',
            '\r': '\\r',
            '"' : '\\"',
            '\\': '\\\\'
        };

        s.ParseJSON = function (hook) {
            try {
                if (/^("(\\.|[^"\\\n\r])*?"|[,:{}\[\]0-9.\-+Eaeflnr-u \n\r\t])+?$/.
                        test(this)) {
                    var j = eval('(' + this + ')');
                    if (typeof hook === 'function') {
                        function walk(v) {
                            if (v && typeof v === 'object') {
                                for (var i in v) {
                                    if (v.hasOwnProperty(i)) {
                                        v[i] = walk(v[i]);
                                    }
                                }
                            }
                            return hook(v);
                        }
                        return walk(j);
                    }
                    return j;
                }
            } catch (e) {
            }
            throw new SyntaxError("parseJSON");
        };

        s.ToJSONString = function () {
            if (/["\\\x00-\x1f]/.test(this)) {
                return '"' + this.replace(/([\x00-\x1f\\"])/g, function(a, b) {
                    var c = m[b];
                    if (c) {
                        return c;
                    }
                    c = b.charCodeAt();
                    return '\\u00' +
                        Math.floor(c / 16).toString(16) +
                        (c % 16).toString(16);
                }) + '"';
            }
            return '"' + this + '"';
        };
    })(String.prototype);
}

/*
 *  md5.js 1.0b 27/06/96
 *
 * Javascript implementation of the RSA Data Security, Inc. MD5
 * Message-Digest Algorithm.
 *
 * Copyright (c) 1996 Henri Torgemane. All Rights Reserved.
 *
 * Permission to use, copy, modify, and distribute this software
 * and its documentation for any purposes and without
 * fee is hereby granted provided that this copyright notice
 * appears in all copies.
 *
 * Of course, this soft is provided "as is" without express or implied
 * warranty of any kind.
 *
 */
 
 

function ArrayInt(n) {
  for(i=0;i<n;i++) this[i]=0;
  this.length=n;
}

function integer(n) { return n%(0xffffffff+1); }

function shr(a,b) {
  a=integer(a);
  b=integer(b);
  if (a-0x80000000>=0) {
    a=a%0x80000000;
    a>>=b;
    a+=0x40000000>>(b-1);
  } else
    a>>=b;
  return a;
}

function shl1(a) {
  a=a%0x80000000;
  if (a&0x40000000==0x40000000)
  {
    a-=0x40000000;
    a*=2;
    a+=0x80000000;
  } else
    a*=2;
  return a;
}

function shl(a,b) {
  a=integer(a);
  b=integer(b);
  for (var i=0;i<b;i++) a=shl1(a);
  return a;
}

function and(a,b) {
  a=integer(a);
  b=integer(b);
  var t1=(a-0x80000000);
  var t2=(b-0x80000000);
  if (t1>=0)
    if (t2>=0)
      return ((t1&t2)+0x80000000);
    else
      return (t1&b);
  else
    if (t2>=0)
      return (a&t2);
    else
      return (a&b);
}

function or(a,b) {
  a=integer(a);
  b=integer(b);
  var t1=(a-0x80000000);
  var t2=(b-0x80000000);
  if (t1>=0)
    if (t2>=0)
      return ((t1|t2)+0x80000000);
    else
      return ((t1|b)+0x80000000);
  else
    if (t2>=0)
      return ((a|t2)+0x80000000);
    else
      return (a|b);
}

function xor(a,b) {
  a=integer(a);
  b=integer(b);
  var t1=(a-0x80000000);
  var t2=(b-0x80000000);
  if (t1>=0)
    if (t2>=0)
      return (t1^t2);
    else
      return ((t1^b)+0x80000000);
  else
    if (t2>=0)
      return ((a^t2)+0x80000000);
    else
      return (a^b);
}

function not(a) {
  a=integer(a);
  return (0xffffffff-a);
}

function MD5Builder()
{
    this.m_aiState = new ArrayInt(4);
    this.m_aiCount = new ArrayInt(2);
        this.m_aiCount[0] = 0;
        this.m_aiCount[1] = 0;
    this.m_aiBuffer = new ArrayInt(64);
    this.m_aiTransformBuffer = new ArrayInt(16);
    this.m_aiDigestBits = new ArrayInt(16);

    this.m_iS11 = 7;
    this.m_iS12 = 12;
    this.m_iS13 = 17;
    this.m_iS14 = 22;
    this.m_iS21 = 5;
    this.m_iS22 = 9;
    this.m_iS23 = 14;
    this.m_iS24 = 20;
    this.m_iS31 = 4;
    this.m_iS32 = 11;
    this.m_iS33 = 16;
    this.m_iS34 = 23;
    this.m_iS41 = 6;
    this.m_iS42 = 10;
    this.m_iS43 = 15;
    this.m_iS44 = 21;

    this.F=function(x,y,z) {
        return or(and(x,y),and(not(x),z));
    }

    this.G=function(x,y,z) {
        return or(and(x,z),and(y,not(z)));
    }

    this.H=function(x,y,z) {
        return xor(xor(x,y),z);
    }

    this.I=function(x,y,z) {
        return xor(y ,or(x , not(z)));
    }

    this.rotateLeft=function(a,n) {
        return or(shl(a, n),(shr(a,(32 - n))));
    }

    this.FF=function(a,b,c,d,x,s,ac) {
        a = a+this.F(b, c, d) + x + ac;
        a = this.rotateLeft(a, s);
        a = a+b;
        return a;
    }

    this.GG=function(a,b,c,d,x,s,ac) {
        a = a+this.G(b, c, d) +x + ac;
        a = this.rotateLeft(a, s);
        a = a+b;
        return a;
    }

    this.HH=function(a,b,c,d,x,s,ac) {
        a = a+this.H(b, c, d) + x + ac;
        a = this.rotateLeft(a, s);
        a = a+b;
        return a;
    }

    this.II=function(a,b,c,d,x,s,ac) {
        a = a+this.I(b, c, d) + x + ac;
        a = this.rotateLeft(a, s);
        a = a+b;
        return a;
    }

    this.transform=function(buf,offset) {
        var a=0, b=0, c=0, d=0;
        var x = this.m_aiTransformBuffer;

        a = this.m_aiState[0];
        b = this.m_aiState[1];
        c = this.m_aiState[2];
        d = this.m_aiState[3];

        for (i = 0; i < 16; i++) {
            x[i] = and(buf[i*4+offset],0xff);
            for (j = 1; j < 4; j++) {
                x[i]+=shl(and(buf[i*4+j+offset] ,0xff), j * 8);
            }
        }

        /* Runde 1 */
        a = this.FF ( a, b, c, d, x[ 0], this.m_iS11, 0xd76aa478); /* 1 */
        d = this.FF ( d, a, b, c, x[ 1], this.m_iS12, 0xe8c7b756); /* 2 */
        c = this.FF ( c, d, a, b, x[ 2], this.m_iS13, 0x242070db); /* 3 */
        b = this.FF ( b, c, d, a, x[ 3], this.m_iS14, 0xc1bdceee); /* 4 */
        a = this.FF ( a, b, c, d, x[ 4], this.m_iS11, 0xf57c0faf); /* 5 */
        d = this.FF ( d, a, b, c, x[ 5], this.m_iS12, 0x4787c62a); /* 6 */
        c = this.FF ( c, d, a, b, x[ 6], this.m_iS13, 0xa8304613); /* 7 */
        b = this.FF ( b, c, d, a, x[ 7], this.m_iS14, 0xfd469501); /* 8 */
        a = this.FF ( a, b, c, d, x[ 8], this.m_iS11, 0x698098d8); /* 9 */
        d = this.FF ( d, a, b, c, x[ 9], this.m_iS12, 0x8b44f7af); /* 10 */
        c = this.FF ( c, d, a, b, x[10], this.m_iS13, 0xffff5bb1); /* 11 */
        b = this.FF ( b, c, d, a, x[11], this.m_iS14, 0x895cd7be); /* 12 */
        a = this.FF ( a, b, c, d, x[12], this.m_iS11, 0x6b901122); /* 13 */
        d = this.FF ( d, a, b, c, x[13], this.m_iS12, 0xfd987193); /* 14 */
        c = this.FF ( c, d, a, b, x[14], this.m_iS13, 0xa679438e); /* 15 */
        b = this.FF ( b, c, d, a, x[15], this.m_iS14, 0x49b40821); /* 16 */

        /* Runde 2 */
        a = this.GG ( a, b, c, d, x[ 1], this.m_iS21, 0xf61e2562); /* 17 */
        d = this.GG ( d, a, b, c, x[ 6], this.m_iS22, 0xc040b340); /* 18 */
        c =this.GG( c, d, a, b, x[11], this.m_iS23, 0x265e5a51); /* 19 */
        b =this.GG( b, c, d, a, x[ 0], this.m_iS24, 0xe9b6c7aa); /* 20 */
        a =this.GG( a, b, c, d, x[ 5], this.m_iS21, 0xd62f105d); /* 21 */
        d =this.GG( d, a, b, c, x[10], this.m_iS22,  0x2441453); /* 22 */
        c =this.GG( c, d, a, b, x[15], this.m_iS23, 0xd8a1e681); /* 23 */
        b =this.GG( b, c, d, a, x[ 4], this.m_iS24, 0xe7d3fbc8); /* 24 */
        a =this.GG( a, b, c, d, x[ 9], this.m_iS21, 0x21e1cde6); /* 25 */
        d =this.GG( d, a, b, c, x[14], this.m_iS22, 0xc33707d6); /* 26 */
        c =this.GG( c, d, a, b, x[ 3], this.m_iS23, 0xf4d50d87); /* 27 */
        b =this.GG( b, c, d, a, x[ 8], this.m_iS24, 0x455a14ed); /* 28 */
        a =this.GG( a, b, c, d, x[13], this.m_iS21, 0xa9e3e905); /* 29 */
        d =this.GG( d, a, b, c, x[ 2], this.m_iS22, 0xfcefa3f8); /* 30 */
        c =this.GG( c, d, a, b, x[ 7], this.m_iS23, 0x676f02d9); /* 31 */
        b =this.GG( b, c, d, a, x[12], this.m_iS24, 0x8d2a4c8a); /* 32 */

        /* Runde 3 */
        a =this.HH( a, b, c, d, x[ 5], this.m_iS31, 0xfffa3942); /* 33 */
        d =this.HH( d, a, b, c, x[ 8], this.m_iS32, 0x8771f681); /* 34 */
        c =this.HH( c, d, a, b, x[11], this.m_iS33, 0x6d9d6122); /* 35 */
        b =this.HH( b, c, d, a, x[14], this.m_iS34, 0xfde5380c); /* 36 */
        a =this.HH( a, b, c, d, x[ 1], this.m_iS31, 0xa4beea44); /* 37 */
        d =this.HH( d, a, b, c, x[ 4], this.m_iS32, 0x4bdecfa9); /* 38 */
        c =this.HH( c, d, a, b, x[ 7], this.m_iS33, 0xf6bb4b60); /* 39 */
        b =this.HH( b, c, d, a, x[10], this.m_iS34, 0xbebfbc70); /* 40 */
        a =this.HH( a, b, c, d, x[13], this.m_iS31, 0x289b7ec6); /* 41 */
        d =this.HH( d, a, b, c, x[ 0], this.m_iS32, 0xeaa127fa); /* 42 */
        c =this.HH( c, d, a, b, x[ 3], this.m_iS33, 0xd4ef3085); /* 43 */
        b =this.HH( b, c, d, a, x[ 6], this.m_iS34,  0x4881d05); /* 44 */
        a =this.HH( a, b, c, d, x[ 9], this.m_iS31, 0xd9d4d039); /* 45 */
        d =this.HH( d, a, b, c, x[12], this.m_iS32, 0xe6db99e5); /* 46 */
        c =this.HH( c, d, a, b, x[15], this.m_iS33, 0x1fa27cf8); /* 47 */
        b =this.HH( b, c, d, a, x[ 2], this.m_iS34, 0xc4ac5665); /* 48 */

        /* Runde 4 */
        a =this.II( a, b, c, d, x[ 0], this.m_iS41, 0xf4292244); /* 49 */
        d =this.II( d, a, b, c, x[ 7], this.m_iS42, 0x432aff97); /* 50 */
        c =this.II( c, d, a, b, x[14], this.m_iS43, 0xab9423a7); /* 51 */
        b =this.II( b, c, d, a, x[ 5], this.m_iS44, 0xfc93a039); /* 52 */
        a =this.II( a, b, c, d, x[12], this.m_iS41, 0x655b59c3); /* 53 */
        d =this.II( d, a, b, c, x[ 3], this.m_iS42, 0x8f0ccc92); /* 54 */
        c =this.II( c, d, a, b, x[10], this.m_iS43, 0xffeff47d); /* 55 */
        b =this.II( b, c, d, a, x[ 1], this.m_iS44, 0x85845dd1); /* 56 */
        a =this.II( a, b, c, d, x[ 8], this.m_iS41, 0x6fa87e4f); /* 57 */
        d =this.II( d, a, b, c, x[15], this.m_iS42, 0xfe2ce6e0); /* 58 */
        c =this.II( c, d, a, b, x[ 6], this.m_iS43, 0xa3014314); /* 59 */
        b =this.II( b, c, d, a, x[13], this.m_iS44, 0x4e0811a1); /* 60 */
        a =this.II( a, b, c, d, x[ 4], this.m_iS41, 0xf7537e82); /* 61 */
        d =this.II( d, a, b, c, x[11], this.m_iS42, 0xbd3af235); /* 62 */
        c =this.II( c, d, a, b, x[ 2], this.m_iS43, 0x2ad7d2bb); /* 63 */
        b =this.II( b, c, d, a, x[ 9], this.m_iS44, 0xeb86d391); /* 64 */

        this.m_aiState[0] +=a;
        this.m_aiState[1] +=b;
        this.m_aiState[2] +=c;
        this.m_aiState[3] +=d;

    }

    this.init=function() {
        this.m_aiCount[0]=this.m_aiCount[1] = 0;
        this.m_aiState[0] = 0x67452301;
        this.m_aiState[1] = 0xefcdab89;
        this.m_aiState[2] = 0x98badcfe;
        this.m_aiState[3] = 0x10325476;
        for (i = 0; i < this.m_aiDigestBits.length; i++)
            this.m_aiDigestBits[i] = 0;
    }

    this.update=function(b) {
        var index,i;

        index = and(shr(this.m_aiCount[0],3) , 0x3f);
        if (this.m_aiCount[0]<0xffffffff-7)
          this.m_aiCount[0] += 8;
        else {
          this.m_aiCount[1]++;
          this.m_aiCount[0]-=0xffffffff+1;
          this.m_aiCount[0]+=8;
        }
        this.m_aiBuffer[index] = and(b,0xff);
        if (index  >= 63) {
            this.transform(this.m_aiBuffer, 0);
        }
    }

    this.finish=function() {
        var bits = new ArrayInt(8);
        var        padding;
        var        i=0, index=0, padLen=0;

        for (i = 0; i < 4; i++) {
            bits[i] = and(shr(this.m_aiCount[0],(i * 8)), 0xff);
        }
        for (i = 0; i < 4; i++) {
            bits[i+4]=and(shr(this.m_aiCount[1],(i * 8)), 0xff);
        }
        index = and(shr(this.m_aiCount[0], 3) ,0x3f);
        padLen = (index < 56) ? (56 - index) : (120 - index);
        padding = new ArrayInt(64);
        padding[0] = 0x80;
        for (i=0;i<padLen;i++)
          this.update(padding[i]);
        for (i=0;i<8;i++)
          this.update(bits[i]);

        for (i = 0; i < 4; i++) {
            for (j = 0; j < 4; j++) {
                this.m_aiDigestBits[i*4+j] = and(shr(this.m_aiState[i], (j * 8)) , 0xff);
            }
        }
    }
};

function MD5(p_sMsg)
{
	var l,s,k,ka,kb,kc,kd;
	var ascii="01234567890123456789012345678901" +
          " !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ"+
          "[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~";

	var xMD5=new MD5Builder();
	xMD5.init();
	for (k=0;k<p_sMsg.length;k++)
	{
		l=p_sMsg.charAt(k);
		xMD5.update(ascii.lastIndexOf(l));
	}
	xMD5.finish();
	ka=kb=kc=kd=0;
	for (i=0;i<4;i++) ka+=shl(xMD5.m_aiDigestBits[15-i], (i*8));
	for (i=4;i<8;i++) kb+=shl(xMD5.m_aiDigestBits[15-i], ((i-4)*8));
	for (i=8;i<12;i++) kc+=shl(xMD5.m_aiDigestBits[15-i], ((i-8)*8));
	for (i=12;i<16;i++) kd+=shl(xMD5.m_aiDigestBits[15-i], ((i-12)*8));
	s=pit_Dword2HexString(kd)+pit_Dword2HexString(kc)+pit_Dword2HexString(kb)+pit_Dword2HexString(ka);
	return s;
};

// end of MD5/logic doe

function pit_F(){return false;};

function pit_ReloadPage()
{
	history.go();
};

function pit_Dword2HexString(n)
{
	var hexa_h = "0123456789abcdef";
	var hexa_c="";
	var hexa_m=n;
	for(hexa_i=0;hexa_i<8;hexa_i++)
	{
		hexa_c=hexa_h.charAt(Math.abs(hexa_m)%16)+hexa_c;
		hexa_m=Math.floor(hexa_m/16);
	};
	return hexa_c;
};

function pit_SetCookie(p_sName,p_sValue,p_iDays) {
	if(p_iDays){
		var xDate = new Date();
		xDate.setTime(xDate.getTime()+(p_iDays*24*60*60*1000));
		var sExpires = "; expires="+xDate.toGMTString();
	}
	else
	{
		var sExpires = "";
	};
	document.cookie = p_sName+"="+p_sValue+sExpires+"; path=/";
}

function pit_GetCookie(p_sName,p_sDefault) {
	var sNameEQ=p_sName+"=";
	var aS=document.cookie.split(';');
	for(var i=0;i<aS.length;i++)
	{
		var sSub=aS[i];
		while(sSub.charAt(0)==' '){sSub=sSub.substring(1,sSub.length);};
		if(sSub.indexOf(sNameEQ)==0){return sSub.substring(sNameEQ.length,sSub.length);};
	}
	return p_sDefault;
}

function pit_EraseCookie(p_sName) {
	pit_SetCookie(p_sName,"",-1);
}

function pit_InitConfig(p_sAppName)
{
	g_sPitConfigAppName=p_sAppName;
	var xRPC=new PitRPC();
	xRPC.SetURL("/userauth.xrq");
	xRPC.SetFunction("getpref");
	xRPC.SetParams("app",p_sAppName);
	xRPC.OnSucceed=function(){
		if(xRPC.m_xResults)
		{
			try {
				g_axPitConfigU=xRPC.m_xResults.U.ParseJSON();
			} catch (e) {
				g_axPitConfigU={};
			};
			try {
				g_axPitConfigS=xRPC.m_xResults.S.ParseJSON();
			} catch (e) {
				g_axPitConfigS={};
			};
		}
		else
		{
			g_axPitConfigU={};
			g_axPitConfigS={};
			pit_UpdateSrvConfig();			
		};
	};
	xRPC.Send();
};

// get a config entry from the cfg cookie
function pit_ConfigGet(p_sName,p_sDefault)
{
	if(!g_axPitConfigS){g_axPitConfigS={};};
	if(!g_axPitConfigS[p_sName])
	{
		return p_sDefault;
	}
	else
	{
		return pit_Clone(g_axPitConfigS[p_sName]);
	};
};

function pit_ConfigGetU(p_sName,p_sDefault)
{
	if(!g_axPitConfigU){g_axPitConfigU={};};
	if(!g_axPitConfigU[p_sName])
	{
		return p_sDefault;
	}
	else
	{
		return pit_Clone(g_axPitConfigU[p_sName]);
	};
};

function pit_UpdateSrvConfig()
{
	g_iPitConfigTimerID=-1;
	var xRPC=new PitRPC();
	xRPC.SetURL("/userauth.xrq");
	xRPC.SetFunction("setpref");
	xRPC.SetParams("app",g_sPitConfigAppName);
	xRPC.SetParams("valu",g_axPitConfigU);
	xRPC.SetParams("vals",g_axPitConfigS);
	xRPC.SetComplex(true);
	xRPC.Send();
};

//
function pit_ConfigSet(p_sName,p_sValue)
{
	if(!g_axPitConfigS){g_axPitConfigS={};};
	if(g_axPitConfigS[p_sName]!=p_sValue)
	{
		g_axPitConfigS[p_sName]=p_sValue;
		if(g_iPitConfigTimerID!=-1){window.clearTimeout(g_iPitConfigTimerID);};
		g_iPitConfigTimerID=window.setTimeout(pit_UpdateSrvConfig,2500);
	};
};

function pit_ConfigSetU(p_sName,p_sValue)
{
	if(!g_axPitConfigU){g_axPitConfigU={};};
	if(g_axPitConfigU[p_sName]!=p_sValue)
	{
		g_axPitConfigU[p_sName]=p_sValue;
		if(g_iPitConfigTimerID!=-1){window.clearTimeout(g_iPitConfigTimerID);};
		g_iPitConfigTimerID=window.setTimeout(pit_UpdateSrvConfig,2500);
	};
};

function pit_ConfigGet2(p_sName,p_sDefault)
{
	var sV=g_xURLParameters.GetParamValue(p_sName);
	if(!sV)
	{
		sV=pit_ConfigGet(p_sName,p_sDefault);
	};
	return sV;
};

function pit_StopE(p_xE)
{
	if(!p_xE){var p_xE=window.event;}
	if(p_xE)
	{
		p_xE.cancelBubble=true;
		if(p_xE.stopPropagation){p_xE.stopPropagation();};
		if(p_xE.preventDefault){p_xE.preventDefault();};
		p_xE.returnValue=false;
	};
};

function pit_DumpObjToTable(p_xO)
{
	var xSB=new PitStringBuilder();
	xSB.Add("<table>");
    for (i in p_xO) {
        if(p_xO.hasOwnProperty(i)) {
        	xSB.Add("<tr><td>",i,"</td><td>",p_xO[i],"</td></tr>");
        }
    };
    xSB.Add("</table>");
	return xSB.GetString();
};

/*
	Inheritance for OO
	Example:
	
	function Base()
	{
	};
	
	Base.prototype.Fnc=function()
	{
	};
	
	function Deriv()
	{
		Base.BaseCTor.call(this);
	};
	Inherit(Deriv,Base);
	Deriv.prototype.Fnc=function()
	{
		Derv.Super.Fnc.call(this);
	};
*/
function Inherit(p_xSubClass,p_xBaseClass,p_sTypeName) {
	function Inheritance() {}
	Inheritance.prototype=p_xBaseClass.prototype;
	p_xSubClass.prototype=new Inheritance();
	p_xSubClass.prototype.Ctor=p_xSubClass;
	p_xSubClass.prototype.m_sTypeName=p_sTypeName;
	p_xSubClass.BaseCtor=p_xBaseClass;
	p_xSubClass.Super=p_xBaseClass.prototype;
}

function Assert(p_sExpr,p_sDesc)
{
	if(!p_sExpr)
	{
		if(p_sDesc)
		{
			pit_Log("Assert: ",p_sDesc," ",p_sExpr);
		}
		else
		{
			pit_Log("Assert: ",p_sExpr);
		};
//		debugger;
	};
};

function pit_IntSnap(p_iVal,p_iGrid,p_iOffset)
{
	if(p_iOffset){p_iVal-=p_iOffset;};
	p_iVal=Math.floor((p_iVal+p_iGrid/2)/p_iGrid)*p_iGrid;
	if(p_iOffset){p_iVal+=p_iOffset;};
	return p_iVal;
};

function pit_LoadScript(p_sURL,p_iAutoDeleteTimeout)
{
	var xScr=document.createElement("script"); 
	if(x_iSiteVersion)
	{
		if(p_sURL.indexOf('?')==-1)
		{
			p_sURL=p_sURL+"?ptversion="+x_iSiteVersion;
		};
	};
	xScr.setAttribute("src",p_sURL); 
	document.body.appendChild(xScr); 
	if(p_iAutoDeleteTimeout)
	{
		window.setTimeout(function(){document.body.removeChild(xScr);},p_iAutoDeleteTimeout);
	};
};

function pit_LoadScriptOnce(p_sURL)
{
	if(!g_axScriptLoaded[p_sURL])
	{
		if(x_iSiteVersion)
		{
			if(p_sURL.indexOf('?')==-1)
			{
				p_sURL=p_sURL+"?version="+x_iSiteVersion;
			};
		};
		var xScr=document.createElement("script"); 
		xScr.setAttribute("src",p_sURL); 
		document.body.appendChild(xScr); 
	}
	else
	{
		var xFnc=g_axScriptLoaded[p_sURL];
		if(xFnc!=1)
		{
			xFnc.call();
		};
	};
};

function pit_ScriptIsLoaded(p_sURL)
{
	if(g_axScriptLoaded[p_sURL])
	{
		return true;
	}
	else
	{
		return false;
	};
};

function pit_ScriptDone(p_sURL,p_xLoadHandler)
{
	if(p_xLoadHandler)
	{
		g_axScriptLoaded[p_sURL]=p_xLoadHandler;
		p_xLoadHandler.call();
	}
	else
	{
		g_axScriptLoaded[p_sURL]=1;
	};
};

// remove all outgoing references on an object. Prevents memory leaks
function pit_Purge(d){
	if(!d){return;};
	var a = d.attributes, i, l, n;
	if(a)
	{
		l=a.length;
		for(i=0;i<l;i+=1)
		{
			n=a[i].name;
			if(typeof d[n]==='function')
			{
				d[n]=null;
				try{
					delete d[n];
				}catch(e) {};
			};
		};
	};
	a=d.childNodes;
	if(a)
	{
		while(d.lastChild)
		{
			pit_Purge(d.lastChild);
			d.removeChild(d.lastChild);
		};
		/*
		l=a.length;
		for(i=0;i<l;i+=1)
		{
			var xC=d.childNodes[i];
			pit_Purge(d.childNodes[i]);
			delete d.childNodes[i];
		};
		*/
	};
	delete d;
};

function pit_ClearFnc(d){
	if(!d){return;};
	var a = d.attributes, i, l, n;
	if(a)
	{
		var sType='function';
		l=a.length;
		for(i=0;i<l;i++)
		{
			n=a[i].name;
			if(typeof d[n]===sType)
			{
				try{
					d[n]=null;
					delete d[n];
				}catch(e) {};
			};
		};
	};
	a=d.childNodes;
	if(a)
	{
		l=a.length;
		for(i=0;i<l;i++)
		{
			var xC=d.childNodes[i];
			if(xC)
			{
				pit_ClearFnc(xC);
			};
		};
	};
};

function pit_PurgeFncChk(d){
	if(!d){return;};
	var a = d.attributes, i, l, n;
	if(a)
	{
		var sType='function';
		l=a.length;
		for(i=0;i<l;i++)
		{
			n=a[i].name;
			if(typeof d[n]===sType)
			{
				debugger;
//				alert(n+" is a function");
				return;
			};
		};
	};
	a=d.childNodes;
	if(a)
	{
		l=a.length;
		for(i=0;i<l;i++)
		{
			var xC=d.childNodes[i];
			if(xC)
			{
				pit_PurgeFncChk(xC);
			};
		};
	};
};

function pit_PurgeFnc(d){
	if(!d){return;};
	var a = d.attributes, i, l, n;
	if(a)
	{
		var sType='function';
		l=a.length;
		for(i=0;i<l;i++)
		{
			n=a[i].name;
			if(typeof d[n]===sType)
			{
				try{
					d[n]=null;
					delete d[n];
				}catch(e) {};
			};
		};
	};
	a=d.childNodes;
	if(a)
	{
		l=a.length;
		for(i=0;i<l;i++)
		{
			var xC=d.childNodes[i];
			if(xC)
			{
				pit_PurgeFnc(xC);
			};
		};
	};
};

function pit_PurgeC(d){
	if(!d){return;};
	var a = d.attributes, i, l, n;
	if(a)
	{
		l=a.length;
		for(i=0;i<l;i+=1)
		{
			n=a[i].name;
			if(typeof d[n]==='function')
			{
				d[n]=null;
				try{
					delete d[n];
				}catch(e) {};
			};
		};
	};
	a=d.childNodes;
	if(a)
	{
		while(d.lastChild)
		{
			var lC=d.lastChild;
			d.removeChild(lC);
			pit_Purge(lC);
		};
		/*
		l=a.length;
		for(i=0;i<l;i+=1)
		{
			var xC=d.childNodes[i];
			pit_Purge(d.childNodes[i]);
			delete d.childNodes[i];
		};
		*/
	};
};

function pit_PurgeFlat(d){
	if(!d){return;};
	d.onclick=null;
	d.onkeyup=null;
	d.onkeydown=null;
	d.onmouseover=null;
	d.onmouseout=null;
	d.onmousedown=null;
	d.onmouseup=null;
	d.pithnd=null;
};

function pit_SetIH(e,t)
{
	if(e)
	{
		if(e.firstChild)
		{
			pit_PurgeFnc(e);
		};
		e.innerHTML=t;
	};
};

function pit_SetIHs(e,t)
{
	if(e)
	{
		e.innerHTML=t;
	};
};

function pit_KillVar(e)
{
	if(!e){return;};
//	debugger;
    if(e.Destruct)
    {
    	e.Destruct();
    };
    for (i in e) {
        if (e.hasOwnProperty(i)) {
        	var xI=e[i];
        	if(xI)
        	{
				if((xI.Destruct)&&(typeof(xI.Destruct)=="function"))
				{
					xI.Destruct();
				};
				xI=null;
				e[i]=null;
			};
        };
		delete e[i];
    };
    delete e;
};

function pit_GetRecursiveBottom(p_xE)
{
	if((!p_xE.offsetHeight)&&(p_xE.offsetHeight!==0)){return 0;};
	var iH=p_xE.offsetHeight+p_xE.offsetTop;
	var iH2;
	var cC=p_xE.firstChild;
	while(cC)
	{
		iH2=pit_GetRecursiveBottom(cC);
		if((iH2)&&(iH2>iH)){iH=iH2;};
		cC=cC.nextSibling;
	};
	return iH;
};

function pit_GetAbsPos(p_xEl)
{
	var xR={m_iX:0,m_iY:0};
	while(p_xEl)
	{
		if(typeof(p_xEl.offsetLeft)=="undefined") {break;};
		xR.m_iX=xR.m_iX+p_xEl.offsetLeft;xR.m_iY=xR.m_iY+p_xEl.offsetTop;
		p_xEl=p_xEl.parentNode;
	};
	return xR;
};

function pit_AddStyle(p_sSelector,p_sDeclarations) {
	if (document.styleSheets && (document.styleSheets.length>0)) {
		var xCSS=document.styleSheets[0];
		if (xCSS.insertRule) {
			iNewRuleIdx=xCSS.insertRule(p_sSelector+" {"+p_sDeclarations+"}",xCSS.cssRules.length);
			if(iNewRuleIdx)
			{
				if (xCSS.cssRules[iNewRuleIdx].cssText.length>0) {
					return true;
				};
			};
		} else if(xCSS.addRule) {
			xCSS.addRule(p_sSelector,p_sDeclarations);
			return true;
		};
	};
	if (document.createStyleSheet) {
		var xStylesheet=document.createStyleSheet();
		if (xStylesheet&&xStylesheet.addRule) {
			xStylesheet.addRule(p_sSelector,p_sDeclarations);
			return true;
		};
	}
	if (document.createProcessingInstruction&&document.insertBefore) {
		var xInsertedNode;
		try {
			var xParent=document.createProcessingInstruction("xml-stylesheet","type='text/css' href='test.css'");
			xInsertedNode=document.insertBefore(xParent,document.documentElement);
		} catch (e) {
		}
		if (xParent && xInsertedNode && xParent.sheet) {
			xParent.sheet.insertRule(p_sSelector+" {"+p_sDeclarations+"}", 0);
			return true;
		}
	};
	if (document.getElementsByTagName&&(document.getElementsByTagName("style").length>0)) {
		var axStyleElements=document.getElementsByTagName("style");
		var xTextNode=document.createTextNode(p_sSelector+" {"+p_sDeclarations+"}");
		axStyleElements[axStyleElements.length-1].appendChild(xTextNode);
		return true;
	};
	if (document.getElementsByTagName&&document.createElement) {
		var xStyleElement=document.createElement("style");
		xStyleElement.setAttribute("type","text/css");
		var xTextNode=document.createTextNode(p_sSelector+" {"+p_sDeclarations+"}");
		xStyleElement.appendChild(xTextNode);
		var axHeadElements=document.getElementsByTagName("head");
		if (axHeadElements&&axHeadElements.length==1) {
			axHeadElements[0].appendChild(xStyleElement);
			return true;
		}
	};
	return false;
}

function pit_URLEncode(text) {
	return encodeURIComponent(text);
}

function pit_HTMLEncode(text) {
	var sLiteralChars=" 0123456789abcdefghijklmnopqrstuvwxyzABCDEDFGHIJKLMNOPQRSTUVWXYZ-_=./':;,+*-(){}[]";
	var sHexChars="0123456789abcdef";
	var sEncoded="";
	var i,iC=text.length;
	for(i=0;i<iC;i++) {
		var cCur=text.charAt(i);
		if(-1!=sLiteralChars.indexOf(cCur)) {
			sEncoded+=cCur;
		} else {
			if(cCur=="&") {
				sEncoded+="&amp;"
			} else if(cCur=="<") {
				sEncoded+="&lt;";
			} else if(cCur==">") {
				sEncoded+="&gt;";
			} else if(cCur=="\"") {
				sEncoded+="&quot;";
			} else {
				var iCode=cCur.charCodeAt(0);
				if(iCode<256)
				{
					sEncoded+="&#"+(iCode)+";";
				}
				else
				{
					sEncoded+="&#x"+sHexChars.charAt((iCode>>12)&0xf)+sHexChars.charAt((iCode>>8)&0xf)+sHexChars.charAt((iCode>>4)&0xf)+sHexChars.charAt((iCode)&0xf)+";";
				};
				
			};
		};
	};
	return sEncoded;
}

function pit_HTMLEncodeF(text) {
	var sLiteralChars=" 0123456789abcdefghijklmnopqrstuvwxyzABCDEDFGHIJKLMNOPQRSTUVWXYZ-_=./\\'\":;,+*-(){}[]";
	var sHexChars="0123456789abcdef";
	var sEncoded="";
	var i,iC=text.length;
	for(i=0;i<iC;i++)
	{
		var cCur=text.charAt(i);
		if(-1!=sLiteralChars.indexOf(cCur))
		{
			sEncoded+=cCur;
		}
		else
		{
			if(cCur=="&")
			{
				sEncoded+="&amp;"
			}
			else if(cCur=="<")
			{
				sEncoded+="&lt;";
			}
			else if(cCur==">")
			{
				sEncoded+="&gt;";
			}
			else if(cCur=="\r")
			{
			}
			else if(cCur=="\n")
			{
				sEncoded+="<br>";
			}
			else
			{
				var iCode=cCur.charCodeAt(0);
				if(iCode<256)
				{
					sEncoded+="&"+sHexChars.charAt((iCode>>4)&0xf)+sHexChars.charAt((iCode)&0xf)+";";
				};
			};
		};
	};
	return sEncoded;
}

function pit_CreateHTTPVarSpec(p_xVars) {
	var xSB=new PitStringBuilder();
	var bFirst=true;
	for(sKey in p_xVars)
	{
		var xValue=p_xVars[sKey];
		if((typeof xValue)!='function')
		{
	    	xSB.Add(sKey,"=",xValue,"\r\n");
		};
	}
	return xSB.GetString();
};

function pit_CreateHTTPVarSpecURL(p_xVars) {
  var sRet="";
  for(sKey in p_xVars)
  {
    var xValue=p_xVars[sKey];
	if((typeof xValue)!='function')
	{
	    sRet+='&'+encodeURIComponent(sKey)+"="+encodeURIComponent(xValue);
	};
  };
  if(sRet.length>0){
    sRet=sRet.substring(1); // chomp initial '&'
  }
  return sRet;
};

function pit_CreateXMLHttpRequest()
{
	if(typeof XMLHttpRequest!='undefined') {return new XMLHttpRequest();};
   	try { return new ActiveXObject("Msxml2.XMLHTTP"); } catch (e) {};
   	try { return new ActiveXObject("Microsoft.XMLHTTP"); } catch (e) {};
   	alert("XMLHttpRequest not supported");
   	return null;
};

function PitStringBuilder()
{
	this.aS=new Array("");
	this.Add=function(){
		var i;
		for(i=0;i<arguments.length;i++){ 
			this.aS.push(arguments[i]);
		};
	};
	this.GetString=function(){
		return this.aS.join("");
	};
	this.Clear=function(){
		this.aS.length=1;
	};
};

function PitNTP()
{
	this.m_iMaxResp=32;
	this.m_axServerTimes=[];
	this.m_iOffset=0;

	this.GetLocalTime=function() {var xD=new Date();return (xD.getTime());};
	this.FixTime=function(p_iTime) {return p_iTime+this.m_iOffset;};
	this.GetServerTime=function() {return new Date(this.FixTime((new Date()).getTime()));};
	
	this.PushServerTime=function(p_sVal)
	{
		var asVal=p_sVal.split(":");
		var iOfs=Number(asVal[0]);
		var iOrgT=Number(asVal[1]);
		var iDelay=Math.floor((this.GetLocalTime()-iOrgT)/2);	//delay=ping/2
	    iOfs=iOfs-iDelay;
    	this.m_axServerTimes.push(iOfs);
    	if(this.m_axServerTimes.length>this.m_iMaxResp) {this.m_axServerTimes.splice(0,this.m_axServerTimes.length-this.m_iMaxResp);};
		
		//Calc average, ignore outliers based on Standard deviation
		var iSum=0;
		for(var i=0;i<this.m_axServerTimes.length;i++)
		{
			var iCur=this.m_axServerTimes[i];
			iSum+=iCur;
		};
		var iAvg=Math.floor(iSum/this.m_axServerTimes.length);
		//pit_Log("avg:",iAvg);
		
		if(this.m_axServerTimes.length>2)
		{
			var axDev=[];
			for(var i=0;i<this.m_axServerTimes.length;i++)
			{
				var iCur=this.m_axServerTimes[i];
				axDev.push([iCur,Math.abs(iAvg-iCur)]);
			};
			axDev.sort(function(p_xA,p_xB) {return p_xA[1]-p_xB[1];});
			var iCnt=Math.floor((axDev.length/2)+0.5);
			iSum=0;
			for(var i=0;i<iCnt;i++)
			{
				//pit_Log(i,": ",axDev[i][0]," ",axDev[i][1]);
				iSum+=axDev[i][0];
			};
			iAvg=Math.floor(iSum/iCnt);
		};
		
		this.m_iOffset=iAvg;
		//pit_Log("NTP:",this.m_iOffset," ",this.m_axServerTimes.length);
  	};
};


// get (roughly) the current inner window size
function pit_GetViewHeight()
{
	if(self.innerHeight){	// all except Explorer
		return self.innerHeight;
	}else if(document.documentElement && document.documentElement.clientHeight) { // Explorer 6 Strict Mode
		return document.documentElement.clientHeight;
	}else if (document.body){// other Explorers
		return document.body.clientHeight;
	};
	return 800;
};

// get (roughly) the current inner window size
function pit_GetViewWidth()
{
	if(self.innerWidth){	// all except Explorer
		return self.innerWidth;
	}else if(document.documentElement && document.documentElement.clientWidth) { // Explorer 6 Strict Mode
		return document.documentElement.clientWidth;
	}else if (document.body){// other Explorers
		return document.body.clientWidth;
	};
	return 600;
};

function pit_SetBackgroundImage(p_sImg)
{
	document.getElementsByTagName("body")[0].style.background="url("+encodeURI(p_sImg)+") repeat";
};

function pit_SetElPos(p_xEl,p_iX,p_iY)
{
	p_xEl.style.position="absolute";
	p_xEl.style.left=p_iX+"px";
	p_xEl.style.top=p_iY+"px";
};

function pit_SetElRect(p_xEl,p_iX,p_iY,p_iW,p_iH)
{
	p_xEl.style.position="absolute";
	p_xEl.style.left=p_iX+"px";
	p_xEl.style.top=p_iY+"px";
	p_xEl.style.width=p_iW+"px";
	p_xEl.style.height=p_iH+"px";
};

function pit_ClearSelection()
{
	if(document.selection)
	{
		document.selection.empty();
	}
	else
	{
//		document.body.focus();
	};
};

function pit_SetFocus(p_xEl)
{
	if(!p_xEl){return;};
	if(p_xEl.firstChild)
	{
		p_xEl=p_xEl.firstChild;
		/*
		if(p_xEl.firstChild)
		{
			if(p_xEl.firstChild.firstChild)
			{
//				p_xEl=p_xEl.firstChild;
			};
		};
		*/
	};
//	try {p_xEl.focus();} catch(e) {};
};

function pit_SetTransparency(p_sID,p_fAmnt)
{
	var xEle=p_sID;
	if(!xEle.style){xEle=document.getElementById(p_sID);};
	if(!xEle){pit_Log("Invalid id ",p_sID);return;};
	xEle.m_fPitTransparency=p_fAmnt;
//	pit_Log("T ",p_fAmnt);
	if(p_fAmnt==1)
	{
		xEle.style.filter="";
	}
	else
	{
		xEle.style.filter="alpha(opacity="+Math.round(p_fAmnt*100)+")";
	};
	xEle.style.khtmlopacity=Number(p_fAmnt);
	xEle.style.mozopacity=Number(p_fAmnt);
	xEle.style.opacity=Number(p_fAmnt);
};

function pit_GetTransparency(p_sID,p_fAmnt)
{
	var xEle=p_sID;
	if(!xEle.style){xEle=document.getElementById(p_sID);};
	if(!xEle){pit_Log("Invalid id ",p_sID);return;};
	if(xEle.m_fPitTransparency=="0"){return 0;};
	if(!xEle.m_fPitTransparency){return 1.0;};
	return xEle.m_fPitTransparency;
};

function pit_AnimateTransparency(p_sID,p_fFrom,p_fTo,p_fMilliSeconds)
{
	var fStep;
	var fTime=5;
	var fTInc;
	if(p_fFrom<p_fTo)
	{
		fTInc=p_fMilliSeconds/((p_fTo-p_fFrom)/0.025);
		for(fStep=p_fFrom;fStep<=p_fTo;fStep+=0.025)
		{
			var sFn="pit_SetTransparency('"+p_sID+"',"+fStep+")";
			window.setTimeout(sFn,fTime);
			fTime=fTime+fTInc;
		};
	} else {
		fTInc=p_fMilliSeconds/((p_fFrom-p_fTo)/0.025);
		for(fStep=p_fFrom;fStep>=p_fTo;fStep-=0.025)
		{
			var sFn="pit_SetTransparency('"+p_sID+"',"+fStep+")";
			window.setTimeout(sFn,fTime);
			fTime=fTime+fTInc;
		};
	}
};

function pit_MergeProperties(p_xOld,p_xAdd)
{
	if(!p_xOld)
	{
		p_xOld=new Object();
	};
	if(p_xAdd)
	{
		for(i in p_xAdd)
		{
			if(p_xAdd.hasOwnProperty(i))
			{
				p_xOld[i]=p_xAdd[i];
			};
		};
	};
	return p_xOld;
};

/*
	node types are: url,img,imgl,imgr,box,br,p,b,i,u,x,big,small,sup,sub,h1,h2,h3,h4,color,quote,code,pre,
	nlist,ulist,litem,table,tr,td,player,ally,loc,item,help,chat,fmsg,pmsg,iurl,eurl,

	not implemented by default: 
	player,ally,loc,item,help,chat,fmsg,pmsg,
*/
function pit_GetDefaultBBCodeRenderer()
{
	function in_br(p_xDest,p_sArgs,p_xCode,xRBehav){return(document.createElement("br"));};
	function in_p(p_xDest,p_sArgs,p_xCode,xRBehav){return(document.createElement("p"));};
	function in_b(p_xDest,p_sArgs,p_xCode,xRBehav){return(document.createElement("b"));};
	function in_i(p_xDest,p_sArgs,p_xCode,xRBehav){return(document.createElement("i"));};
	function in_u(p_xDest,p_sArgs,p_xCode,xRBehav){return(document.createElement("u"));};
	function in_x(p_xDest,p_sArgs,p_xCode,xRBehav){return(document.createElement("s"));};
	function in_big(p_xDest,p_sArgs,p_xCode,xRBehav){return(document.createElement("big"));};
	function in_small(p_xDest,p_sArgs,p_xCode,xRBehav){return(document.createElement("small"));};
	function in_sup(p_xDest,p_sArgs,p_xCode,xRBehav){return(document.createElement("sup"));};
	function in_sub(p_xDest,p_sArgs,p_xCode,xRBehav){return(document.createElement("sub"));};
	function in_h1(p_xDest,p_sArgs,p_xCode,xRBehav){return(document.createElement("h1"));};
	function in_h2(p_xDest,p_sArgs,p_xCode,xRBehav){return(document.createElement("h2"));};
	function in_h3(p_xDest,p_sArgs,p_xCode,xRBehav){return(document.createElement("h3"));};
	function in_h4(p_xDest,p_sArgs,p_xCode,xRBehav){return(document.createElement("h4"));};
	function in_url(p_xDest,p_sArgs,p_xCode,xRBehav){var xE=document.createElement("a");xE.href=p_sArgs;return(xE);};
	function in_eurl(p_xDest,p_sArgs,p_xCode,xRBehav){var xE=document.createElement("a");xE.className="eurl";xE.target="_blank";xE.href=p_sArgs;return(xE);};
	function in_img(p_xDest,p_sArgs,p_xCode,xRBehav){var xE=document.createElement("img");xE.src=p_sArgs;return(xE);};
	function in_imgl(p_xDest,p_sArgs,p_xCode,xRBehav){var xE=document.createElement("img");xE.src=p_sArgs;xE.style.styleFloat="left";return(xE);};
	function in_imgr(p_xDest,p_sArgs,p_xCode,xRBehav){var xE=document.createElement("img");xE.src=p_sArgs;xE.style.styleFloat="right";return(xE);};
	function in_box(p_xDest,p_sArgs,p_xCode,xRBehav){var xE=document.createElement("div");xE.className=p_sArgs;return(xE);};
	function in_color(p_xDest,p_sArgs,p_xCode,xRBehav){var xE=document.createElement("span");xE.color=p_sArgs;return(xE);};
	function in_quote(p_xDest,p_sArgs,p_xCode,xRBehav){var xE=document.createElement("blockquote");return(xE);};
	function in_code(p_xDest,p_sArgs,p_xCode,xRBehav){var xE=document.createElement("code");return(xE);};
	function in_pre(p_xDest,p_sArgs,p_xCode,xRBehav){var xE=document.createElement("pre");return(xE);};
	function in_nlist(p_xDest,p_sArgs,p_xCode,xRBehav){var xE=document.createElement("ol");return(xE);};
	function in_ulist(p_xDest,p_sArgs,p_xCode,xRBehav){var xE=document.createElement("ul");return(xE);};
	function in_litem(p_xDest,p_sArgs,p_xCode,xRBehav){var xE=document.createElement("li");return(xE);};
	function in_table(p_xDest,p_sArgs,p_xCode,xRBehav){
		var xT=document.createElement("table");
		var xB=document.createElement("tbody");
		xT.appendChild(xB);
		return {"DomAdd":xT,"DomInsert":xB};
		};
	function in_tr(p_xDest,p_sArgs,p_xCode,xRBehav){var xE=document.createElement("tr");return(xE);};
	function in_td(p_xDest,p_sArgs,p_xCode,xRBehav){var xE=document.createElement("td");return(xE);};
	return {
		"br":{In:in_br},"h1":{In:in_h1},"h2":{In:in_h2},"h3":{In:in_h3},"h4":{In:in_h4},"p":{In:in_p},"b":{In:in_b},"i":{In:in_i},"u":{In:in_u},
		"x":{In:in_x},"big":{In:in_big},"small":{In:in_small},"sup":{In:in_sup},"sub":{In:in_sub},
		"url":{In:in_url},"iurl":{In:in_url},"eurl":{In:in_eurl},"box":{In:in_box},"color":{In:in_color},"quote":{In:in_quote},
		"img":{In:in_img},"imgl":{In:in_imgl},"imgr":{In:in_imgr},"code":{In:in_code},"pre":{In:in_pre},"ulist":{In:in_ulist},"nlist":{In:in_nlist},
		"litem":{In:in_litem},"table":{In:in_table},"tr":{In:in_tr},"td":{In:in_td}
	}
};

function pit_RenderBBCodeStruct(p_xCode,p_xDest,p_xOverrides,p_bAddLF)
{
	var xRBehav=pit_GetDefaultBBCodeRenderer();
	if(p_xOverrides){xRBehav=pit_MergeProperties(xRBehav,p_xOverrides);};
	if(p_xCode==null){return;};
	if(typeof(p_xCode)=="object")
	{
		if(p_xCode.length)
		{
			var i,iC=p_xCode.length;
			for(i=0;i<iC;i++)
			{
				pit_RenderBBCodeStruct(p_xCode[i],p_xDest,p_xOverrides);
			};
		}
		else
		{
			var sType=p_xCode.type;
			var sArgs=p_xCode.args;
			var xContent=p_xCode.content;
			var xRenderer=xRBehav[sType];
			var xEl;
			if((xRenderer)&&(xRenderer.In))
			{
				xEl=xRenderer.In(p_xDest,sArgs,p_xCode,xRBehav);
				if(xEl)
				{
					if((xEl.DomAdd)&&(xEl.DomInsert))
					{
						p_xDest.appendChild(xEl.DomAdd);
						xEl=xEl.DomInsert
					}
					else
					{
						p_xDest.appendChild(xEl);
					};
				};
			};
			if(!xEl){xEl=p_xDest;};
			if(xContent!=null)
			{
				pit_RenderBBCodeStruct(xContent,xEl,p_xOverrides);
			};
			if((xRenderer)&&(xRenderer.Out))
			{
				xEl=xRenderer.Out(p_xDest,sArgs,p_xCode,xRBehav);
				if(xEl)
				{
					if((xEl.DomAdd)&&(xEl.DomInsert))
					{
						p_xDest.appendChild(xEl.DomAdd);
						xEl=xEl.DomInsert
					}
					else
					{
						p_xDest.appendChild(xEl);
					};
				};
			};
		};
	}
	else
	{
		p_xDest.appendChild(document.createTextNode(p_xCode+" "));
//		p_xDest.appendChild(document.createTextNode(p_xCode.ToJSONString()));
	};
	if(p_bAddLF)
	{
		p_xDest.appendChild(document.createElement("br"));
		p_xDest.appendChild(document.createTextNode("\u00a0"));
	};
};

/*
	DOM element builder:
	p_xData: element structure decl
	p_xParent: node to add elements to (optional)
	returns: last top node created
	
	decl:
	"text" - simple text node
	{TAG:"text"} - tag <TAG> with text sub-node
	{TAG:{attributes}} - tag <TAG> with attributes
	[decl,decl,decl] - list of sub-declarations
	{pitctrl:{ctrldef}} - pit ctrl: Panel, Button, ScrollBarV, Static, ScrollPanel, Edit
	
	ctrldef:
		"ctor":<typename> - PitCtrlPanel...
		"outid":<id> - id for (optional) out-param p_xCtrls
		"params":[args] - parameters for constructor
		"tile":"tileid" - automatic tile engine set
		"clickid":<id> - click cmd id
		"keyid":<id> - key cmd id
		"mouseid":<id> - mouse overout od
		"post":function - post-construction customization code
	
	attributes:
	{
		name:"value",
		name:number,
		evthandler:function,
		subs:[
			a-sub-elements-decl,
			another-sub-elements-decl,
			"textnode"
		]
	}
*/
function pit_BuildEls(p_xData,p_xParent,p_xCtrls)
{
	var xLast;
	if((typeof(p_xData)=="object")&&(p_xData.length))
	{
		for(i in p_xData)
		{
			xLast=pit_BuildEls(p_xData[i],p_xParent,p_xCtrls);
			if(p_xParent&&xLast){p_xParent.appendChild(xLast);};
		};
	}
	else if(typeof(p_xData)=="string")
	{
		xLast=document.createTextNode(p_xData);
		if(p_xParent&&xLast){p_xParent.appendChild(xLast);};
	}
	else
	{
		var i;
		for(i in p_xData)
		{
			if(i!="prototype")
			{
				var xE=p_xData[i];
				var sTagType=i;
				var xNode;
				if(typeof(xE)!="function")
				{
					if(sTagType=="text")
					{
						xNode=document.createTextNode(xE);
						xLast=xNode;
					}
					else if(sTagType=="pitctrl")
					{
						var xParentBox;
						if(p_xParent.m_hHnd)
						{
							xParentBox=p_xParent;
						}
						else
						{
							xParentBox=g_xPitBoxes.GetBox(p_xParent.getAttribute("pithnd"));
						};
						if(!xParentBox)
						{
							pit_Log("Non-box parent ",p_xParent," ",p_xParent.getAttribute("pithnd"));
						}
						else
							{
							var xArgs=xE["params"];
							var xCtor=xE["ctor"];
							var xOutID=xE["outid"];
							var xPost=xE["post"];
							var sTile=xE["tile"];
							var iCmdIDClick=xE["clickid"];
							var iCmdIDKey=xE["keyid"];
							var iCmdIDMouse=xE["mouseid"];
							var sTTID=xE["ttid"];
							var xSubs=xE["subs"];
							var xBox;
							xBox=new xCtor(xArgs[0],xArgs[1],xArgs[2],xArgs[3],xArgs[4],xArgs[5],xArgs[7],xArgs[8]);
							xParentBox.AddChild(xBox);
							xLast=xBox.MakeEl();
							if(sTile){g_xPitTiles.SetElTile(xBox,sTile);};
							if(iCmdIDClick){xBox.SetCmdID(iCmdIDClick);};
							if(iCmdIDKey){xBox.SetKeyCmdID(iCmdIDKey);};
							if(iCmdIDMouse){xBox.SetMouseOverOutCmdID(iCmdIDMouse);};
							if(xPost){xPost(xBox);};
							if(xOutID && p_xCtrls){p_xCtrls[xOutID]=xBox;};
							if(sTTID)
							{
								xBox.SetTTID(sTTID);
							};
							if(xSubs)
							{
								var iS,iSC=xSubs.length;
								for(iS=0;iS<iSC;iS++)
								{
									pit_BuildEls(xSubs[iS],xLast,p_xCtrls);
								};
							};
						};
					}
					else if(sTagType=="icon")
					{
						if(xE)
						{
							xNode=document.createElement("span");
							xLast=xNode;
							g_xPitTiles.SetElTile(xNode,xE);
						};
					}
					else if(sTagType=="iicon")
					{
						if(xE)
						{
							xNode=document.createElement("img");
							xNode.src=xE;
							xLast=xNode;
						};
					}
					else if(sTagType=="prenode")
					{
						xLast=xE;
					}
					else
					{
						xNode=document.createElement(sTagType);
						xLast=xNode;
						if(typeof(xE)=="object")
						{
							for(sAttrib in xE)
							{
								var xVal=xE[sAttrib];
								if(xE.hasOwnProperty(sAttrib))
								{
									if(typeof(xVal)=="function")
									{
										xLast[sAttrib]=xVal;
									}
									else if((typeof(xVal)!="string")&&(xVal.length)&&(xVal.length>0))
									{
										var iS,iSC=xVal.length;
										for(iS=0;iS<iSC;iS++)
										{
											pit_BuildEls(xVal[iS],xLast,p_xCtrls);
										};
									}
									else
									{
										if(sAttrib.substr(0,6)=="style.")
										{
											xLast.style[sAttrib.substr(6)]=xVal;
										}
										else if(sAttrib=="text")
										{
											xLast.appendChild(document.createTextNode(xVal));
										}
										else if(sAttrib=="post")
										{
											if(typeof(xVal)=="function")
											{
												xVal(xLast);
											};
										}
										else if(sAttrib=="width")
										{
											xLast.style.width=xVal;
										}
										else if(sAttrib=="height")
										{
											xLast.style.height=xVal;
										}
										else if(sAttrib=="top")
										{
											xLast.style.position="absolute";
											xLast.style.top=xVal;
										}
										else if(sAttrib=="left")
										{
											xLast.style.position="absolute";
											xLast.style.left=xVal;
										}
										else if(sAttrib=="position")
										{
											xLast.style.position=xVal;
										}
										else if(sAttrib=="display")
										{
											xLast.style.display=xVal;
										}
										else if(sAttrib=="ttid")
										{
											xLast.setAttribute("pit_ttid",xVal);
										}
										else if(sAttrib=="tile")
										{
											g_xPitTiles.SetElTile(xLast,xVal);
										}
										else
										{
											xLast[sAttrib]=xVal;
										}
									};
								};
							};
						}
						else if(typeof(xE)=="string")
						{
							if(xE.length>0)
							{
								xLast.appendChild(document.createTextNode(xE));
							};
						};
					};
					if(p_xParent&&xLast){p_xParent.appendChild(xLast);};
				};
			};
		};
	};
	return xLast;
};

// set the new logging box. Clears all content
function pit_SetLogger(p_sID,p_iMaxLines)
{
	i_Pit_sLogDiv=p_sID;
	if(p_iMaxLines) {
		i_Pit_iMaxLines=p_iMaxLines;
	};
//	pit_ClearLog();
	
};

function pit_SetLoggerRect(p_iX,p_iY,p_iW,p_iH)
{
	if(!i_Pit_sLogDiv){return;};
	var xDiv=document.getElementById(i_Pit_sLogDiv);
	xDiv.style.position="absolute";
	xDiv.style.left=p_iX+"px";
	xDiv.style.top=p_iY+"px";
	xDiv.style.width=p_iW+"px";
	xDiv.style.height=p_iH+"px";
};

// clear all logged content
function pit_ClearLog()
{
	if(!i_Pit_sLogDiv){return;};
	var xDiv=document.getElementById(i_Pit_sLogDiv);
	if(xDiv)
	{
		xDiv.innerHTML="";
	};
	i_Pit_axLogLines=new Array();
};

// output all arguments to the log box and add a line feed
function pit_Log() {
	var xDiv=document.getElementById(i_Pit_sLogDiv);
	if(i_Pit_axLogLines.length>i_Pit_iMaxLines)
	{
		i_Pit_axLogLines.shift();
	};
	var sLine="";
	var i,iC;
	for(i=0;i<arguments.length;i++){ 
		var sT=""+arguments[i];	// stringify arg!
		sLine+=pit_HTMLEncode(sT);
	};
	i_Pit_axLogLines.push(sLine);
	if(!i_Pit_sLogDiv){return;};
	if(xDiv)
	{
		var xSB=new PitStringBuilder();
		iC=i_Pit_axLogLines.length;
		for(i=0;i<iC;i++)
		{
			xSB.Add(i_Pit_axLogLines[i]);
			if(i<iC-1){xSB.Add("<br>");};
		};
		xDiv.innerHTML=xSB.GetString();
	};
};

function pit_LeadZero2(p_sText)
{
	if(p_sText.length==0){return "00";}
	else if(p_sText.length==1){return "0"+p_sText;}
	else{return p_sText;};
};

function pit_LeadZero4(p_sText)
{
	if(p_sText.length==0){return "0000";}
	else if(p_sText.length==1){return "000"+p_sText;}
	else if(p_sText.length==2){return "00"+p_sText;}
	else if(p_sText.length==3){return "0"+p_sText;}
	else{return p_sText;};
};

function pit_LeadZero8(p_sText)
{
	if(p_sText.length==0){return "00000000";}
	else if(p_sText.length==1){return "0000000"+p_sText;}
	else if(p_sText.length==2){return "000000"+p_sText;}
	else if(p_sText.length==3){return "00000"+p_sText;}
	else if(p_sText.length==4){return "0000"+p_sText;}
	else if(p_sText.length==5){return "000"+p_sText;}
	else if(p_sText.length==6){return "00"+p_sText;}
	else if(p_sText.length==7){return "0"+p_sText;}
	else{return p_sText;};
};

function pit_LeadZero12(p_sText)
{
	if(p_sText.length==0){return "000000000000";}
	else if(p_sText.length==1) {return "00000000000"+p_sText;}
	else if(p_sText.length==2) {return "0000000000"+p_sText;}
	else if(p_sText.length==3) {return "000000000"+p_sText;}
	else if(p_sText.length==4) {return "00000000"+p_sText;}
	else if(p_sText.length==5) {return "0000000"+p_sText;}
	else if(p_sText.length==6) {return "000000"+p_sText;}
	else if(p_sText.length==7) {return "00000"+p_sText;}
	else if(p_sText.length==8) {return "0000"+p_sText;}
	else if(p_sText.length==9) {return "000"+p_sText;}
	else if(p_sText.length==10){return "00"+p_sText;}
	else if(p_sText.length==11){return "0"+p_sText;}
	else{return p_sText;};
};

// output all arguments to the log box and add a line feed
function pit_LogT() {
	if(!i_Pit_sLogDiv){return;};
	var xDiv=document.getElementById(i_Pit_sLogDiv);
	if(xDiv)
	{
		var xNow=new Date();
		if(i_Pit_axLogLines.length>30)
		{
			i_Pit_axLogLines.shift();
		};
		var sLine="";
		var i,iC;
//		sLine+=xNow.getUTCMinutes()+"."+xNow.getUTCSeconds()+"."+xNow.getUTCMilliseconds()+" ";
		sLine+=pit_LeadZero8((xNow-i_Pit_xLogTimeStart)+"")+" ";
		for(i=0;i<arguments.length;i++){ 
			var sT=""+arguments[i];	// stringify arg!
			sLine+=pit_HTMLEncode(sT);
		};
		i_Pit_axLogLines.push(sLine);
		var xSB=new PitStringBuilder();
		iC=i_Pit_axLogLines.length;
		for(i=0;i<iC;i++)
		{
			xSB.Add(i_Pit_axLogLines[i]);
			if(i<iC-1){xSB.Add("<br>");};
		};
		xDiv.innerHTML=xSB.GetString();
	};
};

function pit_FormatDateTime(p_xD)
{
	return pit_LeadZero2(""+p_xD.getDate())+"/"+pit_LeadZero2(p_xD.getMonth()+1)+"/"+p_xD.getFullYear()+" "+pit_LeadZero2(""+p_xD.getHours())+":"+pit_LeadZero2(""+p_xD.getMinutes());
};

// set a new timer
// Params:
// p_xFnc: function (NOT string!) to execute
// p_iInterval: interval in ms
// p_bRepeat: true for repeating (interval) timer, false for single-shot (timeout)
// Returns timer id
function pit_SetTimer(p_xFnc,p_iInterval,p_bRepeat)
{
	if(p_bRepeat)
	{
		return window.setInterval(p_xFnc,p_iInterval);
	}
	else
	{
		return window.setTimeout(p_xFnc,p_iInterval);
	};
};

// Remove a previously set timer
function pit_ClrTimer(p_iTimerID)
{
	try
	{
		window.clearTimeout(p_iTimerID);
	}
	catch (e)
	{
	};
	try
	{
		window.clearInterval(p_iTimerID);
	}
	catch (e)
	{
	};
};

var g_iPitEvent_ScrollOfsX=0;
var g_iPitEvent_ScrollOfsY=0;

window.onscroll=function(p_xE)
{
	if(!p_xE){p_xE=window.event;};
	if(p_xE.clientX)
	{
		g_iPitEvent_ScrollOfsX=document.body.scrollLeft+document.documentElement.scrollLeft;
		g_iPitEvent_ScrollOfsY=document.body.scrollTop+document.documentElement.scrollTop;
	};
};

function pit_AdjustEventVals(p_xE)
{
	if(!p_xE){return;};
	var iX=0;
	var iY=0;
	var iKeyCode=0;
	var hTarget=0;
	var bRMB=false;
	var bLMB=false;
	var xOrgTarget=null;
	if((p_xE)&&(document)&&(document.body)&&(document.documentElement))
	{
		if (p_xE.pageX||p_xE.pageY){
			iX=p_xE.pageX;
			iY=p_xE.pageY;
		}
		else if(p_xE.clientX||p_xE.clientY){
//			iX=p_xE.clientX+document.body.scrollLeft+document.documentElement.scrollLeft;
//			iY=p_xE.clientY+document.body.scrollTop+document.documentElement.scrollTop;
			iX=p_xE.clientX+g_iPitEvent_ScrollOfsX;
			iY=p_xE.clientY+g_iPitEvent_ScrollOfsY;
		}
		if(typeof(p_xE.keyCode)=='number')
		{
			iKeyCode=p_xE.keyCode;
		}
		else if (typeof(p_xE.which)=='number')
		{
			iKeyCode=p_xE.which;
		};
		var xTarget;
		if(p_xE.target){xTarget=p_xE.target;}
		else if(p_xE.srcElement){xTarget=p_xE.srcElement;};
		xOrgTarget=xTarget;
		while((xTarget)&&( ((xTarget.getAttribute)&&(!xTarget.getAttribute("pithnd",0))) || (xTarget.nodeName=="#text")))
		{
			xTarget=xTarget.parentNode;
		};
//		pit_Log("E ",xTarget," ",p_xE.target);
		if(xTarget)
		{
			if(xTarget.getAttribute)
			{
				hTarget=xTarget.getAttribute("pithnd",0);
			};
		};
//		pit_Log("T ",xTarget," ",hTarget);
//		pit_Log("E ",p_xE.type," ",p_xE.which," ",p_xE.button);
		
		if(p_xE.which){bRMB=(p_xE.which==3);}
		else if(p_xE.button){bRMB=(p_xE.button==2);};
		if(p_xE.which){bLMB=(p_xE.which==1);}
		else if(p_xE.button){bLMB=(p_xE.button==1);};
		
	};
//	pit_Log("Ev ",iX," ",iY," ",hTarget," ",p_xE.type);
	p_xE.m_iX=iX;
	p_xE.m_iY=iY;
	p_xE.m_iKeyCode=iKeyCode;
	p_xE.m_xOrgTarget=xOrgTarget;
	p_xE.m_xTarget=xTarget;
	p_xE.m_hTarget=hTarget;
	p_xE.m_bRMB=bRMB;
	p_xE.m_bLMB=bLMB;
};

function PitRPC(p_sURL,p_sFunction)
{
	this.m_sID=g_xPitRPC.MakeRQID();
	this.m_sFunction=p_sFunction?p_sFunction:"";
	this.m_iTimeout=45000;
	this.m_xTimeStart;
	this.m_xArgs={};
	this.m_xResults={};
	this.m_sResultText="";
	this.m_iTime;
	this.m_iStatus=0;
	this.m_iRetries=0;
	this.m_iTimer=-1;
	this.m_axR=new Array();
	this.m_bComplex=false;
	this.m_sMethod="post";
	this.m_bNoArgs=false;
	this.m_bNoID=false;
	this.m_sURL=p_sURL;
	this.m_bNoJSONResult=false;
	this.m_bWasSent=false;

	this.SetTimeout=function(p_iMilliSecs)
	{
		this.m_iTimeout=p_iMilliSecs;
	};
	this.SetURL=function(p_sURL)
	{
		this.m_sURL=p_sURL;
	};
	this.SetFunction=function(p_sFunction)
	{
		this.m_sFunction=p_sFunction;
	};
	this.SetComplex=function(p_bC)
	{
		this.m_bComplex=p_bC;
	};
	this.ClearParams=function()
	{
		this.m_xArgs={};
	};
	this.SetParams=function(p_sName,p_xArgs)
	{
		if(p_xArgs)
		{
			this.m_xArgs[p_sName]=p_xArgs.ToJSONString();
		};
	};
	this.SetParam=function(p_sName,p_sArg)
	{
		this.m_xArgs[p_sName]=p_sArg;
	};
	this.Send=function()
	{
		/*
		if(this.m_bWasSent)
		{
			debugger;
		};
		*/
		g_xPitRPC.OnStart();
		this.m_iTime=0;
		this.m_xTimeStart=new Date();
		this.m_iRetries=0;
		this.SendInt();
	};
	this.SendNoRetries=function()
	{
		g_xPitRPC.OnStart();
		this.m_iTime=0;
		this.m_xTimeStart=new Date();
		this.m_iRetries=-1;
		this.SendInt();
	};
	this.SendDelayed=function(p_iMS)
	{
		var xPRq=this;
		if(this.m_iTimer==-1)
		{
			this.m_iTimer=pit_SetTimer(function(){xPRq.TimeOutCB();},p_iMS,true);
		};
	};
	this.SendInt=function()
	{
		var xPRq=this;
		var xRq=pit_CreateXMLHttpRequest();
		this.m_axR[this.m_iRetries]=xRq;
		if(!xRq){return false;};
		if(!this.m_sURL){return false;};
		this.m_bWasSent=true;
		if(!this.m_bNoID)
		{
			this.m_xArgs["rpc_reqid"]=this.m_sID;
		};
		if(this.m_sFunction)
		{
			this.m_xArgs["rpc_function"]=this.m_sFunction;
		};
		xRq.onreadystatechange = function () {
			if(xRq.readyState!=4){return;};
			var iStatus=0;
			try {
				if(xRq.status==0){return;};
				iStatus=xRq.status;
			} catch (e) {iStatus=-2;}; //FireFox Network error
			
			if(xPRq.m_iTimer!=-1)
			{
				pit_ClrTimer(xPRq.m_iTimer);
			};
//			pit_Log("Done: ",this.m_sURL," ",iStatus," ",xRq.responseText);
			var sResponse=xRq.responseText;
			g_xPitRPC.OnStop();
			xPRq.Abort();
			xPRq.m_iStatus=iStatus;
			if(xPRq.m_iStatus==200)
			{
				var xDNow=new Date();
				xPRq.m_iTime=xDNow-xPRq.m_xTimeStart;
				xPRq.m_sResultText=sResponse;
				if(!xPRq.m_bNoJSONResult)
				{
					try {
						xPRq.m_xResults=sResponse.ParseJSON();
//						pit_Log("RPC JSON ok");
					} catch (e) {
						xPRq.m_xResults={};
//						pit_Log("RPC syntax error");
					};
				};
				xPRq.m_xRq=xRq;
				if(xPRq.OnSucceed){xPRq.OnSucceed();delete xPRq.OnSucceed;};
				if(xPRq.OnFail){delete xPRq.OnFail;};
			}
			else
			{
				var xDNow=new Date();
				xPRq.m_iTime=xDNow-xPRq.m_xTimeStart;
				xPRq.m_sResultText=sResponse;
				xPRq.m_xResults={};
				xPRq.m_xRq=xRq;
				if(xPRq.OnFail){xPRq.OnFail();delete xPRq.OnFail;};
				if(xPRq.OnSucceed){delete xPRq.OnSucceed;};
			};
		};
		var xPRq=this;
		if(this.m_iRetries==-1)
		{
			if(this.m_iTimer==-1)
			{
				this.m_iTimer=pit_SetTimer(function(){xPRq.TimeOutCB();},this.m_iTimeout,false);
			};
		}
		else
		{
			if(this.m_iTimer==-1)
			{
				var iTOStep=this.m_iTimeout/6;
				if(iTOStep<1500){iTOStep=1500;};
				this.m_iTimer=pit_SetTimer(function(){xPRq.TimeOutCB();},iTOStep,true);
			};
		};
		if(this.m_bComplex)
		{
			var sRB=pit_CreateHTTPVarSpec(this.m_xArgs);
			xRq.open("post",this.m_sURL,true);
			xRq.setRequestHeader('Content-Type','text/plain; charset=UTF-8');
			xRq.send(sRB);
		}
		else
		{
			if(this.m_bNoArgs)
			{
				xRq.open(this.m_sMethod,this.m_sURL,true);
				xRq.send("");
			}
			else
			{
				var sRB=pit_CreateHTTPVarSpecURL(this.m_xArgs);
				if(sRB.length>0)
				{
					xRq.open(this.m_sMethod,this.m_sURL+"?"+sRB,true);
				}
				else
				{
					xRq.open(this.m_sMethod,this.m_sURL,true);
				};
				xRq.send("");
			};
		};
	};
	this.TimeOutCB=function()
	{
		if((this.m_iRetries>=5)||(this.m_iRetries==-1))
		{
			this.m_iStatus=-3;
			this.Abort();
			if(this.OnFail){this.OnFail();};
			//this.OnSucceed=null;
			//this.OnFail=null;
		}
		else
		{
			this.m_iRetries++;
			this.SendInt();
		};
	};
	this.Abort=function()
	{
		pit_ClrTimer(this.m_iTimer);
		this.m_iTimer=-4;
		var i;
		if(this.m_axR)
		{
			for(i=0;i<this.m_axR.length;i++)
			{
				var xR=this.m_axR[i];
				if(xR)
				{
					this.m_axR[i].onreadystatechange=function(){};
					xR.abort();
					this.m_axR[i]=null;
				};
			};
		};
		this.m_iRetries=0;
		this.m_axR.length=0;
		this.m_xResults={};
		this.m_sResultText="";
		pit_Purge(this);
	};
	this.OnSucceed=function()
	{
		pit_Log(this.m_sResultText.substr(0,30));
	};
	this.OnFail=function()
	{
	};
};

var g_xPitRPC=new function() {
	this.m_iRunningCnt=0;
	this.m_iRqIDIterate=1;
	this.m_bShowProgress=true;
	
	this.OnStart=function()
	{
		this.m_iRunningCnt++;
		if(this.m_iRunningCnt==1)
		{
//			this.ShowProgress();
			window.setTimeout(function(){g_xPitRPC.ShowProgress();},200);
		};
	};
	this.OnStop=function()
	{
		this.m_iRunningCnt--;
		if(this.m_iRunningCnt<=0)
		{
			this.HideProgress();
		};
	};
	this.ShowProgress=function()
	{
		if((this.m_iRunningCnt>0)&&(this.m_bShowProgress))
		{
			var xE=document.getElementById("rpcprog");
			if(xE){xE.style.visibility="visible";};
		};
	};
	this.HideProgress=function()
	{
		if(this.m_bShowProgress)
		{
			var xE=document.getElementById("rpcprog");
			if(xE){xE.style.visibility="hidden";};
		};
	};
	
	this.MakeRQID=function()
	{
		this.m_iRqIDIterate++;
		var xNow=new Date();
		var xSB=new PitStringBuilder();
		xSB.Add(Math.floor(Math.random()*1000),xNow.getUTCFullYear(),xNow.getUTCMonth(),xNow.getUTCDay(),xNow.getUTCHours(),xNow.getUTCMinutes(),
		xNow.getUTCSeconds(),xNow.getUTCMilliseconds(),this.m_iRqIDIterate,Math.floor(Math.random()*1000));
		return xSB.GetString();
	};
};

function PitRPCQueue()
{
	this.m_axRPCs=new Array();
	this.m_iDelay=0;
	this.m_iDelayTimer=-1;
	this.m_iMaxRunning=3;
	this.m_iCurRunning=0;
	var xThis=this;
	
	this.OnFail=function(p_xRPC)
	{
		this.m_iCurRunning--;
		p_xRPC.m_xFncFailHandler();
		var iIdx=xThis.m_axRPCs.indexOf(p_xRPC);
		if(iIdx!=-1)
		{
			xThis.m_axRPCs.splice(iIdx,1);
		};
		p_xRPC=null;
		xThis.CallNextRPC();
	};
	
	this.OnSucceed=function(p_xRPC)
	{
		this.m_iCurRunning--;
		p_xRPC.m_xFncSucceedHandler();
		var iIdx=xThis.m_axRPCs.indexOf(p_xRPC);
		if(iIdx!=-1)
		{
			xThis.m_axRPCs.splice(iIdx,1);
		};
		p_xRPC=null;
		xThis.CallNextRPC();		
	};
	
	this.CallNextRPC=function()
	{
//		while(this.m_iMaxRunning>this.m_iCurRunning)
		{
			if(xThis.m_axRPCs.length==0){return;};
			if(xThis.m_iDelay>0)
			{
				if(xThis.m_iDelayTimer!=-1)
				{
					xThis.m_iDelayTimer=-1;
				}
				else
				{
					xThis.m_iDelayTimer=window.setTimeout(function(){xThis.CallNextRPC();},xThis.m_iDelay);
				};
			};
			var xRPC=xThis.m_axRPCs[0];
			xRPC.Send();
			this.m_iCurRunning++;
		};
	};
	
	this.Clear=function()
	{
		if(this.m_iDelayTimer!=-1)
		{
			window.clearTimeout(this.m_iDelayTimer);
			this.m_iDelayTimer=-1;
		};
		var i,iC=this.m_axRPCs.length;
		for(i=0;i<iC;i++)
		{
			this.m_axRPCs[i].Abort();
		};
		pit_Purge(this.m_axRPCs);
		this.m_iCurRunning=0;
	};
	
	this.Add=function(p_xRPC)
	{
		/*
		p_xRPC.m_xFncFailHandler=p_xRPC.OnFail;
		p_xRPC.m_xFncSucceedHandler=p_xRPC.OnSucceed;
		p_xRPC.OnFail=function()
		{
			xThis.OnFail(p_xRPC);
		};
		p_xRPC.OnSucceed=function()
		{
			xThis.OnSucceed(p_xRPC);
		};
		if((xThis.m_axRPCs.length==0)||(this.m_iCurRunning<this.m_iMaxRunning))
		{
			xThis.m_axRPCs.push(p_xRPC);
			p_xRPC.Send();
		}
		else
		{
			xThis.m_axRPCs.push(p_xRPC);
		};
		*/
		p_xRPC.Send();
	};
};

function pit_LoadPageToEl(p_xEL,p_sURL)
{
	if(p_xEL.m_hHnd){p_xEL=p_xEL.MakeEl();};
	var xRPC=new PitRPC();
	xRPC.m_bNoArgs=true;
	xRPC.m_sMethod="get";
	if(x_iSiteVersion)
	{
		if(p_sURL.indexOf('?')==-1)
		{
			p_sURL=p_sURL+"?ptversion="+x_iSiteVersion;
		};
	};
	xRPC.SetURL(p_sURL);
	xRPC.OnFail=function(){
		var xE=p_xEL;
		if(xE.m_hHnd){xE=xE.MakeEl();};
		pit_SetIH(p_xEL,"Failed "+xRPC.m_sResultText);
	};
	xRPC.OnSucceed=function(){
		var xE=p_xEL;
		if(xE.m_hHnd){xE=xE.MakeEl();};
		pit_SetIH(p_xEL,xRPC.m_sResultText);
	};
	xRPC.Send();
};

function pit_LoadPageToElC(p_xEL,p_sURL,p_sSubClass)
{
	if(p_xEL.m_hHnd){p_xEL=p_xEL.MakeEl();};
	var xRPC=new PitRPC();
	xRPC.m_bNoArgs=true;
	xRPC.m_sMethod="get";
	if(x_iSiteVersion)
	{
		if(p_sURL.indexOf('?')==-1)
		{
			p_sURL=p_sURL+"?ptversion="+x_iSiteVersion;
		};
	};
	xRPC.SetURL(p_sURL);
	xRPC.OnFail=function(){
		pit_SetIH(p_xEL,"<div class=\""+p_sSubClass+"\">"+xRPC.m_sResultText+"</div>");
	};
	xRPC.OnSucceed=function(){
		pit_SetIH(p_xEL,"<div class=\""+p_sSubClass+"\">"+xRPC.m_sResultText+"</div>");
	};
	xRPC.Send();
};

var g_xPitLoader=new function() {
	
	// loader stuff
	this.m_xDiv=null;
	this.m_iTimerCnt=0;
	this.m_sDivID="";
	this.m_iRemaining=0;
	this.m_fCompletion=0;
	this.m_fCompletionD=0;
	this.m_axFinishHandlers=new Array();
	this.m_xDivOrgAlign=null;
	this.m_xDivOrgInner=null;
	this.m_axImgList=new Array();
	this.m_iTimerID=0;
	this.m_iThreshold=20;
	this.m_iExternals=0;

	this.Start=function(p_sDivID) {
		this.m_iTimerCnt=0;
		this.m_xDiv=document.getElementById(p_sDivID);
		this.m_sDivID=p_sDivID;
		if(!this.m_xDiv){return;};
		this.m_xDiv.style.visibility="hidden";
		this.m_iTimerID=window.setInterval("g_xPitLoader.Update()",50);
		this.m_xOrgAlign=this.m_xDiv.align;
		this.m_xDivOrgInner=this.m_xDiv.innerHTML;
		this.m_xDiv.align="center";
		this.m_xDiv.style.zIndex=0;
		var xSB=new PitStringBuilder();
		xSB.Add("<div id='",this.m_sDivID,"_status' class='pit_loadscreen_statusbox'>");
		xSB.Add("<div class='pit_loadscreen_statusbox_title' align='center'>");
		xSB.Add("loading...</div></div>");	// title
		pit_SetIH(this.m_xDiv,xSB.GetString());
//		pit_Log("Loader start");
	};
	
	this.MakeVisible=function()
	{
//		pit_Log("IList "," Rem ",g_xPitLoader.m_iRemaining," ",this.m_axImgList.length);
		var xSB=new PitStringBuilder();
		xSB.Add("<div id='",this.m_sDivID,"_status' class='pit_loadscreen_statusbox'>");
		xSB.Add("<div class='pit_loadscreen_statusbox_title' align='center'>");
		xSB.Add("loading...");	// title
		xSB.Add("</div><div id='pit_loadscreen_statusbox_bar1'></div>");
		xSB.Add("<div id='pit_loadscreen_statusbox_bar2'></div></div>");
		pit_SetIH(this.m_xDiv,xSB.GetString());
		this.m_xDiv.style.zIndex=998;
		this.m_xDiv.style.visibility="visible";
//		pit_Log("Loader show ",this.m_axImgList.length," ",this.m_iRemaining);
	};
	
	this.Clear=function() {
		if(this.m_xDiv)
		{
			this.m_xDiv.align=this.m_xOrgAlign;
			pit_SetIH(this.m_xDiv,this.m_xDivOrgInner);
			this.m_xDiv.style.visibility="hidden";
		};
		window.clearInterval(this.m_iTimerID);
	};
	
	this.AddImg=function() {
		var i;
		for(i=0;i<arguments.length;i++){ 
			iIndex=this.m_axImgList.length;
			this.m_axImgList.push(new Image());
			this.m_axImgList[iIndex].onload=g_xPitLoader.NextImgDone;
			this.m_axImgList[iIndex].onerror=g_xPitLoader.NextImgDone;
			this.m_axImgList[iIndex].src=arguments[i];
//			pit_Log("Load ",arguments[i]);
			this.m_iRemaining++;
		};
	}

	this.AddScript=function() {
		var i;
		for(i=0;i<arguments.length;i++){ 
			var xScr=document.createElement("script"); 
			xScr.onload=g_xPitLoader.NextImgDone;
			xScr.onerror=g_xPitLoader.NextImgDone;
			xScr.setAttribute("src",arguments[i]); 
			document.body.appendChild(xScr); 
//			pit_Log("Load ",arguments[i]);
//			this.m_iRemaining++;
		};
	}

	this.UpdateBar=function(fCompletion)
	{
		var fStage=fCompletion;
		if(fStage>1.0){fStage=1.0;};
		if(fStage<0.0){fStage=0.0;};
		var iL=Math.floor(fStage*100);
		var iR=100-iL;
		var xD1=document.getElementById("pit_loadscreen_statusbox_bar1");
		var xD2=document.getElementById("pit_loadscreen_statusbox_bar2");
		if(xD1 && xD2)
		{
			xD1.style.width=iL+"%";
			xD2.style.left=iL+"%";
			xD2.style.width=iR+"%";
		};
	};
	
	this.CallFinishHandlers=function()
	{
//		pit_Log("Finish start");
//		this.Clear();
		var i,iC;
		iC=this.m_axFinishHandlers.length;
		for(i=0;i<iC;i++)
		{
			var xO=this.m_axFinishHandlers[i];
			if(xO.m_sDiv!="")
			{
				xO.m_xInst.Init(xO.m_sDiv,xO.m_xFnc);
			}
			else
			{
				xO.m_xFnc();
			};
		};
		this.m_axFinishHandlers=new Array();
//		pit_Log("Finish done");
		if(this.m_iTimerCnt>=this.m_iThreshold)
		{
			pit_AnimateTransparency(this.m_sDivID,1.0,0.0,1000);
			pit_SetTimer(function() {g_xPitLoader.Clear();},1000);
		}
		else
		{
			g_xPitLoader.Clear();
		};
	};

	this.NextImgDone=function()
	{
		g_xPitLoader.m_iRemaining--;
		var iTotal=g_xPitLoader.m_axImgList.length+g_xPitLoader.m_iExternals;
		var fComp=(iTotal-g_xPitLoader.m_iRemaining)/iTotal;
//		pit_Log("Img done ",g_xPitLoader.m_iRemaining," ",iTotal," ",fComp," ",this.src);
		if(fComp>g_xPitLoader.m_fCompletion){g_xPitLoader.m_fCompletion=fComp;};
		if(g_xPitLoader.m_iRemaining==0)
		{
			g_xPitLoader.CallFinishHandlers();
		};
		/*
		for(var i in g_xPitLoader.m_axImgList)
		{
//			pit_Log(" Img ",g_xPitLoader.m_axImgList[i].src);
		};
		*/
	};
	
	this.Update=function()
	{
		if(this.m_axImgList.length==0)
		{
			g_xPitLoader.CallFinishHandlers();
			return;
		};
		this.m_iTimerCnt++;
//		pit_Log("Timer ",this.m_iTimerCnt," Rem ",g_xPitLoader.m_iRemaining," ",this.m_axImgList.length);
		var fLastCompletion=this.m_fCompletion;
		if(this.m_fCompletionD<fLastCompletion)
		{
			this.m_fCompletionD=this.m_fCompletionD*0.9+this.m_fCompletion*0.1;
			if(this.m_iTimerCnt>=this.m_iThreshold)
			{
				this.UpdateBar(this.m_fCompletionD);
			};
		};
		if(this.m_iRemaining==0)
		{
			this.m_xDiv.style.visibility="hidden";
			return;
		};
		if(this.m_iTimerCnt==10)
		{
			this.m_xDiv.style.zIndex=998;
			this.m_xDiv.style.visibility="visible";
			pit_SetTransparency(this.m_sDivID,1.0);
		};
		if(this.m_iTimerCnt==this.m_iThreshold)
		{
			this.m_xDiv.style.zIndex=998;
			this.m_xDiv.style.visibility="visible";
			this.MakeVisible();
		};
	};
	
	this.RegisterFinishHandler=function(p_xHandler)
	{
		if((this.m_fCompletion<1.0)&&(g_xPitLoader.m_axImgList.length+g_xPitLoader.m_iExternals>0))
		{
			var xI=new Object();
			xI.m_sDiv="";
			xI.m_xInst=null;
			xI.m_xFnc=p_xHandler;
			this.m_axFinishHandlers.push(xI);
		}
		else
		{
			p_xHandler();
		};
	};
	
	this.RegisterInstFinishHandler=function(p_sDivID,p_xInstance,p_xHandler)
	{
		if((this.m_fCompletion<1.0)&&(g_xPitLoader.m_axImgList.length+g_xPitLoader.m_iExternals>0))
		{
			var xI=new Object();
			xI.m_sDiv=p_sDivID;
			xI.m_xInst=p_xInstance;
			xI.m_xFnc=p_xHandler;
			this.m_axFinishHandlers.push(xI);
		}
		else
		{
			p_xInstance.Init(p_sDivID,p_xHandler);
		};
	};
};

var g_xPitTiles=new function() {
	// tile stuff
	
	this.m_axTileSources=new Object();
	this.m_axTiles=new Object();
	this.m_axAnims=new Object();
	this.m_xScrollBarDefs=new Object();
	this.m_axFonts=new Object();
	
	this.AddImg=function(p_sName,p_sSrc)
	{
		if(!p_sSrc){p_sSrc=p_sName;};
		g_xPitLoader.AddImg(p_sSrc);
		this.m_axTileSources[p_sName]=p_sSrc;
	};
	
	this.GetTile=function(p_sName)
	{
		return this.m_axTiles[p_sName];
	};
	
	this.AddTileDef=function(p_sName,p_sImgName,p_sImgSrc,p_iX,p_iY,p_iW,p_iH,p_sPrefix,p_sStyleAdd)
	{
		if(!p_sPrefix){p_sPrefix="pittile";};
		var xT=new Object();
		if(!this.m_axTileSources[p_sImgName])
		{
			this.m_axTileSources[p_sImgName]=p_sImgSrc;
			g_xPitLoader.AddImg(p_sImgSrc);
		}
		else
		{
		};
		xT.m_sName=p_sName;
		xT.m_sSrcName=p_sImgName;
		xT.m_sSrcImg=p_sImgSrc;
		xT.m_iL=p_iX;
		xT.m_iT=p_iY;
		xT.m_iW=p_iW;
		xT.m_iH=p_iH;
		if(p_sStyleAdd){
			pit_AddStyle("."+p_sPrefix+"_"+p_sName,"background: url("+xT.m_sSrcImg+");"+"background-position: -"+p_iX+"px -"+p_iY+"px;width:"+p_iW+"px;height:"+p_iH+"px;font-size:1px;"+p_sStyleAdd);
		}else{
			pit_AddStyle("."+p_sPrefix+"_"+p_sName,"background: url("+xT.m_sSrcImg+");"+"background-position: -"+p_iX+"px -"+p_iY+"px;width:"+p_iW+"px;height:"+p_iH+"px;font-size:1px");
		};
		this.m_axTiles[p_sName]=xT;
	};

	this.AddTileDef=function(p_sName,p_sSrcImg,p_iX,p_iY,p_iW,p_iH)
	{
		var xT=new Object();
		xT.m_sName=p_sName;
		xT.m_sSrcName=p_sSrcImg;
		xT.m_sSrcImg=this.m_axTileSources[p_sSrcImg];
		xT.m_iL=p_iX;
		xT.m_iT=p_iY;
		xT.m_iW=p_iW;
		xT.m_iH=p_iH;
		pit_AddStyle(".pittile_"+p_sName,"background: url("+encodeURI(xT.m_sSrcImg)+");"+
		"background-position: -"+p_iX+"px -"+p_iY+"px;width:"+p_iW+"px;height:"+p_iH+"px;font-size:1px"
		);
		this.m_axTiles[sName]=xT;
	};

	this.AddTileXDef=function(p_sName,p_sSrcImg1,p_iX1,p_iY1,p_sSrcImg2,p_iX2,p_iY2,p_iW,p_iH)
	{
		var xT=new Object();
		xT.m_sName=p_sName;
		xT.m_sSrcName=p_sSrcImg1;
		xT.m_sSrcImg=this.m_axTileSources[p_sSrcImg1];
		xT.m_iL=p_iX1;
		xT.m_iT=p_iY1;
		xT.m_iW=p_iW;
		xT.m_iH=p_iH;
		var sStyle;
		sStyle="background: url("+encodeURI(p_sSrcImg1)+");background-position: -"+p_iX1+"px -"+
		p_iY1+"px;width:"+p_iW+"px;height:"+p_iH+"px;border:0px;font-size:1px";
		pit_AddStyle(".pittile_"+p_sName,sStyle);
		sStyle="background: url("+encodeURI(p_sSrcImg2)+");background-position: -"+p_iX2+"px -"+
		p_iY2+"px;width:"+p_iW+"px;height:"+p_iH+"px;border:0px;font-size:1px";
		pit_AddStyle(".pittile_"+p_sName+":hover",sStyle);

		sStyle="background: url("+encodeURI(p_sSrcImg1)+");background-position: -"+p_iX1+"px -"+
		p_iY1+"px;width:"+p_iW+"px;height:"+p_iH+"px;border:0px;font-size:1px";
		pit_AddStyle("a .pittile_"+p_sName,sStyle);
		sStyle="background: url("+encodeURI(p_sSrcImg2)+");background-position: -"+p_iX2+"px -"+
		p_iY2+"px;width:"+p_iW+"px;height:"+p_iH+"px;border:0px;font-size:1px";
		pit_AddStyle("a:hover .pittile_"+p_sName,sStyle);
		this.m_axTiles[p_sName]=xT;
	};

	this.ReadImgDef=function(p_axDefList)
	{
		var i,iC=p_axDefList.length;
		i=0;
		var sCurTileSrc=""
		while(i<iC)
		{
			var sCmd=p_axDefList[i];i++;
			if(sCmd=="img")
			{
				var sName=p_axDefList[i];i++;
				var sSrc=p_axDefList[i];i++;
				g_xPitLoader.AddImg(sSrc);
				this.m_axTileSources[sName]=sSrc;
			}
			else if(sCmd=="settilesource")
			{
				sCurTileSrc=p_axDefList[i];i++;
			}
			else if(sCmd=="tile")
			{
				var sName=p_axDefList[i];i++;
				var iL=Number(p_axDefList[i]);i++;
				var iT=Number(p_axDefList[i]);i++;
				var iW=Number(p_axDefList[i]);i++;
				var iH=Number(p_axDefList[i]);i++;
				var xT=new Object();
				xT.m_sName=sName;
				xT.m_sSrcName=sCurTileSrc;
				xT.m_sSrcImg=this.m_axTileSources[sCurTileSrc];
				xT.m_iL=iL;
				xT.m_iT=iT;
				xT.m_iW=iW;
				xT.m_iH=iH;
				pit_AddStyle(".pittile_"+sName,"background: url("+encodeURI(xT.m_sSrcImg)+");"+
				"background-position: -"+iL+"px -"+iT+"px;width:"+iW+"px;height:"+iH+"px;font-size:1px"
//				"background-position: -"+iL+"px -"+iT+"px;width:"+iW+"px;height:"+iH+"px"
				);
				this.m_axTiles[sName]=xT;
			}
			else if(sCmd=="tilex")
			{
				var sName=p_axDefList[i];i++;
				var iL1=Number(p_axDefList[i]);i++;
				var iT1=Number(p_axDefList[i]);i++;
				var iL2=Number(p_axDefList[i]);i++;
				var iT2=Number(p_axDefList[i]);i++;
				var iW=Number(p_axDefList[i]);i++;
				var iH=Number(p_axDefList[i]);i++;
				var xT=new Object();
				xT.m_sName=sName;
				xT.m_sSrcName=sCurTileSrc;
				xT.m_sSrcImg=this.m_axTileSources[sCurTileSrc];
				xT.m_iL=iL;
				xT.m_iT=iT;
				xT.m_iW=iW;
				xT.m_iH=iH;
				var sStyle;
				sStyle="background: url("+encodeURI(xT.m_sSrcImg)+");background-position: -"+iL1+"px -"+
				iT1+"px;width:"+iW+"px;height:"+iH+"px;border:0px;font-size:1px";
				pit_AddStyle(".pittile_"+sName,sStyle);
				sStyle="background: url("+encodeURI(xT.m_sSrcImg)+");background-position: -"+iL2+"px -"+
				iT2+"px;width:"+iW+"px;height:"+iH+"px;border:0px;font-size:1px";
				pit_AddStyle(".pittile_"+sName+":hover",sStyle);

				sStyle="background: url("+encodeURI(xT.m_sSrcImg)+");background-position: -"+iL1+"px -"+
				iT1+"px;width:"+iW+"px;height:"+iH+"px;border:0px;font-size:1px";
				pit_AddStyle("a .pittile_"+sName,sStyle);
				sStyle="background: url("+encodeURI(xT.m_sSrcImg)+");background-position: -"+iL2+"px -"+
				iT2+"px;width:"+iW+"px;height:"+iH+"px;border:0px;font-size:1px";
				pit_AddStyle("a:hover .pittile_"+sName,sStyle);
				
				this.m_axTiles[sName]=xT;
			}
			else if(sCmd=="anim")
			{
				var sName=p_axDefList[i];i++;
				var iL=Number(p_axDefList[i]);i++;
				var iT=Number(p_axDefList[i]);i++;
				var iW=Number(p_axDefList[i]);i++;
				var iH=Number(p_axDefList[i]);i++;
				var iFC=Number(p_axDefList[i]);i++;
				var iF;
				for(iF=1;iF<iFC+1;iF++)
				{
					var xT=new Object();
					xT.m_sName=sName+"_"+iF;
					xT.m_sSrcName=sCurTileSrc;
					xT.m_sSrcImg=this.m_axTileSources[sCurTileSrc];
					xT.m_iL=iL;
					xT.m_iT=iT;
					xT.m_iW=iW;
					xT.m_iH=iH;
					pit_AddStyle(".pittile_"+sName+"_"+iF,"background: url("+encodeURI(xT.m_sSrcImg)+");"+
					"background-position: -"+iL+"px -"+iT+"px;width:"+iW+"px;height:"+iH+"px;font-size:1px");
//					pit_Log("T ",sName+"_"+iF);
					this.m_axTiles[sName+"_"+iF]=xT;
					iL+=iW;
				};
			}
			else if(sCmd=="grid")
			{
				var sName=p_axDefList[i];i++;
				var iL=Number(p_axDefList[i]);i++;
				var iT=Number(p_axDefList[i]);i++;
				var iW=Number(p_axDefList[i]);i++;
				var iH=Number(p_axDefList[i]);i++;
				var iXC=Number(p_axDefList[i]);i++;
				var iYC=Number(p_axDefList[i]);i++;
				var iX,iY;
				for(iX=1;iX<iXC+1;iX++)
				{
					for(iY=1;iY<iYC+1;iY++)
					{
						var xT=new Object();
						xT.m_sName=sName+"_"+iX+"_"+iY;
						xT.m_sSrcName=sCurTileSrc;
						xT.m_sSrcImg=this.m_axTileSources[sCurTileSrc];
						xT.m_iL=iL+(iX-1)*iW;
						xT.m_iT=iT+(iY-1)*iH;
						xT.m_iW=iW;
						xT.m_iH=iH;
						pit_AddStyle(".pittile_"+sName+"_"+iX+"_"+iY,"background: url("+encodeURI(xT.m_sSrcImg)+");"+
						"background-position: -"+xT.m_iL+"px -"+xT.m_iT+"px;width:"+iW+"px;height:"+iH+"px;font-size:1px");
	//					pit_Log("T ",sName+"_"+iF);
						this.m_axTiles[sName+"_"+iX+"_"+iY]=xT;
					};
				};
			}
			else if(sCmd=="font")
			{
				var sName=p_axDefList[i++];
				var sCharSet=p_axDefList[i++];
				var iY=p_axDefList[i++];
				var iH=p_axDefList[i++];
				var iXLast=p_axDefList[i++];
				var iCCnt=sCharSet.length;
				var iCc;
				var xF=new Object();
				xF.m_sName=sName;
				xF.m_sSrcName=sCurTileSrc;
				xF.m_sSrcImg=this.m_axTileSources[sCurTileSrc];
				xF.m_iY=iY;
				xF.m_iH=iH;
				var iWSum=0;
				for(iCc=0;iCc<iCCnt;iCc++)
				{
					var cC=sCharSet.charCodeAt(iCc);
					var iXC=p_axDefList[i++];
					var iW=iXC-iXLast;
					xF["x_"+cC]=iXLast;
					xF["w_"+cC]=iXC-iXLast-1;
					pit_AddStyle(".pitfont_"+sName+"_"+cC,"background: url("+encodeURI(xF.m_sSrcImg)+");font-size:1px;background-position:"+(-iXLast)+"px "+(-iY)+"px;width:"+(iXC-iXLast-1)+"px;height:"+iH+"px");
					iWSum+=iXC-iXLast-1;
					iXLast=iXC;
				};
				xF.m_iAvgW=Math.floor(iWSum/iCCnt);
				this.m_axFonts[sName]=xF;
			}
			else if(sCmd=="fontx")
			{
				var sName=p_axDefList[i++];
				pit_Log("Font ",sName);
				var sCharSet=p_axDefList[i++];
				var iY1=p_axDefList[i++];
				var iY2=p_axDefList[i++];
				var iH=p_axDefList[i++];
				var iXLast=p_axDefList[i++];
				var iCCnt=sCharSet.length;
				var iCc;
				var xF=new Object();
				xF.m_sName=sName;
				xF.m_sSrcName=sCurTileSrc;
				xF.m_sSrcImg=this.m_axTileSources[sCurTileSrc];
				xF.m_iY=iY;
				xF.m_iH=iH;
				var iWSum=0;
				for(iCc=0;iCc<iCCnt;iCc++)
				{
					var cC=sCharSet.charCodeAt(iCc);
					var iXC=p_axDefList[i++];
					var iW=iXC-iXLast;
					xF["x_"+cC]=iXLast;
					xF["w_"+cC]=iXC-iXLast-1;
					pit_AddStyle(".pitfont_"+sName+"_"+cC,"background: url("+encodeURI(xF.m_sSrcImg)+");font-size:1px;background-position:"+(-iXLast)+"px "+(-iY1)+"px;width:"+(iXC-iXLast-1)+"px;height:"+iH+"px");
					pit_AddStyle(".pitfont_"+sName+"_"+cC+":hover","background: url("+encodeURI(xF.m_sSrcImg)+");font-size:1px;background-position:"+(-iXLast)+"px "+(-iY2)+"px;width:"+(iXC-iXLast-1)+"px;height:"+iH+"px");
					pit_AddStyle("a:hover .pitfont_"+sName+"_"+cC,"background: url("+encodeURI(xF.m_sSrcImg)+");font-size:1px;background-position:"+(-iXLast)+"px "+(-iY2)+"px;width:"+(iXC-iXLast-1)+"px;height:"+iH+"px");
					iWSum+=iXC-iXLast-1;
					iXLast=iXC;
				};
				xF.m_iAvgW=Math.floor(iWSum/iCCnt);
				this.m_axFonts[sName]=xF;
			}
			else
			{
				pit_Log("Invalid ",sCmd);
				Assert(false,"Invalid command in tile def "+sCmd);
			}
		};
	};
	
	this.AddBitmapFontText=function(p_xEl,p_sFont,p_sText,p_iX,p_iY,p_iExtraSpace)
	{
		if(p_xEl.GetEl){p_xEl=p_xEl.GetEl();};
		var iS,iSL=p_sText.length;
		var xF=this.m_axFonts[p_sFont];
		if(!xF){return 0;};
		var iXC=p_iX;
		var iH=xF.m_iH;
		var iY=xF.m_iY;
		var iSpace=Math.ceil(xF.m_iAvgW*0.5);
		var sClass="pitfont_"+p_sFont+"_";
		for(iS=0;iS<iSL;iS++)
		{
			var cCh=p_sText.charCodeAt(iS);
			var iX=xF["x_"+cCh];
			var iW=xF["w_"+cCh];
			if(!iW)
			{
				iXC+=iSpace+p_iExtraSpace;
			}
			else
			{
				var xD=document.createElement("div");
				xD.className=sClass+cCh;
				xD.style.position="absolute";
				xD.style.left=iXC+"px";
				xD.style.top=p_iY+"px";
				xD.style.width=iW+"px";
				xD.style.height=iH+"px";
				iXC+=iW+p_iExtraSpace;
				p_xEl.appendChild(xD);
			};
		};
	};
	
	this.GetTileSrc=function(p_sTile)
	{
		var xTile=this.m_axTiles[p_sTile];
		Assert(xTile,"Unknown tile "+p_sTile);
		if(!xTile){return "";};
		return xTile.m_sSrcImg;
	};
	
	this.SetElTile=function(p_xEl,p_sTile,p_bNoShrink)
	{
		var xTile=this.m_axTiles[p_sTile];
		Assert(xTile,"Unknown tile "+p_sTile);
		if(!xTile){return;};
		if(p_xEl.GetEl){
			p_xEl.SetSize(xTile.m_iW,xTile.m_iH);
			p_xEl=p_xEl.GetEl();
		};
		p_xEl.className="pittile_"+p_sTile;
		if((!p_bNoShrink)||!(p_xEl.offsetWidth>xTile.m_iW))
		{
			p_xEl.style.width=xTile.m_iW+"px";
		};
		if((!p_bNoShrink)||!(p_xEl.offsetHeight>xTile.m_iH))
		{
			p_xEl.style.height=xTile.m_iH+"px";
		};
	};

	this.SetElAnimTile=function(p_xEl,p_sTile,p_iFrame)
	{
		p_sTile+="_"+p_iFrame;
		var xTile=this.m_axTiles[p_sTile];
		Assert(xTile,"Unknown tile "+p_sTile);
		if(!xTile){return;};
		if(p_xEl.m_xEl)
		{
			p_xEl.SetSize(xTile.m_iW,xTile.m_iH);
			p_xEl=p_xEl.m_xEl;
		};
		p_xEl.className="pittile_"+p_sTile;
		p_xEl.style.width=xTile.m_iW+"px";
		p_xEl.style.height=xTile.m_iH+"px";
	};

	this.SetElGridTile=function(p_xEl,p_sTile,p_iX,p_iY)
	{
		p_sTile+="_"+p_iX+"_"+p_iY;
		var xTile=this.m_axTiles[p_sTile];
		Assert(xTile,"Unknown tile "+p_sTile);
		if(!xTile){return;};
		if(p_xEl.m_xEl)
		{
			p_xEl.SetSize(xTile.m_iW,xTile.m_iH);
			p_xEl=p_xEl.m_xEl;
		};
		p_xEl.className="pittile_"+p_sTile;
		p_xEl.style.width=xTile.m_iW+"px";
		p_xEl.style.height=xTile.m_iH+"px";
	};

	this.BuildFrameDef=function(p_xSB,p_sBaseTile,p_iX,p_iY,p_iW,p_iH)
	{
		var iX,iY;
		var xTL=this.m_axTiles[p_sBaseTile+"_tl"];
		var xTC=this.m_axTiles[p_sBaseTile+"_tc"];
		var xTR=this.m_axTiles[p_sBaseTile+"_tr"];
		var xBL=this.m_axTiles[p_sBaseTile+"_bl"];
		var xBC=this.m_axTiles[p_sBaseTile+"_bc"];
		var xBR=this.m_axTiles[p_sBaseTile+"_br"];
		var xCL=this.m_axTiles[p_sBaseTile+"_cl"];
		var xCR=this.m_axTiles[p_sBaseTile+"_cr"];
		var iS,iE,iI,iC;
		iI=xTC.m_iW;
		iS=p_iX+xTL.m_iW;
		iE=p_iX+p_iW-xTR.m_iW;
		iC=0;
		for(iX=iS;iX<iE;iX+=iI)
		{
			p_xSB.Add("<div class='pittile_",p_sBaseTile,"_tc' style='position:absolute;left:",iX,"px;top:",p_iY,"px'></div>");
		};
		iC=p_iY+p_iH-xBC.m_iH;
		for(iX=iS;iX<iE;iX+=iI)
		{
			p_xSB.Add("<div class='pittile_",p_sBaseTile,"_bc' style='position:absolute;left:",iX,"px;top:",iC,"px'></div>");
		};
		iI=xCL.m_iH;
		iS=p_iY+xTL.m_iH;
		iE=p_iY+p_iH-xBL.m_iH;
		for(iY=iS;iY<iE;iY+=iI)
		{
			p_xSB.Add("<div class='pittile_",p_sBaseTile,"_cl' style='position:absolute;left:",p_iX,"px;top:",iY,"px'></div>");
		};
		iC=p_iX+p_iW-xCR.m_iW;
		for(iY=iS;iY<iE;iY+=iI)
		{
			p_xSB.Add("<div class='pittile_",p_sBaseTile,"_cr' style='position:absolute;left:",iC,"px;top:",iY,"px'></div>");
		};
		p_xSB.Add("<div class='pittile_",p_sBaseTile,"_tl' style='position:absolute;left:",p_iX,"px;top:",p_iY,"px'></div>");
		p_xSB.Add("<div class='pittile_",p_sBaseTile,"_tr' style='position:absolute;left:",p_iX+p_iW-xTR.m_iW,"px;top:",p_iY,"px'></div>");
		p_xSB.Add("<div class='pittile_",p_sBaseTile,"_bl' style='position:absolute;left:",p_iX,"px;top:",p_iY+p_iH-xBL.m_iH,"px'></div>");
		p_xSB.Add("<div class='pittile_",p_sBaseTile,"_br' style='position:absolute;left:",p_iX+p_iW-xTR.m_iW,"px;top:",p_iY+p_iH-xBR.m_iH,"px'></div>");
	};

	this.AddSingleDiv=function(p_xParent,p_sTile,p_iX,p_iY,p_sType,p_xFnc)
	{
		var xPE=p_xParent;
		if(xPE.GetEl){xPE=xPE.GetEl();};
		var xTL=this.m_axTiles[p_sTile];
		if(!p_sType){p_sType="div";};
		xD=document.createElement(p_sType);
		xD.className="pittile_"+p_sTile;
		xD.style.position="absolute";
		xD.style.left=p_iX+"px";
		xD.style.top=p_iY+"px";
		if(p_sType=="a"){xD.href="#";};
		if(p_xFnc)
		{
			xD.onclick=p_xFnc;
			xD.style.cursor="pointer";
		};
		xPE.appendChild(xD);
		return p_iX+xTL.m_iW;
	};
	
	this.AddStretchedHDivs=function(p_xParent,p_sTile,p_iX,p_iY,p_iW,p_sType,p_bBehind)
	{
		var xPE=p_xParent;
		if(xPE.GetEl){xPE=xPE.GetEl();};
		var xTL=this.m_axTiles[p_sTile];
		var iX=p_iX;
		var iW=p_iW;
		if(!p_sType){p_sType="div";};
		while(iW>0)
		{
			xD=document.createElement(p_sType);
			xD.className="pittile_"+p_sTile;
			xD.style.position="absolute";
			xD.style.left=iX+"px";
			xD.style.top=p_iY+"px";
			if(p_sType=="a"){xD.href="#";};
			if(iW<xTL.m_iW)
			{
				xD.style.width=iW+"px";
			};
			if(p_bBehind)
			{
				var xFC=xPE.firstChild;
				if(!xFC){xPE.appendChild(xD);}else{xPE.insertBefore(xD,xFC);};
			}
			else
			{
				xPE.appendChild(xD);
			};
			iW-=xTL.m_iW;
			iX+=xTL.m_iW;
		};
		return p_iX+p_iW;
	};
	
	this.AddHBarDivs=function(p_xParent,p_sBaseTile,p_iX,p_iY,p_iW,p_iH)
	{
		var iX;
		var xTL=this.m_axTiles[p_sBaseTile+"_l"];
		var xTC=this.m_axTiles[p_sBaseTile+"_c"];
		var xTR=this.m_axTiles[p_sBaseTile+"_r"];
		var xPE=p_xParent;
		if(xPE.GetEl){xPE=xPE.GetEl();};
		var iL=xTL.m_iW;
		var iR=xTR.m_iW;
		var iI=xTC.m_iW;
		var xD;
		var iCenterCnt=0;
		var xCenterDivLast;
		for(iX=iL+p_iX;iX<p_iX+p_iW-iR;iX+=iI)
		{
			xD=document.createElement("div");
			xD.className="pittile_"+p_sBaseTile+"_c";
			xD.style.position="absolute";
			xD.style.left=iX+"px";
			xD.style.top=p_iY+"px";
			xD.setAttribute("bar_type","h_c"+iCenterCnt);
			if(iX+iI>p_iX+p_iW-iR) {xD.style.width=(p_iX+p_iW-iR-iX)+"px";};
			
			var xOld=Node_getChildByAttrib(xPE,"bar_type","h_c"+iCenterCnt);
			if(xOld)
			{
				xPE.replaceChild(xD,xOld);
			}
			else
			{
				if(xCenterDivLast)
				{
					xPE.insertBefore(xD,xCenterDivLast);
				}
				else
				{
					xPE.appendChild(xD);
				};
			};
			xCenterDivLast=xD;
			iCenterCnt++;
		};
		for(var i=iCenterCnt;i<100;i++)
		{
			var xOld=Node_getChildByAttrib(xPE,"bar_type","h_c"+iCenterCnt);
			if(!xOld) {break;};
			xPE.removeChild(xOld);
		};
		
		xD=document.createElement("div");
		xD.className="pittile_"+p_sBaseTile+"_l";
		xD.style.position="absolute";
		xD.style.left=p_iX+"px";
		xD.style.top=p_iY+"px";
		xD.setAttribute("bar_type","h_l");
		var xOld=Node_getChildByAttrib(xPE,"bar_type","h_l");
		if(xOld) {xPE.replaceChild(xD,xOld);} else {xPE.appendChild(xD);};
		
		xD=document.createElement("div");
		xD.className="pittile_"+p_sBaseTile+"_r";
		xD.style.position="absolute";
		xD.style.left=p_iX+p_iW-iR+"px";
		xD.style.top=p_iY+"px";
		xD.setAttribute("bar_type","h_r");
		var xOld=Node_getChildByAttrib(xPE,"bar_type","h_r");
		if(xOld) {xPE.replaceChild(xD,xOld);} else {xPE.appendChild(xD);};
	};

	this.AddFrameDivs=function(p_xParent,p_sBaseTile,p_iX,p_iY,p_iW,p_iH,p_bNoBottom,p_bNoTop,p_sAltBR)
	{
		var iX,iY;
		var xTL=this.m_axTiles[p_sBaseTile+"_tl"];
		var xTC=this.m_axTiles[p_sBaseTile+"_tc"];
		var xTR=this.m_axTiles[p_sBaseTile+"_tr"];
		var xBL=this.m_axTiles[p_sBaseTile+"_bl"];
		var xBC=this.m_axTiles[p_sBaseTile+"_bc"];
		var xBR=this.m_axTiles[p_sBaseTile+"_br"];
		var xCL=this.m_axTiles[p_sBaseTile+"_cl"];
		var xCR=this.m_axTiles[p_sBaseTile+"_cr"];
		var sSufBR="_br";
		if(p_sAltBR)
		{
			xBR=this.m_axTiles[p_sBaseTile+p_sAltBR];
			sSufBR=p_sAltBR;
			if(!xBR)
			{
				xBR=this.m_axTiles[p_sBaseTile+"_br"];
			};
		};
		var iS,iE,iI,iC;
		var xD;
		var xPE=p_xParent;
		if(xPE.GetEl){xPE=xPE.GetEl();};
		if((!xTC)||(!xTL)||(!xTR))
		{
			pit_Log("Invalid frame style ",p_sBaseTile);
			return;
		};
		iI=xTC.m_iW;
		iS=p_iX+xTL.m_iW;
		iE=p_iX+p_iW-xTR.m_iW;
		iC=0;
		if(!p_bNoTop)
		{
			for(iX=iS;iX<iE;iX+=iI)
			{
				xD=document.createElement("div");
				xD.className="pittile_"+p_sBaseTile+"_tc";
				xD.style.position="absolute";
				xD.style.left=iX+"px";
				xD.style.top=p_iY+"px";
				if((iX+iI)-iE>0) {xD.style.width=(iE-iX)+"px";};
				xPE.appendChild(xD);
			};
		};
		iC=p_iY+p_iH-xBC.m_iH;
		if(!p_bNoBottom)
		{
			for(iX=iS;iX<iE;iX+=iI)
			{
				xD=document.createElement("div");
				xD.className="pittile_"+p_sBaseTile+"_bc";
				xD.style.position="absolute";
				xD.style.left=iX+"px";
				xD.style.top=iC+"px";
				if((iX+iI)-iE>0) {xD.style.width=(iE-iX)+"px";};
				xPE.appendChild(xD);
			};
		};
		iI=xCL.m_iH;
		iS=p_iY+xTL.m_iH;
		iE=p_iY+p_iH;
		if(p_bNoTop){iS-=xTL.m_iH;};
		if(!p_bNoBottom){iE-=xBL.m_iH;};
		for(iY=iS;iY<iE;iY+=iI)
		{
			xD=document.createElement("div");
			xD.className="pittile_"+p_sBaseTile+"_cl";
			xD.style.position="absolute";
			xD.style.left=p_iX+"px";
			xD.style.top=iY+"px";
			if((iY+iI)-iE>0) {xD.style.height=(iE-iY)+"px";};
			xPE.appendChild(xD);
		};
		iC=p_iX+p_iW-xCR.m_iW;
		for(iY=iS;iY<iE;iY+=iI)
		{
			xD=document.createElement("div");
			xD.className="pittile_"+p_sBaseTile+"_cr";
			xD.style.position="absolute";
			xD.style.left=iC+"px";
			xD.style.top=iY+"px";
			if((iY+iI)-iE>0) {xD.style.height=(iE-iY)+"px";};
			xPE.appendChild(xD);
		};
		if(!p_bNoTop)
		{
			xD=document.createElement("div");xD.className="pittile_"+p_sBaseTile+"_tl";
			xD.style.position="absolute";xD.style.left=p_iX+"px";xD.style.top=p_iY+"px";xPE.appendChild(xD);
			xD=document.createElement("div");xD.className="pittile_"+p_sBaseTile+"_tr";
			xD.style.position="absolute";xD.style.left=p_iX+p_iW-xTR.m_iW+"px";xD.style.top=p_iY+"px";xPE.appendChild(xD);
		};
		if(!p_bNoBottom)
		{
			xD=document.createElement("div");xD.className="pittile_"+p_sBaseTile+"_bl";
			xD.style.position="absolute";xD.style.left=p_iX+"px";xD.style.top=p_iY+p_iH-xBL.m_iH+"px";xPE.appendChild(xD);
			xD=document.createElement("div");xD.className="pittile_"+p_sBaseTile+sSufBR;
			xD.style.position="absolute";xD.style.left=p_iX+p_iW-xTR.m_iW+"px";xD.style.top=p_iY+p_iH-xBL.m_iH+"px";xPE.appendChild(xD);
		};
	};

	this.BuildVScrollBarDef=function(p_xSB,p_sBaseTile,p_iW,p_iH)
	{
		var xT=this.m_axTiles[p_sBaseTile+"_bar_t"];
		var xC=this.m_axTiles[p_sBaseTile+"_bar_c"];
		var xB=this.m_axTiles[p_sBaseTile+"_bar_b"];
		if(!xT){pit_Log("Invalid tile for scrollv ",p_sBaseTile);return;};
		var iY=0;
		p_xSB.Add("<div class='pittile_",p_sBaseTile,"_bar_t' style='position:absolute;left:0px;top:",iY,"px'></div>");
		iY+=xT.m_iH;
		var iE=p_iH-xB.m_iH;
		while(iY<iE)
		{
			p_xSB.Add("<div class='pittile_",p_sBaseTile,"_bar_c' style='position:absolute;left:0px;top:",iY,"px'></div>");
			iY+=xC.m_iH;
		};
		p_xSB.Add("<div class='pittile_",p_sBaseTile,"_bar_b' style='position:absolute;left:0px;top:",iE,"px'></div>");
	};
	
	this.AddScrollBarDef=function(p_sBaseTile,p_iBarOfsX)
	{
		var xD=this.m_xScrollBarDefs[p_sBaseTile]=new Object();
		xD.m_iBarOfsX=p_iBarOfsX;
	};
	
	this.BuildVScrollBarEls=function(p_xParent,p_sBaseTile,p_iW,p_iH,p_iBarOfsX)
	{
		var xSBD=this.m_xScrollBarDefs[p_sBaseTile];
		if(xSBD) {p_iBarOfsX+=xSBD.m_iBarOfsX;};
		var sBOfs=p_iBarOfsX?""+p_iBarOfsX:"0";
		
		var xT=this.m_axTiles[p_sBaseTile+"_bar_t"];
		var xC=this.m_axTiles[p_sBaseTile+"_bar_c"];
		var xB=this.m_axTiles[p_sBaseTile+"_bar_b"];
		if(!xT){pit_Log("Invalid tile for scrollv ",p_sBaseTile);/*debugger;*/return;};
		var iY=0;
		var xE=document.createElement("a");
		xE.className="pittile_"+p_sBaseTile+"_bar_t";
		xE.style.position="absolute";
		xE.href="javascript:/**/";
		xE.style.left=sBOfs+"px";xE.style.top="0px";
		p_xParent.appendChild(xE);
		iY+=xT.m_iH;
		var iE=p_iH-xB.m_iH;
		while(iY<iE)
		{
			xE=document.createElement("div");
			xE.className="pittile_"+p_sBaseTile+"_bar_c";
			xE.style.position="absolute";
			xE.style.left=sBOfs+"px";xE.style.top=iY+"px";
			p_xParent.appendChild(xE);
			iY+=xC.m_iH;
		};
		xE=document.createElement("a");
		xE.className="pittile_"+p_sBaseTile+"_bar_b";
		xE.style.position="absolute";
		xE.href="javascript:/**/";
		xE.style.left=sBOfs+"px";xE.style.top=iE+"px";
		p_xParent.appendChild(xE);
	};

	this.BuildTextSButton=function(p_sText,p_sBtnStyle,p_iX,p_iY,p_iW,p_iH,p_xClickFnc)
	{
		var xBtn=document.createElement("a");
		xBtn.style.width=p_iW+"px";
		xBtn.style.height=p_iH+"px";
		if((p_iX!=-1)||(p_iY!=-1))
		{
			xBtn.style.position="absolute";
			xBtn.style.top=p_iY+"px";
			xBtn.style.left=p_iX+"px";
		}
		else
		{
			xBtn.style.position="relative";
			xBtn.style.top="0px";
			xBtn.style.left="0px";
		};
		xBtn.setAttribute("href","javascript:/**/");
		xBtn.className="pitTextGButton";
		if(p_xClickFnc)
		{
			xBtn.onclick=p_xClickFnc;
		};
		xBtn.innerHTML=p_sText;
		return xBtn;
	};
	
	this.BuildTextGButton=function(p_sText,p_sBtnStyle,p_iX,p_iY,p_iW,p_iH,p_xClickFnc)
	{
		var xBtn=document.createElement("a");
		xBtn.style.width=p_iW+"px";
		xBtn.style.height=p_iH+"px";
		if((p_iX!=-1)||(p_iY!=-1))
		{
			xBtn.style.position="absolute";
			xBtn.style.top=p_iY+"px";
			xBtn.style.left=p_iX+"px";
		}
		else
		{
			xBtn.style.position="relative";
			xBtn.style.top="0px";
			xBtn.style.left="0px";
		};
		xBtn.setAttribute("href","javascript:/**/");
		xBtn.className="pitTextGButton";
		if(p_xClickFnc)
		{
			xBtn.onclick=p_xClickFnc;
		};
		var xD=document.createElement("div");
		xD.style.position="relative";
		xD.style.top="0px";
		xD.style.left="0px";
		xD.style.width=p_iW+"px";
		xD.style.height=p_iH+"px";
		xBtn.appendChild(xD);
		this.AddHBarDivs(xD,p_sBtnStyle,0,0,p_iW,p_iH);
		var xTN=document.createElement("span");
		pit_SetIH(xTN,p_sText);
		xTN.style.position="absolute";
		xTN.style.left="2px";
		xTN.style.top="2px";
		xTN.style.width=(p_iW-4)+"px";
		xTN.style.height=(p_iH-4)+"px";
		xTN.style.textAlign="center";
		xTN.style.fontSize=Math.ceil(p_iH-9)+"px";
		xTN.style.cursor="pointer";
		xD.appendChild(xTN);
		return xBtn;
	};
	
	this.BuildFontButtonDiv=function(p_xEl,p_sBar,p_sFont,p_sText,p_iX,p_iY,p_iW,p_iH)
	{
		
	};
};

var g_xURLParameters=new function()
{
	this.m_axParams=new Array();

	this.ParseLocationSearch=function()
	{
		var sS=location.search;
		if(sS.length>1) {sS=sS.substring(1,sS.length);} else {return;};
		var asP=sS.split("&");
		for(var i=0;i<asP.length;i++)
		{
			asKV=asP[i].split("=");
			if(asKV.length==1)
			{
				asKV[0]=decodeURIComponent(asKV[0]);
				this.m_axParams.push(asKV);
			}
			else if(asKV.length==2)
			{
				asKV[0]=decodeURIComponent(asKV[0]);
				asKV[1]=decodeURIComponent(asKV[1]);
				this.m_axParams.push(asKV);
			};
		};
	};
	this.ParseLocationSearch();
	
	this.GetSize=function()	{return this.m_axParams.length;};
	
	this.HasParam=function(p_sName)
	{
		for(var i=0;i<this.m_axParams.length;i++)
		{
			if(this.m_axParams[i][0]==p_sName) {return true;};
		};
		return false;
	};

	this.GetParamValue=function(p_sName)
	{
		for(var i=0;i<this.m_axParams.length;i++)
		{
			if(this.m_axParams[i][0]==p_sName)
			{
				if(this.m_axParams[i].length>1) {return this.m_axParams[i][1];};
				return "";
			};
		};
		return "";
	};
};

function PitSoundPlayer(p_sURL)
{
	this.m_xD=null;
	this.m_sURL=p_sURL;
	this.m_iTimerID=0;

	this.IsPlaying=function()
	{
		return this.m_xD!=null;
	};
	
	this.AutoStop=function(p_iDelay)
	{
		if(this.m_iTimerID){window.clearInterval(this.m_iTimerID);this.m_iTimerID=null;};
		var xThis=this;
		window.setTimeout(function(){xThis.Stop();},p_iDelay);
	};
	
	this.RestartTimer=function(p_iDelay)
	{
		var xThis=this;
		this.m_iTimerID=window.setInterval(function(){xThis.Start();},p_iDelay);
	};
	
	this.Start=function(p_sURL,p_bLoop)
	{
		this.Stop(true);
		if(!p_sURL){p_sURL=this.m_sURL;};
		if(!p_sURL){return;};
		var xD;
		if(navigator.userAgent.indexOf("MSIE")!=-1)
		{
			xD=document.createElement("bgsound");
			this.m_xD=xD;
			if(p_bLoop)
			{
				xD.loop="-1";
			}
			else
			{
				xD.loop="0";
			};
			xD.src=p_sURL;
			document.body.appendChild(xD);
		}
		else if(navigator.userAgent.indexOf("Gecko")!=-1)
		{
			xD=document.createElement("embed");
			if(xD)
			{
				xD.autostart="true";
				if(p_bLoop)
				{
					xD.setAttribute("loop",true);
				}
				else
				{
					xD.setAttribute("loop",false);
				};
				xD.hidden="true";
				xD.style.width="0px";
				xD.style.height="0px";
				xD.src=p_sURL;
				this.m_xD=xD;
				document.body.appendChild(xD);
			};
		};
	};
	
	this.Stop=function(p_bKeeptimer)
	{
		if(this.m_xD)
		{
			document.body.removeChild(this.m_xD);
			this.m_xD=null;
		};
		if(!p_bKeeptimer)
		{
			if(this.m_iTimerID){window.clearInterval(this.m_iTimerID);this.m_iTimerID=null;};
		};
	};
};

// localization
var g_L={};
var g_axLocaleIDs=new Array();

function pit_AddLocale(p_sLID,p_xData)
{
	if(g_axLocaleIDs.indexOf(p_sLID)==-1){g_axLocaleIDs.push(p_sLID);};
	var xL=g_L;
	var i;
	for(i in p_xData)
	{
		if(p_xData.hasOwnProperty(i))
		{
			g_L[i]=p_xData[i];
		};
	};	
};

function pit_GetLocale() {return g_L._LID;};

function pit_LocaleFmt(p_sTextID)
{
	var sText=g_L[p_sTextID];
	var iC=arguments.length;
	if(iC>1){sText=sText.replace(/%1/,arguments[1]);};
	if(iC>2){sText=sText.replace(/%2/,arguments[2]);};
	if(iC>3){sText=sText.replace(/%3/,arguments[3]);};
	if(iC>4){sText=sText.replace(/%4/,arguments[4]);};
	if(iC>5){sText=sText.replace(/%5/,arguments[5]);};
	if(iC>6){sText=sText.replace(/%6/,arguments[6]);};
	if(iC>7){sText=sText.replace(/%7/,arguments[7]);};
	if(iC>8){sText=sText.replace(/%8/,arguments[8]);};
	if(iC>9){sText=sText.replace(/%9/,arguments[9]);};
	return sText;
};

function pit_UserLayerCheck(p_xIDs,p_iDelay)
{
	window.setTimeout(function()
	{
		var xRPC=new PitRPC();
		xRPC.SetURL("userauth.xrq");
		xRPC.SetFunction("lchk");
		xRPC.SetComplex(1);
		xRPC.OnSucceed=function() {};
		xRPC.OnFail=function() {};
		var i,iC=p_xIDs.length;
		for(i=0;i<iC;i++)
		{
			var iL=pit_LayerIFrameGetText(p_xIDs[i]).length;
			xRPC.SetParams("fid_"+p_xIDs[i],iL);
		};
		xRPC.SendNoRetries();
	},p_iDelay);
};

var i_sLayerIFrameID="";
var i_sLayerIFrameURL="";
var i_iLayerIFrameWait=1;
var i_iLayerW,i_iLayerH;
function pit_LayerIFrameGetText(p_sID)
{
	var xIF=document.getElementById(p_sID);
	if(!xIF){return "0";};
	if(xIF.nodeName!="IFRAME"){return xIF.innerHTML;}
	var xDoc;
	if(xIF.contentDocument){ // For NS6
		try{
			xDoc=xIF.contentDocument; 
		}
		catch(e)
		{};
	} else if(xIF.contentWindow){ // For IE5.5 and IE6
		try{
			xDoc=xIF.contentWindow.document;
		}
		catch(e)
		{};
	} else if(xIF.document){ // For IE5
		try{
			xDoc=xIF.document;
		}
		catch(e)
		{};
	} else {
		return "0";
	}
	if((!xDoc)||(!xDoc.body))
	{
		return "0";
	};
	return xDoc.body.innerHTML;
};

function pit_LayerIFrameWaitDone()
{
	var sText=pit_LayerIFrameGetText(i_sLayerIFrameID);
	if(sText=="0")
	{
//		pit_LogT("Ad 5");
		window.setTimeout(pit_LayerIFrameWaitDone,100);
		return;
	};
	if(sText.length>1000)
	{
		window.setTimeout(pit_LayerIFrameWaitDone,100);
	}
	else
	{
//		pit_Log("Done.");
		var xIF=document.getElementById(i_sLayerIFrameID);
		var iW=pit_GetViewWidth();
		var iH=pit_GetViewHeight();
		xIF.style.position="absolute";	
		xIF.style.left=(-i_iLayerW-100)+"px";
		xIF.style.top="0px";
		xIF.style.width=(i_iLayerW)+"px";
		xIF.style.height=(i_iLayerH)+"px";
//		pit_LogT("Ad 4");
		window.setTimeout(pit_ReInitLayerIFrame,60000*32);
	};
};

function pit_LayerIFrameWaitContent()
{
	var xIF=document.getElementById(i_sLayerIFrameID);
	i_iLayerIFrameWait++;
	var sText=pit_LayerIFrameGetText(i_sLayerIFrameID);
	if(sText=="0")
	{
		if(i_iLayerIFrameWait<30){window.setTimeout(pit_LayerIFrameWaitContent,100);};
		return;
	};
	sText=sText.substr(0,1200);
	sText=sText.replace(" ","");
	sText=sText.replace("\t","");
	sText=sText.replace("\r","");
	sText=sText.replace("\n","");
	if(sText.length>1000)
	{
//		pit_LogT("Ad 3");
	//	pit_Log("Content arrived ",sText.length);
		var iW=pit_GetViewWidth();
		var iH=pit_GetViewHeight();
		xIF.style.position="absolute";	
		xIF.style.left="0px";
		xIF.style.top="0px";
		xIF.style.width=(i_iLayerW)+"px";
		xIF.style.height=(i_iLayerH)+"px";
		window.setTimeout(pit_LayerIFrameWaitDone,100);
	}
	else
	{
		i_iLayerIFrameWait++;
		if(i_iLayerIFrameWait>=100)
		{
//			pit_Log("no content timeout ",sText.length);
//			pit_LogT("Ad 2");
			window.setTimeout(pit_ReInitLayerIFrame,60000*10);
		}
		else
		{
			window.setTimeout(pit_LayerIFrameWaitContent,100);
		};
	};
};

function pit_ReInitLayerIFrame()
{
//	pit_LogT("Ad R ",i_sLayerIFrameURL);
//	pit_InitLayerIFrame(i_sLayerIFrameURL,i_sLayerIFrameID);
	
	i_iLayerIFrameWait=1;
	var xIF=document.getElementById(i_sLayerIFrameID);
	if(!xIF)
	{
//		pit_Log("no f");
		return;
	};
	if(!xIF.contentWindow)
	{
//		pit_Log("no cw");
		return;
	};
	if(!xIF.contentWindow.location)
	{
//		pit_Log("no cw.l");
		return;
	};
	xIF.contentWindow.location.reload(true);
	window.setTimeout(pit_LayerIFrameWaitContent,100);
/*
	xIF.setAttribute("src",i_sLayerIFrameURL+"?r="+Math.random());
	if(xIF.location){xIF.location.reload(true);};
	window.setTimeout(pit_LayerIFrameWaitContent,100);
	*/
};

function pit_InitLayerIFrame(p_sContentURL,p_sIFrameID)
{
	if((p_sContentURL)&&(p_sIFrameID))
	{
		if((p_sContentURL.length>1)&&(p_sIFrameID.length>1))
		{
			i_sLayerIFrameID=p_sIFrameID;
			i_sLayerIFrameURL=p_sContentURL;
		};
	};
	var xIF=document.getElementById(i_sLayerIFrameID);
	if(xIF)
	{
		if(xIF.parentNode)
		{
			xIF.parentNode.removeChild(xIF);
		};
		xIF=null;
	};
	xIF=document.createElement("iframe");
	xIF.id=i_sLayerIFrameID;
	document.body.appendChild(xIF);
	if(!xIF)
	{
		return;
	};
	i_iLayerIFrameWait=1;
//	pit_LogT("Ad 1 ",i_sLayerIFrameURL);
	i_iLayerW=pit_GetViewWidth();
	i_iLayerH=pit_GetViewHeight();
	xIF.style.position="absolute";	
	xIF.style.border="none";
	xIF.style.left=(-i_iLayerW-100)+"px";
	xIF.style.top="0px";
	xIF.style.zIndex="10000";
	xIF.style.width=(i_iLayerW)+"px";
	xIF.style.height=(i_iLayerH)+"px";
	xIF.setAttribute("src",i_sLayerIFrameURL+"?r="+Math.random());
//	if(xIF.location){xIF.location.reload(true);};
	window.setTimeout(pit_LayerIFrameWaitContent,100);
};
