function foo(s)
{
	document.getElementById('footer').innerHTML += '<div>'+s+'</div>'
}

function getXmlHttp(){
  var xmlhttp;
  try {
    xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");
  } catch (e) {
    try {
      xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
    } catch (E) {
      xmlhttp = false;
    }
  }
  if (!xmlhttp && typeof XMLHttpRequest!='undefined') {
    xmlhttp = new XMLHttpRequest();
  }
  return xmlhttp;
}

var isIE  = (navigator.appVersion.indexOf("MSIE") != -1) ? true : false;
var isWin = (navigator.appVersion.toLowerCase().indexOf("win") != -1) ? true : false;
var isOpera = (navigator.userAgent.indexOf("Opera") != -1) ? true : false;

function ControlVersion()
{
	var version;
	var axo;
	var e;

	try {
		axo = new ActiveXObject("ShockwaveFlash.ShockwaveFlash.7");
		version = axo.GetVariable("$version");
	} catch (e) {
	}

	if (!version)
	{
		try {
			axo = new ActiveXObject("ShockwaveFlash.ShockwaveFlash.6");
			version = "WIN 6,0,21,0";
			axo.AllowScriptAccess = "always";
			version = axo.GetVariable("$version");

		} catch (e) {
		}
	}

	if (!version)
	{
		try {
			axo = new ActiveXObject("ShockwaveFlash.ShockwaveFlash.3");
			version = axo.GetVariable("$version");
		} catch (e) {
		}
	}

	if (!version)
	{
		try {
			axo = new ActiveXObject("ShockwaveFlash.ShockwaveFlash.3");
			version = "WIN 3,0,18,0";
		} catch (e) {
		}
	}

	if (!version)
	{
		try {
			axo = new ActiveXObject("ShockwaveFlash.ShockwaveFlash");
			version = "WIN 2,0,0,11";
		} catch (e) {
			version = -1;
		}
	}
	
	return version;
}

function GetSwfVer(){
	var flashVer = -1;
	
	if (navigator.plugins != null && navigator.plugins.length > 0) {
		if (navigator.plugins["Shockwave Flash 2.0"] || navigator.plugins["Shockwave Flash"]) {
			var swVer2 = navigator.plugins["Shockwave Flash 2.0"] ? " 2.0" : "";
			var flashDescription = navigator.plugins["Shockwave Flash" + swVer2].description;
			var descArray = flashDescription.split(" ");
			var tempArrayMajor = descArray[2].split(".");			
			var versionMajor = tempArrayMajor[0];
			var versionMinor = tempArrayMajor[1];
			var versionRevision = descArray[3];
			if (versionRevision == "") {
				versionRevision = descArray[4];
			}
			if (versionRevision[0] == "d") {
				versionRevision = versionRevision.substring(1);
			} else if (versionRevision[0] == "r") {
				versionRevision = versionRevision.substring(1);
				if (versionRevision.indexOf("d") > 0) {
					versionRevision = versionRevision.substring(0, versionRevision.indexOf("d"));
				}
			}
			var flashVer = versionMajor + "." + versionMinor + "." + versionRevision;
		}
	}
	else if (navigator.userAgent.toLowerCase().indexOf("webtv/2.6") != -1) flashVer = 4;
	else if (navigator.userAgent.toLowerCase().indexOf("webtv/2.5") != -1) flashVer = 3;
	else if (navigator.userAgent.toLowerCase().indexOf("webtv") != -1) flashVer = 2;
	else if ( isIE && isWin && !isOpera ) {
		flashVer = ControlVersion();
	}	
	return flashVer;
}

function DetectFlashVer(reqMajorVer, reqMinorVer, reqRevision)
{
	versionStr = GetSwfVer();
	if (versionStr == -1 ) {
		return false;
	} else if (versionStr != 0) {
		if(isIE && isWin && !isOpera) {
			tempArray         = versionStr.split(" ");
			tempString        = tempArray[1];	
			versionArray      = tempString.split(",");
		} else {
			versionArray      = versionStr.split(".");
		}
		var versionMajor      = versionArray[0];
		var versionMinor      = versionArray[1];
		var versionRevision   = versionArray[2];

		if (versionMajor > parseFloat(reqMajorVer)) {
			return true;
		} else if (versionMajor == parseFloat(reqMajorVer)) {
			if (versionMinor > parseFloat(reqMinorVer))
				return true;
			else if (versionMinor == parseFloat(reqMinorVer)) {
				if (versionRevision >= parseFloat(reqRevision))
					return true;
			}
		}
		return false;
	}
}

var flashLoader = null
var globalTasks = new Array ()
var cookiesEnabled = true

function httpPerform (target, msg, wait, begin, end)
{
	wait ()
	globalTasks[globalTasks.length] = { target: target, msg: msg, wait: wait, begin: begin, end: end }
}

function runHttpScheduler ()
{
	var httpStreams = [ { object: getXmlHttp (),  busy: false }, { object: getXmlHttp (), busy: false } ]

	var getFreeHttpStream = function ()
	{
		if (!httpStreams[0].busy)
			return 0
		else if (!httpStreams[1].busy)
			return 1
		else
			return -1
	}
	
	window.setInterval (function ()
	{
		if (globalTasks.length != 0)
		{
			var i = getFreeHttpStream ()
			
			if (i >= 0)
			{				
				var task = globalTasks[0]
				globalTasks.splice (0, 1)
								
				httpStreams[i].busy = true
				
				task.begin ()
				
				var timeout = window.setTimeout (function ()
				{					
					httpStreams[i].object.onreadystatechange = function () {}
					httpStreams[i].busy = false
					
					if (navigator.appVersion.indexOf ('MSIE 6') < 0)
						httpStreams[i].object.abort ()
					
					httpPerform (task.target, task.msg, task.wait, task.begin, task.end)
					
				}, 5000)
				
				try
				{
					httpStreams[i].object.open ('POST', task.target.match(/(\/[^\/]*)$/)[0], true)
					httpStreams[i].object.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded')	
					httpStreams[i].object.onreadystatechange = function ()
					{
						try
						{
							if (httpStreams[i].object.readyState == 4)
							{							
								if ((httpStreams[i].object.status == 200) && httpStreams[i].object.responseText)
								{
									window.clearTimeout (timeout)
									httpStreams[i].object.onreadystatechange = function () {}
									
									var response = httpStreams[i].object.responseText
									
									window.setTimeout (function () { task.end (response) }, 10)
									
									httpStreams[i].busy = false
								}
							}
						}
						catch (e) {}
					}
					
					httpStreams[i].object.send (task.msg)
				}
				catch (e) {}
			}
		}
		
	}, 500)
}

