var Prototype = {
    Browser: {
        IE: !!(window.attachEvent && navigator.userAgent.indexOf('Opera') === -1),
        Opera: navigator.userAgent.indexOf('Opera') > -1,
        WebKit: navigator.userAgent.indexOf('AppleWebKit/') > -1,
        Gecko: navigator.userAgent.indexOf('Gecko') > -1 && navigator.userAgent.indexOf('KHTML') === -1,
        MobileSafari: !!navigator.userAgent.match(/Apple.*Mobile.*Safari/)
    },
    JSONFilter: /^\/\*-secure-([\s\S]*)\*\/\s*$/,
    emptyFunction: function() {}
};

var Class = {
    create: function() {
        var parent = null,
        properties = $A(arguments);
        if (Object.isFunction(properties[0]))
        parent = properties.shift();
        function klass() {
            this.initialize.apply(this, arguments);
        }
        Object.extend(klass, Class.Methods);
        klass.superclass = parent;
        klass.subclasses = [];
        if (parent) {
            var subclass = function() {};
            subclass.prototype = parent.prototype;
            klass.prototype = new subclass;
            parent.subclasses.push(klass);
        }
        for (var i = 0; i < properties.length; i++)
        klass.addMethods(properties[i]);
        if (!klass.prototype.initialize)
        klass.prototype.initialize = Prototype.emptyFunction;
        klass.prototype.constructor = klass;
        return klass;
    }
};
Class.Methods = {
    addMethods: function(source) {
        var ancestor = this.superclass && this.superclass.prototype;
        var properties = Object.keys(source);
        if (!Object.keys({
            toString: true
        }).length)
        properties.push("toString", "valueOf");
        for (var i = 0, length = properties.length; i < length; i++) {
            var property = properties[i],
            value = source[property];
            if (ancestor && Object.isFunction(value) && value.argumentNames().first() == "$super") {
                var method = value;
                value = (function(m) {
                    return function() {
                        return ancestor[m].apply(this, arguments)
                    };
                })(property).wrap(method);
                value.valueOf = method.valueOf.bind(method);
                value.toString = method.toString.bind(method);
            }
            this.prototype[property] = value;
        }
        return this;
    }
};
Object.extend = function(destination, source) {
    for (property in source) {
        destination[property] = source[property];
    }
    return destination;
}
Object.extend(Object, {
    observeEvent: function(obj, type, fn) {
        if (obj.attachEvent) {
            obj["e" + type + fn] = fn;
            obj[type + fn] = function() {
                obj["e" + type + fn](window.event)
            };
            obj.attachEvent("on" + type, obj[type + fn]);
        }
        else {
            obj.addEventListener(type, fn, false);
        }
    },
    clone: function(object) {
        return Object.extend({},
        object);
    },
    keys: function(object) {
        var keys = [];
        for (var property in object)
        keys.push(property);
        return keys;
    },
    inspect: function(object) {
        try {
            if (Object.isUndefined(object)) return 'undefined';
            if (object === null) return 'null';
            return object.inspect ? object.inspect() : String(object);
        } catch(e) {
            if (e instanceof RangeError) return '...';
            throw e;
        }
    },
    toJSON: function(object) {
        var type = typeof object;
        switch (type) {
        case 'undefined':
        case 'function':
        case 'unknown':
            return;
        case 'boolean':
            return object.toString();
        }
        if (object === null) return 'null';
        if (object.toJSON) return object.toJSON();
        if (Object.isElement(object)) return;
        var results = [];
        for (var property in object) {
            var value = Object.toJSON(object[property]);
            if (!Object.isUndefined(value))
            results.push(property.toJSON() + ': ' + value);
        }
        return '{' + results.join(', ') + '}';
    },
    isArray: function(object) {
        return object != null && typeof object == "object" && 'splice' in object && 'join' in object;
    },
    isElement: function(object) {
        return !! (object && object.nodeType == 1);
    },
    isFunction: function(object) {
        return typeof object == "function";
    },
    isUndefined: function(object) {
        return typeof object == "undefined";
    }
});
Object.extend(Function.prototype, {
    argumentNames: function() {
        var names = this.toString().match(/^[\s\(]*function[^(]*\(([^\)]*)\)/)[1].replace(/\s+/g, '').split(',');
        return names.length == 1 && !names[0] ? [] : names;
    },
    bind: function() {
        if (arguments.length < 2 && Object.isUndefined(arguments[0])) return this;
        var __method = this,
        args = $A(arguments),
        object = args.shift();
        return function() {
            return __method.apply(object, args.concat($A(arguments)));
        }
    },
    wrap: function(wrapper) {
        var __method = this;
        return function() {
            return wrapper.apply(this, [__method.bind(this)].concat($A(arguments)));
        }
    }
});
Date.prototype.toJSON = function() {
    return '"' + this.getUTCFullYear() + '-' +
    (this.getUTCMonth() + 1).toPaddedString(2) + '-' +
    this.getUTCDate().toPaddedString(2) + 'T' +
    this.getUTCHours().toPaddedString(2) + ':' +
    this.getUTCMinutes().toPaddedString(2) + ':' +
    this.getUTCSeconds().toPaddedString(2) + 'Z"';
};
Object.extend(Number.prototype, {
    toJSON: function() {
        return isFinite(this) ? this.toString() : 'null';
    }
});
Array.prototype.iterate = function(func) {
    for (var i = 0; i < this.length; i++) func(this[i], i);
}
if (!Array.prototype.each) Array.prototype.each = Array.prototype.iterate;
Object.extend(Array.prototype, {
    clone: function() {
        return [].concat(this);
    },
    toJSON: function() {
        var results = [];
        this.each(function(object) {
            var value = Object.toJSON(object);
            if (!Object.isUndefined(value)) results.push(value);
        });
        return '[' + results.join(', ') + ']';
    }
});
Object.extend(String, {
    interpret: function(value) {
        return value == null ? '': String(value);
    },
    specialChar: {
        '\b': '\\b',
        '\t': '\\t',
        '\n': '\\n',
        '\f': '\\f',
        '\r': '\\r',
        '\\': '\\\\'
    }
});
Object.extend(String.prototype, {
    gsub: function(pattern, replacement) {
        var result = '',
        source = this,
        match;
        replacement = arguments.callee.prepareReplacement(replacement);
        while (source.length > 0) {
            if (match = source.match(pattern)) {
                result += source.slice(0, match.index);
                result += String.interpret(replacement(match));
                source = source.slice(match.index + match[0].length);
            } else {
                result += source,
                source = '';
            }
        }
        return result;
    },
    sub: function(pattern, replacement, count) {
        replacement = this.gsub.prepareReplacement(replacement);
        count = Object.isUndefined(count) ? 1: count;
        return this.gsub(pattern,
        function(match) {
            if (--count < 0) return match[0];
            return replacement(match);
        });
    },
    strip: function() {
        return this.replace(/^\s+/, '').replace(/\s+$/, '');
    },
    inspect: function(useDoubleQuotes) {
        var escapedString = this.gsub(/[\x00-\x1f\\]/,
        function(match) {
            var character = String.specialChar[match[0]];
            return character ? character: '\\u00' + match[0].charCodeAt().toPaddedString(2, 16);
        });
        if (useDoubleQuotes) return '"' + escapedString.replace(/"/g, '\\"') + '"';
        return "'" + escapedString.replace(/'/g, '\\\'') + "'";
    },
    unfilterJSON: function(filter) {
        return this.sub(filter || Prototype.JSONFilter, '#{1}');
    },
    evalJSON: function(sanitize) {
        var json = this.unfilterJSON();
        try {
            if (!sanitize || json.isJSON()) return eval('(' + json + ')');
        } catch(e) {}
        throw new SyntaxError('Badly formed JSON string: ' + this.inspect());
    },
    toJSON: function() {
        return this.inspect(true);
    },
    isJSON: function() {
        var str = this;
        if (str.blank()) return false;
        str = this.replace(/\\./g, '@').replace(/"[^"\\\n\r]*"/g, '');
        return (/^[,:{}\[\]0-9.\-+Eaeflnr-u \n\r\t]*$/).test(str);
    },
    toArray: function() {
        return this.split('');
    },
    startsWith: function(pattern) {
        return this.indexOf(pattern) === 0;
    },
    blank: function() {
        return /^\s*$/.test(this);
    }
});
function $A(iterable) {
    if (!iterable) return [];
    if (iterable.toArray) return iterable.toArray();
    var length = iterable.length || 0;
    var results = new Array(length);
    while (length--) results[length] = iterable[length];
    return results;
}
if (Prototype.Browser.WebKit) {
    $A = function(iterable) {
        if (!iterable) return [];
        if (! (typeof iterable === 'function' && typeof iterable.length === 'number' && typeof iterable.item === 'function') && iterable.toArray)
        return iterable.toArray();
        var length = iterable.length || 0,
        results = new Array(length);
        while (length--) results[length] = iterable[length];
        return results;
    };
}
Array.from = $A;

function $(el) {
    if (typeof el == 'string') el = document.getElementById(el);
    if (el == null) return false;
    else return Element.extend(el);
}

if (!window.Element) var Element = new Object();
Object.extend(Element, {
    observe: function(type, fn) {
        Object.observeEvent(this, type, fn);
    },
    hasClassName: function(className) {
        var hasClass = false;
        this.className.split(' ').each(function(cn) {
            if (cn == className) hasClass = true;
        });
        return hasClass;
    },
    hasClassNameInternal: function(element, className) {
        element = $(element);
        if (!element) return;
        var hasClass = false;
        element.className.split(' ').each(function(cn) {
            if (cn == className) hasClass = true;
        });
        return hasClass;
    },
    addClassName: function(className) {
        this.removeClassName(className);
        var safeClassName = new String(this.className);
        this.className += (safeClassName.blank()) ? className: ' ' + className;
    },
    removeClassName: function(className) {
        var currentClassName = this.className;
        var classNameArray = currentClassName.split(' ');
        var newClassName = '';
        for (var i = 0; i < classNameArray.length; i++) {
            var cleanClassName = classNameArray[i].strip();
            if (cleanClassName != className) {
                if (newClassName != '') newClassName += ' ';
                newClassName += cleanClassName;
            }
        }
        this.className = newClassName;
    },
    extend: function(object) {
        return Object.extend(object, Element);
    }
});
var Selector = {
    findElementsByClassName: function(tagAndClass) {
        var splitTagAndClass = tagAndClass.split('.');
        var tag = (splitTagAndClass[0] == '') ? '*': splitTagAndClass[0];
        var className = splitTagAndClass[1];
        var elements = new Array();
        var tags = Selector.findElementsByTagName(tag);
        for (var i = 0; i < tags.length; i++) {
            if (Element.hasClassNameInternal(tags[i], className)) {
                elements.push(tags[i]);
            }
        };
        return elements;
    },
    findElementsByTagName: function(tag) {
        return document.getElementsByTagName(tag);
    },
    findElementById: function(id) {
        var id = id.replace('#', '');
        return $(id);
    }
}
function $$() {
    var elements = new Array();
    for (var i = 0; i < arguments.length; i++) {
        var arg = arguments[i];
        if (arg.indexOf('#') > -1) {
            elements.push(Selector.findElementById(arg));
        }
        else if (arg.indexOf('.') > -1) {
            var foundElements = Selector.findElementsByClassName(arg);
            for (var i = 0; i < foundElements.length; i++) {
                elements.push(Element.extend(foundElements[i]));
            }
        }
        else {
            var foundElements = Selector.findElementsByTagName(arg);
            for (var i = 0; i < foundElements.length; i++) {
                elements.push(Element.extend(foundElements[i]));
            }
        }
    }
    return elements;
}

var __submitBtn = null;
var __msgfield = null;
var WufooFieldLogic = Class.create({
    highlightArray: new Array(),
    initialize: function() {
		__submitBtn = $("submit");
    	__msgField = $("message");
		if (__msgField){
			if(__submitBtn){
				__submitBtn.disabled = true;
				__msgField.observe('keydown', this.checkMsgField);
				__msgField.observe('keyup', this.checkMsgField);
				__msgField.observe('blur', this.checkMsgField);
			}else{
				alert("ури, где кнопка?");
			}
		}else{
			alert("ури, где поле?");
		}
    },
    checkMsgField: function(){
    	__submitBtn.disabled = (__msgField.value.length < 1);	
    },
    initializeFocus: function() {
        var fields = $$('.field');
        for (i = 0; i < fields.length; i++) {
            if (fields[i].type == 'radio' || fields[i].type == 'checkbox') {
                fields[i].onclick = function() {
                    clearHighlightArray();
                    $(this.parentNode.parentNode.parentNode).addClassName("focused");
                };
                fields[i].onfocus = function() {
                    clearHighlightArray();
                    $(this.parentNode.parentNode.parentNode).addClassName("focused");
                };
                this.highlightArray.push(fields[i]);
            }
            else if (fields[i].className.match('addr')) {
                fields[i].onfocus = function() {
                    clearHighlightArray();
                    $(this.parentNode.parentNode.parentNode).addClassName("focused");
                };
                fields[i].onblur = function() {
                    $(this.parentNode.parentNode.parentNode).removeClassName("focused")
                };
            }
            else if (fields[i].className.match('other')) {
                fields[i].onfocus = function() {
                    clearHighlightArray();
                    $(this.parentNode.parentNode.parentNode).addClassName("focused");
                };
            }
            else if (fields[i].className.match('select')) {
                fields[i].onmousedown = function() {
                    this.addClassName('ieSelectFix')
                };
                fields[i].onchange = function() {
                    this.removeClassName('ieSelectFix')
                };
                fields[i].onfocus = function() {
                    this.addClassName('ieSelectFix');
                    clearHighlightArray();
                    $(this.parentNode.parentNode).addClassName("focused")
                };
                fields[i].onblur = function() {
                    this.removeClassName('ieSelectFix');
                    $(this.parentNode.parentNode).removeClassName("focused")
                };
            }
            else {
                fields[i].onfocus = function() {
                    clearHighlightArray();
                    $(this.parentNode.parentNode).addClassName("focused");
                };
                fields[i].onblur = function() {
                    $(this.parentNode.parentNode).removeClassName("focused");
                };
                fields[i].onleave = function() {
                    $(this.parentNode.parentNode).removeClassName("focused");
                };
            }
        }
        fields[0].focus();
        fields[0].parentNode.parentNode.addClassName("focused");
    },
    clearHighlightArray: function() {
        for (var i = 0; i < this.highlightArray.length; i++) {
            if (this.highlightArray[i].parentNode) {
                $(this.highlightArray[i].parentNode.parentNode.parentNode).removeClassName('focused');
            }
        }
    },
    getCharacterMessage: function(field) {
        return field.value.length;
    }
});
var WufooFormLogic = Class.create({
    initialize: function() {},
    detectBrowser: function() {
        var browsers = ['firefox', 'chrome', 'safari', 'iphone'];
        var type = navigator.userAgent.toLowerCase();
        var html = $$('html');
        html = html[0];
        for (var i = 0; i < browsers.length; i++) {
            if (type.indexOf(browsers[i]) > -1) html.addClassName(browsers[i]);
        }
    }//,
//    observeFormSubmit: function() {
//        var activeForm = $$('form')[0];
//        $(activeForm).observe('submit', this.disableSubmitButton);
//    },
//    disableSubmitButton: function() {}
});

var PublicForm = Class.create({
    formLogic: new WufooFormLogic(),
    fieldLogic: new WufooFieldLogic(),
    initialize: function(runInit) {
        if (runInit) this.runInit();
    },
    runInit: function() {
        this.formLogic.detectBrowser();
        //this.formLogic.observeFormSubmit();
        this.fieldLogic.initializeFocus();
    }
});

var __PF;
Object.observeEvent(window, 'load', init);
function init() {
    __PF = new PublicForm(true);
}
function clearHighlightArray() {
    __PF.fieldLogic.clearHighlightArray();
}