
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;
}

/* блок отправки сообщения */
function hv_callback() {
    
    var url_request = this.getAttribute("rel");
    if(!url_request ) return ralse;
    var req = getXmlHttp()  
    var statusElem = document.getElementById('hv_request_status');
    req.onreadystatechange = function() {  
        // onreadystatechange активируется при получении ответа сервера
         if (req.readyState == 4) { 
             
             if(req.status == 200) { 

                 // проверяем статусы ответа сервера
                 switch (req.responseText) {
                     
                    case "ok":
                        hv_alert(statusElem, "ok", 'Спасибо, ваш запрос получен. Наш менеджер свяжется с Вами в ближайшее время!');
                        hv_toggle('hv_form');
                        setTimeout(hv_toggle, 3000, 'hv');
                        setTimeout(hv_toggle, 3000, 'hv_mask');

                        break;
                    case "errorData1":

                        hv_alert(statusElem, "error", 'Ошибка! ?мя не указано!');
                        break;
                    case "errorData2":
                        hv_alert(statusElem, "error", 'Ошибка! Номер телефона указан не верно!');
                        break;
                    case "errorRequest":
                        default:
                            
                        hv_alert(statusElem, "error", 'К сожалению произошла ошибка при отправке, попробуйте позднее!');
                        break;

                } 

             } else {
                    hv_alert(statusElem, "error", 'К сожалению произошла ошибка при отправке, попробуйте позднее!');
             }
            // тут можно добавить else с обработкой ошибок запроса
        }
     }

    req.open('POST', url_request + '/hv_callback.php', true); 
    var code = document.getElementById("hvCode");
    var Phone = document.getElementById("hvPhone");
    var respond = (code && Phone) ? "code=" + code.value + "&phone=" + Phone.value : null;
    req.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
    req.setRequestHeader("Content-length", respond.length);
    req.send(respond);  // отослать запрос
    hv_alert(statusElem, "process",  'Ожидаю ответа сервера...');
}

hvID = function(ID){
    var obj = document.getElementById(ID);
    return obj ? obj : false
}

hv_alert = function(obj, type, message){
    
    obj.innerHTML = message;
    obj.setAttribute("class", "hv_" + type);
    return false;

}


hv_toggle_hvRequest = function(){
    
    hv_toggle('hv_mask');
    hv_toggle('hv');
    return ;
}

hv_toggle_click = function(){
    hv_toggle('hv_mask');
    hv_toggle('hv');
}


hv_toggle = function(ID){
    
    var obj = document.getElementById(ID);
    if(!obj) return;
    if(!obj.getAttribute("class") || obj.getAttribute("class") == "hv_show") {
        obj.setAttribute("class", "hv_hide");
    } else {
        obj.setAttribute("class", "hv_show");
    }
}

hv_validate = function(){
    var code = document.getElementById("hvCode");
    var Phone = document.getElementById("hvPhone");
    if(code && code.value == '?мя') code.value = '';
    if(Phone && Phone.value == 'Номер телефона') Phone.value = '';
}

hv_validate_blur = function(){
    var code = document.getElementById("hvCode");
    var Phone = document.getElementById("hvPhone");

    if(code && !code.value) code.value = '?мя';
    if(Phone && !Phone.value) Phone.value = 'Номер телефона';
}

// Добавляем событие
window.onload = function() { 
    hv_validate_blur();
    Event.add(document.getElementById('hv_callback_link'), 'click', hv_toggle_hvRequest);
    Event.add(document.getElementById('hvRequestClose'), 'click', hv_toggle_hvRequest);
    Event.add(document.getElementById('hv_callback_send'), 'click', hv_callback);
    Event.add(document.getElementById('hv_mask'), 'click', hv_toggle_click);
    Event.add(document.getElementById('hv_question_mask'), 'click', hv_toggle_addQuestion);
    Event.add(document.getElementById('hvQuestionClose'), 'click', hv_toggle_addQuestion);
    
    // текст код города
    Event.add(document.getElementById('hvCode'), 'blur', hv_validate_blur);
    Event.add(document.getElementById('hvCode'), 'focus', hv_validate);
    Event.add(document.getElementById('hvPhone'), 'blur', hv_validate_blur);
    Event.add(document.getElementById('hvPhone'), 'focus', hv_validate);
}


Event = (function() {
 
  var guid = 0
     
  function fixEvent(event) {
    event = event || window.event
   
    if ( event.isFixed ) {
      return event
    }
    event.isFixed = true
   
    event.preventDefault = event.preventDefault || function(){this.returnValue = false}
    event.stopPropagation = event.stopPropagaton || function(){this.cancelBubble = true}
     
    if (!event.target) {
        event.target = event.srcElement
    }
   
    if (!event.relatedTarget && event.fromElement) {
        event.relatedTarget = event.fromElement == event.target ? event.toElement : event.fromElement;
    }
   
    if ( event.pageX == null && event.clientX != null ) {
        var html = document.documentElement, body = document.body;
        event.pageX = event.clientX + (html && html.scrollLeft || body && body.scrollLeft || 0) - (html.clientLeft || 0);
        event.pageY = event.clientY + (html && html.scrollTop || body && body.scrollTop || 0) - (html.clientTop || 0);
    }
   
    if ( !event.which && event.button ) {
        event.which = (event.button & 1 ? 1 : ( event.button & 2 ? 3 : ( event.button & 4 ? 2 : 0 ) ));
    }
     
    return event
  }  
   
  /* Вызывается в контексте элемента всегда this = element */
  function commonHandle(event) {
    event = fixEvent(event)
     
    var handlers = this.events[event.type]
 
    for ( var g in handlers ) {
      var handler = handlers[g]
 
      var ret = handler.call(this, event)
      if ( ret === false ) {
          event.preventDefault()
          event.stopPropagation()
      }
    }
  }
   
  return {
      
    add: function(elem, type, handler) {
        
      if (elem.setInterval && ( elem != window && !elem.frameElement ) ) {
        elem = window;
      }
       
      if (!handler.guid) {
        handler.guid = ++guid
      }
       
      if (!elem.events) {
        elem.events = {}
        elem.handle = function(event) {
          if (typeof Event !== "undefined") {
            return commonHandle.call(elem, event)
          }
        }
      }
       
      if (!elem.events[type]) {
        elem.events[type] = {}        
       
        if (elem.addEventListener)
          elem.addEventListener(type, elem.handle, false)
        else if (elem.attachEvent)
          elem.attachEvent("on" + type, elem.handle)
      }
       
      elem.events[type][handler.guid] = handler
    },
     
    remove: function(elem, type, handler) {
      var handlers = elem.events && elem.events[type]
       
      if (!handlers) return
       
      delete handlers[handler.guid]
       
      for(var any in handlers) return
      if (elem.removeEventListener)
        elem.removeEventListener(type, elem.handle, false)
      else if (elem.detachEvent)
        elem.detachEvent("on" + type, elem.handle)
         
      delete elem.events[type]
     
       
      for (var any in elem.events) return
      try {
        delete elem.handle
        delete elem.events 
      } catch(e) { // IE
        elem.removeAttribute("handle")
        elem.removeAttribute("events")
      }
    } 
  }
}())


