var rexp_url = /^(http|https|ftp):\/\/[a-zA-Z0-9-]+(\.[a-zA-Z0-9-]+)+/i;
var rexp_url_wo_proto = /^[a-zA-Z0-9-]+(\.[a-zA-Z0-9-]+)+/i;
var rexp_domain = /^[a-zA-Z0-9-]+(\.[a-zA-Z0-9-]+)+$/i;
var rexp_email = /^([0-9a-zA-Z]+([_.-]?[0-9a-zA-Z]+)*@[0-9a-zA-Z]+[0-9,a-z,A-Z,.,-]*(.){1}[a-zA-Z]{2,4})+$/;
var rexp_mailto = /^mailto:\s*([0-9a-zA-Z]+([_.-]?[0-9a-zA-Z]+)*@[0-9a-zA-Z]+[0-9,a-z,A-Z,.,-]*(.){1}[a-zA-Z]{2,4})+$/i;
var rexp_time = /^([0-1][0-9]|[2][0-3])(:([0-5][0-9])){1,2}$/;
var rexp_ip = /^((25[0-5]|2[0-4][0-9]|1[0-9]{2}|[0-9]{1,2})\.){3}(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[0-9]{1,2})$/;
var rexp_decimal = /^\d*[0-9](\.\d*[0-9])?$/;
var rexp_img_fname = /^[a-zA-Z0-9-_\.]+\.(jpg|jpeg|gif|png)$/;

function show_dict(d, skip)
{
	var s = '';
	var i = 1;
	if (typeof(skip) == 'undefined') skip = 0
	for (var k in d)
	{
		if (skip <= 0)
		{
			try { s = s + i + '. ' + k + '=>' + d[k] + '\n'; } catch (e) {};
		}
		skip = skip - 1;
		i = i + 1;
	}
	alert(s);
}

