function getCookie( name ) {
	var start = document.cookie.indexOf( name + "=" );
	var len = start + name.length + 1;
	if ( ( !start ) && ( name != document.cookie.substring( 0, name.length ) ) ) {
		return null;
	}
	if ( start == -1 ) return null;
	var end = document.cookie.indexOf( ';', len );
	if ( end == -1 ) end = document.cookie.length;
	return unescape( document.cookie.substring( len, end ) );
}

function setCookie( name, value, expires, path, domain, secure ) {
	var today = new Date();
	today.setTime( today.getTime() );
	if ( expires ) {
		expires = expires * 1000 * 60 * 60 * 24;
	}
	var expires_date = new Date( today.getTime() + (expires) );
	document.cookie = name+'='+escape( value ) +
		( ( expires ) ? ';expires='+expires_date.toGMTString() : '' ) + //expires.toGMTString()
		( ( path ) ? ';path=' + path : '' ) +
		( ( domain ) ? ';domain=' + domain : '' ) +
		( ( secure ) ? ';secure' : '' );
}

function deleteCookie( name, path, domain ) {
	if ( getCookie( name ) ) document.cookie = name + '=' +
			( ( path ) ? ';path=' + path : '') +
			( ( domain ) ? ';domain=' + domain : '' ) +
			';expires=Thu, 01-Jan-1970 00:00:01 GMT';
}

