/**
 *  @(#)rssParser.js    V0.1    2007/03/15
 *
 *  rss XML Parser extend Prototype.js v1.5
 *  Copyright 2005-2007 by VRICKS, All Right Reserved.
 *  http://www.vricks.com
 *
 *  GNU LESSER GENERAL PUBLIC LICENSE
 *  TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
 *
 *  @Author Woo-Chang Yang, routine@vrick.com
 */

function rssParser(xml) {
    	var v = Try.these(
		// Rss 버전을 가져 옵니다.
		function() { return xml.getElementsByTagName("rss")[0].getAttribute("version") ? "2.0" : false; },
		function() { return xml.getElementsByTagName("rdf:RDF")[0].getAttribute("xmlns") ? "1.0" : false; },
		function() { return xml.getElementsByTagName("feed")[0].getAttribute("xmlns") ? "atom" : false; }
	)
	switch(v) {
		case "2.0"	: return new rssParser2(xml); break;
		case "1.0"	: return new rssParser1(xml); break;
		case "atom"	: return new rssParserAtom(xml); break;
		default		: return false;
	}
};

// Rss 2.0 Calss
var rssParser2 = Class.create();
Object.extend(rssParser2.prototype, {
	initialize	: function(xml) {
			
		var channel	= xml.getElementsByTagName("channel")[0];
		this.title	= channel.getElementsByTagName("title")[0].firstChild.nodeValue;
		this.link	= channel.getElementsByTagName("link")[0].firstChild.nodeValue;
		/*	
		if(channel.getElementsByTagName("image")[0]) {
			var images	= channel.getElementsByTagName("image")[0];
			this.image	= {
				"url"	: images.getElementsByTagName("url")[0].firstChild.nodeValue,
				"title"	: images.getElementsByTagName("title")[0].firstChild.nodeValue,
				"link"	: images.getElementsByTagName("link")[0].firstChild.nodeValue
			};
		}
		else {
			this.image = {
				"url"	: "",
				"title"	: "",
				"link"	: ""
			}
		}
		this.description	= Try.these (
			function() { return channel.getElementsByTagName("description")[0].firstChild.nodeValue; },
			function() { return "" }
		);
		this.language		= Try.these (
			function() { return channel.getElementsByTagName("language")[0].firstChild.nodeValue; },
			function() { return channel.getElementsByTagName("dc:language")[0].firstChild.nodeValue; },
			function() { return ""}
		);
		this.pubDate		= Try.these(
			function() { return channel.getElementsByTagName("pubDate")[0].firstChild.nodeValue; },
			function() { return channel.getElementsByTagName("lastBuildDate")[0].firstChild.nodeValue; },
			function() { return ""; }
		);
		*/		
		var items = new Array();
		$A(channel.getElementsByTagName("item")).each(function(i){
			items.push({
				/*
				"category" : Try.these(
					function() { return i.getElementsByTagName("category")[0].firstChild.nodeValue; },
					function() { return "" }
				),*/
				"title" : i.getElementsByTagName("title")[0].firstChild.nodeValue,
				"link"	: i.getElementsByTagName("link")[0].firstChild.nodeValue
				/*
				"description" : Try.these (
					function() { return i.getElementsByTagName("description")[0].firstChild.nodeValue; },
					function() { return "" }
				),
				"pubDate" : Try.these (
					function() { return i.getElementsByTagName("pubDate")[0].firstChild.nodeValue; },
					function() { return i.getElementsByTagName("dc:date")[0].firstChild.nodeValue; },
					function() { return "" }
				)*/
			})
		})
		this.item = items;
	}
});

var rssParser1 = Class.create();
Object.extend(rssParser1.prototype, {
	initialize	: function(xml) {
		
		var channel	= xml.getElementsByTagName("channel")[0];
		var images	= xml.getElementsByTagName("image")[0];
		this.title	= channel.getElementsByTagName("title")[0].firstChild.nodeValue;
		this.link	= channel.getElementsByTagName("link")[0].firstChild.nodeValue;
		this.image	= {
			"url"	: images.getElementsByTagName("url")[0].firstChild.nodeValue,
			"title"	: images.getElementsByTagName("title")[0].firstChild.nodeValue,
			"link"	: images.getElementsByTagName("link")[0].firstChild.nodeValue
		};
		this.description	= channel.getElementsByTagName("description")[0].firstChild.nodeValue;
		this.language		= channel.getElementsByTagName("dc:language")[0].firstChild.nodeValue;
		this.pubDate		= channel.getElementsByTagName("dc:date")[0].firstChild.nodeValue;
			
		var items			= xml.getElementsByTagName("item");
		var itemValue		= new Array();
		for(var i = 0; i < items.length; i++) {
			itemValue.push({
				"category"		: items[i].getElementsByTagName("category")[0].firstChild.nodeValue,
				"title"			: items[i].getElementsByTagName("title")[0].firstChild.nodeValue,
				"link"			: items[i].getElementsByTagName("link")[0].firstChild.nodeValue,
				"description"	: items[i].getElementsByTagName("description")[0].firstChild.nodeValue,
				"pubDate"		: items[i].getElementsByTagName("dc:date")[0].firstChild.nodeValue
			});
		};
		this.item = itemValue;
	}
});