function findParent (e, pred)
{
	var p = e
	
	while (true)
	{
		if (pred (p))
			return p
		else if (p.parentNode)
			p = p.parentNode
		else
			return undefined
	}
}

function findByClass (e, tag, cls)
{	
	var tags = e.getElementsByTagName (tag)

	for (var i = 0, n = tags.length; i != n; i++)
	{
		var tag = tags[i]
				
		if (tag.className == cls)
		{
			return tag
		}
	}
	
	return undefined
}

function parseHTML (host, text, next)
{
	host.removeChild (mkChild (host, 'div', function (d)
	{
		d.style.display = 'none'
		d.innerHTML = text
		next (d)
	}))
}

function animateHeight (e, start, target, advance, onBegin, onDone)
{
	if (e._anim)
	{
		e._finalizeAnim ()
	}
	
	onBegin ()
	
	e._finalizeAnim = function ()
	{
		e.style.height = target + 'px'
		e._anim = undefined
		e._finalizeAnim = undefined
		
		window.clearInterval (e._anim)
		onDone ()
	}
	
	var size = start
	e.style.height = '0px'

	e._anim = window.setInterval (function ()
	{
		if (e._anim && e._finalizeAnim)
		{
			size += advance
			
			if (
				(advance > 0 && size >= target) ||
				(advance < 0 && size <= target) || advance == 0)
			{
				e._finalizeAnim ()
			}
			else
			{
				e.style.height = size + 'px'
			}
		}
	}, 10)
}

function extractFileName (data)
{
    data = data.replace(/^\s|\s$/g, "");

    if (/\.\w+$/.test(data))
    {
        var m = data.match(/([^\/\\]+)\.(\w+)$/);
        if (m)
            return m[1] + '.' + m[2]
        else
            return "(file)"
    }
    else
    {
        var m = data.match(/([^\/\\]+)$/);
        
        if (m)
            return m[1]
        else
            return "(file)"
    }
}

function xyFromEvent (e, next)
{
  if (e.pageX)
    next (e.pageX, e.pageY)
  else
    next (e.clientX + document.body.parentElement.scrollLeft, e.clientY + document.body.parentElement.scrollTop)
}

function placeInputUnderCursor (e, x, y)
{
  e.style.position = 'absolute'
  e.style.left = (x - e.offsetWidth + 10) + 'px'
  e.style.top = (y - 5) + 'px' 
}

function mkChild (p, tag, f)
{
  var e = document.createElement (tag)
  f (e)
  p.appendChild (e)
  return e
}

function frameDocument (id)
{	
  var f = document.getElementById (id)
 
  if (f.contentDocument)
    return f.contentDocument
  else if (f.contentWindow)
    return f.contentWindow.document  
  else
    return window.top.frames[id].document
}

function blink (e, should)
{
	if (!should)
	{
		if (e._stopBlink)
			e._stopBlink ()
	}
	else if (!e._stopBlink)
	{
		var time = 0
		
		var anim = window.setInterval (function ()
		{
			if (e._stopBlink)
			{
				var x = Math.floor (Math.sin (time * 0.01) * 127 + 128)
				e.style.color = 'rgb(' + x + ',' + x + ',' + x + ')'
				time += 10
			}
		
		}, 10)
	  
		e._stopBlink = function ()
		{
			window.clearInterval (anim)
			e.style.color = ''
			e._stopBlink = undefined
		}
	}
}

function mkUploadUI (e, fileName, next)
{     
	next (mkChild (e, 'div', function (box)
	{
		box.className = 'ui'
			  
		mkChild (box, 'div', function (e)
		{
			e.className = 'file'
			e.innerHTML = (fileName.length > 13) ? (fileName.substr (0, 13) + '...') : fileName
		})          
		
		box._indicator = mkChild (box, 'div', function (e)
		{
			e.className = 'indicator'
			e._set = function (cls, text, shouldBlink)
			{
				blink (e, shouldBlink)
				e.className = cls
				e.innerHTML = text
			}
		})
		
		box._progress = mkChild (box, 'div', function (frame)
		{
			frame.className = 'progressframe hidden'
			frame._value = 0
			
			mkChild (frame, 'div', function (progress)
			{
				progress.className = 'progressbar'
				
				frame._update = function (value)
				{
					frame._value = value
					progress.style.width = value + '%'
				}
			})
		})
	}))
}

