﻿//----------------RssItem---------------------------------//

	function RssItem()
	{
		this.items	= new Object();
		this.dl		= new Object();
	}
	
	
	RssItem.prototype.HasTag  = function(tag)
	{
		var tags = this.GetItem("Tags","dl").split(" ");
		for (var i = 0; i < tags.length; i++)
		{
			if (tag == tags[i])
				return true;
		}
		return false;
	}
	
	
	RssItem.prototype.Parse  = function(item)
	{
		for (var i = 0; i < item.childNodes.length; i++)
		{
			var subitem = item.childNodes[i];
			if (subitem.firstChild == null)
				continue;
			
			var prefix   = null;
			var baseName = null;
			var names    = subitem.tagName.split(":");
			if (names.length > 1)
			{
				prefix	 = names[0];
				baseName = names[1];
			}
			else
				baseName = names[0];
				
			if (prefix != null)
			{
				if (prefix.toLowerCase() == "dl")
					this.dl[baseName.toLowerCase()] = subitem.firstChild.nodeValue;
			}
			else
				this.items[baseName.toLowerCase()] = subitem.firstChild.nodeValue;
		}
	}	
	
	RssItem.prototype.GetItem  = function()
	{
		var num		=  arguments.length;
		if (num == 0)
			return "";
		var name	= arguments[0].toLowerCase();
		var ns		= null;
		if (num > 1)
			ns		= arguments[1].toLowerCase();

	
		var v = "";
			
		if (ns == null)
		{
			v  = this.items[name];
			if (v == null || v == undefined)
				v = "";
		}
		else if (ns == "dl")
		{
			v  = this.dl[name];
			if (v == null || v == undefined)
				v	=  "";
		}
		
		if(ns == null && name == "pubdate")
		{
			v = Uti_RFC2Date(v);
		}
		return v;
	}
	
//----------------RssItem---------------------------------//

//----------------RssHandler------------------------------//	

	function RssHandler()
	{
		this.ajaxObj		= new Sam_Ajax();
		this.IsIE			= this.ajaxObj.IsIE;
		this.cache			= new Object;
	}
	
	RssHandler.prototype.GetRss  = function(url,oncomplete,arg)
	{
		if (this.cache[url] == null)
		{
			var params = new Array();
			params.push(this);
			params.push(url);
			params.push(oncomplete);
			params.push(arg);
			
			this.ajaxObj.Call(url,"GET",RssHandlerCallback,params);
		}
		else
			oncomplete(this.cache[url],arg);
	}
	
	RssHandler.prototype.SelectNodes = function(doc,xpath)
	{
		if (this.IsIE)		// IE
		{
			if (doc.documentElement == undefined)
				return null;
			return doc.documentElement.selectNodes("//rss/channel");
		}
		else					// Gecko
		{
			var aNodeArray = new Array();
			var xPathResult = doc.evaluate( xpath, doc, doc.createNSResolver(doc.documentElement), XPathResult.ORDERED_NODE_ITERATOR_TYPE, null);
			if ( xPathResult ) 
			{
				var oNode = xPathResult.iterateNext();
 				while( oNode )
 				{
 					aNodeArray[aNodeArray.length] = oNode ;
 					oNode = xPathResult.iterateNext();
 				}
			} 
			return aNodeArray ;
		}
	}


	RssHandler.prototype.Callback  = function(bSuccess, xml,arg)
	{
		if (!bSuccess)
		{
			arg[3][0].GetDataFail();
			return;
		}
		var channels = this.SelectNodes(xml,"//rss/channel");
		if (channels == null)
			return;
		
		
		var itemarray = new Array();

		if (channels.length > 0)
		{
			var channel = channels[0];
			for (var i = 0; i < channel.childNodes.length; i++)
			{
				var item = channel.childNodes[i];
				if (item.tagName.toLowerCase() == "item")
				{
					var rssitem = new RssItem();
					rssitem.Parse(item);
					itemarray.push(rssitem);
				}
			}
		}
		
		this.cache[arg[1]] = itemarray;
		
		arg[2](itemarray,arg[3]);
	}
	
	function RssHandlerCallback(bSuccess, xml,arg)
	{
		arg[0].Callback(bSuccess,xml,arg);
	}

