var pr = {	
	objTmp: new Object(), // 이전 오브젝트를 담아둘 객체
	printDiv: {},
	printDiv2: {},
	printDivContents: {},
	printUl: {},
	selectfunction: 0,
	selectclass: 0,
	selectelement: 0,
	selectstring: 0,	
	selectobject: 0,
	
	init: function(obj){
		// 객체 저장
		this.objTmp = obj;
		
		// 출력 레이어 생성
		this.printDiv = new Element('div',{
			styles: {
				width: '400px',
				height: '400px',
				position: 'absolute',
				top: '100px',
				left: '100px',
				border: '1px solid #e1e1e1',
				backgroundColor: '#ffffff'			
			}
		}).inject(document.body);
		
		// 제목 레이어 생성
		this.printDiv2 = new Element('div',{
			styles: {
				backgroundColor: '#e1e1e1',
				fontFamily: 'verdana',
				fontSize: '8pt',
				fontWeight: 'bold',
				padding: '3px',
				paddingLeft: '15px',
				height: '15px'
			}
		}).setHTML('Print_r&nbsp;&nbsp;| <a href=\'#\' onclick=\'pr.select("function",event);return false;\'>[function]</a> <a href=\'#\' onclick=\'pr.select("class",event);return false;\'>[class]</a> <a href=\'#\' onclick=\'pr.select("object",event);return false;\'>[object]</a> <a href=\'#\' onclick=\'pr.select("element",event);return false;\'>[element]</a> <a href=\'#\' onclick=\'pr.select("string",event);return false;\'>[string]</a> <a href=\'#\' onclick=\'pr.printDiv.remove();\'>[X]</a>').inject(this.printDiv);
		
		// 드래그 활성화
		new Drag.Move(this.printDiv, {handle: this.printDiv2});
		
		this.printDivContents = new Element('div',{
			styles: {
				fontFamily: 'verdana',
				fontSize: '8pt',
				display: 'block',
				height: (this.printDiv.getSize().size.y - this.printDiv2.getSize().size.y - 1),
				overflow: 'auto'
			}
		}).inject(this.printDiv);
		
		// 1단계 생성	
		this.printUl = new Element('ul').inject(this.printDivContents);
		var printLi;
		var typeVal;
		var tmp;
		var typeObj = $type(obj);
		
		// 배열이나 객체일 경우 리스트를 생성한다
		if (typeObj == 'array' || typeObj == 'object' || typeObj == 'collection' || typeObj == 'element') {
			
			for (var val in obj){

				typeVal = $type(obj[val]);				
				printLi = new Element('li', { id: typeVal});
			
				if (val == 'constructor')
					printLi.setHTML('<b>'+val+'</b>: '+obj.constructor);

				else if (typeVal == 'array' || typeVal == 'object' || typeVal == 'collection' || typeVal == 'element') {
					printLi.setHTML('<b>'+val+'</b>: <a href=\'#\' onclick=\'pr.toggle("'+val+'",this);return false;\'>['+typeVal+']</a>');	
				}
				
				// 함수일때
				else if (typeVal == 'function' || typeVal == 'class') {
					printLi.setHTML('<b>'+val+'</b>: <a href=\'#\' onclick=\'this.parentNode.childNodes[4].toggle();return false;\'>['+typeVal+']</a> <div style=\'display:none;border:1px solid #e1e1e1;padding:5px;color:gray;\'>'+tmp+'</div>');
				}

				// 값일때
				else if ($chk(obj[val]))
					printLi.setHTML('<b>'+val+'</b>['+typeVal+']: ').appendText(obj[val]);
				
				// 삽입
				if(printLi.innerHTML) printLi.inject(this.printUl);
			}
		}
		else if($chk(obj))
			this.printUl.setHTML(typeObj+':<br />'+obj);
		else
			this.printUl.setHTML('Value Undefined!');
	},

	//// 하위 펼침 생성	
	toggle: function(name,target){

		eval('var obj = this.objTmp[\''+name+'\']');
//		eval('var obj = this.objTmp.'+name);
		
		// 이미 펼쳐진것이라면 토글만 한다
		if (target.parentNode.childNodes[3]) 
			target.parentNode.childNodes[3].toggle();
		
		// 생성한다
		else {	
			var printUl = new Element('ul').inject(target.parentNode);
			var printLi;
			var typeVal;
			var typeObj = $type(obj);
			
			// 배열이나 객체일 경우 리스트를 생성한다
			if (typeObj == 'array' || typeObj == 'object' || typeObj == 'collection' || typeObj == 'element') {
				
				for (var val in obj){

					typeVal = $type(obj[val]);					
					printLi = new Element('li', { id: typeVal });
					
					if (val == 'constructor')
						printLi.setHTML('<b>'+val+'</b>: '+obj.constructor);					
				
					else if (typeVal == 'array' || typeVal == 'object' || typeVal == 'collection' || typeVal == 'element') {
						printLi.setHTML('<b>'+name+'.'+val+'</b>: <a href=\'\' onclick=\'pr.toggle("'+name+'.'+val+'",this);return false;\'>['+typeVal+']</a>');	
					}
					
					// 함수일때
					else if (typeVal == 'function' || typeVal == 'class') {
						printLi.setHTML('<b>'+name+'.'+val+'</b>: <a href=\'\' onclick=\'this.parentNode.childNodes[4].toggle();return false;\'>['+typeVal+']</a> <div style=\'display:none;border:1px solid #e1e1e1;padding:5px;color:gray;\'>'+obj[val].toString().replace(/\</ig,'&lt;')+'</div>');
					}
	
					// 값일때
					else if ($chk(obj[val])) 				
						printLi.setHTML('<b>'+name+'.'+val+'</b>['+typeVal+']: ').appendText(obj[val]);
										
					// 삽입
					if(printLi.innerHTML) printLi.inject(printUl);
				}
			}
			else if ($chk(obj))
				printUl.setHTML(typeObj+':<br />'+Obj);
			else
				printUl.setHTML('Value Undefined!');
		}
	},
	
	//// 분류별 보기
	select: function(name, event){		
		eval('var selectValue = this.select'+name+';');
		var toggleArg = selectValue ? 'show' : 'hide';
		var toggleColor = selectValue ? 'black' : 'gray';
		
		// 토글하기
		var selectObj = $$('li');
		if ($chk(selectObj)) {
			selectObj.each(function(item, index){
				if (item.id == name)
					item.toggle(toggleArg);
			});
		}
		
		// text 변화		
		var event = new Event(event);
		event.target.style.color = toggleColor;		
		
		selectValue = selectValue ? 0 : 1;
		eval('this.select'+name+' = selectValue;');			
	}
};