/**
 * jsonp is taken from JsHttpRequest by Dmitry Koterov, http://en.dklab.ru/lib/JsHttpRequest/
 */
var jsonp = function(url) {
        var d = document, s = null, b = d.body;
        if (!window.opera) {
            // Safari, IE, FF, Opera 7.20.
            this.span = s = d.createElement('SCRIPT');
            var closure = function() {
                s.language = 'JavaScript';
                if (s.setAttribute) s.setAttribute('src', url); else s.src = url;
                b.insertBefore(s, b.lastChild);
            }
        } else {
            // Oh shit! Damned stupid Opera 7.23 does not allow to create SCRIPT
            // element over createElement (in HEAD or BODY section or in nested SPAN -
            // no matter): it is created deadly, and does not response the href assignment.
            // So - always create SPAN.
            this.span = s = d.createElement('SPAN');
            s.style.display = 'none';
            b.insertBefore(s, b.lastChild);
            s.innerHTML = 'Workaround for IE.<s'+'cript></' + 'script>';
            var closure = function() {
                s = s.getElementsByTagName('SCRIPT')[0]; // get with timeout!
                s.language = 'JavaScript';
                if (s.setAttribute) s.setAttribute('src', url); else s.src = url;
            }
        }
        setTimeout(closure, 10);
}

function validateCode(remoteURL, form, imageURL, errorMsg) {
	try {
		$this = this;

		var disableForm = function() {
			form.className = form.className + " validating";
			var elements = form.elements;
			for (var i=0; i<elements.length; i++) {
				if (typeof(elements[i].originalDisabled) == "undefined") {
					elements[i].originalDisabled = elements[i].disabled;
				}
				elements[i].disabled = true;
			}
		}

		var enableForm = function(removeClass) {
			var elements = form.elements;
			for (var i=0; i<elements.length; i++) {
				if (elements[i].originalDisabled != true) {
					elements[i].disabled = false;
				}
			}
			if (removeClass) {
				form.className = form.className.replace("validating", "");
			}
		}

		$this.remoteValidateTimeout = setTimeout(function() {
			enableForm(false);
			form.submit();
		}, 5000)


		var findElementById = function(context, id) {
			var elements = context.getElementsByTagName("img");
			for (var i = 0; i < elements.length; i++) { 
			    if (id == elements[i].getAttribute("id")) {
			    	return elements[i];
				}
			}
			return null;
		}

		window.remoteValidateCallback = function(isValid, sid) {
			clearTimeout($this.remoteValidateTimeout);
			if (!isValid) {

				var fieldSID = form.sid;
				if (fieldSID) {
					fieldSID.value = sid;
				}
				//var captchaImg = document.getElementById("captcha_img");
				var captchaImg = findElementById(form, "captcha_img");

				if (captchaImg) {
					captchaImg.src = imageURL+'&sid='+sid;
				}

				enableForm(true);

				//var captchaField = document.getElementById("code");
				var captchaField = findElementById(form, "code");
				if (captchaField) {
					captchaField.value = "";
					captchaField.focus();
				}

				alert(errorMsg);
				return;
			}
			enableForm(false);
			form.submit();
		}

		var fieldSID = form.sid;
		if (fieldSID) {
			disableForm();
			jsonp(remoteURL+'&code='+form.code.value+'&callback=window.remoteValidateCallback&sid='+fieldSID.value);
		}

		return false;
	} catch (e) {}
}