﻿function Ajax(url)
{
    this.m_xmlReq=false;
    this.Url=url;
    
    if(window.XMLHttpRequest)
    {
        this.m_xmlReq = new XMLHttpRequest();
        if(this.m_xmlReq.overrideMimeType)  this.m_xmlReq.overrideMimeType('text/xml');
    }
    else if(window.ActiveXObject)
    { 
       try
       {
            this.m_xmlReq = new ActiveXObject('Msxml2.XMLHTTP');
       }
       catch(e)
       {
          try
          {
              this.m_xmlReq = new ActiveXObject('Microsoft.XMLHTTP');
          }
          catch(e){}
        }
    }
    
    this.invokeServer=function(send_data,method)
    {
        if(!this.m_xmlReq)  return;
        
        
        
        this.m_xmlReq.open(method,this.Url,false);
        
       
        
        if(method=='POST') 
        this.m_xmlReq.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');    
        this.m_xmlReq.send(send_data.toString());
        
        var dto=new DTO();
        

        
        
        if(this.m_xmlReq.status==200 && this.m_xmlReq.readyState == 4)
        {
            dto.loadFromXDoc(this.m_xmlReq.responseXML); 
        }
        
         
        
        return dto;         
    }
}

function DTO()
{
    this.Content=new Hashtable();
	
    this.add=function(key,value)
    {
	    return this.Content.add(key,value);
    }

    this.items=function(key)
    {
	    return this.Content.items(key);
    }
    
    this.getInteger=function(key)
    {
        var num=parseInt(this.items(key));
        
        if(isNaN(num)) 
            return 0;
        return num; 
    }
    
    this.getFloat=function(key)
    {
        var num=parseFloat(this.items(key));
        
        if(isNaN(num)) 
            return 0;
        return num; 
    }
    
    this.loadFromXDoc=function(xdoc)
    {
	    this.visitNode(xdoc.documentElement);
    }
    
    this.visitNode=function(root)
    {
        var i,node,node_list=root.childNodes;
        
	    for(i=0;i<node_list.length;i++)
	    {
	        node=node_list[i];

            if(this.isLeaf(node))
            {
                this.Content.add(node.nodeName,node.firstChild.nodeValue);
            }
            else if(this.hasRow(node))
            {
                var list=new ArrayList();
                this.visit_list(node,list);
                this.Content.add(node.nodeName,list);
            }
            else
            {
                var hash=new Hashtable();
                this.visit_hashtable(node,hash);
                this.Content.add(node.nodeName,hash);
            }
	    }
    }
    
    this.visit_list=function(root,list)
    {
        var i,node,node_list=root.childNodes;
        
	    for(i=0;i<node_list.length;i++)
	    {
	        node=node_list[i];
	        
            if(this.isLeaf(node))
            {
                list.add(node.firstChild.nodeValue);
            }
            else if(this.hasRow(node))
            {
                var list_item=new ArrayList();
                this.visit_list(node,list_item);
                list.add(list_item);
            }
            else
            {
                var hash_item=new Hashtable();
                this.visit_hashtable(node,hash_item);
                list.add(hash_item);
            }
	    }
    }
    
    this.visit_hashtable=function(root,hash)
    {
        var i,node,node_list=root.childNodes;
        
	    for(i=0;i<node_list.length;i++)
	    {
	        node=node_list[i];
	        
            if(this.isLeaf(node))
            {
                hash.add(node.nodeName,node.firstChild.nodeValue);
            }
            else if(this.hasRow(node))
            {
                var list_item=new ArrayList();
                this.visit_list(node,list_item);
                hash.add(node.nodeName,list_item);
            }
            else
            {
                var hash_item=new Hashtable();
                this.visit_hashtable(node,hash_item);
                hash.add(node.nodeName,hash_item);
            }
	    }
    }
    
    this.isLeaf=function(node)
    {
        return node.firstChild.nodeName=="#cdata-section";
    }
    
    this.hasRow=function(node)
    {
        return node.firstChild.nodeName=="row";
    }
}

