﻿function chkAjaBrowser(){
  var a,ua = navigator.userAgent;
  this.bw= { 
    safari    : ((a=ua.split('AppleWebKit/')[1])?a.split('.')[0]:0)>=124 ,
    konqueror : ((a=ua.split('Konqueror/')[1])?a.split(';')[0]:0)>=3.3 ,
    mozes     : ((a=ua.split('Gecko/')[1])?a.split(' ')[0]:0) >= 20011128 ,
    opera     : (!!window.opera) && ((typeof XMLHttpRequest)=='function') ,
    msie      : (!!window.ActiveXObject)?(!!createHttpRequest()):false 
  }

  return (this.bw.safari||this.bw.konqueror||this.bw.mozes||this.bw.opera||this.bw.msie)
}

function createHttpRequest(){
  if(window.XMLHttpRequest){
  //Win Mac Linux m1,f1,o8 Mac s1 Linux k3 & Win e7용 
    return new XMLHttpRequest() ;
  } else if(window.ActiveXObject){
  //Win e4,e5,e6용 
    try {
      return new ActiveXObject('Msxml2.XMLHTTP') ;
    } catch (e) {
      try {
        return new ActiveXObject('Microsoft.XMLHTTP') ;
      } catch (e2) {
        return null ;
      }
    }
  } else  {
    return null ;
  }
}

// 송신기 함수 
// @sample         sendRequest(onloaded,'&prog=1','POST','./about2.php',true,true)
// @sample         sendRequest(onloaded,{name:taro,id:123,sel:1},','POST','./about3.php',true,true)
// @sample         sendRequest({onload:loaded,onbeforsetheader:sethead},'',','POST','./about3.php',true,true)
// @param {string} callback  신시에 기동하는 관수명 
// @param {object} callback  신시에 기동하는 관수명과 헤더 지정 관수명{onload:관수명,onbeforsetheader:관수명} 
// @param {array}  callback  신시에 기동하는 관수명과 헤더 지정 ary['onload']=관수명;ary['onbeforsetheader']=관수명 
// @see                    http://jsgt.org/ajax/ref/head_test/header/Range/004/sample.htm
// @param {string} data	   송신하는 데이타 string의 경우(&이름1=치1&이름2=치2...) 
// @param {object} data	   송신하는 데이타 object의 경우{이름1:치1,이름2:치2,...} 
// @param {array}  data	   송신하는 데이타 array의 경우는 연상 배열 ary['이름1']=치1;ary['이름2']=치2 
// @param {string}method   'POST' or 'GET'
// @param {string}url      리퀘스트 하는 파일의 URL 
// @param {string}async	   비동기라면 true 동기라면 false 
// @param {string}sload	   슈퍼 로드 true에 강제, 생략 또는 false에 디폴트 
// @param {string}user	   인증 페이지용 사용자명 
// @param {string}password 인증 페이지용 패스워드 
sendRequest.README	 = {
  url		: 'http://jsgt.org/ajax/ref/lib/ref.htm',
  name	: 'sendRequest', 
  version	: 0.51, 
  license	: 'Public Domain',
  author	: 'Toshiro Takahashi http://jsgt.org/mt/01/',memo:''
};


function sendRequest(callback,data,method,url,async,sload,user,password){
    //XMLHttpRequest오브젝트 생성
    var oj = createHttpRequest();
  if( oj == null ) return null;
  //강제 로드의 설정 
  var sload = (!!sendRequest.arguments[5])?sload:false;
  if(sload || method.toUpperCase() == 'GET')url += '?';
  if(sload)url=url+'t='+(new Date()).getTime();
  //브라우저 판정 
  var bwoj = new chkAjaBrowser();
  var opera	  = bwoj.bw.opera;
  var safari	  = bwoj.bw.safari;
  var konqueror = bwoj.bw.konqueror;
  var mozes	  = bwoj.bw.mozes ;
  //callback를 분해 
  //{onload:xxxx,onbeforsetheader:xxx}
  if(typeof callback=='object'){
    var callback_onload = callback.onload;
    var callback_onbeforsetheader = callback.onbeforsetheader;
  } else {
    var callback_onload = callback;
    var callback_onbeforsetheader = null;
  }
  
  

  //  신처리 
  //opera서는 onreadystatechange에 다중 less 버그가 있기 때문에 onload가 안전 
  //Moz,FireFox서는 oj.readyState== 3에도  신 하기 때문에 통상은 onload가 안전 
  //Win ie그러면 onload는 동작하지 않는다 
  //Konqueror서는 onload가 불안정 
  //참고http://jsgt.org/ajax/ref/test/response/responsetext/try1.php 
  
  if(opera || safari || mozes){
    oj.onload = function () { callback_onload(oj); }
  } else {
    oj.onreadystatechange =function (){
      if ( oj.readyState == 4 ){
        //alert(oj.status+'--'+oj.getAllResponseHeaders());
        callback_onload(oj);
      }
    }
  }
  

  //URL인코드 
  data = uriEncode(data,url);
  if(method.toUpperCase() == 'GET') {
    url += data;
  }

  //open 메소드 
  oj.open(method,url,async,user,password);
  if(!!callback_onbeforsetheader)callback_onbeforsetheader(oj);
  //디폴트 헤더application/x-www-form-urlencodedSET 
  setEncHeader(oj);
  oj.send(data);

  //URI인코드 헤더 SET 
  function setEncHeader(oj){
    var contentTypeUrlenc = 'application/x-www-form-urlencoded; charset=UTF-8';
    if(!window.opera){
      oj.setRequestHeader('Content-Type',contentTypeUrlenc);
    } else {
      if((typeof oj.setRequestHeader) == 'function')
        oj.setRequestHeader('Content-Type',contentTypeUrlenc);
    }	
    return oj
  }
  
  function uriEncode(data,url){
    var encdata =(url.indexOf('?')==-1)?'?dmy':'';
    if(typeof data=='object'){
      for(var i in data)
        encdata+='&'+encodeURIComponent(i)+'='+encodeURIComponent(data[i]);
    } else if(typeof data=='string'){
      if(data=='')return '';
      //&와=에 일단 분해하여 encode 
      var encdata = '';
      var datas = data.split('&');
      
      for(var i=1;i<datas.length;i++){
        var dataq = datas[i].split('=');
        encdata += '&'+encodeURIComponent(dataq[0])+'='+encodeURIComponent(dataq[1]);
      }
    } 
    
    return encdata;
  }
return oj
}