//----------------RssHandler------------------------------//	

//----------------RssList---------------------------------//	
	function RssList(name)
	{
		this.objname			= name;
		this.rssHandler			= new RssHandler();
		this.targetarea			= null;
		this.taglistarea		= null;
		this.taglist			= "";
		this.url				= "";
		this.StartAnthor		= "";

		
		this.BuildTaglist		= null;
		this.BuildList			= null;
		this.GetListHead		= null;
		this.GetListEnd			= null;
		this.ListCountPerPage	= 30;
	}



	RssList.prototype.GetDataFail = function()
	{
		this.targetarea.innerHTML = "<br>读取数据失败!    <a href=\"javascript:" + this.objname +".GetList('')\">重试</a><br><br><br>"
	}

	RssList.prototype.Init = function(idTagList,idListArea,Tags,url)
	{
		if (idTagList != null && idTagList != "")
			this.taglistarea	= document.getElementById(idTagList);
		if (idListArea != null && idListArea != "")			
			this.targetarea		= document.getElementById(idListArea);
		
		this.taglist		= Tags;
		this.url			= url;
	
	
		if (this.BuildTaglist != null)
			this.BuildTaglist();
		else
			this.BuildStdTaglist();
		
		if (this.targetarea == null)
			return;
		
		this.targetarea.innerHTML = "<br>正在读数据...<br><br><br><br>";
		
		this.GetList("");
	}

	RssList.prototype.GetList = function(tag,newurl,pid)
	{
		if (this.StartAnthor != "")
			window.location.hash = this.StartAnthor;
			
	
	
		var params = new Array();
		params.push(this);
		params.push(tag);
		
		var curUrl = this.url;
		
		if (arguments.length > 1 && newurl != undefined && newurl != null && newurl != "")
			curUrl = newurl;	
			
		if (arguments.length > 2)
			params.push(pid);
		else
			params.push(1);
		
		this.rssHandler.GetRss(curUrl,RssListCallback,params);
	}
	
	
	
	RssList.prototype.BuildStdTaglist = function()
	{
	
		if (this.taglist == null || this.taglist == undefined)
			return;
			
		var tags	= this.taglist.split(" ");
		var html = "";
		for (var i = 0 ; i < tags.length ; i++)
		{
			var tag= tags[i];
			if (tag == "")
				break;
			html	+= " <A href=\"javascript:" + this.objname+  ".GetList('" + tag + "')\">" + Uti_HtmlEncode(tag) +"</A> ";
		}
		html += " <A href=\"javascript:" + this.objname+  ".GetList('')\">全部</A> ";
		
		if (this.taglistarea != null)
			this.taglistarea.innerHTML = html;
	}	
	
	
	RssList.prototype.onGetList = function(items,params)
	{
		var tag = params[1];
		var pid = params[2];
		
		if (pid < 1)
			pid = 1;
		var start = this.ListCountPerPage * (pid -1);
		var end	  = this.ListCountPerPage * pid;
		
		if (this.BuildList == null)
			return;
			
		var html  = "";
		if (this.GetListHead != null)
		{
			html = this.GetListHead();
		}
		
		var itemindex = 0;
		
		for (var i = 0; i< items.length; i++)
		{
			var rssItem = items[i];
			if (tag != "" && tag != null && tag != undefined)
			{
				if (rssItem.HasTag(tag))
				{
					if (itemindex >= start && itemindex < end)
						html += this.BuildList(rssItem,itemindex);
					itemindex++;
				}
			}
			else
			{
				if (itemindex >= start && itemindex < end)
					html += this.BuildList(rssItem,itemindex);
				itemindex++;
			}
		}

		var totalpage = Math.floor((itemindex + this.ListCountPerPage-1) / this.ListCountPerPage);
		if (this.GetListEnd != null)
			html += this.GetListEnd(tag,pid,totalpage);
		else
			html += this.GetStdPageNum(tag,pid,totalpage);

		this.targetarea.innerHTML = html;	
	}
	
	
	function RssListCallback(items, arg)
	{
		arg[0].onGetList(items,arg);
	}	
		
	
	RssList.prototype.GetStdPageNum = function(tag,pid,totalpage)
	{
		if (totalpage <= 1)
			return "";
			
			
		if (this.objname == undefined)
			return "";

		var s = "<div class=\"PageNum\">";

	//	for (var i = 1; i <= totalpage; i ++)
	//	{
	//		var clsname = "page";
	//		if (i == pid)
	//		{
	//			clsname = "curpage";
	//			s += "<span class=\""+clsname+"\">" + i + "</span>";
	//		}
	//		else				
	//			s += " <a class=\""+clsname+"\" href=\"javascript:"+this.objname+".GetList('" + Uti_ConvertSingleQuote(tag) + "',null," + i +")\">[" + i + "]</a>";
	//	}
		s += "<span title='首页'><a href=\"javascript:"+this.objname+".GetList('" + Uti_ConvertSingleQuote(tag) + "',null, 1)\"><<</a></span> ";
		s += "<span title='上一页'><a href=\"javascript:"+this.objname+".GetList('" + Uti_ConvertSingleQuote(tag) + "',null, "+(pid-1)+")\"><</a></span> ";
		s += "<span>"+pid+"</span> <span title='下一页'><a href=\"javascript:"+this.objname+".GetList('" + Uti_ConvertSingleQuote(tag) + "',null, "+(parseInt(pid)+1)+")\">></a></span> ";
		s += "<span title='尾页'><a href=\"javascript:"+this.objname+".GetList('" + Uti_ConvertSingleQuote(tag) + "',null,"+totalpage+")\">>></a></span>";
		s += "</div>";
		s += "　"+pid+"/"+totalpage+"页　第<input id='PageIndex' class='PageBox' type='text' style='width:30px;' maxlength='4' title='敲回车跳转' onkeypress=\"if(event.keyCode==13 && !isNaN(parseInt(this.value))){"+this.objname+".GetList('" + Uti_ConvertSingleQuote(tag) + "',null, parseInt(this.value))}\">页";
		s += "<input type='button' value='GO' onclick=\""+this.objname+".GetList(\'" + Uti_ConvertSingleQuote(tag) + "\',null, parseInt(document.getElementById(\'PageIndex\').value))\">"

		return s;
	}
//----------------RssList---------------------------------//	

//----------------Utility---------------------------------//
	function Uti_ConvertSingleQuote(s)
	{
//		if (typeof(s) == "string")
//			return s.replace(/"/g,"&quot;").replace(/\'/g,"\\\'");
//		else
			return s;
	}

	function Uti_HtmlEncode(text)
	{
		return text.replace(/&/g, '&amp').replace(/"/g, '&quot;').replace(/</g, '&lt;').replace(/>/g, '&gt;');
	}

	
	function Uti_PrefixZeroNum(n)
	{
		if (n < 10)
			return "0" + n.toString();
		else
			return n.toString();
	}
	
	function Uti_RFC2Date(rfc822)
	{
		try
		{
			var d = new Date(rfc822);
			return d.getFullYear() + "-" + Uti_PrefixZeroNum(d.getMonth() + 1) + "-" +  Uti_PrefixZeroNum(d.getDate()) + " "+ Uti_PrefixZeroNum(d.getHours()) +":"+ Uti_PrefixZeroNum(d.getMinutes());
		}
		catch(e)
		{
			return "";
		}	
	}