var XmlReader = Class.create({
	initialize: function(xmlSource) {
		this.tips = new Array();
		this.pubDates = new Object();
		this.urls = new Object();
		var reader = this;
		this.request = new Ajax.Request(xmlSource, {
			method: "get",
			onSuccess: function(response) {
				reader.parseResponse(response);
				reader.createCalendar();
				reader.createControls();
			},
			onFailure: function() {
				// failure handling
			},
			onException: function(request, e) {
				// exception handling
			}
		});
	},
	parseResponse: function(response) {
		try {
			var now = new Date();
			var xmlDoc = response.responseXML;
			var items = xmlDoc.getElementsByTagName("item");
			for(var i=0; i<items.length; i++) {
				var tip = new Tip(items[i]);
				var d = new Date(Date.parse(tip.pubDate));
				if (d>now) continue;
				tip.pubDate = d;
				this.tips.push(tip);
			}
			this.quickSortByKey(this.tips,"pubDate");
			for(var i=0; i<this.tips.length; i++) {
				var tip = this.tips[i];
				this.pubDates[this.getDateString(tip.pubDate)] = i;
				this.urls[this.getUrlPostfix(tip.link)] = i;
			}
		}
		catch(e) {
		}
	},
	createCalendar: function(y,m) {
		var reader = this;
		var actdt = (this.urls[this.getUrlPostfix(document.location.href)]!=null?this.tips[this.urls[this.getUrlPostfix(document.location.href)]].pubDate:new Date());
		var actdtstr = this.getDateString(actdt);
		y = y!=null?y:actdt.getFullYear();
		m = m!=null?m:actdt.getMonth();
		var ms = ["január", "február", "március", "április", "május", "június", "július", "augusztus", "szeptember", "október", "november", "december"];
		$("calendar_month").innerHTML = (y!=actdt.getFullYear()?y+". ":"")+ms[m];
		var py = y;
		var pm = m-1;
		if (pm<0) {
			py = y-1;
			pm = 11;
		}
		$("calendar_prev").onclick = function() {
			reader.createCalendar(py,pm);
			return false;
		}
		var ny = y;
		var nm = m+1;
		if (nm>11) {
			ny = y+1;
			nm = 0;
		}
		$("calendar_next").onclick = function() {
			reader.createCalendar(ny,nm);
			return false;
		}
		var offset = -1;
		var prefix = "calendar_cell_";
		var rows = $$("tr.calendar_row");
		var cells = $$("tr.calendar_row td");
		for (var i=0;i<cells.length;i++) {
			var cell = cells[i];
			cell.className = "inactive";
			cell.innerHTML = "";
			if (i<rows.length) {
				rows[i].hide();
			}
		}
		for (var i=1;i<=31;i++) {
			var dt = new Date(y,m,i);
			if (dt.getMonth()!=m) {
				break;
			}
			if (offset==-1) {
				offset = dt.getDay()==0?6:dt.getDay()-1;
			}
			var column = (offset+i-1)%7;
			var row = Math.floor((offset+i-1)/7);
			var cell = cells[row*7+column];
			var dtstr = this.getDateString(dt);
			if (this.pubDates[dtstr]!=null) {
				var a = document.createElement("a");
				cell.appendChild(a);
				a.id = prefix+dtstr;
				a.className = (actdtstr==dtstr?"active":"");
				a.innerHTML = i;
				a.href = "";
				a.onclick = function() {
					reader.goto(reader.tips[reader.pubDates[this.id.substring(prefix.length)]].link);
					return false;
				}
			}
			else {
				cell.innerHTML = i;
				if (actdtstr==dtstr) {
					cell.className = "active";
				}
			}
			rows[row].show();
		}
		$("calendar").show();
	},
	createControls: function() {
		var reader = this;
		var idx = this.urls[this.getUrlPostfix(document.location.href)];
		if (idx!=null) {
			var tip = this.tips[idx];
			var first = this.tips[0];
			var last = this.tips[this.tips.length-1];
			var previous = (idx>0?this.tips[idx-1]:null);
			var next = (idx<this.tips.length-1?this.tips[idx+1]:null);
			var controls = $$("div.pager > div[class='lapozas'] a");
			for (var i=0;i<4;i++) {
				switch (i) {
					case 0:
						controls[i].className = controls[i+4].className = (first!=null && idx>0?"active":"inactive");
						controls[i].onclick = controls[i+4].onclick = function() {
							if (this.className=="active") {
								reader.goto(first.link);
							}
							return false;
						}
						break;
					case 1:
						controls[i].className = controls[i+4].className = (previous!=null?"active":"inactive");
						controls[i].onclick = controls[i+4].onclick = function() {
							if (this.className=="active") {
								reader.goto(previous.link);
							}
							return false;
						}
						break;
					case 2:
						controls[i].className = controls[i+4].className = (next!=null?"active":"inactive");
						controls[i].onclick = controls[i+4].onclick = function() {
							if (this.className=="active") {
								reader.goto(next.link);
							}
							return false;
						}
						break;
					case 3:
						controls[i].className = controls[i+4].className = (last!=null && idx<this.tips.length-1?"active":"inactive");
						controls[i].onclick = controls[i+4].onclick = function() {
							if (this.className=="active") {
								reader.goto(last.link);
							}
							return false;
						}
						break;
				}
				if (controls[i].className=="active") {
					controls[i].href="";
					controls[i+4].href="";
				}
			}
		}
	},
	getDateString: function(d) {
		if (d==null) {
			return null;
		}
		var dt = ""+d.getFullYear();
		dt += (d.getMonth()+1<10?"0"+(d.getMonth()+1):d.getMonth()+1);
		dt += d.getDate();
		return dt;
	},
	getUrlPostfix: function(fullurl) {
		if (fullurl==null || fullurl.length==0) {
			return null;
		}
		var idx = fullurl.lastIndexOf("/");
		if (idx==fullurl.length-1) {
			fullurl = fullurl.substring(0,fullurl.length-1);
			idx = fullurl.lastIndexOf("/");
		}
		return ((idx!=-1)&&(idx<fullurl.length-1)?fullurl.substring(idx+1):fullurl);
	},
	goto: function(url) {
		document.location.href = url;
	},
	quickSortByKey: function(arr, key) {
		var left = 0;
		var right = arr.length-1;
		var top = 1;
		var lStack = new Array();
		var rStack = new Array();
		var i, j, n, k, x, tmp;
		lStack[top] = left;
		rStack[top] = right;
		while (top!=0) {
			left = lStack[top]; 
			right = rStack[top]; 
			top--;
	    	while (left < right) {
				i = left;
				j = right;
				n = left + right;
				k = Math.floor(n/2);
				x = arr[k][key];
		  		while (i<=j) {
	        		while (arr[i][key] < x) {
						i++;
					}
					while (arr[j][key] > x) {
						j--;
					}
					if (i <= j) {
						tmp = arr[j];
						arr[j] = arr[i];
						arr[i] = tmp;
						i++; 
						j--;
					}
				}
				if ((j-left)<(right-i)) {
					if(i < right){ 
						top++;
						lStack[top] = i;
						rStack[top] = right;
					}
					right = j;
				}
				else {
					if (left < j) {
						top++;
						lStack[top] = left;
						rStack[top] = j; 
					}
					left = i;
				}
			}
		}
	}
}); 

var Tip = Class.create({
	initialize: function(itemXml) {
		var node=itemXml.firstChild;
		while (node) {
			try {
				this[node.nodeName] = (node.nodeType==1?node.firstChild.nodeValue:node.text);
				node=node.nextSibling;
			}
			catch(e) {
				break;
			}
		}
	}
});