function attachFileInputToMouse (e, input)
{
	var hostMousemove = undefined
	var hostMouseout = undefined
	var inputMousemove = undefined
	
	var attach = function ()
	{
		hostMousemove = handle (e, 'mousemove',
			function (event)
			{
			  xyFromEvent (event, function (x, y)
			  {
				placeInputUnderCursor (input, x, y)
			  })
			})
		
		hostMouseout = handle (e, 'mouseout',
			function (event)
			{
			  xyFromEvent (event, function (x, y)
			  {
				if ((x < e.offsetLeft) || (y < e.offsetTop) ||
					(x > e.offsetLeft + e.offsetWidth) || (y > e.offsetTop + e.offsetHeight))
				{
					input.style.left = -10000 + 'px'
				}
			  })
			})
		
		inputMousemove = handle (input, 'mousemove',
			function (event)
			{
			  xyFromEvent (event, function (x, y)
			  {
				placeInputUnderCursor (input, x, y)
			
				if ((x < e.offsetLeft) || (y < e.offsetTop) ||
					(x > e.offsetLeft + e.offsetWidth) || (y > e.offsetTop + e.offsetHeight))
				{
					input.style.left = -10000 + 'px'
				}
			  })
			})
			
		input._detachFromMouse = function ()
		{
			cancelHandle (hostMousemove)
			cancelHandle (hostMouseout)
			cancelHandle (inputMousemove)
			
			input.onmouseout = function () {}
			input.onmouseup = function () {}
			
			input._detachFromMouse = undefined
		}
		
		input.onmousedown = function ()
		{
			if (input._detachFromMouse)
			{
				input._detachFromMouse ()
	
				documentMousemove = handle (document.body, 'mousemove',
					function (event)
					{
					  xyFromEvent (event, function (x, y)
					  {
						placeInputUnderCursor (input, x, y)
					  })
					})

				input.onmouseup = input.mouseout = function ()
				{
					cancelHandle (documentMousemove)
					input.style.left = -10000 + 'px'
		
					var temp = handle (e, 'mousemove',
						function (event)
						{
							input.blur ()
							cancelHandle (temp)
							xyFromEvent (event, function (x, y) { placeInputUnderCursor (input, x, y) })
							attach ()
						})
				}
			}
		}
	  
		input.onmouseout = function ()
		{
			input.style.left = -10000 + 'px'
		}
	}
	
	attach ()
}

function getLinksUI ()
{
	var ui = document.getElementById ('links-ui')
	
	if (ui)
	{
		return ui
	}
	else
	{
		return mkChild (document.body, 'div', function (ui)
		{
			ui.id = 'links-ui'
			ui.style.display = 'none'
			
			var respawn = function (byButton)
			{
				ui._doNotHide = false
				
				if (ui._onClose)
				{
					ui._onClose (byButton)
					ui._onClose = undefined
				}
			}
			
			ui._close = function (byButton)
			{
				respawn (byButton)
				ui.style.display = 'none'
			}
			
			ui._header = mkChild (ui, 'a', function (a)
			{
				a.href = '#close'
				a.className = 'header'
				a.innerHTML = localizedText.close

				a.onmousedown = function ()
				{
					ui._close (true)
					ui._resetDelay ()
					return false
				}
			})
			
			var copyLinks = new Array ()
			
			ui._updateLinksText = function ()
			{
				for (var i = 0; i != copyLinks.length; i++)
				{
					copyLinks[i].innerHTML =
						(window.clipboardData || (flashLoader != null)) ? localizedText.copy : localizedText.select
				}
			}
			
			ui._body = mkChild (ui, 'div', function (body)
			{
				body.className = 'body'
				
				var mkLink = function (parent, desc)
				{					
					return mkChild (parent, 'p', function (p)
					{
						mkChild (p, 'span', function (e)
						{
							e.innerHTML = desc + ': '
						})
						
						var textarea
						
						var copy = mkChild (p, 'a', function (a)
						{
							a.href = '#'
							
							copyLinks[copyLinks.length] = a
							
							a.onclick = function ()
							{
								if (flashLoader != null)
								{
									textarea.focus ()
									textarea.select ()
									flashLoader.copyToClipboard (textarea.value)
								}
								else
									copyToClipboard (textarea)
									
								return false
							}
						})
						
						var disabledCopy = mkChild (p, 'em', function (a)
						{
							copyLinks[copyLinks.length] = a
							
							a.className = 'hidden'
							a.innerHTML = window.clipboardData ? localizedText.copy : localizedText.select
						})
						
						textarea = mkChild (p, 'input', function (e)
						{
							e.type = 'text'
							e.readOnly = 'readonly'
							e.onfocus = function () { ui._doNotHide = true }
							e.onblur = function () { var text = e.value; e.value = ''; e.value = text; ui._doNotHide = false }
							e.onmouseup = function () { e.select () }
						})
						
						var disabledTextarea = mkChild (p, 'b', function (e)
						{
							e.className = 'hidden'
							e.innerHTML = localizedText.notavailable + ' <a href="/?faq=&directurl="> (' + localizedText.why + ')</a>'
						})
						
						p._set = function (copyHref, url)
						{
							if (url == '')
							{
								copy.className = 'hidden'
								textarea.className = 'hidden'
								disabledCopy.className = ''
								disabledTextarea.className = ''
							}
							else
							{
								copy.className = ''
								textarea.className = ''
								disabledCopy.className = 'hidden'
								disabledTextarea.className = 'hidden'
								
								if (copyHref != '')
									copy.href = copyHref

								textarea.value = url
							}
						}
					})
				}
				
				body._contents = mkChild (body, 'div', function (contents)
				{
					ui._linkView = mkLink (contents, localizedText.chat)
					ui._linkForum = mkLink (contents, localizedText.forum)
					ui._linkHTML = mkLink (contents, localizedText.blog)
					ui._linkDirect = mkLink (contents, localizedText.direct)
					
					ui._updateLinksText ()
				})
			})
			
			ui._spawn = function (parent, onShow, onClose, linkView, linkHTML, linkForum, linkDirect)
			{
				ui._resetDelay ()
				
				parent.appendChild (ui)
				
				respawn (false)
				
				ui.style.display = ''
				ui._onClose = onClose
				
				ui._linkView._set (linkView, linkView)
				ui._linkHTML._set ('', linkHTML)
				ui._linkForum._set ('', linkForum)
				ui._linkDirect._set (linkDirect, linkDirect)
				
				onShow ()
			}
			
			ui._resetDelay = function ()
			{
				if (ui._delay)
				{
					window.clearTimeout (ui._delay)
					ui._delay = undefined
				}
			}
			
			ui._triggerDelay = function (onDone, time)
			{
				ui._resetDelay ()
				ui._delay = window.setTimeout (function () { onDone () }, time)
			}
		})
	}
}

