/**
 * Carabo Search Class
 *
 * @copyright  2007 Carabo Project
 * Created  on  2007/02/08
*/
var CrbSearchPanel = Class.create();
CrbSearchPanel.spinner = null;
CrbSearchPanel.initOpened = false;
CrbSearchPanel.prototype = {
	initialize : function(elm){
		this.elm = elm;
		Event.observe(this.elm, 'click', this.change.bindAsEventListener(this), false);
		this.elm.onmouseover = this._addUnderLine.bindAsEventListener(this);
		this.elm.onmouseout = this._removeUnderLine.bindAsEventListener(this);
		this._closed = true;
		this._init();
	},

	_init : function(){
		if(CrbSearchPanel.initOpened == true){
			this.openPanel();
		}
	},

	addCloseItem : function(closeItem){
		this.closeItem = closeItem;
		this.closeItem.onclick = this.change.bindAsEventListener(this);
		this.closeItem.onmouseover = this._addUnderLine.bindAsEventListener(this);
		this.closeItem.onmouseout  = this._removeUnderLine.bindAsEventListener(this);
	},

	_addUnderLine : function(event){
		var elm = Event.element(event);
		if(elm.tagName.toUpperCase() != "H2"){
			return;
		}
		Element.setStyle(elm, {"text-decoration" : "underline"});
	},

	_removeUnderLine : function(event){
		var elm = Event.element(event);
		if(elm.tagName.toUpperCase() != "H2"){
			return;
		}
		Element.setStyle(elm, {"text-decoration" : "none"});
	},

	change : function(event){
		Event.stop(event);
		this._closed == true? this.openPanel() : this.closePanel();
	},

	openPanel : function(){
		var cls = 'searchbox01 text';
		var parent = this._findTagName(this.elm, cls);
		Element.removeClassName(parent, 'searchbox01');
		Element.removeClassName(parent, 'text');
		Element.addClassName(parent, 'searchbox02 text');
		this._addSpinner(parent);
		this._closed = false;
	},

	closePanel : function(){
		var cls = 'searchbox02 text';
		var parent = this._findTagName(this.elm, cls);
		Element.removeClassName(parent, 'searchbox02');
		Element.removeClassName(parent, 'text');
		Element.addClassName(parent, 'searchbox01 text');
		var collapseElement = this._getCollapseElement(parent);
		Element.setStyle(collapseElement, {"display" : "none"});
		this._closed = true;
	},

	addCusor : function(elm){
		Element.setStyle(elm, {
							"cursor" : "hand",
							"cursor" : "pointer"
		});
	},

	_addSpinner : function(elm){
		if(!CrbSearchPanel.spinner) return;
		var spinner = document.createElement('div');
		spinner.className = "searchbox21 text";
		spinner.innerHTML = CrbSearchPanel.spinner;
		elm.parentNode.appendChild(spinner);
		this._removeSpinner.callTimeout(500, this, elm);
	},

	_removeSpinner : function(elm){
		if(!CrbSearchPanel.spinner) return;
		var collapseElement = this._getCollapseElement(elm);
		Element.remove(elm.parentNode.lastChild);
		Element.setStyle(collapseElement, {"display" : "block"});
	},

	_findTagName : function(element, className){
	    while (element.parentNode && (!element.className ||
					(element.className.toUpperCase() != className.toUpperCase()))){
			element = element.parentNode;
		}
		return element;
	},

	_getCollapseElement : function(elm){
		var next = elm.nextSibling;
		while(next.nodeType != 1){
			next = next.nextSibling;
		}
		return next;
	}
}

CrbSearchPanel.tmpl = function(data)
{
	var html = document.createElement('li');
	var source = '';
	source += '	<div class="searchbox01 text">';
	source += '		<div class="searchbox31">';
	source += '			<h2 class="open texts">' + data.title + '</h2>';
	source += '			<p class="link texts"><a href="' + data.feed_url + '" target="_blank">' + data.feed_title + '</a></p>';
	source += '			<p class="days texts">' + data.publish_date + '</p>';
	source += '		</div>';
	source += '	</div>';
	if(CrbSearchPanel.initOpened){
		source += '	<div class="searchbox22">';
	} else {
		source += '	<div class="searchbox22" style="display: none">';
	}
	source += '		<div class="inbox01 text">';
	source += '			<h3 class="bold"><a href="' + data.link + '" target="_blank">' + data.title + '</a></h3>';
	if(data.author){
		source += '			<p class="texts righttxt">作成者 : ' + data.author + '</p>';
	}
	if(data.description){
		source += '			<p class="text">' + data.description + '</p>';
	} else {
		source += '			<p class="text">本文はありません</p>';
	}
	source += '		</div>';
	source += '		<p class="inbox02 texts"><h2 class="close texts">本文を閉じる</h2></p>';
	source += '		<ul class="sealist03 texts">';
	source += '			<li><a href="' + data.link + '" target="_blank">元記事を確認</a></li>';
	source += '			<li>｜<a href="/">TOPへ</a></li>';
	source += '		</ul>';
	source += '	</div>';
	html.innerHTML = source;
	return html;
}

CrbSearchPanel.infoTmpl = function(data)
{
	var html = document.createElement('li');
	var source = '';
	source += '	<div class="searchbox02 text">';
	source += '		<div class="searchbox31">';
	source += '			<h2 class="open texts">' + data.title + '</h2>';
	source += '			<p class="days texts">' + data.display_date + '</p>';
	source += '		</div>';
	source += '	</div>';
	source += '	<div class="searchbox22">';
	source += '		<div class="inbox01 text">';
	source += '			<h3 class="bold">' + data.title + '</a></h3>';
	source += '			<p class="text">' + data.body + '</p>';
	source += '		</div>';
	source += '	</div>';
	html.innerHTML = source;
	return html;
}

Function.prototype.applyTimeout = function (ms, self, args) {
  var f = this;
  return setTimeout(
    function () {
      f.apply(self, args);
    },
    ms);
};

Function.prototype.callTimeout = function (ms, self) {
  return this.applyTimeout(
      ms,
      self,
      Array.prototype.slice.call(arguments, 2));
};

Function.prototype.applyInterval = function (ms, self, args) {
  var f = this;
  return setInterval(
    function () {
      f.apply(self, args);
    },
    ms);
};

Function.prototype.callInterval = function (ms, self) {
  return this.applyInterval(
      ms,
      self,
      Array.prototype.slice.call(arguments, 2));
};


