// rss reader

// thanks for futomi's Ajax Book
// UTF-8

//global numbers
var httpObj;               // HTTP Object
var timerId;               // HTTP Timer
var timeout_sec = 10;      // HTTP TimeOut ( second )

var recordLength = 3;			// record length ( test )

// URL
var url_list = new Array();  
url_list['loadDiaryRss'] = 'http://www.hirahira.net/wp_diary/?feed=rss2';
url_list['loadNewsRss'] = 'http://www.hirahira.net/wp_news/?feed=rss2';
url_list['loadHistory'] = 'http://www.hirahira.net/about/history.xml';


// day function for Date Object ( Japanese DayOfWeek )
function _dayOfWeek () {
	var dayOfWeek = new Array ( "日", "月", "火", "水", "木", "金", "土" );
	return ( ' ' + dayOfWeek[ this.getDay() ] + '曜日  ' );
} 
Date.prototype.getDayOfWeek = _dayOfWeek;

// Fill number
function fill( number, length, letter ) {
	var adds = '';
	if ( !length ) { length = 2 }
	if ( !letter ) { letter = '0' }
	var diff = length - ( '' + number ).length;
	if( diff > 0 ) { for ( i = 0; i < diff ; i++ ) { adds += letter } }
	return ( adds + number );
}


//display XML
function dispXmlElement(xml) {

	// root
    var base_node;
    var i;
	var i_end;
	
    for(i=0; i<xml.childNodes.length; i++) {
        if(xml.childNodes[i].tagName) {
            base_tagname = xml.childNodes[i].tagName;
            base_node = xml.childNodes[i];
            break;
        }
    }
    // select rss format from Tag
    if(base_tagname == 'rdf:RDF') {

    } else if(base_tagname == 'rss' && base_node.getAttribute('version') == '2.0' ) {
        base_node = xml.getElementsByTagName('channel')[0];
    } else {
        alert('Unknown RSS Format : ' + item_tagname);
        return false;
    }
    // extrace all item List
	var items = getElements( base_node,  'item' );
	
    // description
    var displayframe = document.getElementById('displayframe');
    var itemframe = document.getElementById('itemframe');
    for (i=0; i<items.length; i++) {
        var item_title;
        var item_link;
        var item_desc = '';
        var item_date = '';
        var j=0;
        for(j=0; j<items[i].childNodes.length; j++) {
            var child = items[i].childNodes[j];
            var child_tag = items[i].childNodes[j].tagName;

            if(child_tag == 'title') {
                item_title = child.firstChild.nodeValue;

            } else if(child_tag == 'link') {
                item_link = child.firstChild.nodeValue;

            } else if(child_tag == 'description') {
                if(child.firstChild) {
                    item_desc = child.firstChild.nodeValue;
                }

            } else if(child_tag == 'dc:date') {      // RSS1.0
                if(child.firstChild) {
                    item_date = child.firstChild.nodeValue;
                }
            } else if(child_tag == 'pubDate') {      // RSS2.0
                if(child.firstChild) {
                    item_date = child.firstChild.nodeValue;
                }
            }
        }

		// display time with Japanese Style
		var date = new Date ( item_date );
		with( date ){
			var dateDays = new Array ( getFullYear() , (getMonth() + 1), getDate() ).join('.');
			var dateTime = new Array ( fill(getHours()), fill(getMinutes()), fill(getSeconds()) ).join(':');
			item_date = dateDays + getDayOfWeek() + dateTime;
		}
		
		
		
        // tree from templete 
        var new_itemframe = itemframe.cloneNode(true);
        new_itemframe.removeAttribute('id');
        new_itemframe.id = 'item' + i;
		
        // write documents to tree
        var divs = new_itemframe.getElementsByTagName('div');
        divs[0].innerHTML = '<a href="' + item_link + '" target="_blank">' + item_title + '</a>';
        divs[2].innerHTML = item_desc;
		divs[2].id = 'comment' + i;
		divs[1].innerHTML = item_date;

	    // display frame
        displayframe.appendChild(new_itemframe);
        new_itemframe.style.display = 'block';
		

    }
    // enable buttons
    document.getElementById('loadDiaryRss').disabled = false;
    document.getElementById('loadNewsRss').disabled = false;
	document.getElementById('loadHistory').disabled = false;
	

	// check box
	hotOnly();
	descSwitch();

	// status change
	
}

function loadXml(e) {
    // disable buttons
    document.getElementById('loadDiaryRss').disabled = true;
    document.getElementById('loadNewsRss').disabled = true;
	document.getElementById('loadHistory').disabled = true;
	
    // select button
    var target_button = getTargetNode(e);
	
	// delete current frame
    deleteAll ( 'displayframe' );

    // request
    httpXmlRequest(url_list[target_button.id], 'GET', '', dispXmlElement, httpError);
    // stop default propagation
    stopDefaultAndPropagation(e);
    return false;
}