function mkLinksButton (slot, noHoverOpen)
{
	mkChild (slot, 'a', function (a)
	{
		var spawn = function ()
		{			
			var ui = getLinksUI ()
			
			ui._spawn (slot,
				function () /* shown */
				{
					a.style.display = 'none'
				},
				function (byBytton) /* closed */
				{
					slot.removeChild (a)
					mkLinksButton (slot, byBytton)
				},
				slot._url4sharing, slot._url4web, slot._url4forums, slot._urlDirect)
		}

		a.className = 'links-button'
		a.innerHTML = localizedText.links
		a.href = '#links'
		a.onmousedown = function ()
		{
			spawn ()
			
			return false
		}
				
		a.onmousemove = function ()
		{
			if (!noHoverOpen)
			{
				var ui = getLinksUI ()
				
				if (ui.style.display == '' && ui.parentNode != slot)
				{
					spawn ()
				}
				else if (ui.style.display == 'none' && !a._mouseup)
				{
					ui._triggerDelay (spawn, 100)
				}
			}
		}
		
		a.onmouseout = function ()
		{
			noHoverOpen = false
			a._mouseup = undefined;
			getLinksUI ()._resetDelay ()
		}
		
		a.onmouseup = function () { a._mouseup = true }
	})
}

function createAllLinksUI (list)
{
	var hint = document.getElementById ('show-links')
	var allLinks = document.getElementById ('all-links')

	if (hint.style.display != 'block' && allLinks.style.display != 'block')
	{
		var hintContents = hint.getElementsByTagName ('div')[0]
		
		hint.style.display = 'block'
		hintContents.style.display = 'none'

		animateHeight (hint, 0, 50, 5, function () {}, function ()
		{
			hintContents.style.display = ''
			hint.onclick = function ()
			{
				hint.style.display = 'none'
				allLinks.style.display = 'block'
			}
		})
		
		list._updateLinks = function ()
		{			
			var url4sharing = document.getElementById ('url_4_sharing')
			var url4forums = document.getElementById ('url_4_forums')
			var url4websites = document.getElementById ('url_4_websites')
			
			url4sharing.value = ''
			url4forums.value = ''
			url4websites.value = ''
		
			list._foreach (function (li, index)
			{
				if (li._isUploaded)
				{
					if (li._url4sharing)
					{
						url4sharing.value += li._url4sharing
					}
					if (li._url4forums)
					{
						url4forums.value += li._url4forums + ' '
					}
					if (li._url4web)
					{
						url4websites.value += li._url4web + ' '
					}
				}
			})
		}
		
		list._updateLinks ()
	}
}

function getFileName (url)
{
	return url.match(/\_([^\/]+)([\s\S]+)?$/)[1]
}

function createClickField (slot, cls, text, defaultCursor, onClick)
{
	slot._clickField = mkChild (slot, 'a', function (a)
	{
		a.className = cls
		a.innerHTML = text
		a.href = '#'
		a.style.position = 'relative'
		
		if (defaultCursor)
			a.style.cursor = 'default'

		a.onclick = function () { onClick (); return false; }
	})
}

function enterFlashChooseFileState (slot, index)
{
	slot._state = 'choosefile'
	slot.className = 'choose'
	
	createClickField (slot, 'choosefile', localizedText.click, false,
		function ()
		{
			try
			{
				flashLoader.upload (index)
			}
			catch (e)
			{
				alert (localizedText.flashError)
			}
		})
}

function enterChooseFileState (slot, onDone)
{
	slot._state = 'choosefile'
	slot.className = 'choose'
	
	mkChild (slot, 'input', function (f)
	{
		f.type = 'file'
		f.name = 'Filedata'
		f.className = 'transparent'
		f.style.position = 'absolute'
		f.style.left = -10000 + 'px'
		f.style.zIndex = 999
	
		slot._exitChooseFileState = function ()
		{
				if (f._detachFromMouse)
					f._detachFromMouse ()
					
				f.blur ()
				f.display = 'none'
	
				if (slot._clickField)
				{
					slot.removeChild (slot._clickField)
					slot._clickField = undefined
				}
				
				slot.className = ''
				slot._exitChooseFileState = undefined
				slot._setChooseFileReady = undefined
		}
	
		f.onchange = function ()
		{
			if (f.value != '')
			{
				var fileName = extractFileName (f.value)
				
				if (!fileName.toLowerCase ().match(/([^\/\\]+)\.(jpg|gif|jpeg|png)$/))
				{
					alert (localizedText.invalidFile)
				}
				else
				{
					slot._exitChooseFileState ()
					
					f.onchange = function () { }
					
					onDone (f, fileName)
				}
			}
		}

		if (navigator.appVersion.indexOf ('MSIE 6') >= 0)
		{
			f.onmouseup = function ()
			{
				f.onfocus = function ()
				{
					f.blur ()
					f.onfocus = ''
				}
			}
		}
		
		createClickField (slot, 'loading',
			localizedText.loading, true,
			function () {})
				
		slot._setChooseFileReady = function ()
		{
			try
			{
				slot._clickField.className = 'choosefile'
				slot._clickField.innerHTML = localizedText.click
				attachFileInputToMouse (slot._clickField, f)
				
			} catch (e) {}
		}
	})
}

function enterConnectingState (slot, ui, onDone)
{
	slot._state = 'connecting'

	httpPerform ('http://' + cfgSrvDomain + '/?js&schedule', '',
		function ()
		{
			ui._indicator._set ('blinking', localizedText.waiting, false)
		},
		function ()
		{
			ui._indicator._set ('blinking', localizedText.connecting, false)
		},
		function (response)
		{
			parseHTML (ui, response, function (e)
			{
				onDone (e.getElementsByTagName('a').item(0).getAttribute('href'))
			})
		})
}