function ArrayList() 
{ 
    this.content = new Array(); 

    this.count=0; 
    this.isValidIndex=function(index) 
    { 
        return /^\d+$/.exec(index) && index>=0 && index<this.count 
    } 
    this.add=function(data) 
    { 
        this.content[this.count++]=data; 
    } 
    this.items=function(index) 
    { 
        if(!this.isValidIndex(index))    return null; 

        return this.content[index]; 
    } 
    this.remove =function(index) 
    { 
        if(!this.isValidIndex(index))    return false; 

        for(var i=index;i<this.count;i++)    this.content[i]=this.content[i+1]; 

        delete this.content[this.count-1]; 
        this.count--; 
    } 
    this.indexOf=function(elem) 
    { 
        for (var i=0;i <this.count;i++) 
            if (this.content[i]==elem)    return i; 
             
        return -1; 
    } 
    this.lastIndexOf = function(elem)  
    { 
        for (var i = this.count-1; i >= 0; i--) 
            if (this.content[i]==elem ) return i; 

        return -1; 
    } 
    this.contains=function(elem) 
    { 
        return this.indexOf(elem) >= 0; 
    } 
}

var _UNDEFINED_="undefined";
function Hashtable() 
{ 
	this.count=0;
	this.content= new Object(); 
	this.defined=function(p)
	{
		return typeof(p)!=_UNDEFINED_;
	}
	this.add = function(key,value)
	{ 
		if(this.contains(key))	return false; 

		this.content[key]=value;
		this.count++;
		return true; 			
    } 
	this.remove= function(key)
	{
		if(!this.contains(key))	return;

		delete this.content[key];
		this.count--;
	} 
	this.items  = function(key)
	{
		if(this.contains(key))	return this.content[key];

		return null;
	} 
	this.contains= function(key)
	{ 
		return this.defined(this.content[key]);
	} 
	this.clear= function()
	{
		for(var k in this.content)	delete this.content[k];
		this.count=0;
	}
	
	this.toString=function()
	{
	    var sb=new StringBuilder();
	    var hasItem=false;
	    
	    for(var k in this.content)
	    {
	        if(hasItem)
	            sb.appendFormat("&{0}={1}",k,this.content[k]);
	        else
	        {
	            sb.appendFormat("{0}={1}",k,this.content[k]);
	            hasItem=true;
	        }
	    }
	    
	    return sb.toString();
	}
}

function StringBuilder(value)
{
	this.s = new Array();
	

	this.append=function(value)
	{
		if(value!=null)
			this.s.push(value);
	}
	
	this.append(value);

	this.toString=function()
	{
		return this.s.join('');
	}
	
	this.clear=function()
	{
		this.s=new Array();
	}

	this.appendFormat=function(format,args)
	{
			for ( var i=0 ; i < format.length-1;)
			{
				if ( format.charAt(i) == '{' && format.charAt(i+1) != '{' )
				{
				    var index = 0, indexStart = i+1;
				    for ( var j=indexStart ; j <= format.length-2 ; ++j )
				    {
					    var ch = format.charAt(j);
					    if ( ch < '0' || ch > '9' ) break;
				    }
				    if ( j > indexStart )
				    {
					    if ( format.charAt(j) == '}' && format.charAt(j+1) != '}' )
					    {
						     for ( var k=j-1 ; k >= indexStart ; k-- )
						     {
							     index += (format.charCodeAt(k)-48)*Math.pow(10, j-1-k);
						     }  
						    var swapArg = arguments[index+1];
						    this.append(swapArg);
						    i += j-indexStart+2;
						    continue;
					    }
				    }
				    this.append(format.charAt(i));
				    i++;
				}
				else
				{
					if ( ( format.charAt(i) == '{' && format.charAt(i+1) == '{' ) || ( format.charAt(i) == '}' && format.charAt(i+1) == '}' ) )
					{
						i++
					}
					this.append(format.charAt(i));
					i++;
				}
			}
			this.append(format.substr(i));
			return this; 
	}
}