function deleteAll( frame ){
	var displayframe = document.getElementById( frame );
	    while(displayframe.lastChild) {
        displayframe.removeChild(displayframe.lastChild);
    }
}

function getElements( base_node, tag ){
	var items = base_node.getElementsByTagName( tag );
	recordLength = items.length;
	return items;
}

function httpError(error) {
    alert(error);
}

// request XML
function httpXmlRequest(target_url, method, data, success_func, error_func) {
    try {
        if(window.XMLHttpRequest) {
            httpObj = new XMLHttpRequest();
        } else if(window.ActiveXObject) {
            httpObj = new ActiveXObject("Microsoft.XMLHTTP");
        } else {
            httpObj = false;
        }
    } catch(e) {
        httpObj = false;
    }
    if(! httpObj) {
        httpObjGenerateFail();
    }
    timerId = setInterval('timeoutCheck()', 1000);
    httpObj.open(method, target_url, true);
    httpObj.onreadystatechange = function() {
        if (httpObj.readyState == 4) {
            clearInterval(timerId);
            if (httpObj.status == 200) {
                success_func(httpObj.responseXML);
            } else {
                error_func(httpObj.status + ' : ' + httpObj.statusText);
                return false;
            }
        }
    }
    httpObj.send(data);
}

// HTTP timeout
function timeoutCheck() {
    timeout_sec --;
    if(timeout_sec <= 0) {
        clearInterval(timerId);
        httpObj.abort();
        alert('time out');
        return false;
    }
}

// stop default propagation
function stopDefaultAndPropagation(e) {
    if(e.stopPropagation) {
        e.stopPropagation();
    }
    if(window.event) {
        window.event.cancelBubble = true;
    }
    if(e.preventDefault) {
        e.preventDefault();
    }
    if(window.event) {
        window.event.returnValue = false;
    }
}

function getTargetNode(e) {
    var target_node;
    if(e.target) {
      target_node = e.target;
    } else {
      target_node = e.srcElement;
    }
    // Safari
    if (target_node.nodeType == 3) {
        target_node = target_node.parentNode;
    }
    return target_node;
}

//description on/off
function descSwitch() {
	var display = 'none';
	if( document.getElementById('descRadio1').checked == true ) { display = 'block'; } else { display = 'none' ;}
	for (i=0; i<recordLength; i++) {
		itemNumber = 'comment' + i;
		document.getElementById(itemNumber).style.display = display;
		}

}

//max articles
function hotOnly() {
	var itemNumber;
	
	var count = document.getElementById('hotCount');
	var number = eval(count.value);
	
	if ( !recordLength ) { recordLength = 0 }
	
	// check All button
	if( document.getElementById('hotNewsButton').checked == true) { 
		document.getElementById('hotCount').disabled = true ;
		
		for ( i=0; i<recordLength; i++) {
			itemNumber = 'item' + i;
			document.getElementById(itemNumber).style.display = 'block'
			}
		number = recordLength;
			
	} else {
		document.getElementById('hotCount').disabled = false ;
		if ( number > recordLength ) { number = recordLength; } 
		
		for ( i=0; i<number; i++) {
			itemNumber = 'item' + i;
			document.getElementById(itemNumber).style.display = 'block';
		}
		for ( i=number; i<recordLength; i++ ) {
			itemNumber = 'item' + i;
			document.getElementById(itemNumber).style.display = 'none';
		}

	}
	count.value = number;
}

// number of articles
function popUp(e) {
	var text = document.getElementById('hotCount');
	var number = eval(text.value);
	
	if ( !number ) { number = 0 }
	if ( number > recordLength ) { number = recordLength }
	 
	text.value = number;
	hotCount = number;
	hotOnly();
}


// on Load
function setListeners(e) {
    var loadDiaryRss = document.getElementById('loadDiaryRss');
    var loadNewsRss = document.getElementById('loadNewsRss');
	var loadHistory = document.getElementById('loadHistory');
	
	var descriptionOnOff = document.getElementById('descRadio1');
	var hotNewsButton = document.getElementById('hotNewsButton');
	var text = document.getElementById('hotCount');
		
    addListener(loadDiaryRss, 'click', loadXml, false);
    addListener(loadNewsRss, 'click', loadXml, false);
	addListener(loadHistory, 'click', loadXml, false);
	
	addListener(descriptionOnOff, 'click', descSwitch, false);
    addListener(text, 'keyup', popUp, false);
	addListener(hotNewsButton, 'click', hotOnly, false);
}

// Can you use listener ?
function addListener(elem, eventType, func, cap) {
    if(elem.addEventListener) {
        elem.addEventListener(eventType, func, cap);
    } else if(elem.attachEvent) {
        elem.attachEvent('on' + eventType, func);
    } else {
        alert('error : your browser is NOT support event-listerner');
        return false;
    }
}

// open Window
addListener(window, 'load', setListeners, false);