function enterUploadingFromURLState (slot, ui, uploadTarget, sourceURL, onError, onDone)
{
	slot._state = 'uploading'
		
	httpPerform (uploadTarget + '&uploadfrom=' + encodeURIComponent (sourceURL), 'upload=',
		function ()
		{
			ui._indicator._set ('blinking', localizedText.waiting, false)
		},
		function ()
		{
			ui._indicator._set ('blinking', localizedText.uploading, true)
		},
		function (response)
		{
			parseUploadResponse (response, ui, onError,
				function () /* no response */
				{
					onError (localizedText.connectionFailed)
				},
				onDone)
		})
}

function enterUploadingState (slot, ui, file, uploadTarget, onDone)
{	
	slot._state = 'uploading'
	
	ui._indicator._set ('blinking', localizedText.uploading, true)
		
	var frameId = 'f' + Math.floor(Math.random() * 99999);
	
	mkChild (slot, 'div', function (e)
	{
		var frameSrc = 'http://' + uploadTarget.match(/:\/\/([^\/:]+)/)[1] + '/blank.php'
		
		e.innerHTML = '<iframe name="'+frameId+'" frameborder="0" src="' + frameSrc + '" onload="if (!this.readyState || this.readyState == \'complete\' || this.readyState == \'\') this.onloadHandler ()"></iframe>'
		var frame = e.childNodes[0]
		
		frame.onloadHandler = function ()
		{
			var form = mkChild (slot, 'form', function (e)
			{
				e.method = 'post'
				e.target = frameId
				e.setAttribute('target', frameId)
				e.action = uploadTarget		
				e.setAttribute('action', uploadTarget)
				e.enctype = 'multipart/form-data'
				e.encoding = 'multipart/form-data'
				e.appendChild (file)
			})
			
			var submit = mkChild (form, 'input', function (e)
			{
				e.type = 'hidden'
				e.name = 'MAX_FILE_SIZE'
				e.value = sizeLimit
			})
			
			var submit = mkChild (form, 'input', function (e)
			{
				e.type = 'hidden'
				e.name = 'upload'
			})
			
			frame.onloadHandler = function ()
			{
				frame.onloadHandler = undefined
				onDone ()
			}
			
			frame.setAttribute('src', frameSrc);
			form.submit ()
		}
		
		if (/Opera/.test(navigator.userAgent))
		{
			e.style.position = 'absolute'
			e.style.left = '-10000px'
		}
		else
		{
			e.style.display = 'none'			
		}
	})
}

function parseUploadResponse (response, ui, onError, onEmpty, onDone)
{
	parseHTML (ui, response, function (d)
	{
		var errors = findByClass (d, 'div', 'upload-errors')
		var results = findByClass (d, 'div', 'js-upload-results')

		if (errors)
		{					
			onError (errors.getElementsByTagName('span')[0].innerHTML)
		}
		else if (results)
		{
			var get = function (cls)
			{
				var item = findByClass (d, 'textarea', cls)
				return item ? item.value : ''
			}

			onDone (
				get ('js-url4share'),
				get ('js-url4web'),
				get ('js-url4forum'),
				get ('js-url-direct'),
				get ('js-thumb'))
		}
		else
		{
			onEmpty ()
		}
	})
}

function enterRetrievingState (slot, ui, uploadTarget, onError, onDone)
{
	window.setTimeout (function ()
	{
		slot._state = 'retrieving'
			
		httpPerform (uploadTarget, '',
			function ()
			{
				ui._indicator._set ('blinking', localizedText.waiting, false)
			},
			function ()
			{
				ui._indicator._set ('blinking', localizedText.retrieving, false)
			},
			function (response)
			{
				parseUploadResponse (response, ui,
					onError,
					function ()
					{
						enterRetrievingState (slot, ui, uploadTarget, onError, onDone)
					},
					onDone)
			})
	}, 300)
}

function enterUploadedState (slot, url4sharing, url4web, url4forums, urlDirect, thumb)
{
	slot._state = 'uploaded'
	
	var fileName = getFileName (url4sharing)
		
	slot.className = 'thumb'
	slot.innerHTML =
		'<a target="_blank" href="'+url4sharing+'"><img src="'+thumb+'" alt="' + fileName +'" title="' + fileName + '"></a>'
	
	slot._url4sharing = url4sharing
	slot._url4web = url4web
	slot._url4forums = url4forums
	slot._urlDirect = urlDirect
	
	mkLinksButton (slot, false)

	if (document.getElementById ('show-links'))
	{
		var list = slot.parentNode

		numUploadedFiles = 0
		list._foreach (function (li, index)
		{
			if (li._isUploaded)
			{
				numUploadedFiles++
			}
		})
		
		if (numUploadedFiles > 1)
		{
			createAllLinksUI (list)
			
			if (list._updateLinks)
				list._updateLinks ()
		}
	}
}

function enterErroneousState (slot, ui, errorMessage)
{
	slot._state = 'error'
	
	ui._indicator._set ('error', errorMessage, false)
	
	addClass (ui._progress, 'hidden')
}

function enterWaitingState (slot, ui, onDone)
{
	slot._state = 'waiting'
	
	ui._indicator._set ('blinking', localizedText.waiting, false)
		
	var check = function ()
	{
		var numUploading = 0
		
		slot.parentNode._foreach (function (slot, index)
		{
			if (slot._state == 'uploading')
				numUploading++
		})
		
		return (numUploading < 2)
	}
	
	if (check ())
	{
		onDone ()
	}
	else
	{
		var pulse = window.setInterval (function ()
		{
			if (check && check ())
			{
				check = undefined
				window.clearInterval (pulse)
				onDone ()
			}
		}, 1000)
	}
}

function clickExtendBehavior (li, index, anim)
{
	var numItems = li.parentNode.getElementsByTagName ('li').length
	
	if (numItems - index <= 4)
	  for (var i = 0; i != 4; i++)
		createSlot (li.parentNode, numItems + i, anim)
}

function createSlot (list, index, anim)
{
	mkChild (list, 'li', function (slot)
	{
		slot.className = 'blank'
		jsEnableSlot (slot, index, anim)
	})
}

