function ratio_sms() {
props=window.open('/smsratio.php', '_blank', 'toolbars=0, scrollbars=1, location=0, statusbars=0, menubars=0, resizable=0, width=440, height=470 left = 190, top = 100');
}

var rusBig = new Array( "Ý", "×", "Ù", "Ø", "¨", "¨", "Æ", "Þ", "Þ", "ß", "ß", "À", "Á", "Â", "Ã", "Ä", "Å", "Ç", "È", "É", "Ê", "Ë", "Ì", "Í", "Î", "Ï", "Ð", "Ñ", "Ò", "Ó", "Ô", "Õ","Õ", "Ö", "Ù", "Ú", "Û", "Ü");
var engBig = new Array("JE", "CH", "SHH", "SH", "YO", "JO", "ZH", "YU", "JU", "YA", "JA", "A","B","V","G","D","E", "Z","I","J","K","L","M","N","O","P","R","S","T","U","F","H","X","C", "W","##","Y", "''");
var rusSmall = new Array("ý", "÷", "ù", "ø", "¸", "¸","æ", "þ", "þ", "ÿ", "ÿ", "à", "á", "â", "ã", "ä", "å", "ç", "è", "é", "ê", "ë", "ì", "í", "î", "ï", "ð", "ñ", "ò", "ó", "ô", "õ","õ", "ö", "ù", "ú", "û", "ü" );
var engSmall = new Array("je'", "ch", "shh", "sh", "yo", "jo", "zh", "yu", "ju", "ya", "ja", "a", "b", "v", "g", "d", "e", "z", "i", "j", "k", "l", "m", "n", "o", "p", "r", "s",  "t", "u", "f", "h","x", "c", "w", "#", "y", "'");
var rusRegBig = new Array( /Ý/g, /×/g, /Ù/g, /Ø/g, /¨/g, /¨/g, /Æ/g, /Þ/g, /Þ/g, /ß/g, /ß/g, /À/g, /Á/g, /Â/g, /Ã/g, /Ä/g, /Å/g, /Ç/g, /È/g, /É/g, /Ê/g, /Ë/g, /Ì/g, /Í/g, /Î/g, /Ï/g, /Ð/g, /Ñ/g, /Ò/g, /Ó/g, /Ô/g, /Õ/g,/Õ/g, /Ö/g, /Ù/g, /Ú/g, /Û/g, /Ü/g);
var engRegBig = new Array( /JE/g, /CH/g, /SHH/g, /SH/g, /YO/g, /JO/g, /ZH/g, /YU/g, /JU/g, /YA/g, /JA/g, /A/g, /B/g, /V/g, /G/g, /D/g, /E/g, /Z/g, /I/g, /J/g, /K/g, /L/g, /M/g, /N/g, /O/g, /P/g, /R/g, /S/g, /T/g, /U/g, /F/g, /H/g,/X/g, /C/g, /W/g, /##/g, /Y/g, /''/g);
var rusRegSmall = new Array( /ý/g, /÷/g, /ù/g, /ø/g, /¸/g, /¸/g, /æ/g, /þ/g, /þ/g, /ÿ/g, /ÿ/g, /à/g, /á/g, /â/g, /ã/g, /ä/g, /å/g, /ç/g, /è/g, /é/g, /ê/g, /ë/g, /ì/g, /í/g, /î/g, /ï/g, /ð/g, /ñ/g, /ò/g, /ó/g, /ô/g, /õ/g,/õ/g, /ö/g, /ù/g, /ú/g, /û/g, /ü/g);
var engRegSmall = new Array(/je/g, /ch/g, /shh/g, /sh/g, /yo/g, /jo/g, /zh/g, /yu/g, /ju/g, /ya/g, /ja/g, /a/g, /b/g, /v/g, /g/g, /d/g, /e/g, /z/g, /i/g, /j/g, /k/g, /l/g, /m/g, /n/g, /o/g, /p/g, /r/g, /s/g, /t/g, /u/g, /f/g, /h/g,/x/g, /c/g, /w/g, /#/g, /y/g, /'/g);
function rusLang(namepo) {
elm = document.getElementById(namepo);
var textar = elm.value;
if (textar) {
for (var i=0; i<engRegBig.length; i++) {
textar = textar.replace(engRegBig[i], rusBig[i])
    }
for (i=0; i<engRegSmall.length; i++) {
textar = textar.replace(engRegSmall[i], rusSmall[i])
    }
elm.value = textar;
  }
}

function mess_out(mes) {
	ht = document.getElementsByTagName("html");
	document.body.style.filter = "progid:DXImageTransform.Microsoft.BasicImage(grayscale=1)";
	if (confirm(mes)) { document.body.style.filter = ""; return true; 	}
	else { document.body.style.filter = ""; return false;}
}


function expend_id(id) {
	var itm = null;
	if (document.getElementById){ itm = document.getElementById(id); } 
	else if (document.all) { itm = document.all[id]; } 
	else if (document.layers) { itm = document.layers[id]; } 
	if (!itm)	{;} 
	else if (itm.className == "hs2") { itm.className = "hs"; } 
	else if (itm.className == "hs") { itm.className = "hs2"; } 
	else { itm.visibility = "show"; }
}

ucub =new Array();
ucub[0]="";
ucub[1]="<img class=imic src=http://212.150.34.64/pic/c1.gif alt='Êóáîê çà ëó÷øóþ ðàçäà÷ó'>";
ucub[2]="<img class=imic src=http://212.150.34.64/pic/c2.gif alt='Êóáîê çà ïîïóëÿðíóþ ðàçäà÷ó'>";
ucub[3]="<img class=imic src=http://212.150.34.64/pic/c3.gif alt='Êóáîê ñàìîìó àêòèâíîìó ðàçäàþùåìó'>";
ucub[4]="<img class=imic src=http://212.150.34.64/pic/c4.gif alt='Êóáîê çà ñàìóþ îáñóæäàåìóþ ðàçäà÷ó'>";
ucub[5]="<img class=imic src=http://212.150.34.64/pic/c5.gif alt='Êóáîê ëó÷øåìó êîììåíòàòîðó'>";
ucub[6]="<img class=imic src=http://212.150.34.64/pic/c6.gif alt='Êóáîê ëó÷øåìó SMS ïîëüçîâàòåëþ'>";
ucub[7]="<img class=imic src=http://212.150.34.64/pic/c7.gif alt='Êóáîê ëó÷øåìó Ìåöåíàòó'>";
ucub[8]="<img class=imic src=http://212.150.34.64/pic/c8.gif alt='Êóáîê ëó÷øåìó ÄèÄæåþ'>";
ugrup =new Array();
ugrup[0]="";
ugrup[1]="<img class=imic src=http://212.150.34.64/pic/star.gif alt='Ìåöåíàò'>";
ugrup[2]="<img class=imic src=http://212.150.34.64/pic/warned.gif alt='Ïðåäóïðåæä¸í'>";
ugrup[4]="<img class=imic src=http://212.150.34.64/pic/g1.gif alt='Âåðíûé ñèä'>";
ugrup[5]="<img class=imic src=http://212.150.34.64/pic/g2.gif alt='Ðèòîðèê'>";
ugrup[6]="<img class=imic src=http://212.150.34.64/pic/nastavnik.png alt='Íàñòàâíèê'>";
ugrup[7]="<img class=imic src=http://212.150.34.64/pic/wtorrent.gif alt='Ïðåäóïðåæä¸í 1 Òîððåíò'>";
ugrup[8]="<img class=imic src=http://212.150.34.64/pic/dj.gif alt='ÄèÄæåé'>";
ugrup[9]="<img class=imic src=http://212.150.34.64/pic/k.gif alt='Êîðîëü òðåêåðà'>";
ugrup[10]="<img class=imic src=http://212.150.34.64/pic/k.gif alt='Êîðîëåâà òðåêåðà'>";

function get_string() {
var doc="";
while((tmp=data.charAt(i++))) {
 if(tmp=="^") return doc
 else doc+=tmp
}
return tmp;
}

function draw_usersarray() {
d1=new Array(); d2=new Array(); d3=new Array(); d4=new Array(); 
d5=new Array(); d6=new Array(); d7=new Array();
i=0;x=0;var t_x;
date=get_string();
while(doc=get_string()) {
	t_x=0;
	d1[x]=""; d2[x]=""; d3[x]=""; d4[x]=""; d5[x]=""; d6[x]="";d7[x]="";
	while((tmp=doc.charAt(t_x++))&&tmp!="|") d1[x]+=tmp; //id
	while((tmp=doc.charAt(t_x++))&&tmp!="|") d2[x]+=tmp; //name
	while((tmp=doc.charAt(t_x++))&&tmp!="|") d3[x]+=tmp; //class
	while((tmp=doc.charAt(t_x++))&&tmp!="|") d4[x]+=tmp; //gen
	while((tmp=doc.charAt(t_x++))&&tmp!="|") d5[x]+=tmp; //grup
	while((tmp=doc.charAt(t_x++))&&tmp!="|") d6[x]+=tmp;//cub
	while((tmp=doc.charAt(t_x++))&&tmp!="|") d7[x]+=tmp;//park
	x++;
	}
d = document;
y=-1;
while(d2[++y]) {
	if(y>0) d.write(", ");
	d.write("<a href='/userdetails.php?id="+d1[y]+"' class=u"+d3[y]+">"+d2[y]+"</a>");
	if(d4[y]>0) d.write("<img class=imic src=http://212.150.34.64/pic/ico_f.gif alt='Äåâóøêà'>");
	if(d5[y]>0) d.write(ugrup[d5[y]]);
	if(d6[y]>0) d.write(ucub[d6[y]]);
	if(d7[y]>0) d.write("<img class=imic src=http://212.150.34.64/pic/park.gif alt='Ïðèïàðêîâàí'>");
}
}

function draw_users_to() {
d1=new Array(); d2=new Array(); d3=new Array(); d4=new Array(); 
d5=new Array(); d6=new Array(); d7=new Array();
i=0;x=0;var t_x;
date=get_string();
while(doc=get_string()) {
	t_x=0;
	d1[x]=""; d2[x]=""; d3[x]=""; d4[x]=""; d5[x]=""; d6[x]="";d7[x]="";
	while((tmp=doc.charAt(t_x++))&&tmp!="|") d1[x]+=tmp; //id
	while((tmp=doc.charAt(t_x++))&&tmp!="|") d2[x]+=tmp; //name
	while((tmp=doc.charAt(t_x++))&&tmp!="|") d3[x]+=tmp; //class
	while((tmp=doc.charAt(t_x++))&&tmp!="|") d4[x]+=tmp; //gen
	while((tmp=doc.charAt(t_x++))&&tmp!="|") d5[x]+=tmp; //grup
	while((tmp=doc.charAt(t_x++))&&tmp!="|") d6[x]+=tmp;//cub
	while((tmp=doc.charAt(t_x++))&&tmp!="|") d7[x]+=tmp;//park
	x++;
	}
var txt_to;
txt_to="";
y=-1;
while(d2[++y]) {
	if(y>0) txt_to += ", ";
	txt_to += "<a href='/userdetails.php?id="+d1[y]+"' class=u"+d3[y]+">"+d2[y]+"</a>";
	if(d4[y]>0) txt_to += "<img class=imic src=http://212.150.34.64/pic/ico_f.gif alt='Äåâóøêà'>";
	if(d5[y]>0) txt_to += ugrup[d5[y]];
	if(d6[y]>0) txt_to += ucub[d6[y]];
	if(d7[y]>0) txt_to += "<img class=imic src=http://212.150.34.64/pic/park.gif alt='Ïðèïàðêîâàí'>";
}

return txt_to;
}

function draw_userssmall() {
d1=new Array(); d2=new Array(); d3=new Array();
i=0;x=0;var t_x;
date=get_string();
while(doc=get_string()) {
	t_x=0;
	d1[x]=""; d2[x]=""; d3[x]="";
	while((tmp=doc.charAt(t_x++))&&tmp!="|") d1[x]+=tmp; //id
	while((tmp=doc.charAt(t_x++))&&tmp!="|") d2[x]+=tmp; //name
	while((tmp=doc.charAt(t_x++))&&tmp!="|") d3[x]+=tmp; //class
	x++;
	}
d = document;
y=-1;
while(d2[++y]) {
	if(y>0) d.write(", ");
	d.write("<a href='/userdetails.php?id="+d1[y]+"' class=u"+d3[y]+">"+d2[y]+"</a>");
}
}

function whichBrs() {
var agt=navigator.userAgent.toLowerCase();
if (agt.indexOf("opera") != -1) return 'Opera';
if (agt.indexOf("firefox") != -1) return 'Firefox';
if (agt.indexOf("msie") != -1) return 'Internet Explorer';
if (agt.indexOf("netscape") != -1) return 'Netscape';
if (agt.indexOf("mozilla/5.0") != -1) return 'Mozilla';
if (agt.indexOf('\/') != -1) {
if (agt.substr(0,agt.indexOf('\/')) != 'mozilla') {
return navigator.userAgent.substr(0,agt.indexOf('\/'));}
else return 'Netscape';} else if (agt.indexOf(' ') != -1)
return navigator.userAgent.substr(0,agt.indexOf(' '));
else return navigator.userAgent;
}

function draw_peerstab(leecher) {
d1=new Array(); d2=new Array(); d3=new Array(); d4=new Array(); 
d5=new Array(); d6=new Array(); d7=new Array(); 

d8=new Array(); d9=new Array(); d10=new Array(); d11=new Array(); d12=new Array(); 
d13=new Array(); d14=new Array(); d15=new Array(); d16=new Array(); d17=new Array(); d18=new Array();
i=0;x=0;var t_x; 
date=get_string();
while(doc=get_string()) {
	t_x=0;
	d1[x]=""; d2[x]=""; d3[x]=""; d4[x]=""; d5[x]=""; d6[x]="";d7[x]="";d8[x]="";
	d9[x]="";d10[x]="";d11[x]="";d12[x]="";d13[x]="";d14[x]="";d15[x]="";d16[x]="";d17[x]="";d18[x]="";
	while((tmp=doc.charAt(t_x++))&&tmp!="|") d1[x]+=tmp; //id
	while((tmp=doc.charAt(t_x++))&&tmp!="|") d2[x]+=tmp; //name
	while((tmp=doc.charAt(t_x++))&&tmp!="|") d3[x]+=tmp; //class
	while((tmp=doc.charAt(t_x++))&&tmp!="|") d4[x]+=tmp; //gen
	while((tmp=doc.charAt(t_x++))&&tmp!="|") d5[x]+=tmp; //grup
	while((tmp=doc.charAt(t_x++))&&tmp!="|") d6[x]+=tmp; //cub
	while((tmp=doc.charAt(t_x++))&&tmp!="|") d7[x]+=tmp; //strana

	while((tmp=doc.charAt(t_x++))&&tmp!="|") d8[x]+=tmp; //zalil
	while((tmp=doc.charAt(t_x++))&&tmp!="|") d9[x]+=tmp; //procza
	while((tmp=doc.charAt(t_x++))&&tmp!="|") d10[x]+=tmp; //skachal
	while((tmp=doc.charAt(t_x++))&&tmp!="|") d11[x]+=tmp; //procsk
	while((tmp=doc.charAt(t_x++))&&tmp!="|") d12[x]+=tmp; //retio
	while((tmp=doc.charAt(t_x++))&&tmp!="|") d13[x]+=tmp; //retiocolor
	while((tmp=doc.charAt(t_x++))&&tmp!="|") d14[x]+=tmp; //podtime
	while((tmp=doc.charAt(t_x++))&&tmp!="|") d15[x]+=tmp; //connect
	while((tmp=doc.charAt(t_x++))&&tmp!="|") d16[x]+=tmp; //procent
	x++;
	}
d = document;
y=-1;
while(d2[++y]) {
	d.write("<tr><td nowrap><img src=http://212.150.34.64/pic/f/"+d7[y]+".gif height=8>  ");
	d.write("<a href='/userdetails.php?id="+d1[y]+"' class=u"+d3[y]+">"+d2[y]+"</a>");
	if(d4[y]>0) d.write("<img class=imic src=http://212.150.34.64/pic/ico_f.gif alt='Äåâóøêà'>");
	if(d5[y]>0) d.write(ugrup[d5[y]]);
	if(d6[y]>0) d.write(ucub[d6[y]]);
	d.write("<td align=right class=small>");
	d.write(d8[y]);
	d.write("<td align=right class=small>"+d9[y]+"/ñ</td>");
	d.write("<td align=right class=small>"+d10[y]+"</td>");
	d.write("<td align=right class=small>"+d11[y]+"/ñ</td>");
	d.write("<td align=right class=small><b><font color="+d13[y]+">"+d12[y]+"</font></b></td>");
	if(leecher==1) d.write("<td align=right class=small>"+d16[y]+"%</td>");
	d.write("<td align=right class=small>"+d14[y]+"</td>");
	d.write("<td class=small>");
	if(d15[y]>0)  d.write("<img src=http://212.150.34.64/pic/notc.gif height=16 width=16></td> ");
// d.write(d16[y]+"</td>");
}
}

function get_peerstab(leecher) {
ret="";
d1=new Array(); d2=new Array(); d3=new Array(); d4=new Array(); 
d5=new Array(); d6=new Array(); d7=new Array(); 

d8=new Array(); d9=new Array(); d10=new Array(); d11=new Array(); d12=new Array(); 
d13=new Array(); d14=new Array(); d15=new Array(); d16=new Array(); d17=new Array(); d18=new Array();
i=0;x=0;var t_x; 
date=get_string();
while(doc=get_string()) {
	t_x=0;
	d1[x]=""; d2[x]=""; d3[x]=""; d4[x]=""; d5[x]=""; d6[x]="";d7[x]="";d8[x]="";
	d9[x]="";d10[x]="";d11[x]="";d12[x]="";d13[x]="";d14[x]="";d15[x]="";d16[x]="";d17[x]="";d18[x]="";
	while((tmp=doc.charAt(t_x++))&&tmp!="|") d1[x]+=tmp; //id
	while((tmp=doc.charAt(t_x++))&&tmp!="|") d2[x]+=tmp; //name
	while((tmp=doc.charAt(t_x++))&&tmp!="|") d3[x]+=tmp; //class
	while((tmp=doc.charAt(t_x++))&&tmp!="|") d4[x]+=tmp; //gen
	while((tmp=doc.charAt(t_x++))&&tmp!="|") d5[x]+=tmp; //grup
	while((tmp=doc.charAt(t_x++))&&tmp!="|") d6[x]+=tmp; //cub
	while((tmp=doc.charAt(t_x++))&&tmp!="|") d7[x]+=tmp; //strana

	while((tmp=doc.charAt(t_x++))&&tmp!="|") d8[x]+=tmp; //zalil
	while((tmp=doc.charAt(t_x++))&&tmp!="|") d9[x]+=tmp; //procza
	while((tmp=doc.charAt(t_x++))&&tmp!="|") d10[x]+=tmp; //skachal
	while((tmp=doc.charAt(t_x++))&&tmp!="|") d11[x]+=tmp; //procsk
	while((tmp=doc.charAt(t_x++))&&tmp!="|") d12[x]+=tmp; //retio
	while((tmp=doc.charAt(t_x++))&&tmp!="|") d13[x]+=tmp; //retiocolor
	while((tmp=doc.charAt(t_x++))&&tmp!="|") d14[x]+=tmp; //podtime
	while((tmp=doc.charAt(t_x++))&&tmp!="|") d15[x]+=tmp; //connect
	while((tmp=doc.charAt(t_x++))&&tmp!="|") d16[x]+=tmp; //procent
	x++;
	}
y=-1;
while(d2[++y]) {
	ret += "<tr><td nowrap><img src=http://212.150.34.64/pic/f/"+d7[y]+".gif height=8>  ";
	ret += "<a href='/userdetails.php?id="+d1[y]+"' class=u"+d3[y]+">"+d2[y]+"</a>";
	if(d4[y]>0) ret +="<img class=imic src=http://212.150.34.64/pic/ico_f.gif alt='Äåâóøêà'>";
	if(d5[y]>0) ret += ugrup[d5[y]];
	if(d6[y]>0) ret += ucub[d6[y]];
	ret += "<td align=right class=small>";
	ret += d8[y];
	ret += "<td align=right class=small>"+d9[y]+"/ñ</td>";
	ret += "<td align=right class=small>"+d10[y]+"</td>";
	ret += "<td align=right class=small>"+d11[y]+"/ñ</td>";
	ret += "<td align=right class=small><b><font color="+d13[y]+">"+d12[y]+"</font></b></td>";
	if(leecher==1) ret += "<td align=right class=small>"+d16[y]+"%</td>";
	ret += "<td align=right class=small>"+d14[y]+"</td>";
	ret += "<td class=small>";
	if(d15[y]>0)  ret += "<img src=http://212.150.34.64/pic/notc.gif height=16 width=16></td> ";
}
return ret;
}


////////////////////////// REITING ////////////////////////////////
var UT_RATING_IMG = 'http://212.150.34.64/pic/rat/1.gif';
var UT_RATING_IMG_BG = 'http://212.150.34.64/pic/rat/1_0.gif';

function UTRating(ratingElementId, maxStars, objectName, formName, ratingMessageId, componentSuffix, defMessage, size)
{
	this.ratingElementId = ratingElementId;
	this.maxStars = maxStars;
	this.objectName = objectName;
	this.formName = formName;
	this.ratingMessageId = ratingMessageId
	this.componentSuffix = componentSuffix
	this.defMessage = defMessage

	this.starTimer = null;
	this.starCount = 0;
	
	(new Image()).src = UT_RATING_IMG;

	function showStars(starNum, skipMessageUpdate) {
		this.clearStarTimer();
		this.greyStars();
		this.colorStars(starNum);
		if(!skipMessageUpdate)
			this.setMessage(starNum);
	}

	function setMessage(starNum) {
		messages = new Array(this.defMessage, "<b>Ïëîõîé</b>", "<b>Ñëàáåíüêî</b>", "<b>Äîñòîéíî</b>", "<b>Î÷åíü õîðîøî</b>", "<b>Êðóòî</b>");
		document.getElementById(this.ratingMessageId).innerHTML = messages[starNum];
	}

	function colorStars(starNum) {
		for (var i=0; i < starNum; i++)
			document.getElementById('star_'  + this.componentSuffix + "_" + (i+1)).src = UT_RATING_IMG;
	}

	function greyStars() {
		for (var i=0; i < this.maxStars; i++)
			if (i <= this.starCount)
				document.getElementById('star_' + this.componentSuffix + "_"  + (i+1)).src = UT_RATING_IMG_BG;
			else
				document.getElementById('star_' + this.componentSuffix + "_"  + (i+1)).src = UT_RATING_IMG_BG;
	}

	function setStars(starNum) {
		this.starCount = starNum;
		this.drawStars(starNum);
		document.forms[this.formName]['rating'].value = this.starCount;
		var ratingElementId = this.ratingElementId;
		postForm(this.formName, true, function (req) { replaceDivContents(req, ratingElementId); });
	}


	function drawStars(starNum, skipMessageUpdate) {
		this.starCount=starNum;
		this.showStars(starNum, skipMessageUpdate);
	}

	function clearStars() {
		this.starTimer = setTimeout(this.objectName + ".resetStars()", 300);
	}

	function resetStars() {
		this.clearStarTimer();
		if (this.starCount)
			this.drawStars(this.starCount);
		else
			this.greyStars();
		this.setMessage(0);
	}

	function clearStarTimer() {
		if (this.starTimer) {
			clearTimeout(this.starTimer);
			this.starTimer = null;
		}
	}

	this.clearStars = clearStars;
	this.clearStarTimer = clearStarTimer;
	this.greyStars = greyStars;
	this.colorStars = colorStars;
	this.resetStars = resetStars;
	this.setStars = setStars;
	this.drawStars = drawStars;
	this.showStars = showStars;
	this.setMessage = setMessage;

}

function getXmlHttpRequest()
{
   var httpRequest = null;
   var XMLHTTPtype = new Array(
       'Msxml2.XMLHTTP.7.0', 'Msxml2.XMLHTTP.6.0', 'Msxml2.XMLHTTP.5.0',
       'Msxml2.XMLHTTP.4.0', 'Msxml2.XMLHTTP.3.0', 'Msxml2.XMLHTTP',
       'Microsoft.XMLHTTP');
   for (var i = 0; i < XMLHTTPtype.length; i++) {
       try {
           if (window.XMLHttpRequest) {
               httpRequest = new XMLHttpRequest(XMLHTTPtype[i]);
           } else if (window.ActiveXObject) {
               httpRequest= new ActiveXObject(XMLHTTPtype[i]);
           };
       } catch (e) {};    
       if (httpRequest != null) { break; };
   };

   return httpRequest;
}

function getUrlSync(url)
{
	return getUrl(url, false, null);
}

function getUrlAsync(url, handleStateChange)
{
	return getUrl(url, true, handleStateChange);
}


// call a url
function getUrl(url, async, handleStateChange) {
	var xmlHttpReq = getXmlHttpRequest();

	if (!xmlHttpReq)
		return;

	if (handleStateChange)
	{
		xmlHttpReq.onreadystatechange = function()
			{
				handleStateChange(xmlHttpReq);
			};
	}
	else
	{
		xmlHttpReq.onreadystatechange = function() {;}
	}

	xmlHttpReq.open("GET", url, async);
	xmlHttpReq.send(null);
}

function postUrl(url, data, async, stateChangeCallback)
{ 
	var xmlHttpReq = getXmlHttpRequest(); 

	if (!xmlHttpReq)
		return;

	xmlHttpReq.open("POST", url, async);
	xmlHttpReq.onreadystatechange = function()
		{
			stateChangeCallback(xmlHttpReq);
		};
	xmlHttpReq.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
	xmlHttpReq.send(data);
	//alert ('url: ' + url + '\ndata: ' + data);
}

function urlEncodeDict(dict)
{ 
	var result = "";
	for (var i=0; i<dict.length; i++) {
		result += "&" + encodeURIComponent(dict[i].name) + "=" + encodeURIComponent(dict[i].value);
	}
	return result;
}

function execOnSuccess(stateChangeCallback)
{
	return function(xmlHttpReq)
		{
			if (xmlHttpReq.readyState == 4 &&
					xmlHttpReq.status == 200)
				stateChangeCallback(xmlHttpReq);
			//alert(xmlHttpReq + " " + xmlHttpReq.readyState + " " + xmlHttpReq.status);
		};
}


function postFormByForm(form, async, successCallback) {
	var formVars = new Array();
	for (var i = 0; i < form.elements.length; i++)
	{
		var formElement = form.elements[i];
		
		// Special handling for checkboxes (we need an array of selected checkboxes..)!
		if(formElement.type=='checkbox' && !formElement.checked) {
			continue;
		} 
		var v=new Object;
		v.name=formElement.name;
		v.value=formElement.value;
		formVars.push(v);		
	} 
	postUrl(form.action, urlEncodeDict(formVars), async, execOnSuccess(successCallback));
}

function postForm(formName, async, successCallback)
{
	// postFormByName
	var form = document.forms[formName];
	return postFormByForm(form, async, successCallback);
}

function replaceDivContents(xmlHttpRequest, dstDivId)
{
	var dstDiv = document.getElementById(dstDivId);
	dstDiv.innerHTML = xmlHttpRequest.responseText;
}


function getUrlXMLResponseCallback(xmlHttpReq) {
	if(xmlHttpReq.responseXML == null) {
		alert("Error while processing your request.");
		return;
	}
	var root_node = getRootNode(xmlHttpReq);
	var return_code = getNodeValue(root_node, 'return_code');
	//alert("return code " + return_code);

	if(return_code == 0) {
		redirect_val = getNodeValue(root_node, 'redirect_on_success');
		if(redirect_val != null) {
			window.location=redirect_val;
		} else {
			success_message = getNodeValue(root_node, 'success_message');
			if (success_message != null) {
				alert(success_message);
			}
			if(this.successCallback != null) {
				this.successCallback(xmlHttpReq);
			}
		}
	} else {
		var error_msg = getNodeValue(root_node, 'error_message');
		if (error_msg == null || error_msg.length == 0) {
			if(return_code==2) {
				error_msg = "You must be logged in to perform this operation.";
			} else {
				error_msg = "An error occured while performing this operation.";
			}
		}
		alert(error_msg)
	}
}

function getNodeValue(obj,tag)
{
	node=obj.getElementsByTagName(tag);
	if(node!=null && node.length>0) {
		return node[0].firstChild.nodeValue;
	} else {
		return null;
	}
}

function getRootNode(xmlHttpReq) {
	return xmlHttpReq.responseXML.getElementsByTagName('root')[0];
}

function getUrlXMLResponse(url, successCallback) {
	this.successCallback = successCallback;
	this.urlResponseCallback = getUrlXMLResponseCallback;
	getUrl(url, true, execOnSuccess(this.urlResponseCallback)) 
}

function postUrlXMLResponse(url, data, successCallback) {
	this.successCallback = successCallback;
	this.urlResponseCallback = getUrlXMLResponseCallback;
	postUrl(url, data, true, execOnSuccess(this.urlResponseCallback))
}

function confirmAndPostUrlXMLResponse(url, confirmMessage, data, successCallback) {
	if (confirm(confirmMessage)) {
		postUrlXMLResponse(url, data, successCallback);
	}
}

function postFormXMLResponse(formName, successCallback) {
	this.successCallback = successCallback;
	postForm(formName, true, execOnSuccess(getUrlXMLResponseCallback))
}