var ready = null;
pages = new String("/entry.html,/oser/newshop.html,/oser/basket.html,/test.html");
names = new String("base,shop,basket,test");
sizes = new String("height=500,width=770.width=970.height=500,width=770.height=310,width=150");
winspecs = "directories=NO,location=NO,menubar=NO,resizable=YES,scrollbars=YES,status=YES,toolbar=NO,dependant=YES";
var objs;
objs = null;
var mynum = null;
var origin;
var size;
var flag = 0;
omess = "Done.";
var messout = "";
var debuglvl = 0;

function initpg() {
	if (flag == 0) {
		flag = 1;
		self.onError = myerrhndlr;
		flashstatus("Integrating with other available windows...");
		origin = window.opener;
		if (origin != null) {
			mynum = origin.get_cnum(self.name);
			origin.reg_win(self, mynum);
			objs = origin.objs.slice(0);
			ready = origin.ready;
			for (i = 0; i < objs.length; i ++ ) {
				hld = objs[i];
				if ((i != mynum) && (i != origin.mynum) && (hld != null)) hld.reg_win(self, mynum);
			}
		} else {
			objs = new Array(self);
			mynum = 0;
			ready = 0;
		}
	}
	return retstatus();
}

function show(name) {
	showwin(find_index(name));
}

function cls(name) {
	closewin(find_index(name));
}

function ref(name) {
	num = find_index(name);
	hld = objs[num];
	if ((hld != null) && (hld.closed == false)) {
		hld.refresh_me();
		flashstatus("ref: refreshing");
		//hld.focus();
	// by default we don't want to give focus to the basket it it's already opened
	} else { 
		showwin(num); 
		flashstatus("ref: opening");
	}
	retstatus();
}

function closeme() {
	goto_orig();
	for(i = 0 ; i < objs.length; i++) {
		hld = objs[i];
		if ((i != mynum) && (hld != null) && (hld.closed == false) && (hld.flag != null) && (hld.flag == 1)) hld.reg_win(null, mynum);
	}
	return window.close();
}

function goto_orig() {
	if ((origin == null) || (origin.closed == true)) {
		for (i = 0; i < objs.length; i++) {
			hld = objs[i];
			if ((i != mynum) && (hld != null) && (hld.closed == false)) {
				hld.focus();
				i = objs.length;
			}
		}
	} else origin.focus();
}

function refresh_me() {
	window.mainFrame.location.reload();
}

function myerrhndlr(msg, url, lno) {
	// window.location.reload();
	messout += "<br><B align=enter>Error Intercepted</b><br>From " + url + "<BR>" + msg + " at " + lno
	alert(messout);
	return true;
}

function showwin(num) {
	size = objs.length;
	hld = null;
	if (num < size) hld = objs[num];
	if ((size <= num) || (hld == null) || (hld.closed == true)) {
		pgs = pages.split(",");
		nms = names.split(",");
		szs = sizes.split(".");
		toopen = pgs[num];
		opennm = nms[num];
		sizenm = szs[num];
		objs[num] = openpage(toopen, opennm, sizenm);
		hld = objs[num];
		hld.focus();
	} else {
		hld = objs[num];
		if ((hld != null) && (hld.closed == false)) {
			hld.origin = self;
			// hld.refresh_me();
			hld.focus();
		}
	}
}

function get_cnum(name) {
	if (name == null) return 0; else return find_index(name);
}

function find_index(name) {
	finding = new RegExp(name, "i") 
	arstr = names.split(",");
	rtn = null;
	for (i = 0; i < arstr.length; i++) {
		hold = arstr[i];
		if (hold.search(finding) != -1) {
			rtn = i;
			i = arstr.length;
		}
	}
	return rtn;
}

function closewin(num) {
	size = objs.length;
	if ((size > num) && (objs[num] != null) && (objs[num].closed == false)) {
		hld = objs[num];
		if (debuglvl != 0) messout += "<BR><b>" + hld.getstatus() + "</b><br>";
		hld.origin = self;
		hld.closeme();
		return retstatus();
	} else flashstatus("Unable to close");
}

function openpage(url, nomepagina, size) {
	return window.open(url, nomepagina, winspecs + "," + size);
}

function isbase() {
	return (mynum == 0);
}

function reg_win(obj, num) {
	size = objs.length;
	if (num == 0) num += 1;
	hld = objs[num];
	if ((hld != null) && (hld.closed == false)) {
		objs[num] = obj; 
		if (obj == null) ready = ready ^ (0x01 << --num); else ready = ready | (0x01 << --num); // max number of windows is 32
	} else {
		if (objs[num] == obj) ready = ready | (0x01 << --num ); else {
			if (obj != null) {
				objs[num] = obj;
				ready = ready | (0x01 << --num );
			} else flashstatus("Registration: no match found");
		}
	}
	retstatus();
}

function ver_win(ob, num) {
	rtn = (((ready & (0x01 << --num)) >> --num) + ((objs[num] == ob) ? 1 : 0));
	flashstatus("ver_win: check detected for ob " + ob + " number " + num + " rtnval: " + rtn);
	return rtn;
}

function get_win(num) {
	size = objs.length;
	if (num < size) hld = objs[num]; else return null;
	if ((hld != null) && (hld.closed == false)) return hld;
	return null;
}

function flashstatus(mess) {
	//omess = window.status;
	if (debuglvl != 0) messout += "<BR>" + mess;
	window.status = mess;
	return true;
}

function retstatus() {
	window.status = omess;
	return true;
}

function getstatus() {
	rtn = messout + "<BR><BR>mynum = " + mynum + "<BR>"
	messout = '';
	rtn += "origin is "
	if ((origin == null) || (origin.closed == true)) rtn += "invalid<br>"; else {
		rtn += "valid with index number " + origin.mynum + "<BR>"; 
	}
	rtn += "Object array has " + objs.length  + " objects<br>";
	rtn += "Registation value  " + ready;
	return rtn;
}