function enterUploadedState2 (slot, url4sharing, url4web, url4forum, urlDirect, thumb)
{
	slot._isUploaded = true
	
	removeClass (document.getElementById ('persistence'), 'hidden')
	removeClass (document.getElementById ('signup'), 'leftmost')

	if (!cookiesEnabled)
	{
		removeClass (document.getElementById ('nocookies'), 'hidden')
	}
	
	enterUploadedState (slot, url4sharing, url4web, url4forum, urlDirect, thumb)
	
	if (slot.parentNode._numRecent != 0)
	{
		slot.className += ' hot'
	}
}

function enterRetrievingState2 (slot, ui, uploadTarget)
{
	enterRetrievingState (slot, ui, uploadTarget,
		function (errorMessage) /* error */
		{
			enterErroneousState (slot, ui, errorMessage)
		},
		function (url4sharing, url4web, url4forum, urlDirect, thumb) /* done */
		{
			enterUploadedState2 (slot, url4sharing, url4web, url4forum, urlDirect, thumb)
		})
}

function jsEnableSlot (slot, index, anim)
{
	slot._state = ''
	
	if (slot.className == 'blank')
	{
		var mkContents = function ()
		{
			if (flashLoader != null)
			{
				enterFlashChooseFileState (slot, index)
			}
			else
			{
				enterChooseFileState (slot, function (file, fileName)
				{
					clickExtendBehavior (slot, index, true)
					
					mkUploadUI (slot, fileName, function (ui)
					{
						enterConnectingState (slot, ui,
							function (uploadTarget) /* done */
							{
								enterWaitingState (slot, ui, function ()
								{
									enterUploadingState (slot, ui, file, uploadTarget,
										function ()
										{
											enterRetrievingState2 (slot, ui, uploadTarget)
										})
								})
							})
					})
				})
			}
		}
		
		if (anim)
			animateHeight (slot, 0, 90, 10, function () {}, mkContents)
		else
			mkContents ()
	}
	else if (slot.className == 'thumb')
	{
		slot.parentNode._numRecent++
		
		slot._state = 'uploaded'
		
		var urls = slot.getElementsByTagName ('textarea')
		
		enterUploadedState (slot, 
			slot.getElementsByTagName ('a')[0].href,
			urls[1].value,
			urls[0].value,
			urls.length > 2 ? urls[2].value : '',
			slot.getElementsByTagName ('img')[0].src)
	}
}

function jsEnableSlots ()
{
	var list = document.getElementById ('slots')
	
	if (list)
	{
		list._foreach = function (visit)
		{
			var lis = list.getElementsByTagName ('li')
			
			for (var i = 0, n = lis.length; i != n; i++)
			{
				visit (lis[i], i)
			}
		}
		
		list._numRecent = 0
		
		list._foreach (function (slot, index)
		{
			jsEnableSlot (slot, index, false)
		})
	}
}

function finalizeProgress (p)
{
	if (p._anim == undefined)
	{
		addClass (p, 'complete')
		
		var opacity = 100
		p._anim = window.setInterval (function ()
		{
			opacity = Math.max (opacity - 1, 0)
			
			if (isIE)
				p.style.filter = 'alpha(opacity=' + opacity + ')'
			else
				p.style.opacity = opacity / 100
			
			if (opacity == 0)
			{
				addClass (p, 'hidden')
				window.clearInterval (p._anim)
			}
			
		}, 10)
	}
}

function updateProgress (slotIndex, value)
{
	var slot = ((document.getElementById ('slots')).getElementsByTagName ('li'))[slotIndex]

	var progress = slot._ui._progress
	
	if (progress._value != 100)
	{
		removeClass (slot._ui._progress, 'hidden')
		
		progress._animTarget = value
		
		if (progress._anim == undefined)
		{
			progress._anim = window.setInterval (function ()
			{
				progress._update (Math.min (progress._animTarget, progress._value + 1))
				
				if (progress._value == progress._animTarget)
				{
					window.clearInterval (progress._anim)
					progress._anim = undefined
					
					if (progress._value == 100)
					{
						finalizeProgress (progress)
					}
				}
		
			}, 10)
		}
	}
}

function updateSlotIndicator (slotIndex, state)
{
	var slot = ((document.getElementById ('slots')).getElementsByTagName ('li'))[slotIndex]
	
	if (state == 'uploading')
	{
		slot._state = state
		slot._ui._indicator._set ('blinking', localizedText.uploading, true)
	}
	else
	{
		addClass (slot._ui._progress, 'hidden')
				
		if (state == 'connecting')
		{
			slot._state = state
			slot._ui._indicator._set ('blinking', localizedText.connecting, false)
		}
		else if (state == 'waiting')
		{
			slot._state = state
			slot._ui._indicator._set ('blinking', localizedText.waiting, false)
		}
		else if (state == 'error')
		{
			enterErroneousState (slot, slot._ui, localizedText.fileTooBig)
		}
		else if (state == 'httperror')
		{
			enterErroneousState (slot, slot._ui, localizedText.uploadFailed)
		}
		else if (state == 'ioerror')
		{
			enterErroneousState (slot, slot._ui, localizedText.ioError)
		}
	}
}

function enterRetrievingStateFromFlash (slotIndex, uploadTarget)
{
	var slot = ((document.getElementById ('slots')).getElementsByTagName ('li'))[slotIndex]
	
	finalizeProgress (slot._ui._progress)
	
	enterRetrievingState2 (slot, slot._ui, uploadTarget);
}