function bind_dict(format,dict,itemIndex)
{
    var idx_end=0;
    var c=null;
    var k=null;
    var sb=new StringBuilder();
    for (var i=0 ; i < format.length;)
    {
	    c=format.charAt(i);
	    if (c == '{')
	    {
		    idx_end=format.indexOf('}',i);
		    k=format.substring(i+1,idx_end);
		    if(k=='__ItemIndex')
		        sb.append(itemIndex+1);
		    else
		        sb.append(dict.items(k));
		    i=idx_end+1;
		    continue;
	    }
	    sb.append(c);
	    i++;
    }
    return sb.toString();
}

function JSPanel(objDivid)
{
    this.Template=null;
    this.DataSource=null;
    
    this.DataBind=function()
    {
        document.getElementById(objDivid).innerHTML=bind_dict(this.Template,this.DataSource,0);
    }
}

function JSRepeater(objDivid)
{ 
    this.HeaderTemplate=null;
    this.ItemTemplate=null;
    this.FooterTemplate=null;
    this.DataSource=null;
    
    this.IsPaging=true;
    this.PageIndex=1;
    this.PageSize=10;
    this.RecordCount=0;
    
    
    this.getPageCount=function()
    {
       return Math.ceil(this.RecordCount/this.PageSize);
    }

	this.onPageIndexChanged=null;
    
    this.DataBind=function()
    {
        var count=this.DataSource.count;
        var sb=new StringBuilder(this.HeaderTemplate);
        for(var i=0;i<count;i++)    
            sb.append(bind_dict(this.ItemTemplate,this.DataSource.items(i),(this.PageIndex-1)*this.PageSize+i));
            
        sb.append(this.FooterTemplate);
        if(this.IsPaging) sb.append(this.getTurnHTML());
        
        document.getElementById(objDivid).innerHTML=sb.toString();
    }
    
    var getTurnArray=function(p,g)
    {
        var x =new Array( 0, 0, p - 3, p - 2, p - 1, p, p + 1, p + 2, p + 3, 0, 0 );

        if (g > 0) x[0] = 1;
        if (g > 1) x[1] = 2;
        if (g > 2) x[10] = g;
        if (g > 3) x[9] = g - 1;

        for (var i = 2; i < 9; i++)
            if (x[i] < 3 || x[i] > g - 2) x[i] = 0;

        if (x[2] != 0) x[2] = -1;
        if (x[8] != 0) x[8] = -1;
        return x;
    }
    
    this.getTurnHTML=function()
    {
        var page_index=this.PageIndex;
		var page_count=	this.getPageCount();
		
		var sb=new StringBuilder();
        var turnArray=getTurnArray(page_index,page_count);
        
        if (page_index > 1)
            sb.appendFormat(" <a href='javascript:{0}({1})'>上一页</a> ",this.onPageIndexChanged,page_index - 1);
        else
            sb.append(" 上一页 ");

        for (var i = 0; i < 11; i++)
        {
            var j = turnArray[i];
            
            if (j == 0)
                continue;
            else if (j == -1)
                sb.append('...');
            else if (j == page_index)
                sb.appendFormat("{0}", j);
            else
                sb.appendFormat(" <a href='javascript:{0}({1})'>{1}</a> ",this.onPageIndexChanged,j);
        }
         if (page_index < page_count && page_count > 1)
               sb.appendFormat(" <a href='javascript:{0}({1})'>下一页</a> ",this.onPageIndexChanged,page_index + 1);
         else
               sb.appendFormat(" 下一页 ");
        sb.appendFormat(" 共 {0} 页 {1} 条",page_count,this.RecordCount);
        return sb.toString();
    }
}



function DropDownList(ddl_id)
{
	this.DataTextField=null;
	this.DataValueField=null;
	this.DataSource=null;

	this.DataBind=function()
	{
		var count=this.DataSource.count;
		var obj_ddl=document.getElementById(ddl_id);

		var data_item=null;
        		for(var i=0;i<count;i++) 
		{
			data_item=this.DataSource.items(i);
			obj_ddl.options.add(new Option(data_item.items(this.DataTextField),data_item.items(this.DataValueField)));
		}
			
	}
}