// ================================================================
//  jkl-parsexml.js ---- JavaScript Kantan Library for Parse XML
//  Copyright 2005 Kawasaki Yusuke <u-suke@kawa.net>
//  http://www.kawa.net/works/js/jkl/parsexml.html
// ================================================================
//  v0.01  2005/05/18  first release
//  v0.02  2005/05/20  Opera 8.0beta may be abailable but somtimes crashed
//  v0.03  2005/05/20  overrideMimeType( "text/xml" );
//  v0.04  2005/05/21  class variables: REQUEST_TYPE, RESPONSE_TYPE
//  v0.05  2005/05/22  use Msxml2.DOMDocument.5.0 for GET method on IE6
//  v0.06  2005/05/22  CDATA_SECTION_NODE
//  v0.07  2005/05/23  use Microsoft.XMLDOM for GET method on IE6
//  v0.10  2005/10/11  new function: JKL.ParseXML.HTTP.responseText()
//  v0.11  2005/10/13  sub classes: JKL.ParseXML.Text, JSON and DOM.
//  v0.12  2005/10/14  sub classes: JKL.ParseXML.CSV and CSVmap.
// ================================================================
//  http://msdn.microsoft.com/library/en-us/xmlsdk/html/d051f7c5-e882-42e8-a5b6-d1ce67af275c.asp
// ================================================================
if(typeof (JKL)=="undefined"){
JKL=function(){
};
}
JKL.ParseXML=function(_1,_2){
this.http=new JKL.ParseXML.HTTP(_1,_2);
this.http.allow_xmldom(true);
return this;
};
JKL.ParseXML.VERSION="0.12";
JKL.ParseXML.MAP_NODETYPE=["","ELEMENT_NODE","ATTRIBUTE_NODE","TEXT_NODE","CDATA_SECTION_NODE","ENTITY_REFERENCE_NODE","ENTITY_NODE","PROCESSING_INSTRUCTION_NODE","COMMENT_NODE","DOCUMENT_NODE","DOCUMENT_TYPE_NODE","DOCUMENT_FRAGMENT_NODE","NOTATION_NODE"];
JKL.ParseXML.prototype.async=function(_3,_4){
this.callback_func=_3;
this.callback_arg=_4;
};
JKL.ParseXML.prototype.onerror=function(_5,_6){
this.onerror_func=_5;
};
JKL.ParseXML.prototype.parse=function(){
if(!this.http){
return;
}
if(this.onerror_func){
this.http.onerror(this.onerror_func);
}
if(this.callback_func){
var _7=this;
var _8=function(){
if(!_7.http){
return;
}
var _9=_7.parseResponse();
_7.callback_func(_9,_7.callback_arg);
};
this.http.async(_8);
}
this.http.load();
if(!this.callback_func){
var _a=this.parseResponse();
return _a;
}
};
JKL.ParseXML.prototype.setOutputArrayAll=function(){
this.setOutputArray(true);
};
JKL.ParseXML.prototype.setOutputArrayAuto=function(){
this.setOutputArray(null);
};
JKL.ParseXML.prototype.setOutputArrayNever=function(){
this.setOutputArray(false);
};
JKL.ParseXML.prototype.setOutputArrayElements=function(_b){
this.setOutputArray(_b);
};
JKL.ParseXML.prototype.setOutputArray=function(_c){
if(typeof (_c)=="string"){
_c=[_c];
}
if(_c&&typeof (_c)=="object"){
if(_c.length<0){
_c=false;
}else{
var _d={};
for(var i=0;i<_c.length;i++){
_d[_c[i]]=true;
}
_c=_d;
if(_c["*"]){
_c=true;
}
}
}
this.usearray=_c;
};
JKL.ParseXML.prototype.parseResponse=function(){
var _f=this.http.documentElement();
var _10=this.parseDocument(_f);
return _10;
};
JKL.ParseXML.prototype.parseDocument=function(_11){
if(!_11){
return;
}
var ret=this.parseElement(_11);
if(this.usearray==true){
ret=[ret];
}else{
if(this.usearray==false){
}else{
if(this.usearray==null){
}else{
if(this.usearray[_11.nodeName]){
ret=[ret];
}
}
}
}
var _13={};
_13[_11.nodeName]=ret;
return _13;
};
JKL.ParseXML.prototype.parseElement=function(_14){
if(_14.nodeType==7){
return;
}
if(_14.nodeType==3||_14.nodeType==4){
var _15=_14.nodeValue.match(/[^\u0000-\u0040]/);
if(_15==null){
return;
}
return _14.nodeValue;
}
var _16;
var cnt={};
if(_14.attributes&&_14.attributes.length){
_16={};
for(var i=0;i<_14.attributes.length;i++){
var key=_14.attributes[i].nodeName;
if(typeof (key)!="string"){
continue;
}
var val=_14.attributes[i].nodeValue;
if(!val){
continue;
}
if(typeof (cnt[key])=="undefined"){
cnt[key]=0;
}
cnt[key]++;
this.addNode(_16,key,cnt[key],val);
}
}
if(_14.childNodes&&_14.childNodes.length){
var _1b=true;
if(_16){
_1b=false;
}
for(var i=0;i<_14.childNodes.length&&_1b;i++){
var _1c=_14.childNodes[i].nodeType;
if(_1c==3||_1c==4){
continue;
}
_1b=false;
}
if(_1b){
if(!_16){
_16="";
}
for(var i=0;i<_14.childNodes.length;i++){
_16+=_14.childNodes[i].nodeValue;
}
}else{
if(!_16){
_16={};
}
for(var i=0;i<_14.childNodes.length;i++){
var key=_14.childNodes[i].nodeName;
if(typeof (key)!="string"){
continue;
}
var val=this.parseElement(_14.childNodes[i]);
if(!val){
continue;
}
if(typeof (cnt[key])=="undefined"){
cnt[key]=0;
}
cnt[key]++;
this.addNode(_16,key,cnt[key],val);
}
}
}
return _16;
};
JKL.ParseXML.prototype.addNode=function(_1d,key,_1f,val){
if(this.usearray==true){
if(_1f==1){
_1d[key]=[];
}
_1d[key][_1d[key].length]=val;
}else{
if(this.usearray==false){
if(_1f==1){
_1d[key]=val;
}
}else{
if(this.usearray==null){
if(_1f==1){
_1d[key]=val;
}else{
if(_1f==2){
_1d[key]=[_1d[key],val];
}else{
_1d[key][_1d[key].length]=val;
}
}
}else{
if(this.usearray[key]){
if(_1f==1){
_1d[key]=[];
}
_1d[key][_1d[key].length]=val;
}else{
if(_1f==1){
_1d[key]=val;
}
}
}
}
}
};
JKL.ParseXML.Text=function(url,_22){
this.http=new JKL.ParseXML.HTTP(url,_22);
return this;
};
JKL.ParseXML.Text.prototype.parse=JKL.ParseXML.prototype.parse;
JKL.ParseXML.Text.prototype.parseResponse=function(){
var _23=this.http.responseText();
return _23;
};
JKL.ParseXML.JSON=function(url,_25){
this.http=new JKL.ParseXML.HTTP(url,_25);
return this;
};
JKL.ParseXML.JSON.prototype.parse=JKL.ParseXML.prototype.parse;
JKL.ParseXML.JSON.prototype.parseResponse=function(){
var _26=this.http.responseText();
var _27=eval("("+_26+")");
return _27;
};
JKL.ParseXML.DOM=function(url,_29){
this.http=new JKL.ParseXML.HTTP(url,_29);
this.http.allow_xmldom(true);
return this;
};
JKL.ParseXML.DOM.prototype.parse=JKL.ParseXML.prototype.parse;
JKL.ParseXML.DOM.prototype.parseResponse=function(){
var _2a=this.http.documentElement();
return _2a;
};
JKL.ParseXML.CSV=function(url,_2c){
this.http=new JKL.ParseXML.HTTP(url,_2c);
return this;
};
JKL.ParseXML.CSV.prototype.parse=JKL.ParseXML.prototype.parse;
JKL.ParseXML.CSV.prototype.parseResponse=function(){
var _2d=this.http.responseText();
var _2e=this.parseCSV(_2d);
return _2e;
};
JKL.ParseXML.CSV.prototype.parseCSV=function(_2f){
_2f=_2f.replace(/\r\n?/g,"\n");
var pos=0;
var len=_2f.length;
var _32=[];
while(pos<len){
var _33=[];
while(pos<len){
if(_2f.charAt(pos)=="\""){
var _34=_2f.indexOf("\"",pos+1);
while(_34<len&&_34>-1){
if(_2f.charAt(_34+1)!="\""){
break;
}
_34=_2f.indexOf("\"",_34+2);
}
if(_34<0){
}else{
if(_2f.charAt(_34+1)==","){
var _35=_2f.substr(pos+1,_34-pos-1);
_35=_35.replace(/""/g,"\"");
_33[_33.length]=_35;
pos=_34+2;
continue;
}else{
if(_2f.charAt(_34+1)=="\n"||len==_34+1){
var _35=_2f.substr(pos+1,_34-pos-1);
_35=_35.replace(/""/g,"\"");
_33[_33.length]=_35;
pos=_34+2;
break;
}else{
}
}
}
}
var _36=_2f.indexOf(",",pos);
var _37=_2f.indexOf("\n",pos);
if(_37<0){
_37=len;
}
if(_36>-1&&_36<_37){
_33[_33.length]=_2f.substr(pos,_36-pos);
pos=_36+1;
}else{
_33[_33.length]=_2f.substr(pos,_37-pos);
pos=_37+1;
break;
}
}
if(_33.length>=0){
_32[_32.length]=_33;
}
}
if(_32.length<0){
return;
}
return _32;
};
JKL.ParseXML.CSVmap=function(url,_39){
this.http=new JKL.ParseXML.HTTP(url,_39);
return this;
};
JKL.ParseXML.CSVmap.prototype.parse=JKL.ParseXML.prototype.parse;
JKL.ParseXML.CSVmap.prototype.parseCSV=JKL.ParseXML.CSV.prototype.parseCSV;
JKL.ParseXML.CSVmap.prototype.parseResponse=function(){
var _3a=this.http.responseText();
var _3b=this.parseCSV(_3a);
if(!_3b){
return;
}
if(_3b.length<0){
return;
}
var _3c=_3b.shift();
var _3d=[];
for(var i=0;i<_3b.length;i++){
var _3f={};
for(var j=0;j<_3c.length&&j<_3b[i].length;j++){
_3f[_3c[j]]=_3b[i][j];
}
_3d[_3d.length]=_3f;
}
return _3d;
};
JKL.ParseXML.HTTP=function(url,_42){
this.url=url;
this.query=_42;
this.req=null;
this.xmldom_flag=false;
this.onerror_func=null;
this.callback_func=null;
this.already_done=null;
return this;
};
JKL.ParseXML.HTTP.REQUEST_TYPE="application/x-www-form-urlencoded";
JKL.ParseXML.HTTP.RESPONSE_TYPE="text/xml; charset=Shift_JIS";
JKL.ParseXML.HTTP.RESPONSE_TYPE="text/xml";
JKL.ParseXML.HTTP.ACTIVEX_XMLDOM="Microsoft.XMLDOM";
JKL.ParseXML.HTTP.ACTIVEX_XMLHTTP="Microsoft.XMLHTTP";
JKL.ParseXML.HTTP.prototype.onerror=function(_43){
this.onerror_func=_43;
};
JKL.ParseXML.HTTP.prototype.async=function(_44){
this.async_func=_44;
};
JKL.ParseXML.HTTP.prototype.allow_xmldom=function(tf){
this.xmldom_flag=tf;
};
JKL.ParseXML.HTTP.prototype.load=function(){
var _46=(typeof (this.query)=="string")?"POST":"GET";
if(window.ActiveXObject){
var _47=JKL.ParseXML.HTTP.ACTIVEX_XMLHTTP;
if(_46=="GET"&&this.xmldom_flag){
_47=JKL.ParseXML.HTTP.ACTIVEX_XMLDOM;
}
this.req=new ActiveXObject(_47);
}else{
if(window.XMLHttpRequest){
this.req=new XMLHttpRequest();
}
}
var _48=this.async_func?true:false;
if(typeof (this.req.send)!="undefined"){
this.req.open(_46,this.url,_48);
}
if(typeof (this.req.setRequestHeader)!="undefined"){
this.req.setRequestHeader("content-type",JKL.ParseXML.HTTP.REQUEST_TYPE);
}
if(typeof (this.req.overrideMimeType)!="undefined"){
this.req.overrideMimeType(JKL.ParseXML.HTTP.RESPONSE_TYPE);
}
if(_48){
var _49=this;
_49.already_done=false;
var _4a=function(){
if(_49.req.readyState!=4){
return;
}
var _4b=_49.checkResponse();
if(!_4b){
return;
}
if(_49.already_done){
return;
}
_49.already_done=true;
_49.async_func();
};
this.req.onreadystatechange=_4a;
}
if(typeof (this.req.send)!="undefined"){
var _4c=(typeof (this.query)=="string")?query:"";
this.req.send(_4c);
}else{
if(typeof (this.req.load)!="undefined"){
this.req.async=_48;
this.req.load(this.url);
}
}
if(_48){
return;
}
var _4d=this.checkResponse();
};
JKL.ParseXML.HTTP.prototype.checkResponse=function(){
if(this.req.parseError&&this.req.parseError.errorCode!=0){
if(this.onerror_func){
this.onerror_func(this.req.parseError.reason);
}
return false;
}
if(this.req.status-0>0&&this.req.status!=200&&this.req.status!=304){
if(this.onerror_func){
this.onerror_func(this.req.status);
}
return false;
}
return true;
};
JKL.ParseXML.HTTP.prototype.documentElement=function(){
if(!this.req){
return;
}
if(this.req.responseXML){
return this.req.responseXML.documentElement;
}else{
return this.req.documentElement;
}
};
JKL.ParseXML.HTTP.prototype.responseText=function(){
if(!this.req){
return;
}
return this.req.responseText;
};

