
function popup(url, name, w, h, x, y, returnwindow){
	if( !w ){
		w = 320;
	}
	if( !h ){
		h = 240;
	}
	var options = "width=" + w + ",height=" + h + ",toolbar=no,location=no,directories=no,status=no,menubar=no,scrollbars=yes,resizable=yes,copyhistory=no";
	var new_window = window.open(url, name, options);
	window.self.name = "main";
	new_window.focus();
	if( returnwindow != null ){
	   return new_window;
	}
}

function toggleDisplay(target){
	if( target != null ){
		var obj = document.getElementById(target);
		if( obj.style.display == 'none' || obj.style.display == '' ){
			obj.style.display = 'block';
		}else{
			obj.style.display = 'none';
		}
	}
}

function setStyle(target, prop, values){
	if( !isObject(target) ){
		target = document.getElementById(target);
	}
	target.style[prop] = values;
}

function formCheckReq(targets){
	for( i=0; i<targets.length; i++){
		var t = document.getElementById(targets[i]);
		if( t.value == '' ){
			var l; var m;
			var msg = '%s is required.';
			if( l = document.getElementById('lb_' + targets[i]) ){
				m = sprintf(msg, l.innerHTML);
			}else{
				m = sprintf(msg, targets[i]);
			}
			alert(m);
			t.focus();
			return false;
		}
	}
	return true;
}

function formConfirm(target, msg){
	if( target && confirm(msg) ){
		document.forms[target].submit();
	}
	return false;
}

function formCheckMin(targets, numbers){
	for( i=0; i<targets.length; i++){
		var t = document.getElementById(targets[i]);
		if( numbers[i] > 0 && (t.value.length == 0 || t.value.length < numbers[i]) ){
			var l; var lb; var m;
			var msg = '%s requires atleast %u characters.';
			if( l = document.getElementById('lb_' + targets[i]) ){
				lb = l.innerHTML;
			}else{
				lb = targets[i];
			}
			m = sprintf(msg, lb, numbers[i]);
			alert(m);
			t.focus();
			return false;
		}
	}
	return true;
}

function formClearInputs(form){
	var eles = document.forms[form].elements;
	for( var i = 0; i < eles.length; i++ ){
		var e = eles[i];
		if( e.type == 'checkbox' || e.type == 'radio' ){
			e.checked = false;
		}else if( e.type == 'text' ){
			e.value = '';
		}
	}
}

function registerSelectCity(){
	var sel = document.getElementById('loc');
	if( XHR == null ){
		var q = document.getElementById('newloc').value;
		q = ltrim(q);
		q = q.replace('\s+', ' ');
		if( q.length == 0 || old_loc == q ){
			return false;
		}
		old = q;
		loading = document.createElement('option');
		loading.appendChild(document.createTextNode('Loading...'));
		removeChildren(sel);
		sel.appendChild(loading);
		if( XHR = loadXHR() ){
			handleXHR(XHR, registerSelectCity, 'http://www.meedium.com/xhr/', "GET", 'do=findcity&city=' + encodeURIComponent(q));
		}
	}else if( XHR.readyState == 4 ){
		if( XHR.status == 200 ){
			removeChildren(sel);
			selected = new Array();
			var items = XHR.responseXML.getElementsByTagName("item");
			var ids = XHR.responseXML.getElementsByTagName("CityId");
			var cities = XHR.responseXML.getElementsByTagName("City");
			var regions = XHR.responseXML.getElementsByTagName("Region");
			var countries = XHR.responseXML.getElementsByTagName("Country");
			var citieshtml = XHR.responseXML.getElementsByTagName("Cityhtml");
			var regionshtml = XHR.responseXML.getElementsByTagName("Regionhtml");
			var countrieshtml = XHR.responseXML.getElementsByTagName("Countryhtml");
			if( items.length > 0 ){
				for( var i = 0; i < items.length; i++ ){
					var t = citieshtml[i].firstChild.nodeValue + ', ' + regionshtml[i].firstChild.nodeValue + ', ' + countrieshtml[i].firstChild.nodeValue;
					var d = document.createElement('option');
					d.value = ids[i].firstChild.nodeValue;
					d.appendChild(document.createTextNode(t));
					sel.appendChild(d);
					selected[i] = citieshtml[i].firstChild.nodeValue;
					if( i == 0 ){
						document.getElementById('newloc').value = citieshtml[i].firstChild.nodeValue;
					}
				}
			}else{
				document.getElementById('loc').value = 0;
			}
		}
		XHR = null;
	}
}

