if (typeof(com) == 'undefined') {
    com = {};
}
if (typeof(com.is_a) == 'undefined') {
    com.is_a = {};
}

com.is_a.FormPost = function(formId)
{
    this.formId = formId;
    this.messageDiv = null;
    
    /**
     *  Замена конструктора
     */
    this.init = function()
    {
        var self = this;
        var form = document.getElementById(this.formId);
        form.onsubmit = function() { self.post(); return false; }
    }
    
    /**
     *  Отправляет форму на сервер
     */
    this.post = function()
    {
        var form = document.getElementById(this.formId);
        var action = form.action;
        var elements = form.elements;
        
        // Формируем сообщение
        var postData = '';
        
        // Формируем данные
        for (var i = 0; i < elements.length; i++) {
            var element = elements.item(i);
            var elementName = element.name != '' ? element.name : element.id;
            if (elementName != '' && element.disabled == false) {
                var elementTag = element.tagName.toLowerCase();
                switch (elementTag) {
                 case 'input':
                    postData += this.inputFieldMessage(elementName, element);
                    break;
                 case 'select':
                    postData += this.selectFieldMessage(elementName, element);
                    break;
                 case 'textarea':
                    postData += this.textAreaFieldMessage(elementName, element);
                    break;
                }
                postData += '&';
            }
        }
        // Удаляем последний слэш
        postData = postData.substr(0, postData.length - 1);
        
        // Отсылаем данные
        this.sendData(action, postData);
    }
    
    /**
     *  Отсылает сообщение на сервер
     */
    this.sendData = function(url, message)
    {
        var xmlHttpRequest = this.newXmlHttpRequest();
        if (xmlHttpRequest != null) {
            var self = this;
            xmlHttpRequest.onreadystatechange = function() { if (xmlHttpRequest.readyState == 4) { self.onResponse(xmlHttpRequest); } } 
            xmlHttpRequest.open('POST', url, true) // асинхронный вызов
            xmlHttpRequest.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded;charset=utf-8');
            xmlHttpRequest.send(message);
        }
        else {
            throw new Error("Can't send data, xmlHttpRequest object isn't available.");
        }
    }
    
    /**
     *  Вызывается объектом xmlHttpRequest при получении данных от сервера
     */
    this.onResponse = function(xmlHttpRequest)
    {
        if (xmlHttpRequest.status == 200) {
            this.message(xmlHttpRequest.responseText);
        }
        else {
            alert('Не возможно отправить данные, сервер сообщает об ошибке, повторите попытку позже.');
        }
    }
    
    /**
     *  Показывает сообщение отданное сервером после обработки запроса
     */
    this.message = function(message)
    {
        this.createMessageDiv();
        this.messageDiv.innerHTML = message;
        
        var viewPort = this.viewPort();
        if (viewPort != null) {
            this.messageDiv.style.display = 'inline';
            this.messageDiv.style.left = (viewPort.left + (viewPort.width - this.messageDiv.clientWidth) / 2) + 'px';
            this.messageDiv.style.top = (viewPort.top + (viewPort.height - this.messageDiv.clientHeight) / 2) + 'px';  
        }
        else {
            alert(message);
        }
    }
    
    /**
     *  Создает div для сообщения
     */
    this.createMessageDiv = function()
    {
        var self = this;
        var messageDiv = null;
        messageDiv = document.createElement('div');
        messageDiv.style.display = 'none';
        messageDiv.style.position = 'absolute';
        messageDiv.style.left = 0 + 'px';
        messageDiv.style.top = 0 + 'px';
        messageDiv.className = 'formPostMessage';
        messageDiv.close = function() { messageDiv.style.display = 'none'; } 
        messageDiv.resetForm = function() { self.resetForm(); }
        document.body.appendChild(messageDiv);
        this.messageDiv = messageDiv;
    }
     
    /**
     *  Сбрасывает форму в начальное состояние
     */
    this.resetForm = function()
    {
        var form = document.getElementById(this.formId);
        form.reset();
    }
    
    /**
     *  Возвращает данные для input type = text|checkbox|radio|hidden
     */
    this.inputFieldMessage = function(elementName, element)
    {
        var type = element.type.toLowerCase();
        
        if ((type == 'text') ||
            (type == 'checkbox' && element.checked) ||
            (type == 'radio' && element.checked) ||
            (type == 'hidden')) {
                
            return elementName+'='+this.encode(element.value);
        }
        else {
            return '';
        }
    }
    
    /**
     *  Возвращает данные для select
     */
    this.selectFieldMessage = function(elementName, element)
    {
        if (element.multiple) {
            var message = '';
            var options = element.options;
            for (var i = 0; i < options.length; i++) {
                var option = options.item(i);
                if (option.selected) {
                    message += elementName+'='+this.encode(option.value)+'&';
                }
            }
            // Удаляем последний слэш и возвращаем
            return message.substr(0, message.length - 1);
        }
        else {
            return elementName+'='+this.encode(element.value);
        }
    }
    
    /**
     *  Возвращает данные для textarea
     */
    this.textAreaFieldMessage = function(elementName, element)
    {
        return elementName+'='+this.encode(element.value);
    }
    
    /**
     *  Создаёт объект XmlHttpRequest
     */
    this.newXmlHttpRequest = function()
    {
        var xmlHttpRequest = null;
        
        try {
            xmlHttpRequest = new ActiveXObject("Msxml2.XMLHTTP");
        }
        catch (e) {
            try {
                xmlHttpRequest = new ActiveXObject("Microsoft.XMLHTTP");
            }
            catch (e2) {
                xmlHttpRequest = null;
            }
        }
        if (xmlHttpRequest == null && typeof(XMLHttpRequest) != 'undefined') {
            xmlHttpRequest = new XMLHttpRequest();
        }
        /*
        if (xmlHttpRequest != null) {
            try {
                xmlHttpRequest.overrideMimeType('text/xml');
            }
            catch(e) {
                // Нет так нет.
            }
        }
        */
        return xmlHttpRequest;
    }
    
    /**
     *  Возвращает координаты текущей видимой области окна
     */
    this.viewPort = function()
    {
        var top = 0;
        var left = 0;
        var width = 0;
        var height = 0;
        
        // Определеяем размеры окна
        if (typeof( window.innerWidth ) == 'number') {
            //Non-IE
            width = window.innerWidth;
            height = window.innerHeight;
        } else if (document.documentElement && (document.documentElement.clientWidth || document.documentElement.clientHeight)) {
            //IE 6+ in 'standards compliant mode'
            width = document.documentElement.clientWidth;
            height = document.documentElement.clientHeight;
        } else if (document.body && (document.body.clientWidth || document.body.clientHeight)) {
            //IE 4 compatible
            width = document.body.clientWidth;
            height = document.body.clientHeight;
        }
  
        // Определяем координаты видимой области
        if (typeof(window.pageYOffset) == 'number') {
            //Netscape compliant
            top = window.pageYOffset;
            left = window.pageXOffset;
        } else if (document.body && (document.body.scrollLeft || document.body.scrollTop)) {
            //DOM compliant
            top = document.body.scrollTop;
            left = document.body.scrollLeft;
        } else if (document.documentElement && (document.documentElement.scrollLeft || document.documentElement.scrollTop)) {
            //IE6 standards compliant mode
            top = document.documentElement.scrollTop;
            left = document.documentElement.scrollLeft;
        }
        
        return {
            top: top,
            left: left,
            width: width,
            height: height
        };
    }
    
    /**
     *  Кодирует данные для отправки POST запросом
     */
    this.encode = function(data)
    {
        return encodeURIComponent(data);
    }
    
    // Типа вызов конструктора
    this.init();
}