var rssParserAtom = Class.create();
Object.extend(rssParserAtom.prototype, {
	initialize	: function(xml) {
		
		this.title	= xml.getElementsByTagName("title")[0].firstChild.nodeValue;
		this.link	= xml.getElementsByTagName("link")[0].getAttribute("href");
		this.image	= {
			"url"	: "",
			"title"	: "",
			"link"	: ""
		};
		this.description	= xml.getElementsByTagName("info")[0].firstChild.nodeValue;
		this.language		= "";
		this.pubDate		= xml.getElementsByTagName("modified")[0].firstChild.nodeValue;
		
		var items			= xml.getElementsByTagName("entry");
		var itemValue		= new Array();
		for(var i = 0; i < items.length; i++) {
			itemValue.push({
				"category"		: "",
				"title"			: items[i].getElementsByTagName("title")[0].firstChild.nodeValue,
				"link"			: items[i].getElementsByTagName("link")[0].getAttribute("href"),
				"description"	: items[i].getElementsByTagName("summary")[0].firstChild.nodeValue,
				"pubDate"		: items[i].getElementsByTagName("created")[0].firstChild.nodeValue
			});
		};
		this.item = itemValue;
	}
});


function getRss(rss) {
    //Element.show("nature");
    var uri ='';
    /*
    $("rssList1").innerHTML = $("loading").innerHTML;
    $("rssList2").innerHTML = $("loading").innerHTML;
    $("rssList3").innerHTML = $("loading").innerHTML; 
    */   
    if(rss=="insilicogen"){  uri ="/blog/rss";}
    if(rss=="science"){  uri ="/rss/scienceblog.xml";}
    if(rss=="nature"){  uri ="/rss/nature.xml";}
    
    new Ajax.Request(
        uri,
	{
	    method : "get",
        onSuccess : function(req) {
            var xml = req.responseXML;
            var xml2  = rssParser(xml);
            if(!xml) { alert("RSS address is invalid"); $("contents").innerHTML = ""; return; }
            printHtml(xml2, rss);

	},
	    onFailure : function() {
            alert("RSS requeset failed");
            $("contents").innerHTML = "";
	}
    }
    );
}

function printHtml(xml, param) {
    var d = new Date(xml.pubDate);
    var cont ='';
    if(navigator.userAgent.indexOf('MSIE') >= 0 && param=='insilicogen'){
        cont = '<br/>';
    }else if(navigator.userAgent.indexOf('Firefox') >= 0){
        cont='';
    }
    for(var i = 0; i < xml.item.length; i++) {

            var subtitle= xml.item[i].title;
           
            if(subtitle.bytes() > 40){ subtitle =subtitle.cut(40);}
            cont += '<br/><a href="' + xml.item[i].link +'" target="_blank">' + subtitle + '</a>';
            if(i == 2) break;
    };
    

    if(param =='insilicogen'){
        $("rssList1").innerHTML = cont;
    }
    if(param =='science'){
        $("rssList2").innerHTML = cont;
    }
    if(param =='nature'){
        $("rssList3").innerHTML = cont;
    }
}
function getNotice() {
    var uri = "/php/get_notice.php";
    new Ajax.Request(
        uri,
	{
	method : "get",
        onSuccess : function(req) {
	    var json = eval("(" + req.responseText + ")");
            if(!json) { alert("Request address is invalid"); $("latest_news").innerHTML = ""; return; }
            printNews(json);

	},
	onFailure : function() {
            alert("requeset failed");
            $("latest_news").innerHTML = "";
	}
    }
    );
}
function printNews(json) {
    var cont = "<ul id='news'>";
    //cont +="<li><li>";  

    for(var i = 0; i < json.length; i++) {
	    //var link_root ="/gb/bbs/board.php?bo_table=notice";
	    var link_root ="/wiki/Announcement";
        var title =json[i].subject;
        var subtitle =title;
        if(subtitle.bytes() > 50){ subtitle =subtitle.cut(50);}
        var no   = json[i].no;
	    var link  = link_root + no;
        var new_image  = "<img src='/static/images/new_button.jpg'/>";
        var new_tag = json[i].date_tag;
        if(new_tag =='true'){ }else{ new_tag =''; }
        cont += '<li><a href="' + link_root +'" >' + subtitle + '</a>&nbsp;&nbsp;' + new_image + '</li>';
        if(i == 3) break;
    };
    cont+="</ul>";
    $("latest_news").innerHTML = cont;
}




function koreanCheck(str) {
    var i;
    var ch;
   
    for (i=0;i<str.length;i++) {
        ch = escape(str.charAt(i));        //ISO-Latin-1 문자셋으로 변경

        if (strCharByte(ch) != 2) { //한글이 아닐 경우
            return;
        }
    }
}

function strCharByte(chStr) {
    if (chStr.substring(0, 2) == '%u') {
        if (chStr.substring(2,4) == '00')
            return 1;
        else
            return 2;        //한글
    } else if (chStr.substring(0,1) == '%') {
        if (parseInt(chStr.substring(1,3), 16) > 127)
            return 2;        //한글
        else
            return 1;
    } else {
            return 1;
    }
}


       /**
        * string String::cut(int len)
        * 글자를 앞에서부터 원하는 바이트만큼 잘라 리턴합니다.
        * 한글의 경우 2바이트로 계산하며, 글자 중간에서 잘리지 않습니다.
        */
        String.prototype.cut = function(len) {
                var str = this;
                var l = 0;
                for (var i=0; i<str.length; i++) {
                        l += (str.charCodeAt(i) > 128) ? 2 : 1;
                        if (l > len) return str.substring(0,i) + "...";
                }
                return str;
        }
        /**
        * bool String::bytes(void)
        * 해당스트링의 바이트단위 길이를 리턴합니다. (기존의 length 속성은 2바이트 문자를 한글자로 간주합니다)
        */
        String.prototype.bytes = function() {
                var str = this;
                var l = 0;
                for (var i=0; i<str.length; i++) l += (str.charCodeAt(i) > 128) ? 2 : 1;
                return l;
        }
        //alert(aaa.cut(15));
        //(bbb.bytes() > 20) 







