function lwsgt_get_appropriate_ws_url()
{
	var pcol;
	var u = document.URL;

	if (u.substring(0, 5) === "https") {
		pcol = "wss://";
		u = u.substr(8);
	} else {
		pcol = "ws://";
		if (u.substring(0, 4) === "http")
			u = u.substr(7);
	}

	return pcol + u;
}

function lwsgt_app_hdr(j, bc, ws)
{
	var s = "", n, m = 0;

	ws.bcq = 0;
					
	for (n = 0; n < j.cols.length; n++)
		if (!j.cols[n].hide)
			m++;

	s = "<tr><td colspan=\"" + m + "\" class=\"lwsgt_title\">" +
		ws.lwsgt_title + "</td></tr>";

	if (!!bc) {
		s += "<tr><td colspan=\"" + m + "\" class=\"lwsgt_breadcrumbs\">";
		for (n = 0; n < bc.length; n++) {
			s += " / ";
			if (!bc[n].url && bc[n].url !== "")
				s += " " + lws_san(bc[n].name) + " ";
			else {
				s += "<a href=# id=\"bc_"+ ws.divname + ws.bcq + "\" h=\"" +
				    ws.lwsgt_cb + "\" p=\""+ws.lwsgt_parent+"\" aa=\"="+
					lws_san(encodeURI(bc[n].url))+"\" m=\"-1\" n=\"-1\">" +
					lws_san(bc[n].name) + "</a> ";
				ws.bcq++;
			}
		}
		s += "</td></tr>";
	}
	s += "<tr>";
	for (n = 0; n < j.cols.length; n++)
		if (!j.cols[n].hide)
			s = s + "<td class=\"lwsgt_hdr\">" + lws_san(j.cols[n].name) +
				"</td>";
	
	s += "</tr>";
	
	return s;
}

function lwsgt_click_callthru()
{
	window[this.getAttribute("h")](this.getAttribute("p"), this.getAttribute("aa"), this.getAttribute("m"), this.getAttribute("n"));
	event.preventDefault();
}

function lwsgt_initial(title, pcol, divname, cb, gname)
{
	this.divname = divname;
	
	lws_gray_out(true,{"zindex":"499"});

	if (typeof MozWebSocket != "undefined")
		this.lwsgt_ws = new MozWebSocket(lwsgt_get_appropriate_ws_url(), pcol);
	else
		this.lwsgt_ws = new WebSocket(lwsgt_get_appropriate_ws_url(), pcol);
	this.lwsgt_ws.divname = divname;
	this.lwsgt_ws.lwsgt_cb = cb;
	this.lwsgt_ws.lwsgt_parent = gname;
	this.lwsgt_ws.lwsgt_title = title;
	try {
		this.lwsgt_ws.onopen = function() {
			lws_gray_out(false);
		//	document.getElementById("debug").textContent =
		//		"ws opened " + lwsgt_get_appropriate_ws_url();
		};
		this.lwsgt_ws.onmessage = function got_packet(msg) {
			var s, m, n, j = JSON.parse(msg.data);
			document.getElementById("debug").textContent = msg.data;
			if (j.cols) {
				this.hdr = j;
			}
			if (j.breadcrumbs) 
				this.breadcrumbs = j.breadcrumbs;

			if (j.data) {
				var q = 0;
				s = "<table class=\"lwsgt_table\">" +
					lwsgt_app_hdr(this.hdr, this.breadcrumbs, this);
				for (m = 0; m < j.data.length; m++) {
					s = s + "<tr class=\"lwsgt_tr\">";
					for (n = 0; n < this.hdr.cols.length; n++) {
						if (!this.hdr.cols[n].hide) {
							if (!this.hdr.cols[n].align)
								s = s + "<td class=\"lwsgt_td\">";
							else
								s = s + "<td class=\"lwsgt_td\" style=\"text-align: right\">";

							if (this.hdr.cols[n].href &&
							    !!j.data[m][this.hdr.cols[n].href]) {
								s = s + "<a href=# id=\""+ this.divname + q + "\" h=\"" + this.lwsgt_cb + "\" p=\""+this.lwsgt_parent+"\" aa=\""+
									lws_san(encodeURI(j.data[m][this.hdr.cols[n].href]))+"\" m=\""+m+"\" n=\""+n+"\">" +
									lws_san(j.data[m][this.hdr.cols[n].name]) +
									"</a>";
								q++;
							}
							else
								s = s + lws_san(j.data[m][this.hdr.cols[n].name]);
			
							s = s + "</td>";
						}
					}
	
					s = s + "</tr>";
				}
				s = s + "</table>";
				document.getElementById(this.divname).innerHTML = s;
				for (n = 0; n < q; n++)
					document.getElementById(this.divname + n).onclick =
						lwsgt_click_callthru;

				for (n = 0; n < this.bcq; n++)
					document.getElementById("bc_" + this.divname + n).onclick =
						lwsgt_click_callthru;

			}		
		};
		this.lwsgt_ws.onclose = function(){
			lws_gray_out(true,{"zindex":"499"});
		};
	} catch(exception) {
		alert("<p>Error" + exception);  
	}
}