function allocateSlotsAndCommenceUpload (multiuploader, seekFrom, fileNames)
{
	var list = document.getElementById ('slots')
	var slots = list.getElementsByTagName ('li')
	
	var fileIndex = 0
	
	var slotIndices = new Array ()
	
	for (var i = seekFrom; (i != slots.length) && (fileIndex != fileNames.length); i++)
	{
		var slot = slots[i]
		
		if (slot._finalizeAnim)
		{
			slot._finalizeAnim ()
		}
		
		if (slot._state == 'choosefile')
		{
			slot.innerHTML = ''
		
			slot._state = 'waiting'
			
			mkUploadUI (slot, fileNames[fileIndex], function (ui)
			{
				slot.className = ''
				slot._ui = ui
				ui._indicator._set ('blinking', localizedText.waiting, false)
			})

			slotIndices[fileIndex] = i
			
			clickExtendBehavior (slot, i, (fileNames.length - fileIndex) <= 4)
			
			fileIndex++
		}
	}
	
	return slotIndices
}

function sendPermalink (email, respond)
{
	httpPerform ('/?permalink&js',
		'email=' + encodeURIComponent (email) + '&submit=',
		function () {},
		function () {},
		respond)
}

function jsEnableTab (name, tabContext, activeClass, inactiveClass, next)
{
	var tab = document.getElementById (name)
	var ui = document.getElementById (name + '-ui')
	
	if (tab && ui)
	{
		tab._activeClass = activeClass
		tab._inactiveClass = inactiveClass
				
		tab.onclick = function ()
		{
			tab.blur ()
			
			if (tabContext.activeTab && tabContext.activeUI)
			{
				replaceClass (tabContext.activeTab, tabContext.activeTab._activeClass, tabContext.activeTab._inactiveClass)
				replaceClass (tabContext.activeUI, 'block', 'hidden')
			}
			
			if (tabContext.activeTab != tab)
			{
				tabContext.activeTab = tab
				tabContext.activeUI = ui
				
				swapClass (tab, tab._activeClass, tab._inactiveClass)
				swapClass (ui, 'block', 'hidden')
			}
			else
			{
				tabContext.activeTab = undefined
				tabContext.activeUI = undefined
			}
		
			return false
		}
		
		next (tab, ui)
		
		if (classPresent (tab, tab._activeClass))
		{
			tabContext.activeTab = tab
			tabContext.activeUI = ui
		}
	}
}

function jsEnableReset (tabContext)
{
	jsEnableTab ('reset', tabContext, 'reset-active', 'reset-inactive', function (tab, ui)
	{
		var cancel = document.getElementById ('reset-cancel')
		
		cancel.onclick = function ()
		{
			tab.onclick ()
			return false
		}
	})
}

function jsEnableFromURL (tabContext)
{
	jsEnableTab ('fromurl', tabContext, 'fromurl-active', 'fromurl-inactive', function (tab, ui)
	{
		var submit = document.getElementById ('fromurl-submit')
		var url = document.getElementById ('fromurl-value')
		
		url.value = ''

		submit.onclick = function ()
		{
			document.getElementById ('fromurl').onclick ()

			var list = document.getElementById ('slots')
			var slots = list.getElementsByTagName ('li')
						
			for (var i = 0; i != slots.length; i++)
			{
				var slot = slots[i]
				
				if (slot._finalizeAnim)
				{
					slot._finalizeAnim ()
				}
				
				if (slot._state == 'choosefile')
				{
					slot.innerHTML = ''
					
					var sourceURL = url.value
					url.value = ''

					mkUploadUI (slot, localizedText.uploadingFromURL, function (ui)
					{						
						clickExtendBehavior (slot, i, true)
						
						enterConnectingState (slot, ui,
							function (uploadTarget) /* done */
							{
								enterWaitingState (slot, ui, function ()
								{
									enterUploadingFromURLState (slot, ui, uploadTarget, sourceURL,
										function (errorMessage)
										{
											enterErroneousState (slot, ui, errorMessage)
										},
										function (url4sharing, url4web, url4forum, urlDirect, thumb)
										{
											enterUploadedState2 (slot, url4sharing, url4web, url4forum, urlDirect, thumb)
										})
								})
							})
					})
					
					break;
				}
			}
			
			return false
		}
	})
}

function jsEnablePermalink (tabContext)
{
	jsEnableTab ('permalink', tabContext, 'permalink-active', 'permalink-inactive', function (tab, form)
	{
		tab._activeClass = (tab.className == 'permalink-inactive') ? 'permalink-active' : tab.className
		
		var submit = document.getElementById ('permalink-submit')
		var email = document.getElementById ('permalink-email')

		form.onsubmit = function ()
		{
			email.disabled = 'true'
			submit.disabled = 'true'
			submit.value = localizedText.sending
			
			sendPermalink (email.value,
				function (response)
				{
					form.innerHTML = response
					if (document.getElementById ('permalink-send-ok'))
					{
						tab.className = 'permalink-success'
						tab._activeClass = tab.className
					}
					else if (document.getElementById ('permalink-send-fail'))
					{
						tab.className = 'permalink-failure'
						tab._activeClass = tab.className
						
						jsEnablePermalink (tabContext)
					}
				})
	
			return false
		}
	})
}

function jsEnableToolsMenu ()
{
	var tabContext = {}
	
	jsEnableReset (tabContext)
	jsEnablePermalink (tabContext)
	jsEnableFromURL (tabContext)
}

function lerp (a, b, t)
{
	return Math.round (a + (b - a) * t);
}

function emergeSmoothly (e)
{
	if (e._anim)
	{
		e.style.display = ''
		return
	}
	
	var link = e.getElementsByTagName ('a')[0]

	var backColor = [ 0xf4, 0xf6, 0xf8 ]
	var textColor = [ 0x99, 0x99, 0x99 ]
	var linkColor = [ 0x33, 0x66, 0x99 ]
	
	var alphaBlend = function (e, c, t)
	{
		e.style.color = 'rgb(' + lerp (backColor[0], c[0], t) + ',' + lerp (backColor[1], c[1], t) + ',' + lerp (backColor[2], c[2], t) + ')'
	}
	
	var updateColor = function (t)
	{
		alphaBlend (e, textColor, t)
		
		if (link)
			alphaBlend (link, linkColor, t)
	}
	
	updateColor (0)
	
	e.style.display = ''
	
	var i = 0
	var n = 20
	e._anim = window.setInterval (function ()
	{
		if (i == n)
		{
			e.style.color = ''
			window.clearInterval (e._anim)
			e._anim = undefined
		}
		else
		{
			updateColor (i / n)
		}
		
		i++
	}, n)
}