function html_quote(s) {
	s = s.replace(/&/g, '&amp;');
	s = s.replace(/"/g, '&quot;');
	s = s.replace(/</g, '&lt;');
	s = s.replace(/>/g, '&gt;');
	s = s.replace(/'/g, '&#39;');
	return s
}

function callFunction(func, args)
{

	func.apply(null, args);
}

function addToClassName(obj, name)
{
	var s = obj.className;
	var re = new RegExp('(?=\\b)' + name + '(?=\\b)', 'gi')
	s.replace(re, '');
	s = s + ' ' + name;
	s = s.split(/\s/).join(' ');
	obj.className = s;
}

function removeFromClassName(obj, name)
{
	var s = obj.className;
	var re = new RegExp('(?=\\b)' + name + '(?=\\b)', 'gi')
	s = s.replace(re, '');
	s = s.split(/\s/).join(' ');
	obj.className = s;
}

function hasInClassName(obj, name)
{
	var s = obj.className;
	var re = new RegExp()
	re.compile(name, 'g')
	return re.test(s);
}

function callMethod(obj, method_name, args)
{
	obj[method_name].apply(obj, args);
}

function args2array(args, skip)
{
	if (typeof(skip) == 'undefined')
	{
		skip = 0;
	}
	var arr = new Array();
	for (var i=skip; i<args.length; i++)
	{
		arr[i-skip] = args[i];
	}
	return arr;
}

function has_value(arr, value)
{
	for (var i=0; i<arr.length; i++)
	{
		if (arr[i] == value)
		{
			return true;
		}
	}
	return false;
}

function BoundMethod(obj, method_name)
{
	if (arguments.length > 2)
	{
		var bound_args = args2array(arguments, 2);
		return function()
		{
			if (arguments.length > 0)
			{
				var args = args2array(arguments);
				return callMethod(obj, method_name, bound_args.concat(args));
			}
			else
			{
				return callMethod(obj, method_name, bound_args);
			}
		}
	}
	else
	{
		return function()
		{
			return callMethod(obj, method_name, arguments);
		}
	}
}

function addEventListener2(obj, event_name, listener)
{
	var old_handler = obj[event_name];
	if (old_handler)
	{
		new_handler = function()
		{
			callFunction(old_handler, arguments);
			callFunction(listener, arguments);
		};
	}
	else
	{
		new_handler = listener;
	}
	obj[event_name] = new_handler;
}

function findOuterForm(element)
{
	var p = element.parentNode;
	if (!p.tagName)
	{
		return null;
	}
	if (p.tagName.toLowerCase() == 'form')
	{
		return p;
	}
	return findOuterForm(p);
}

function openPhotoWindow(url, name, w, h)
{
	var sFeatures = 'directories=0,location=0,menubar=0,toolbar=0,' +
		'resizable=1,scrollbars=1,status=0,dependent=yes';
	var sFeatures = "top=5, left=5, toolbar=no,status=no,scrollbars=yes,resizable=yes,dependent=yes";
	if (typeof(w) != 'undefined')
	{
		sFeatures = sFeatures + ',width=' + w.toString();
	}
	if (typeof(h) != 'undefined')
	{
		sFeatures = sFeatures + ',height=' + h.toString();
	}
	var w = window.open(url, name, sFeatures);
	w.focus();
	return w;
}

function openDialogWindow(url, name, w, h)
{
	var sFeatures = 'directories=0,location=0,menubar=0,toolbar=0,' +
		'resizable=1,scrollbars=1,status=0,dependent=yes';
	var sFeatures = "toolbar=no,status=no,resizable=yes,dependent=yes";
	if (typeof(w) != 'undefined')
	{
		sFeatures = sFeatures + ',width=' + w.toString();
	}
	if (typeof(h) != 'undefined')
	{
		sFeatures = sFeatures + ',height=' + h.toString();
	}
	var w = window.open(url, name, sFeatures);
	w.focus();
	return w;
}

function getEventPos(e)
{
	var posx = 0;
	var posy = 0;
	if (!e) var e = window.event;
	if (e.pageX || e.pageY)
	{
		posx = e.pageX;
		posy = e.pageY;
	}
	else if (e.clientX || e.clientY)
	{
		posx = e.clientX + document.body.scrollLeft;
		posy = e.clientY + document.body.scrollTop;
	}
	return {x: posx, y: posy};
}

function getEventElement(e)
{
	return (e.target) ? e.target : e.srcElement;
}

function getEventKeyCode(e)
{
	var code;
	if (!e) var e = window.event;
	if (e.keyCode) code = e.keyCode;
	else if (e.which) code = e.which;
	return code;
}

function getEventChar(e)
{
	return String.fromCharCode(getEventKeyCode(e));
}

function cancelEvent(e)
{
	if (!e) var e = window.event;
	e.returnValue = false;
	if (e.preventDefault) e.preventDefault();
	return false;
}

function cancelEventBubble(e)
{
	if (!e) var e = window.event;
	e.cancelBubble = true;
	if (e.stopPropagation) e.stopPropagation();
}

function getElementPos(obj)
{
	var posx = 0;
	var posy = 0;
	if (obj.offsetParent)
	{
		while (obj.offsetParent)
		{
			posx += obj.offsetLeft;
			posy += obj.offsetTop;
			obj = obj.offsetParent;
		}
	}
	else if (obj.x)
	{
		posx += obj.x;
		posy += obj.y;
	}
	return {x: posx, y: posy};
}

function Evt(e)
{
	this._e = (e) ? e : window.event;
}

Evt.prototype.getElement = function()
{
	return this._elm ? this._elm : (this._elm = getEventElement(this._e));
}

Evt.prototype.getKeyCode = function()
{
	return this._code ? this._code : (this._code = getEventKeyCode(this._e));
}

Evt.prototype.getChar = function()
{
	return this._char ? this._char : (this._char = getEventChar(this._e));
}

Evt.prototype.cancel = function()
{
	return cancelEvent(this._e);
}

Evt.prototype.cancelBubble = function()
{
	cancelEventBubble(this._e);
}

Evt.prototype.getPos = function()
{
	return (this._pos) ? this._pos : (this._pos = getEventPos(this._e));
}

Evt.prototype.getX = function()
{
	return (this._pos) ? this._pos.x : ((this._pos = getEventPos(this._e)).x);
}

Evt.prototype.getY = function()
{
	return (this._pos) ? this._pos.y : ((this._pos = getEventPos(this._e)).y);
}

function getQueryString()
{
	return location.search.substring(1);
}

function qs2dict(qs)
{
	var params = qs.split('&');
	var values = new Array();
	for (var i=0; i<params.length; i++)
	{
		if (params[i] != '')
		{
			var tmp = params[i].split('=');
			if (values[tmp[0]] == undefined)
			{
				values[tmp[0]] = unescape(tmp[1]);
			}
			else if (values[tmp[0]].length != undefined &&
				typeof(values[tmp[0]]) != 'string')
			{
				values[tmp[0]][values[tmp[0]].length] = unescape(tmp[1]);
			}
			else
			{
				values[tmp[0]] = [values[tmp[0]], unescape(tmp[1])];
			}
		}
	}
	return values;
}

function getQueryDict()
{
	return qs2dict(getQueryString());
}

function dict2qs(d)
{
	params = new Array();
	for (var k in d)
	{
		//params[params.length] = k + '=' + escape(d[k]);
		if (d[k].length != undefined && typeof(d[k]) != 'string')
		{
			for (var i=0; i<d[k].length; i++)
			{
				params[params.length] = k + '=' + d[k][i];
			}
		}
		else
		{
			params[params.length] = k + '=' + d[k];
		}
	}
	return params.join('&');
}

function setQueryString(qs, fragment)
{
	fragment = (fragment != undefined) ? ('#' + fragment) : '';
	qs = (qs != '') ? ('?' + qs) : '';
	location.replace(location.pathname + qs + fragment);
}

function setQueryDict(d, fragment)
{
	setQueryString(dict2qs(d), fragment)
}

function setQueryParam(k, v, fragment)
{
	var d = getQueryDict();
	d[k] = v;
	setQueryDict(d, fragment);
}

function setQueryParams(params, fragment)
{
	var d = getQueryDict();
	for (var k in params)
	{
		d[k] = params[k];
	}
	setQueryDict(d, fragment);
}


function resizeToElement(element, addw, addh)
{
	pos = getElementPos(element);
	w = element.offsetWidth;
	h = element.offsetHeight;
	if (typeof(addw) != "undefined")
		w = w + addw;
	if (typeof(addh) != "undefined")
		h = h + addh;
	/*availWidth = screen.availWidth - 100;
	availHeight = screen.availHeight - 100;
	if (availWidth < w) w = availWidth;
	if (availHeight < h) h = availHeight;*/
	window.resizeTo(w, h);
}

function disable_form(theform)
{
	for (i=0; i<theform.length; i++)
	{
		var tempobj = theform.elements[i];
		if (tempobj.type.toLowerCase() == "submit")
			tempobj.disabled = true;
		if (tempobj.type.toLowerCase() == "button")
			tempobj.disabled = true;
	}
}

function MM_preloadImages() { //v3.0
	var d=document; if(d.images){ if(!d.MM_p) d.MM_p=new Array();
	var i,j=d.MM_p.length,a=MM_preloadImages.arguments;
	for(i=0; i<a.length; i++) if (a[i].indexOf("#")!=0)
	{ d.MM_p[j]=new Image; d.MM_p[j++].src=a[i];}}
}
