//header
var Header=function(){
    this.code=-1;
    this.message="";
};

Header.prototype={
    
    //resolve from xml
    /**
     * format:
     * <header>
     *        <code>1001</code>
     *        <message>operation success</message>
     *</header>
     */
    resolve:function(xmlDoc){
        this.code = xmlDoc.getElementsByTagName("code")[0].firstChild.nodeValue;
        if(xmlDoc.getElementsByTagName("message")[0].firstChild)
	        this.message = xmlDoc.getElementsByTagName("message")[0].firstChild.nodeValue;
	    else
	    	this.message = "";
    },
    
    toString:function(){
        return "<header><code>"+this.code+"</code><message>"+this.message+"</message></header>";
    }
}

//item property
var Property=function(){
    this.name="";
    this.type="";
    this.value="";
};
//define functions
Property.prototype={
    
    //resolve from xml
    /**
     * format:
     * <pro name="age" type="int">21</pro>
     */
    resolve:function(xmlDoc){
        this.name=xmlDoc.getAttribute("name");
        this.type=xmlDoc.getAttribute("type");
         if(xmlDoc.firstChild){
            this.value = unescape(xmlDoc.firstChild.nodeValue);
        }else{
            this.value="";
        }
    },
    
    toString:function(){
        return "<pro name=\""+this.name+"\" type=\""+this.type+"\">"+this.value+"</pro>";
    }
}

//data item
var Item=function(){
    this.index=-1;
    this.properties=[];
};
Item.prototype={
    
    //resolve from xml document
    /**
     * format:
     * <item index="0">
     *         <pro name="age" type="int">21</pro>
     *         <pro name="gender" type="java.lang.String">Male</pro>
     * </item>
     */
    resolve:function(xmlDoc){
        this.index=xmlDoc.getAttribute("index");
        var proDocs = xmlDoc.getElementsByTagName("pro");
        for(var m=0;m<proDocs.length;m++){
            var pro = new Property();
            pro.resolve(proDocs[m]);
            this.properties[this.properties.length] = pro;
            this.properties[pro.name]=pro;
        }
    },
    
    toString:function(){
        var str = "<item index=\""+this.index+"\">";
        for(var m=0;m<this.properties.length;m++){
            str += this.properties[m].toString();
        }
        str += "</item>";
        return str;
    }
}

//data set
var Set=function(){
    this.name="";
    this.segSize=10;
    this.segCount=0;
    this.total=0;
    this.segIndex=1;
    this.sortField="";
    this.sortType="";
    this.items=[];
};
Set.prototype={

    //resolve from xml document
    /**
     * format:
     * <set name="test" segSize="10" total="20" segIndex="1" segCount="2" sortField="age" sortType="asc">
     *         <item index="0">
     *             <pro name="age" type="int">21</pro>
     *             <pro name="gender" type="java.lang.String">Male</pro>
     *         </item>
     *         <item index="1">
     *             <pro name="age" type="int">22</pro>
     *             <pro name="gender" type="java.lang.String">Female</pro>
     *         </item>
     * </set>
     */
    resolve:function(xmlDoc){
        this.name=xmlDoc.getAttribute("name");
        this.segSize=xmlDoc.getAttribute("segSize");
        this.segCount=xmlDoc.getAttribute("segCount");
        this.total=xmlDoc.getAttribute("total");
        this.segIndex=xmlDoc.getAttribute("segIndex");
        this.sortField=xmlDoc.getAttribute("sortField");
        this.sortType=xmlDoc.getAttribute("sortType");
        var itemDocs=xmlDoc.getElementsByTagName("item");
        for(var m=0;m<itemDocs.length;m++){
            var item = new Item();
            item.resolve(itemDocs[m]);
            this.items[this.items.length]=item;
            //this.items[item.index]=item;
        }
    },
    
    toString:function(){
        var str = "<set segSize=\""+this.segSize+"\" segCount=\""+this.segCount+"\" total=\""+this.total+"\" segIndex=\""+this.segIndex+"\" sortField=\""+this.sortField+"\" sortType=\""+this.sortType+"\">";
        for(var m=0;m<this.items.length;m++){
            str += this.items[m].toString();
        }
        str += "</set>";
        return str;
    }
}

//response body
var Body=function(){
    this.set=new Set();
};
Body.prototype={

    //resolve from xml document
    /**
     * format:
     * <body>
     *         <set name="test" segSize="10" total="20" segIndex="1" segCount="2">
     *             <item index="0">
     *                 <pro name="age" type="int">21</pro>
     *                 <pro name="gender" type="java.lang.String">Male</pro>
     *             </item>
     *             <item index="1">
     *                 <pro name="age" type="int">22</pro>
     *                 <pro name="gender" type="java.lang.String">Female</pro>
     *             </item>
     *         </set>
     * </body>
     */
    resolve:function(xmlDoc){
        if(xmlDoc.firstChild)
            this.set.resolve(xmlDoc.firstChild);
    },
    
    toString:function(){
        return "<body>"+this.set.toString()+"</body>";
    }
}

//response from server
var Response=function(){
    this.header=new Header();
    this.body=new Body();
};

Response.prototype={

    //resolve XML
    resolve:function(xmlDoc){
        var headerDocs = xmlDoc.getElementsByTagName("header");
        if(headerDocs.length > 0)
            this.header.resolve(headerDocs[0]);
        var bodyDocs = xmlDoc.getElementsByTagName("body");
        if(bodyDocs.length > 0)
            this.body.resolve(bodyDocs[0]);
    },
    
    toString:function(){
        return "<resp>"+this.header.toString()+this.body.toString()+"</resp>";
    }
    
}