function setNoteText (src)
{
	var e = document.getElementById ('note')
	
	e.style.display = 'none'
	e.innerHTML = src
	
	emergeSmoothly (e)
}

var waitSlotsLoading = false

function loadSlots (f)
{
	var load = function ()
	{
		waitSlotsLoading = true
		f ()
		waitSlotsLoading = false
	}
	
	if (waitSlotsLoading)
	{
		var retry = window.setInterval (function ()
		{
			if (!waitSlotsLoading && retry)
			{
				window.clearInterval (retry)
				retry = undefined
				load ()
			}
			
		}, 100)
	}
	else
	{
		load ()
	}
}

function enableFlashLoader ()
{
	var acquire = function ()
	{
		if (flashLoader != null)
			return true
			
		var uploaderObject = window.uploaderObject || document.uploaderObject
		var uploaderEmbed = window.uploaderEmbed || document.uploaderEmbed

		if (uploaderObject && uploaderObject.upload)
			flashLoader = uploaderObject
		else if (uploaderEmbed && uploaderEmbed.upload)
			flashLoader = uploaderEmbed
			
		if (flashLoader != null)
		{
			loadSlots (function ()
			{
				getLinksUI ()._updateLinksText ()
				
				document.getElementById ('slots')._foreach (function (slot, i)
				{
					if (slot._state == 'choosefile')
					{
						slot._exitChooseFileState ()
						enterFlashChooseFileState (slot, i)
					}
				})
				
				var noteTextNum = Math.floor(Math.random()*3+1)
				
				setNoteText ((noteTextNum == 1) ?
					localizedText.upcoming :
					((noteTextNum == 2) ? localizedText.delicious : localizedText.upcomingPlugin))
			})
			
			return true
		}
		else
			return false
	}
	
	if (!(acquire ()))
	{
		var n = 0
		var retry = window.setInterval (function ()
		{
			if (acquire () || (n > 30))
			{
				window.clearInterval (retry)
			}
			
			n++
		}, 100)
	}
}

function enterJSMode (disclaimer)
{
	if (flashLoader == null)
	{
		loadSlots (function ()
		{
			if (flashLoader == null)
			{
				setNoteText (disclaimer)
	
				document.getElementById ('slots')._foreach (function (slot, i)
				{
					if (slot._setChooseFileReady)
						slot._setChooseFileReady ()
				})
			}
		})
	}
}

function enterNoFlashMode ()
{
	enterJSMode (localizedText.noflash + ' <a href="/?faq=&batchupload="> (' + localizedText.why + ')</a>')
}

function testCookiesEnabled ()
{
	document.cookie = "testcookie=1; path=/";
	
	if (document.cookie.indexOf('testcookie') != -1)
	{
		document.cookie = "testcookie=1; expires=Tue, 8 May 1945 00:00:00 UTC; path=/";
		return true;
	}
	
	return false;
}

function testLocalContext ()
{
	try
	{
		if (parent && parent.location)
		{
			return (parent.location.href != undefined)
		}
		else
			return true
	}
	catch (e)
	{
		return false
	}
}

handle (window, 'load', function ()
{
	document.domain = cfgSrvDomain
	
	if (navigator.appVersion.indexOf ('MSIE 8') >= 0)
		return
	
	if (!(testLocalContext ()))
	{
		removeClass (document.getElementById ('iframe-warn'), 'hidden')
		return
	}
	
	cookiesEnabled = testCookiesEnabled ()
		
	jsEnableToolsMenu ()
	
	handle (document.body, 'mousemove', function (event)
	{
		var linksUI = getLinksUI ()
		
		if (linksUI.style.display == '' && !linksUI._doNotHide)
		{
			if (!findParent (
					event.target || event.srcElement, function (e)
					{
						return e.className == 'links-button' || e == linksUI
					}))
				linksUI._triggerDelay (function () { linksUI._close (false) }, 100)
			else
				linksUI._resetDelay ()
		}
	})
	
	handle (document.body, 'mousedown', function (event)
	{
		var linksUI = getLinksUI ()
		
		if (linksUI.style.display == '' && !findParent (
			event.target || event.srcElement, function (e)
			{
				return e.className == 'links-button' || e == linksUI
			}))
			linksUI._close (false)
	})
	
	runHttpScheduler ()
	
	jsEnableSlots ()

	if (!(DetectFlashVer (10, 0, 0)) && DetectFlashVer (9, 0, 0))
	{
		var flashDiv = mkChild (document.getElementById ('flash-container'), 'div',
			function (e)
			{
				e.style.position = 'absolute'
				e.style.left = '-10000px'
			})
			
		flashDiv.innerHTML +=
			'<object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="1" height="1" name="uploaderObject" id="uploaderObject" align="middle">' +
				   '<param name="allowScriptAccess" value="always">' +
				   '<param name="allowFullScreen" value="false">'+
				   '<param name="FlashVars" value="cfgSrvDomain='+cfgSrvDomain+'&sizeLimit='+sizeLimit+'">'+
				   '<param name="movie" value="multiupload-2.swf">' +
				   '<embed src="multiupload-2.swf" FlashVars="cfgSrvDomain='+cfgSrvDomain+'&sizeLimit='+sizeLimit+'" quality="high" bgcolor="#ffffff" width="1" height="1" name="uploaderEmbed" id="uploaderEmbed" align="middle" allowScriptAccess="always" allowFullScreen="false" type="application/x-shockwave-flash">' +
			'</object>';
		
		window.setTimeout (enterNoFlashMode, 2000)
	}
	else
	{
		enterNoFlashMode ()
	}
})