// ==UserScript==
// @name		LingrLogGetter
// @namespace	http://www.kanasansoft.com/
// @include		http://www.lingr.com/room/*
// @include		https://www.lingr.com/room/*
// ==/UserScript==

(function(){

	if(window.self!=window.top){
		return;
	}

	var PARAM_HANDLE="handle";
	var PARAM_MESSAGE="message";

	var ID_MESSAGES="messages";

	var CLASS_NAME_HANDLE="publicHandle";
	var CLASS_NAME_MESSAGE="publicMessageText";

	var CLASS_NAME_HANDLE_TEXT="handleText";
	var CLASS_NAME_MESSAGE_TEXT_CONTAINER="messageTextContainer";

	var ELEMENT_NODE=document.ELEMENT_NODE||1;
	var TEXT_NODE=document.ELEMENT_TEXT||3;

	var TAG_NAME_PRE="pre";//get textContent

	var TAG_NAME_A="a";//get link url
	var TAG_NAME_IMAGE="img";//get image url or emoticon
	var TAG_NAME_OBJECT="object";//get mp3 or youtube

	var CLASS_NAME_EMOTICON="emoticon";//get alt

	var CLASS_NAME_MP3="mp3";//get mp3
	var CLASS_NAME_YOUTUBE="youTube";//get youtube

	var URL_YOUTUBE_PREFIX="http://www.youtube.com/watch?v=";

	var lookupHandle=function(className){return className==CLASS_NAME_HANDLE};
	var lookupMessage=function(className){return className==CLASS_NAME_MESSAGE};

	var analysisHandle=function(node){
		var rtn=[];
		var buf;
		var time=node.title;
		var handle=node.getElementsByClassName(CLASS_NAME_HANDLE_TEXT)[0].textContent;
		buf={"messageType":PARAM_HANDLE,"messageValue":handle,"dateTime":time};
		rtn.push(buf);
		return rtn;
	}

	var analysisMessage=function(node){

		var rtn=[];
		var buf;
		var time=node.title;

		//multilines mode
		var pres=node.getElementsByClassName(CLASS_NAME_MESSAGE_TEXT_CONTAINER)[0].getElementsByTagName(TAG_NAME_PRE);
		if(pres.length!=0){
			buf={"messageType":PARAM_MESSAGE,"messageValue":pres[0].textContent,"dateTime":time};
			rtn.push(buf);
			//return
			return rtn;
		}

		//singleline mode
		var messages=node.getElementsByClassName(CLASS_NAME_MESSAGE_TEXT_CONTAINER)[0].childNodes;
		messages=Array.filter(messages,function(){return true});
		if(messages[0].nodeType==TEXT_NODE&&
			/^(\t|\r|\n| )+$/.test(messages[0].textContent)){
			messages.shift();
			//continue
		}
		var str="";
		while(messages.length>0){
			var message=messages.shift();
			switch(message.nodeType){
			case TEXT_NODE:
				//text
				str+=message.textContent;
				break;
			case ELEMENT_NODE:
				//element
				switch(message.tagName.toLowerCase()){
				case TAG_NAME_A:
					//link
					str+=message.href;
					break;
				case TAG_NAME_IMAGE:
					//image
					if(message.className==CLASS_NAME_EMOTICON){
						//emoticon
						str+=message.alt;
					}else{
						//other image
						str+=message.src;
					}
					break;
				case TAG_NAME_OBJECT:
					//object
					var deleteTagNumber=0;
					switch(message.className){
					case CLASS_NAME_MP3:	
						//mp3
						deleteTagNumber=2;
						break;
					case CLASS_NAME_YOUTUBE:
						//youtube
						deleteTagNumber=1;
						break;
					}
					var messageElements=[message];
					while(deleteTagNumber>0){
						var tooManyElement=messages.shift();
						if(tooManyElement.nodeType==ELEMENT_NODE){
							messageElements.push(tooManyElement);
							deleteTagNumber--;
						}
					}
					switch(message.className){
					case CLASS_NAME_MP3:
						//mp3
						str+=messageElements[2].href;
						break;
					case CLASS_NAME_YOUTUBE:
						//youtube
						str+=URL_YOUTUBE_PREFIX+messageElements[0].data.match(/[a-zA-Z0-9]+$/);
						break;
					}
					break;
				}
				break;
			}
		}
		str=str.replace(/^(\t|\r|\n| )+/,"").replace(/(\t|\r|\n| )+$/,"");
		buf={"messageType":PARAM_MESSAGE,"messageValue":str,"dateTime":time};
		rtn.push(buf);
		return rtn;
	}

	var getStructuralLog=function(){
		var nodes=document.getElementById(ID_MESSAGES).getElementsByTagName("li");
		var logs=[];
		var len=nodes.length;
		for(var i=0;i<len;i++){
			var node=nodes[i]
			var classNames=node.className.split(" ");
			switch(true){
			case classNames.filter(lookupHandle).length!=0:
				logs=logs.concat(analysisHandle(node));
				break;
			case classNames.filter(lookupMessage).length!=0:
				logs=logs.concat(analysisMessage(node));
				break;
			}
		}
		return logs;
	}

	var changeLogFormatToCSV=function(logs){
		var csv=[];
		var handle="";
		var message="";
		var time="";
		var len=logs.length;
		for(var i=0;i<len;i++){
			switch(logs[i].messageType){
			case PARAM_HANDLE:
				handle=logs[i].messageValue;
				break;
			case PARAM_MESSAGE:
				message=logs[i].messageValue;
				time=logs[i].dateTime;
				csv.push(
					"\""+handle.replace(/"/g,"\"")+"\","+
					"\""+message.replace(/"/g,"\"")+"\","+
					"\""+time.replace(/"/g,"\"")+"\""
				);
				break;
			}
		}
		return csv.join("\n");
	}

	var makeButton=function(){

		var matches=location.pathname.match(/^\/room\/([^/]+)(?:\/(?:(archives)(?:\/(?:([0-9]{4})\/([0-9]{2})\/([0-9]{2})\/?)?)?)?)?$/).filter(function(s){return !!s;});

		var button=document.createElement("a");
		button.style.display="inline-block";
		button.style.padding="0.5em";
		button.style.backgroundColor="#ffffff";
		button.style.borderLeft="0px none transparent";
		button.style.borderRight="0px none transparent";
		button.style.borderTop="1px solid #EEEEEE";
		button.style.borderBottom="1px solid #EEEEEE";
		button.href="javascript:void(0);";
		button.textContent="make log csv";

		switch(matches.length){
//		case 2://in room
		case 3://archives
		case 6://date
			break;
		default:
			return;
		}

		var handler=function(e){
			e.preventDefault();
			e.stopPropagation();
			button.removeEventListener("click",arguments.callee,true);
			button.textContent="now making...";
			var log=changeLogFormatToCSV(getStructuralLog());
			button.href="data:text/x-csv,"+encodeURIComponent(log);
			setTimeout(function(){button.textContent="get log csv";},0);
		}

		button.addEventListener("click",handler,true);

		var h1=document.getElementsByTagName("h1")[0];
		h1.parentNode.insertBefore(button,h1.nextSibling);

	}

	var onLoad=function(){
		setTimeout(makeButton,1000);
	}

	window.addEventListener("load",onLoad,true);

})();

