/* util */
function __$A(iterable) {
	if (!iterable) return [];
	var results=[];
	for (var i=0,length=iterable.length; i<length; i++)	results.push(iterable[i]);
	return results;
};
Object.__extend=function(a, b){
  for (var property in b) a[property] = b[property];
  return a;
};
Function.prototype.__bind = function() {
	var __method = this, args = __$A(arguments), object = args.shift();
	return function() {
		return __method.apply(object, args.concat(__$A(arguments)));
	}
};
function __$C(tag) {
	return document.createElement(tag);
};
/* searchContents
 * @id {string}
 * @(opts)
		type: {string} 랜더링 type (search||shopping)
		strlen: {numeric} 문자열 길이 제한
		maxLength: {numeric} 노출 아이템 개수 제한 (null:all)
		count: {numeric} 한페이지에 노출되는 item 개수
		width: {string} wrapper width
		autoAlign: {boolean} wrapper 자동 정렬 허용 여부
		marginBottom: {string} wrapper 아래 여백
		borderColor: {string} border color
		tPadding: {string} 제목 부분 좌우 padding
		cPadding: {string} 컨텐츠 부분 좌우 padding
		imageMargin: {string} 이미지 좌우 간격
		data: {json} 임의의 데이터 지정
		random: {boolean} 리스트 랜덤 출력 여부
		pageRandom: {boolean} 최초 노출 페이지 랜덤 여부
		prevBtnImg: {String} 이전 버튼 이미지
		nextBtnImg: {String} 다음 버튼 이미지
 *
 */
