﻿xmlns = "podcast";
var loadingImg = "<br/>&nbsp;<img src='/images/criloading.gif' align='absmiddle'> ";
function DataList(service, svcArgs, templateFile, container, pageBar, cacheTime, callbackFunc, callbackArgs)
{
	var _service;
	var _svcArgs;
	var _templateFile;
	var _container;
	var _pageBar;
	var _cacheTime;
	var _cacheExpiredTime;
	var _callbackFunc;
	var _callbackArgs;
	var _perPageGroupSize;
	var _currentPage;
	
	this.setCacheTime = function(cacheTime)
	{
		this._cacheExpiredTime = new Date().getTime() + cacheTime * 1000;
	}
	
	this.getCacheName = function()
	{
		var cacheName = "";
		if(this._svcArgs != null)
		{
			this._svcArgs.remove("_tick");
			var keys = this._svcArgs.allKeys();
			for(var i = 0; i < keys.length; i++)
			{
				cacheName += keys[i] + "=" + this._svcArgs.get(keys[i]) + ";";
			}
		}
		return cacheName;	
	}

	//clear the cache for same service but diffurent page.
	this._clearCache = function()
	{
		for(var key in DataList.cache)
		{
			var captureKey = "service=" + this._service;
			if(key.indexOf(captureKey) != -1)
			{
				DataList.cache[key] = null;
			}
		}
	}
	
	this._init = function(service, svcArgs, templateFile, container, pageBar, cacheTime, callbackFunc, callbackArgs)
	{
		this._service = service;
		this._svcArgs = svcArgs;
		this._templateFile = templateFile;
		this._container = (typeof container == "string")? document.getElementById(container) : container;
		this._pageBar = (typeof pageBar == "string")? document.getElementById(pageBar) : pageBar;
		this._cacheTime = (typeof cacheTime == "number")? cacheTime : 0;
		this._cacheExpiredTime = this.setCacheTime(this._cacheTime);
		this._callbackFunc = callbackFunc;
		this._callbackArgs = callbackArgs;
		this._svcArgs.set("service", this._service.toString());
		this._perPageGroupSize = DataList.PER_GROUP_SIZE;
	}

	this._echo = function(msg)
	{
		if(this._container != null) this._container.innerHTML = msg;
	}
	
	//为CRIOnline定制的特殊过滤条件
	this.checkForCRIOnline = function(xmlDoc)
	{
		if(xmlDoc.selectSingleNode("/rss") == null)
		{
			this._echo(xmlDoc.selectSingleNode("/response/message").text);
			return false;
		}
		return true;
	}
	
	this._createPageBar = function(xmlDoc)
	{
		var total, pageIndex, pageSize, pageCount;
		pageSize = parseInt(xmlDoc.selectSingleNode("/rss/channel/" + xmlns + ":pageCapacity").text);
		pageCount = total = Math.ceil(parseInt(xmlDoc.selectSingleNode("/rss/channel/" + xmlns + ":itemTotal").text) / pageSize);
		pageIndex = parseInt(xmlDoc.selectSingleNode("/rss/channel/" + xmlns + ":pageIndex").text);

		var groupCount = Math.ceil(pageCount / this._perPageGroupSize);
	
		var currGroupIndex = Math.ceil(pageIndex / this._perPageGroupSize);
		var startPageIndex = (currGroupIndex - 1) * this._perPageGroupSize + 1;
		
		var tblPage = document.createElement("table");
		tblPage.cellSpacing = "4";
		trPage = tblPage.insertRow(0);
		this._pageBar.innerHTML = "";

		for(var i = startPageIndex, j = 0; j < this._perPageGroupSize && i <= total; i++, j++)
		{
			
			var c = trPage.insertCell(j);
			c.align = "center";
			c.appendChild(document.createTextNode(i.toString()));
			if(i != pageIndex)
			{
				c.className = "PageIndex";
				c.dataList = this;
				c.page = i;
				c.onclick = function()
				{
					this.dataList.create(this.page);
				}
			}
			else
				c.className = "PageIndexSelected";
		}		
		this._pageBar.appendChild(tblPage);
	}
	
	//转换模板和数据
	this.createDocument = function(xmlDoc, xslDoc)
	{
		if(xslDoc == null)
		{
			this._echo("can't find xsl file:" + this._templateFile.toString());
		}
		
		try
		{
			var fraghtml = xmlDoc.transformNode(xslDoc);
			this._echo(fraghtml);
			
			if(this._pageBar)
				this._createPageBar(xmlDoc);
		}
		finally
		{
			//执行用户的回调函数
			if(typeof this._callbackFunc == "function")
				this._callbackFunc(this._callbackArgs, xmlDoc, xslDoc);
		}
	}
	
	this.getXslDocument = function(xmlDoc)
	{
		if(xmlDoc == null)
		{
			this._echo("XML document load error:" + arguments[1]);
			return;
		}
		
		if(this.checkForCRIOnline(xmlDoc) == false)
		{
			return;
		}
		
		this._echo(loadingImg + "loading template...");
		//优先获取缓存版本的xsl文档
		var cacheTemplate = DataList.cache[this._templateFile.toString()];
		if(cacheTemplate == null)
		{
			HttpRequest.asyncGet(this._templateFile, this._srvArgs, DataList.getXslDocumentCallback, new Array(this, xmlDoc));
		}
		else
		{
			trace("从缓存中获取xsl文档");
			this.createDocument(xmlDoc, cacheTemplate);
		}
	},

	this.getCurrentPage = function()
	{
		return _currentPage;
	},
	
	this.create = function(page, refreshCache)
	{
		var page = this._currentPage = ((typeof page == "number")? page.toString() : "1")
		this._svcArgs.remove("page");
		this._svcArgs.set("page", page);
		var cacheName = this.getCacheName();
		var cacheEnabled = ( (refreshCache != true) && (this._cacheExpiredTime > new Date().getTime()) && (DataList.cache[cacheName] != null) );
		
		//优先获取缓存版本的XML文档
		this._echo(loadingImg + "loading XML data...");
		if(!cacheEnabled)
		{
			//clear the cahe for same servise but diffurent page.
			if(refreshCache) this._clearCache();
			HttpRequest.asyncGet(DataList.SERVICE_PAGE, this._svcArgs, DataList.getXmlDocumentCallback, new Array(this, page));	
		}
		else
		{
			trace("从缓存中获取Xml文档");
			this.getXslDocument(DataList.cache[cacheName], page);
		}		
	}
	
	this._init(service, svcArgs, templateFile, container, pageBar, cacheTime, callbackFunc, callbackArgs);
}

DataList.PER_PAGE_SIZE = 10;
DataList.PER_GROUP_SIZE = 10;
DataList.cache = new Object();
DataList.SERVICE_PAGE = "/services.aspx";

//全局静态回调函数
DataList.getXmlDocumentCallback = function(xmlDoc, data)
{
	var instance = data[0];
	var page = data[1];	
	//缓存xml文档
	DataList.cache[instance.getCacheName()] = xmlDoc;	
	instance.setCacheTime(instance._cacheTime);
	instance.getXslDocument(xmlDoc, arguments[2]);
}

DataList.getXslDocumentCallback = function(xslDoc, data)
{
	var instance = data[0];
	var xmlDoc = data[1];
	
	//缓存xsl文档
	DataList.cache[instance._templateFile.toString()] = xslDoc;
	instance.createDocument(xmlDoc, xslDoc, arguments[2]);
}

function trace(msg)
{
	//alert(msg);
}
