var thisform;

Element.addMethods({
	removeChildren: function(object) {
		while(object.firstChild)
			object.removeChild(object.firstChild);
	},
	attachLabel: function(object, label) {
		if(!object.id) object.id = 'id' + Math.random();
			label.htmlFor = object.id;
	}
});

function $T(text)
{
	return document.createTextNode(text);
}

function Lineclear()
{
	var lc = new Element('div');
	lc.className = 'lineclear';
	lc.innerHTML = '<span></span>';
	return lc;
}

function Pagespacer()
{
	var ps = new Element('div');
	ps.className = 'pages_spacer';
	return ps;
}

Event.observe(document, 'click', function(event) {
	var element = Event.element(event);
	while(element) {
		if(element.clickHandler) {
			element.clickHandler(event);
			break;
		}
		element = element.parentNode;
	}
});

Event._observe = Event.observe;
Event.observe = function(element, eventName, handler, useCapture) {
	if(eventName == 'click') {
		element.clickHandler = handler;
	} else {
		Event._observe(element, eventName, handler, useCapture);
	}
}

function ImageButton(f, src, alt, title, hoverSrc)
{
	var img = new Element('img');
	img.clickHandler = (function(event) {
		if(Event.isLeftClick(event))
			f(event);
		return false;
	}).bind(this);
	img.style.cursor = 'pointer';
	img.src = src;
	img.alt = alt;
	if(title)
		img.title = title;
	if(hoverSrc)
	{
		img.onmouseover = function() { img.src = hoverSrc; }
		img.onmouseout = function() { img.src = src; }
		new Image().src = hoverSrc; // preload hover image
	}
	return img;
}

function TextButton(f, text, title)
{
	var a = new Element('a');
	a.appendChild($T(text));
	a.clickHandler = (function(event) {
		if(Event.isLeftClick(event))
			f(event);
		return false;
	}).bind(this);
	a.href = "javascript:void(0);";
	if(title)
		a.title = title;
	return a;
}

function Span(text)
{
	var s = new Element('span');
	s.innerHTML = text;
	return s;
}

function TextItem(text)
{
	var li = new Element('li');
	li.appendChild(new Span(text));
	return li;
}

function loading(rpc)
{
	if(rpc)
	{
		if($('loading'))
		{
			$('loading').show();
			Element.setOpacity('loading', 0.9);
			$('loading_cancel').clickHandler = function(event) {
				rpc.abort(event);
				loading(false);
			}
		}
	}
	else
	{
		if($('loading'))
			$('loading').hide();
		unwait();
	}
}

function wait() {
	document.body.addClassName('wait');
}

function unwait() {
	document.body.removeClassName('wait');
}

function filename(hash)
{
	return hash.substring(0, 1) + '/' + hash.substring(1, 2) + '/' + hash;
}

function language(lang_var, vars) {
	if(typeof vars != 'undefined') {
		if(!(vars instanceof Array)) vars = [vars];
		if(languages[lang_var]) {
			var output = vsprintf(languages[lang_var], vars);
			return output.unescapeHTML();
		} else {
			return '<em><code>' + lang_var + '</code> not set</em>';
		}
	} else {
		return languages[lang_var] ? languages[lang_var].unescapeHTML() : '<em><code>' + lang_var + '</code> not set</em>';
	}
}

function vsprintf(format, args) {
	return sprintf.apply(this, [format].concat(args));
}