var SearchContents = function(id,opts) {
	this.id = id;
	this.data = null;
	this.item = null;
	this.page = new Array;
	this.current = 0;
	this.impressionLogSet = new Array;
	this.opts = {
		type:'search',
		strlen:30,
		maxLength:0,
		count:5,
		target:'_blank',
		width:'100%',
		autoAlign:true,
		marginBottom:'9px',
		borderColor:'#e6e6e6',
		tPadding:'6px',
		cPadding:'6px',
		imageMargin:'10px',
		data:null,
		random:false,
		pageRandom:true,
		prevBtnImg:'http://img-contents.daum-img.net/movie/2008_home/common/btn_left.gif',
		nextBtnImg:'http://img-contents.daum-img.net/movie/2008_home/common/btn_right.gif'
	};
	Object.__extend(this.opts,opts);
	this.init();
};
SearchContents.prototype = {
	init:function() {
		try {
			switch (this.opts.type) {
				case 'search':{
					this.data = (!!this.opts.data) ? this.opts.data : daum_contents_feature_1;
					break;
				}
				case 'shopping':{
					this.data = (!!this.opts.data) ? this.opts.data : daum_contents_feature_2;
					break;
				}
			}
			if(this.data.item.length == 0) throw({name:'dataError',messahe:'데이터가 없습니다'});
		} catch(e) {
			//alert(e);
			return false;
		}
		this.renderCSS();
		document.write('<div id=\"'+this.id+'_Wrap\"></div>');
		this.container = document.getElementById(this.id+'_Wrap');
		this.container.style.width = this.opts.width;
		this.container.style.margin = '0 auto ' + this.opts.marginBottom + ' auto';
		var widthDiff = this.container.parentNode.clientWidth-this.container.clientWidth;
		if((this.opts.autoAlign && this.container.offsetLeft<widthDiff) && widthDiff>0) {
			this.container.style.marginLeft = Math.round(widthDiff/2).toString() + 'px';
		}
		this.item = this.shuffle();
		this.renderHTML();
	},
	renderCSS:function() {
		var css = '';
		if (!document.getElementById('searchContentsCSS')) {
			css += '<style id=\"searchContentsCSS\" type="text/css">';
			css += '.searchContents {border:1px solid '+this.opts.borderColor+';padding:10px;padding-bottom:0;font-size:12px;background-color:#fff;}\n';
			css += '.searchContents a {color:#333;text-decoration:none;}\n';
			css += '.searchContents a:hover {color:#4E59E7;text-decoration:underline;}\n';
			css += '.searchContents img {border:0;}\n';
			css += '.searchContents h3 {display:block;margin:0;padding:0 '+this.opts.tPadding+';height:22px;border-bottom:1px solid #e6e6e6;font:bold 12px AppleGothic,Gulim,sans-serif;}\n';
			css += '.searchContents h3 .title {float:left;padding-top:1px;}\n';
			css += '.searchContents h3 .navi {float:right;}\n';
			css += '.searchContents h3 .navi img {float:left;margin-right:1px;}\n';
			css += '.searchContents h3 .navi .prevBtn img {margin-right:2px;}\n';
			css += '</style>';
		}
		document.write(css);
		css = '<style id=\"'+this.id+'_CSS\" type="text/css">';
		switch(this.opts.type) {
			case 'search' : {
				css += '#'+this.id+' ul {padding:0 '+this.opts.cPadding+';padding-bottom:10px;margin:7px 0 0 0;list-style:none;line-height:1.2em;text-align:left;}\n';
				css += '#'+this.id+' ul li {display:block;margin-bottom:10px;padding-left:6px;background:transparent url(http://fn.daum-img.net/image/finance/plaza/2009/i_dot01.gif) no-repeat scroll 0 6px}\n';
				css += '#'+this.id+' ul li.last {margin-bottom:0;}\n';
				css += '#'+this.id+' ul li a {line-height:14px;}\n';
				css += '#'+this.id+' ul li a.b {font-weight:bold}\n';
				break;
			}
			case 'shopping' : {
				css += '#'+this.id+' dl {width:65px;text-align:center;margin:12px '+this.opts.imageMargin+' 0 0;display:inline;float:left;}\n';
				css += '#'+this.id+' dl.last {margin-right:0;}\n';
				css += '#'+this.id+' dl dt {padding-bottom:5px;}\n';
				css += '#'+this.id+' dl dt img {margin:0 auto;display:block;}\n';
				css += '#'+this.id+' dl dd {margin:0;text-align:center;}\n';
				css += '#'+this.id+' dl dd a {font:normal 11px/14px AppleGothic,dotum,sans-serif;letter-spacing:-1px;}\n';
				css += '#'+this.id+' dl dd span {padding-top:1px;display:block;color:#4E59E7;}\n';
				break;
			}
		}
		css += '</style>';
		document.write(css);
	},
	renderHTML:function(){
		var getNilKwd = function() {
			var hostname = document.location.hostname;
			var keyword = {
				'bbs.movie.daum.net' : 'movkwd',
				'realestate.daum.net' : 'estatekwd',
				'board.miznet.daum.net' : 'mcookkwd',
				'bbs.music.daum.net' : 'muskwd',
				'tv.media.daum.net' : 'tzonekwd',
				'stock.daum.net' : 'finkwd'
			}
			return keyword[hostname] || '';
		};
		var getSearchLink = function(item) {
			return item.link +'&nil_profile='+getNilKwd();
		};
		this.current = (!!this.opts.pageRandom) ? Math.floor(Math.random()* this.item.length / this.opts.count ) : 0;
		this.container.innerHTML = '';
		var itemCnt = 0;
		var oDiv = __$C('DIV');
		oDiv.id = this.id;
		oDiv.className = 'searchContents';
		var oH3 = __$C('H3');
		if(!!this.data.image) {
			var title = __$C('IMG');
			title.className = 'title';
			title.src = this.data.image;
			title.height = '11';
		} else {
			var title = __$C('SPAN');
			title.className = 'title';
			title.appendChild(document.createTextNode(this.data.name));
		};
		oH3.appendChild(title);
		var oSpan = __$C('SPAN');
		var oA = __$C('A');
		if (this.item.length > this.opts.count) {
			oSpan.className = 'navi';
			oA.title = '이전';
			oA.className = 'prevBtn';
			oA.onclick = this.goPrev.__bind(this);
			oA.innerHTML = '<img src="'+this.opts.prevBtnImg+'">';
			oA.href = 'javascript:;';
			oSpan.appendChild(oA);
			oA = __$C('A');
			oA.title = '다음';
			oA.className = 'nextBtn';
			oA.onclick = this.goNext.__bind(this);
			oA.innerHTML = '<img src="'+this.opts.nextBtnImg+'">';
			oA.href = 'javascript:;';
			oSpan.appendChild(oA);
			oH3.appendChild(oSpan);
		};
		oDiv.appendChild(oH3);
		switch (this.opts.type) {
			case 'search':{
				var strlen = 0;
				var id = 0;
				var oLi;
				var temp;
				for (var i = 0; i < this.item.length / this.opts.count; i++) {
					this.page[i] = __$C('ul');
					this.page[i].style.display = (i == this.current) ? 'block' : 'none';
					this.impressionLogSet.push(new Array);
					this.page[i].innerHTML = '';
					temp = (this.item.length < this.opts.count) ? this.item.length : this.opts.count;
					for (var j = 0; j < this.opts.count; j++) {
						if (!!this.item[itemCnt]) {
							oLi = __$C('LI');
							oLi.className = (j < (temp - 1) && !!this.item[itemCnt+1]) ? '' : 'last';
							this.impressionLogSet[i].push(this.item[itemCnt].id);
							strlen = (j == 0) ? this.opts.strlen - 6 : this.opts.strlen;
							oA = __$C('A');
							oA.title = this.item[itemCnt].title;
							oA.className = (this.item[itemCnt].bold == 'Y') ? 'b' : '';
							oA.href = getSearchLink(this.item[itemCnt]);
							oA.target = this.opts.target;
							oA.onclick = this.clickLog.__bind(this, this.item[itemCnt].id);
							oA.innerHTML = this.cutStr(this.item[itemCnt].title);
							oLi.appendChild(oA);
							this.page[i].appendChild(oLi);
							itemCnt++;
						} else {break;}
					}
					oDiv.appendChild(this.page[i]);
				}
				this.impressionLog();
				break;
			}
			case 'shopping' : {
				var oDl;
				var oDt;
				var oDd;
				var temp;
				for (var i = 0; i < this.item.length / this.opts.count; i++) {
					this.page[i] = __$C('DIV');
					this.page[i].style.height = '121px';
					this.page[i].style.display = (i == this.current) ? 'block' : 'none';
					this.page[i].style.padding = '0 '+this.opts.cPadding+' 0 '+this.opts.cPadding;
					this.page[i].style.margin = '0 auto 0 auto';
					this.impressionLogSet.push(new Array);
					temp = (this.item.length < this.opts.count) ? this.item.length : this.opts.count;
					for (var j = 0; j < this.opts.count; j++) {
						if (!!this.item[itemCnt]) {
							this.impressionLogSet[i].push(this.item[itemCnt].id);
							oDl = __$C('DL');
							oDl.className = (j < (temp - 1) && !!this.item[itemCnt+1]) ? '' : 'last';
							oDt = __$C('DT');
							oDd = __$C('DD');
							oA = __$C('A');
							oA.title = this.item[itemCnt].title;
							oA.href = this.item[itemCnt].link;
							oA.target = this.opts.target;
							oA.onclick = this.clickLog.__bind(this, this.item[itemCnt].id);
							oA.innerHTML = '<img src=\"' + this.item[itemCnt].image_url + '\" width="65" height="65" alt=\"' + this.item[itemCnt].title + '&#13;' + this.item[itemCnt].subtitle + '\">';
							oDt.appendChild(oA);
							oA = __$C('A');
							oA.title = this.item[itemCnt].title;
							oA.href = this.item[itemCnt].link;
							oA.target = this.opts.target;
							oA.onclick = this.clickLog.__bind(this, this.item[itemCnt].id);
							oA.innerHTML = this.item[itemCnt].title + '<span>' + this.item[itemCnt].subtitle + '</span>';
							oDd.appendChild(oA);
							oDl.appendChild(oDt);
							oDl.appendChild(oDd);
							this.page[i].appendChild(oDl);
							itemCnt++;
						} else {break;}
					}
					oDiv.appendChild(this.page[i]);
				}
				this.impressionLog();
				break;
			}
		}
		this.container.appendChild(oDiv);
	},
	shuffle:function() {
		var length = (this.opts.maxLength==0) ? this.data.item.length : this.opts.maxLength;
		var item = new Array(length);
		for(var i=0; i<length; i++) {
			item[i] = (this.data.item[i]);
		}
		if (this.opts.random) {
			item.sort(this.rand);
		}
		return item;
	},
	rand:function() {
		return Math.round(Math.random())-0.5;
	},
	goNext:function() {
		var nextPage = (this.current<this.page.length-1) ? this.current+1 : 0;
		this.page[this.current].style.display = 'none';
		this.page[nextPage].style.display = 'block';
		this.current = nextPage;
		this.impressionLog();
	},
	goPrev:function() {
		var prevPage = (this.current>0) ? this.current-1 : this.page.length-1;
		this.page[this.current].style.display = 'none';
		this.page[prevPage].style.display = 'block';
		this.current = prevPage;
		this.impressionLog();
	},
	cutStr:function(str,len,tail) {
		var len = this.opts.strlen;
		var tail = '..';
		if(!tail) tail="";
		var l=0, c=0, l2=0, u="", s="";
		if(len>0) l2=len;
		for(var i=0;u=str.charCodeAt(i);i++)
		{
			if (u>127) l+=2;
			else l++;
			if(l2) {
				s+=str.charAt(i);
				if(l>=l2)
				{
					if(l>l2) s=s.slice(0,-1);
					return s+tail;
				}
			}
		}
		return l2 ? s:l;
	},
	clickLog:function(id) {
		var oImg = __$C('IMG');
		oImg.src = 'http://feature.daum.net/feature_log/click?feature_id=' + id;
	},
	impressionLog:function() {
		if(!!this.impressionLogSet[this.current]) {
			var oImg = __$C('IMG');
			oImg.src = 'http://feature.daum.net/feature_log/impression?feature_id=' + this.impressionLogSet[this.current].join(',');
		}
		this.impressionLogSet[this.current] = null;
	}
};