function moveToCenter(target, move){
	var c;
	if( !isObject(target) ){
		c = document.getElementById(target);
	}else{
		c = target;
	}
	if( window.innerHeight ){
	//	gecko, khtml
		ih = window.innerHeight;
		iw = window.innerWidth;
		sl = window.pageXOffset;
		st = window.pageYOffset;
		ew = c.clientWidth;
		eh = c.clientHeight;
		if( window.opera ){
			of = 0;
		}else{
			of = 16;
		}
	}else if( document.documentElement && document.documentElement.clientHeight ){
	//	ie
		ih = document.documentElement.clientHeight;
		iw = document.documentElement.clientWidth;
		sl = document.documentElement.scrollLeft;
		st = document.documentElement.scrollTop;
		ew = c.offsetWidth;
		eh = c.offsetHeight;
		of = 0;		
		if( !window.opera ){
			c.style.width = '60%';
		}
	}else if( document.body ){
		ih = document.body.clientHeight;
		iw = document.body.clientWidth;
		sl = document.body.scrollLeft;
		st = document.body.scrollTop;
		ew = document.c.clientWidth;
		eh = document.c.clientHeight;
		of = 0;
	}
	ll = (iw - ew) / 2 + sl;
	lt = (ih - eh - of) / 2 + st;
	if( move ){
		setXY(c, ll, lt);
	}
	return new Array(ll, lt);
}

function setXY(target, x, y){
	var c;
	if( !isObject(target) ){
		c = document.getElementById(target);
	}else{
		c = target;
	}
	if( c.style ){
		c = c.style;
	}
	if( c.pixelLeft ){
		c.pixelLeft = x;
	}else if( window.opera ){
		c.left = x;
	}else{
		c.left = x + 'px';
	}	
	if( c.pixelTop ){
		c.pixelTop = y;
	}else if( window.opera ){
		c.top = y;
	}else{
		c.top = y + 'px';
	}
}

function getOffset(target, offsetType) {
	var ret = 0;
	while( target ){
		ret += target[offsetType];
		target = target.offsetParent;
	}
	return ret;
}

function getXY(obj){
	var el = obj;var pL = 0;
	while(el){pL+=el.offsetLeft;el=el.offsetParent;}
	var pT = 0;
	var er = obj;
	while(er){pT+=er.offsetTop;er=er.offsetParent;}
	return new Array(pL, pT);
}

function addEvent(obj, hdl, evt){
	if( obj.addEventListener ){
		obj.addEventListener(evt, hdl, false);
	}else if(obj.attachEvent){
		obj.attachEvent('on' + evt, hdl);
	}
}

function removeChildren(target){
	if( isString(target) ){
		target = document.getElementById(target);
	}
	while( target.firstChild ){
		target.removeChild(target.firstChild);
	}
}

function loadXHR(){
	if( window.XMLHttpRequest ){
		return new XMLHttpRequest();
	}else if( window.ActiveXObject ){
		return new ActiveXObject("Microsoft.XMLHTTP");
	}else{
		return null;
	}
}

function handleXHR(req, func, url, method, value){
	req.onreadystatechange = func;
	if( method == "POST" ){
		req.open(method, url, true);
		req.setRequestHeader("Content-Type" , "application/x-www-form-urlencoded");
		req.setRequestHeader('referer', 'http://www.meedium.com/');
		req.send(value);
	}else{
		req.open(method, url + '?' + value, true);
		req.send(null);
	}
}