function sprintf( ) {
	// http://kevin.vanzonneveld.net
	// +   original by: Ash Searle (http://hexmen.com/blog/)
	// + namespaced by: Michael White (http://getsprink.com)
	// +	tweaked by: Jack
	// +   improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
	// +	  input by: Paulo Ricardo F. Santos
	// +   improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)

	var regex = /%%|%(\d+\$)?([-+\'#0 ]*)(\*\d+\$|\*|\d+)?(\.(\*\d+\$|\*|\d+))?([scboxXuidfegEG])/g;
	var a = arguments, i = 0, format = a[i++];
	
	// pad()
	var pad = function(str, len, chr, leftJustify) {
		if (!chr) chr = ' ';
		var padding = (str.length >= len) ? '' : Array(1 + len - str.length >>> 0).join(chr);
		return leftJustify ? str + padding : padding + str;
	};
	
	// justify()
	var justify = function(value, prefix, leftJustify, minWidth, zeroPad, customPadChar) {
		var diff = minWidth - value.length;
		if (diff > 0) {
			if (leftJustify || !zeroPad) {
				value = pad(value, minWidth, customPadChar, leftJustify);
			} else {
				value = value.slice(0, prefix.length) + pad('', diff, '0', true) + value.slice(prefix.length);
			}
		}
		return value;
	};
	
	// formatBaseX()
	var formatBaseX = function(value, base, prefix, leftJustify, minWidth, precision, zeroPad) {
		// Note: casts negative numbers to positive ones
		var number = value >>> 0;
		prefix = prefix && number && {'2': '0b', '8': '0', '16': '0x'}[base] || '';
		value = prefix + pad(number.toString(base), precision || 0, '0', false);
		return justify(value, prefix, leftJustify, minWidth, zeroPad);
	};
	
	// formatString()
	var formatString = function(value, leftJustify, minWidth, precision, zeroPad, customPadChar) {
		if (precision != null) {
			value = value.slice(0, precision);
		}
		return justify(value, '', leftJustify, minWidth, zeroPad, customPadChar);
	};
	
	// finalFormat()
	var doFormat = function(substring, valueIndex, flags, minWidth, _, precision, type) {
		if (substring == '%%') return '%';
	
		// parse flags
		var leftJustify = false, positivePrefix = '', zeroPad = false, prefixBaseX = false, customPadChar = ' ';
		var flagsl = flags.length;
		for (var j = 0; flags && j < flagsl; j++) switch (flags.charAt(j)) {
			case ' ': positivePrefix = ' '; break;
			case '+': positivePrefix = '+'; break;
			case '-': leftJustify = true; break;
			case "'": customPadChar = flags.charAt(j+1); break;
			case '0': zeroPad = true; break;
			case '#': prefixBaseX = true; break;
		}
	
		// parameters may be null, undefined, empty-string or real valued
		// we want to ignore null, undefined and empty-string values
		if (!minWidth) {
			minWidth = 0;
		} else if (minWidth == '*') {
			minWidth = +a[i++];
		} else if (minWidth.charAt(0) == '*') {
			minWidth = +a[minWidth.slice(1, -1)];
		} else {
			minWidth = +minWidth;
		}
	
		// Note: undocumented perl feature:
		if (minWidth < 0) {
			minWidth = -minWidth;
			leftJustify = true;
		}
	
		if (!isFinite(minWidth)) {
			throw new Error('sprintf: (minimum-)width must be finite');
		}
	
		if (!precision) {
			precision = 'fFeE'.indexOf(type) > -1 ? 6 : (type == 'd') ? 0 : void(0);
		} else if (precision == '*') {
			precision = +a[i++];
		} else if (precision.charAt(0) == '*') {
			precision = +a[precision.slice(1, -1)];
		} else {
			precision = +precision;
		}
	
		// grab value using valueIndex if required?
		var value = valueIndex ? a[valueIndex.slice(0, -1)] : a[i++];
	
		switch (type) {
			case 's': return formatString(String(value), leftJustify, minWidth, precision, zeroPad, customPadChar);
			case 'c': return formatString(String.fromCharCode(+value), leftJustify, minWidth, precision, zeroPad);
			case 'b': return formatBaseX(value, 2, prefixBaseX, leftJustify, minWidth, precision, zeroPad);
			case 'o': return formatBaseX(value, 8, prefixBaseX, leftJustify, minWidth, precision, zeroPad);
			case 'x': return formatBaseX(value, 16, prefixBaseX, leftJustify, minWidth, precision, zeroPad);
			case 'X': return formatBaseX(value, 16, prefixBaseX, leftJustify, minWidth, precision, zeroPad).toUpperCase();
			case 'u': return formatBaseX(value, 10, prefixBaseX, leftJustify, minWidth, precision, zeroPad);
			case 'i':
			case 'd': {
				var number = parseInt(+value);
				var prefix = number < 0 ? '-' : positivePrefix;
				value = prefix + pad(String(Math.abs(number)), precision, '0', false);
				return justify(value, prefix, leftJustify, minWidth, zeroPad);
			}
			case 'e':
			case 'E':
			case 'f':
			case 'F':
			case 'g':
			case 'G': {
				var number = +value;
				var prefix = number < 0 ? '-' : positivePrefix;
				var method = ['toExponential', 'toFixed', 'toPrecision']['efg'.indexOf(type.toLowerCase())];
				var textTransform = ['toString', 'toUpperCase']['eEfFgG'.indexOf(type) % 2];
				value = prefix + Math.abs(number)[method](precision);
				return justify(value, prefix, leftJustify, minWidth, zeroPad)[textTransform]();
			}
			default: return substring;
		}
	};
	
	return format.replace(regex, doFormat);
}

function showCat(category)
{
	location.href = "index.php?filter=" + category;
}

function windowopen(url, x, y)
{
	window.open(url, '_blank', 'fullscreen=0, toolbar=0, location=0, directories=0, status=0, menubar=0, scrollbars=0, resizable=1, width=' + x + ', height=' + y);
}

function windowopenscroll(url, x, y)
{
	window.open(url, '_blank', 'fullscreen=0, toolbar=0, location=0, directories=0, status=1, menubar=0, scrollbars=1, resizable=1, width=' + x + ', height=' + y);
}

function viewer(hash)
{
	windowopen('popup.viewer.php?hash=' + hash, 610, 630);
}

function meta(hash)
{
	windowopenscroll('popup.metadata.php?hash=' + hash, 600, 400);
}

function cEdit(hash)
{
	if(confirm(language('copyedit-confirm')))
		windowopenscroll('popup.edit.php?hash=' + hash, 400, 200);
}

function comment(hash, w)
{
	var imageSize = settings.thumb_size + 2 * settings.thumb_padding;
	windowopenscroll('popup.comments.' + (w ? 'write' : 'read') + '.php?hash=' + hash, 400 + imageSize, 80 + imageSize);
}

function confirmLink(text, url)
{
	if(confirm(text))
		location.href = url;
}

function accessMode(mode)
{
	location.href = '?set_priv=' + mode;
}

function getKeys(array)
{
	var arrayKeys = [];
	for(var i in array)
		if(array[i])
			arrayKeys.push(i);
	return arrayKeys;
}

function getNodeValue(node)
{
	return node.firstChild ? removeWhitespace(node.firstChild.nodeValue) : '';
}

function removeWhitespace(data)
{
  data = data.replace(/[\t\n\r ]+/g, " ");
  if (data.charAt(0) == " ")
	data = data.substring(1, data.length);
  if (data.charAt(data.length - 1) == " ")
	data = data.substring(0, data.length - 1);
  return data;
}

var OverrideSubmit = Class.create({
	initialize: function(element, override) {
		$(element).observe('keydown', function(event) {
			if(event.keyCode == Event.KEY_RETURN) {
				Event.stop(event);
				if(override) override();
			}
		});
	}
});

/*
var BrowserDetect = {
	init: function () {
		this.browser = this.searchString(this.dataBrowser) || "An unknown browser";
		this.version = this.searchVersion(navigator.userAgent)
			|| this.searchVersion(navigator.appVersion)
			|| "an unknown version";
		this.OS = this.searchString(this.dataOS) || "an unknown OS";
	},
	searchString: function (data) {
		for (var i=0;i<data.length;i++)	{
			var dataString = data[i].string;
			var dataProp = data[i].prop;
			this.versionSearchString = data[i].versionSearch || data[i].identity;
			if (dataString) {
				if (dataString.indexOf(data[i].subString) != -1)
					return data[i].identity;
			}
			else if (dataProp)
				return data[i].identity;
		}
	},
	searchVersion: function (dataString) {
		var index = dataString.indexOf(this.versionSearchString);
		if (index == -1) return;
		return parseFloat(dataString.substring(index+this.versionSearchString.length+1));
	},
	dataBrowser: [
		{ 	string: navigator.userAgent,
			subString: "OmniWeb",
			versionSearch: "OmniWeb/",
			identity: "OmniWeb"
		},
		{
			string: navigator.vendor,
			subString: "Apple",
			identity: "Safari"
		},
		{
			prop: window.opera,
			identity: "Opera"
		},
		{
			string: navigator.vendor,
			subString: "iCab",
			identity: "iCab"
		},
		{
			string: navigator.vendor,
			subString: "KDE",
			identity: "Konqueror"
		},
		{
			string: navigator.userAgent,
			subString: "Firefox",
			identity: "Firefox"
		},
		{
			string: navigator.vendor,
			subString: "Camino",
			identity: "Camino"
		},
		{		// for newer Netscapes (6+)
			string: navigator.userAgent,
			subString: "Netscape",
			identity: "Netscape"
		},
		{
			string: navigator.userAgent,
			subString: "MSIE",
			identity: "Explorer",
			versionSearch: "MSIE"
		},
		{
			string: navigator.userAgent,
			subString: "Gecko",
			identity: "Mozilla",
			versionSearch: "rv"
		},
		{ 		// for older Netscapes (4-)
			string: navigator.userAgent,
			subString: "Mozilla",
			identity: "Netscape",
			versionSearch: "Mozilla"
		}
	],
	dataOS : [
		{
			string: navigator.platform,
			subString: "Win",
			identity: "Windows"
		},
		{
			string: navigator.platform,
			subString: "Mac",
			identity: "Mac"
		},
		{
			string: navigator.platform,
			subString: "Linux",
			identity: "Linux"
		}
	]

};
BrowserDetect.init();
var pngSupport = !(BrowserDetect.browser == 'Explorer' && BrowserDetect.OS == 'Windows' && BrowserDetect.version < 7);
*/