(function() {

	var slideSpeed = 20;
	var slideInterval = 0;

	var currentPage = null;
	var currentDialog = null;
	var currentWidth = 0;
	var currentHash = location.hash;
	var hashPrefix = "#_";
	var pageHistory = [];
	var newPageCount = 0;
	var checkTimer;

	// *************************************************************************************************
	window.emoji = {
		insert: function(num, option) {
			var prevPage = $(pageHistory[pageHistory.length-2]);
			var textarea = prevPage.getElementsByTagName('TEXTAREA')[0];
			if(textarea.className === "label") {
				textarea.className = "";
				textarea.value = "";
			}
			textarea.value += '[m:'+num+']';
		}
	};
	window.iui =
	{
		logout: function() {
			deleteCookie("imixi_un");
		},
		"toolbarButtons": {
			"writeDiary": {
				"label": "日記",
				"href": "#writeDiary"
			},
			"writeComment": {
				"label": "コメント",
				"href": "#writeComment"
			},
			"sendMessage": {
				"label": "メッセ",
				"href": "#sendMessage"
			},
			"emoji": {
				"label": "絵文字",
				"href": "#emojiPallet"
			}
		},
		showPage: function(page, backwards)
		{
			if (page)
			{
				if (currentDialog)
				{
					currentDialog.removeAttribute("selected");
					currentDialog = null;
				}

				if (hasClass(page, "dialog"))
				showDialog(page);
				else
				{
					var fromPage = currentPage;
					currentPage = page;
					
					if (fromPage)
					setTimeout(slidePages, 0, fromPage, page, backwards);
					else
					updatePage(page, fromPage);
				}
			}
		},

		showPageById: function(pageId)
		{
			var page = $(pageId);
			if (page)
			{
				var index = pageHistory.indexOf(pageId);
				var backwards = index != -1;
				if (backwards)
				pageHistory.splice(index, pageHistory.length);

				iui.showPage(page, backwards);
			}
		},

		showPageByHref: function(href, args, method, replace, cb)
		{
			var req = new XMLHttpRequest();
			req.onerror = function()
			{
				if (cb)
				cb(false);
			};

			req.onreadystatechange = function()
			{
				if (req.readyState == 4)
				{
					if(req.responseText === "login") {
						location.reload();
						return;
					}
					if (replace)
					replaceElementWithSource(replace, req.responseText);
					else
					{
						var frag = document.createElement("div");
						frag.innerHTML = req.responseText;
						iui.insertPages(frag.childNodes);
					}
					if (cb)
					setTimeout(cb, 1000, true);
				}
			};

			if (args)
			{
				req.open(method || "GET", href, true);
				req.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
				req.setRequestHeader("Content-Length", args.length);
				req.send(args.join("&"));
			}
			else
			{
				req.open(method || "GET", href, true);
				req.send(null);
			}
		},

		insertPages: function(nodes)
		{
			var targetPage;
			for (var i = 0; i < nodes.length; ++i)
			{
				var child = nodes[i];
				if (child.nodeType == 1)
				{
					if (!child.id)
					child.id = "__" + (++newPageCount) + "__";

					var clone = $(child.id);
					if (clone)
					clone.parentNode.replaceChild(child, clone);
					else
					document.body.appendChild(child);

					if (child.getAttribute("selected") == "true" || !targetPage)
					targetPage = child;

					--i;
				}
			}

			if (targetPage)
			iui.showPage(targetPage);    
		},

		getSelectedPage: function()
		{
			for (var child = document.body.firstChild; child; child = child.nextSibling)
			{
				if (child.nodeType == 1 && child.getAttribute("selected") == "true")
				return child;
			}    
		},
		login: function(un, pw) {
			var un = un || document.getElementById('login_email').value;
			var pw = pw || document.getElementById('login_password').value;
			var req = new XMLHttpRequest();
			req.onerror = function()
			{

			};
			req.onreadystatechange = function()
			{
				if (req.readyState == 4)
				{
					if (req.responseText.substr(0, 4) == "succ") {
						var tmp = req.responseText.split('*');
						setCookie('imixi_un', tmp[1], 30);
						setCookie('imixi_pw', tmp[2], 30);
						setCookie('imixi_id', tmp[3], 30);
						iui.showPageByHref("page.php?a=updates", null, null, null);
					}
				}
			};
			req.open("POST", "./page.php", true);
			req.setRequestHeader("Content-Type" , "application/x-www-form-urlencoded");
			req.send("a=ilogin&un="+un+"&pw="+pw);
		}
	};

	// *************************************************************************************************

	addEventListener("load", function(event)
	{
		var page = iui.getSelectedPage();
		if (page) {
			iui.showPage(page);
		} else {
			iui.showPageByHref("./page.php?a=updates", null, null, null);
		}
		

		setTimeout(preloadImages, 0);
		setTimeout(checkOrientAndLocation, 0);
		checkTimer = setInterval(checkOrientAndLocation, 300);
		
		if(getCookie('imixi_un') && getCookie('imixi_pw')) {
			iui.login(getCookie('imixi_un'), getCookie('imixi_pw'));
		}
	}, false);

		addEventListener("click", function(event)
		{
			var link = findParent(event.target, "a");
			if (link)
			{
				function unselect() { link.removeAttribute("selected"); }

				if (link.href && link.hash && link.hash != "#")
				{
					link.setAttribute("selected", "true");
					iui.showPage($(link.hash.substr(1)));
					setTimeout(unselect, 500);
				}
				else if (link == $("backButton"))
				history.back();
				else if (link.getAttribute("type") == "js") 
				eval(link.href.substr(11));
				else if (link.getAttribute("type") == "submit")
				submitForm(findParent(link, "form"));
				else if (link.getAttribute("type") == "cancel")
				cancelDialog(findParent(link, "form"));
				else if (link.target == "_replace")
				{
					link.setAttribute("selected", "progress");
					iui.showPageByHref(link.href, null, null, link, unselect);
				}
				else if (!link.target)
				{
					link.setAttribute("selected", "progress");
					iui.showPageByHref(link.href, null, null, null, unselect);
				}
				else
				return;

				event.preventDefault();        
			}
			}, true);

			addEventListener("click", function(event)
			{
				var div = findParent(event.target, "div");
				if (div && hasClass(div, "toggle"))
				{
					div.setAttribute("toggled", div.getAttribute("toggled") != "true");
					event.preventDefault();        
				}
				}, true);

				function checkOrientAndLocation()
				{
					if (window.innerWidth != currentWidth)
					{   
						currentWidth = window.innerWidth;
						var orient = currentWidth == 320 ? "profile" : "landscape";
						document.body.setAttribute("orient", orient);
						setTimeout(scrollTo, 100, 0, 1);
					}

					if (location.hash != currentHash)
					{
						var pageId = location.hash.substr(hashPrefix.length)
						iui.showPageById(pageId);
					}
				}

				function showDialog(page)
				{
					currentDialog = page;
					page.setAttribute("selected", "true");

					if (hasClass(page, "dialog") && !page.target)
					showForm(page);
				}

				function showForm(form)
				{
					if (form.id !== "loginDialog") {
						form.onsubmit = function(event) {
							event.preventDefault();
							submitForm(form);
						};
						form.onclick = function(event) {
							if (event.target == form && hasClass(form, "dialog"))
							cancelDialog(form);
						};
					} else {
						form.onsubmit = function(event) {
							iui.login($("login_email").value, $("login_password").value);
						};
						$("backButton").style.display = "none";
						$("toolbarButton").style.display = "none";
						$("pageTitle").innerHTML = "iMixiログイン";
					}
					
				}

				function cancelDialog(form)
				{
					form.removeAttribute("selected");
				}

				function updatePage(page, fromPage)
				{
					
					if (!page.id)
					page.id = "__" + (++newPageCount) + "__";

					location.href = currentHash = hashPrefix + page.id;
					pageHistory.push(page.id);

					var pageTitle = $("pageTitle");
					if (page.title)
					pageTitle.innerHTML = page.title;

					if (page.localName.toLowerCase() == "form" && !page.target)
					showForm(page);

					var backButton = $("backButton");
					if (backButton)
					{
						var prevPage = $(pageHistory[pageHistory.length-2]);
						if (prevPage && !page.getAttribute("hideBackButton"))
						{
							backButton.style.display = "inline";
							backButton.innerHTML = prevPage.title ? prevPage.title : "戻る";
						}
						else
						backButton.style.display = "none";
					}    
					
					var toolbarButton = $("toolbarButton");
					if (toolbarButton)
					{
						if(page.getAttribute("toolbar")==="hide") {
							toolbarButton.style.display = "none";
						}
						var tmp = iui.toolbarButtons[page.getAttribute("toolbar")];
						if(tmp) {
							toolbarButton.style.display = "";
							toolbarButton.innerHTML = tmp['label'];
							toolbarButton.href = tmp['href'];
						}
					}
					page.setAttribute("selected", "true");
				}

				function slidePages(fromPage, toPage, backwards)
				{        
					var axis = (backwards ? fromPage : toPage).getAttribute("axis");
					if (axis == "y")
					(backwards ? fromPage : toPage).style.top = "100%";
					else
					toPage.style.left = "100%";

					toPage.setAttribute("selected", "true");
					scrollTo(0, 1);
					clearInterval(checkTimer);

					var percent = 100;
					slide();
					var timer = setInterval(slide, slideInterval);

					function slide()
					{
						percent -= slideSpeed;
						if (percent <= 0)
						{
							percent = 0;
							if (!hasClass(toPage, "dialog"))
							fromPage.removeAttribute("selected");
							clearInterval(timer);
							checkTimer = setInterval(checkOrientAndLocation, 300);
							setTimeout(updatePage, 0, toPage, fromPage);
						}

						if (axis == "y")
						{
							backwards
							? fromPage.style.top = (100-percent) + "%"
							: toPage.style.top = percent + "%";
						}
						else
						{
							fromPage.style.left = (backwards ? (100-percent) : (percent-100)) + "%"; 
							toPage.style.left = (backwards ? -percent : percent) + "%"; 
						}
					}
				}

				function preloadImages()
				{
					var preloader = document.createElement("div");
					preloader.id = "preloader";
					document.body.appendChild(preloader);
				}

				function submitForm(form)
				{
					iui.showPageByHref(form.action || "POST", encodeForm(form), form.method);
				}

				function encodeForm(form)
				{
					function encode(inputs)
					{
						for (var i = 0; i < inputs.length; ++i)
						{
							if (inputs[i].name)
							args.push(inputs[i].name + "=" + escape(inputs[i].value));
						}
					}

					var args = [];
					encode(form.getElementsByTagName("input"));
					encode(form.getElementsByTagName("select"));
					encode(form.getElementsByTagName("textarea"));
					return args;    
				}

				function findParent(node, localName)
				{
					while (node && (node.nodeType != 1 || node.localName.toLowerCase() != localName))
					node = node.parentNode;
					return node;
				}

				function hasClass(self, name)
				{
					var re = new RegExp("(^|\\s)"+name+"($|\\s)");
					return re.exec(self.getAttribute("class")) != null;
				}

				function replaceElementWithSource(replace, source)
				{
					var page = replace.parentNode;
					var parent = replace;
					/*
					while (page.parentNode != document.body)
					{
						page = page.parentNode;
						parent = parent.parentNode;
					}
					*/
					var frag = document.createElement(parent.localName);
					frag.innerHTML = source;

					page.removeChild(parent);

					while (frag.firstChild)
					page.appendChild(frag.firstChild);
				}

				function $(id) { return document.getElementById(id); }
				function ddd() { console.log.apply(console, arguments); }

				})();