function error(req){
	var msg = "XMLHttpRequest browser support is required.";
	if( req != null ){
		msg = msg + "\n" + req.status + "\n" + req.statusText;
	}
	alert(msg);
	return false;
}

function png(){
	var match = /\.png$/i;
	if( window.ActiveXObject ){
		imgs = document.getElementsByTagName('img');
		for( j=0; j < imgs.length; j++ ){
			if( match.test(imgs[j].src) ){
				imgs[j].setAttribute("sm:iepng", "true");
			}
		}
	}
}

// Object type / homepage.mac.com/takashi_miyamoto/rpg/javascript/util.js
function isObject(o) {
  return (typeof(o)=="object");
}
function isArray(o) {
  return (isObject(o) && (o.length) &&(!isString(o)));
}
function isFunction(o) {
  return (typeof(o)=="function");
}
function isString(o) {
  return (typeof(o)=="string");
}

//	function from www.27seconds.com/kb/article_view.aspx?id=11
function ltrim(str){
	var whitespace = new String(" \t\n\r");
	var s = new String(str);
	if( whitespace.indexOf(s.charAt(0)) != -1 ){
		var j=0, i = s.length;
		while (j < i && whitespace.indexOf(s.charAt(j)) != -1) { j++; }
		s = s.substring(j, i);
	}
	return s;
}

// function from forums.devshed.com/t39065/s84ded709f924610aa44fff827511aba3.html
// author appears to be Robert Pollard
function sprintf()
{
	if (!arguments || arguments.length < 1 || !RegExp)
	{
		return;
	}
	var str = arguments[0];
	var re = /([^%]*)%('.|0|\x20)?(-)?(\d+)?(\.\d+)?(%|b|c|d|u|f|o|s|x|X)(.*)/;
	var a = b = [], numSubstitutions = 0, numMatches = 0;
	while (a = re.exec(str))
	{
		var leftpart = a[1], pPad = a[2], pJustify = a[3], pMinLength = a[4];
		var pPrecision = a[5], pType = a[6], rightPart = a[7];
		
		//alert(a + '\n' + [a[0], leftpart, pPad, pJustify, pMinLength, pPrecision);

		numMatches++;
		if (pType == '%')
		{
			subst = '%';
		}
		else
		{
			numSubstitutions++;
			if (numSubstitutions >= arguments.length)
			{
				alert('Error! Not enough function arguments (' + (arguments.length - 1) + ', excluding the string)\nfor the number of substitution parameters in string (' + numSubstitutions + ' so far).');
			}
			var param = arguments[numSubstitutions];
			var pad = '';
			       if (pPad && pPad.substr(0,1) == "'") pad = leftpart.substr(1,1);
			  else if (pPad) pad = pPad;
			var justifyRight = true;
			       if (pJustify && pJustify === "-") justifyRight = false;
			var minLength = -1;
			       if (pMinLength) minLength = parseInt(pMinLength);
			var precision = -1;
			       if (pPrecision && pType == 'f') precision = parseInt(pPrecision.substring(1));
			var subst = param;
			       if (pType == 'b') subst = parseInt(param).toString(2);
			  else if (pType == 'c') subst = String.fromCharCode(parseInt(param));
			  else if (pType == 'd') subst = parseInt(param) ? parseInt(param) : 0;
			  else if (pType == 'u') subst = Math.abs(param);
			  else if (pType == 'f') subst = (precision > -1) ? Math.round(parseFloat(param) * Math.pow(10, precision)) / Math.pow(10, precision): parseFloat(param);
			  else if (pType == 'o') subst = parseInt(param).toString(8);
			  else if (pType == 's') subst = param;
			  else if (pType == 'x') subst = ('' + parseInt(param).toString(16)).toLowerCase();
			  else if (pType == 'X') subst = ('' + parseInt(param).toString(16)).toUpperCase();
		}
		str = leftpart + subst + rightPart;
	}
	return str;
}
