var xmlHttp;
var keepAlive;
var views=new Array('login');
var currentView='login';
var prevView;
var loggedIn=false;
var userId;
var userName;
var userPassword;
var themeId;
var inactiveCount=0;
var modalCount=0;
var dialogDelegate;
var switchViewId;
var switchViewDelegate;
var navigationControllerId;
var navigationControllerDelegate;
var leaveDelegate;
var ignoreDialog=false;
var deleteThemeId;
function GetXmlHttpObject(){
	if (window.XMLHttpRequest) {
		return new XMLHttpRequest();
	}
	if (window.ActiveXObject) {
		return new ActiveXObject("Microsoft.XMLHTTP");
	}
	alert('Sorry, but it looks like your browser does not support XML Http Object.');
	return null;
}
function getArrayFromPlist(plist) {
	var finalData=new Array();
	plist=plist.replace(/	/g,'');
	plist=plist.replace(/<key>/g,'');
	plist=plist.replace(/<\/key>/g,'=');
	plist=plist.replace(/<integer>/g,'');
	plist=plist.replace(/<string>/g,'');
	plist=plist.replace(/<dict>/g,'');
	plist=plist.replace(/<\/integer>/g,'=integer;');
	plist=plist.replace(/<\/string>/g,'=string;');
	plist=plist.replace(/<\/dict>/g,'=color;');
	plist=plist.replace(/\n/g,'');
	plist=plist.replace(/\r/g,'');
	plist=plist.replace(/;red/g,'=red');
	plist=plist.replace(/;green/g,'=green');
	plist=plist.replace(/;blue/g,'=blue');
	plist=plist.replace(/;alpha/g,'=alpha');
	plist=plist.replace(/;=color/g,'=color');
	plist=plist.replace('<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"><plist version="1.0">','');
	plist=plist.replace('=color;</plist>','');
	var data=plist.split(';');
	var counter=0;
	while (counter<data.length) {
		finalData[counter]=data[counter].split('=');
		counter++;
	}
	return finalData;
}
function setValuesFromArray(data) {
	var counter=0;
	while (counter<data.length) {
		var current=data[counter];
		var type=current[current.length-1];
		if (type=='integer') {
			setIntegerValue(current[0],current[1]);
		} else if (type=='string') {
			setStringValue(current[0],current[1]);
		} else if (type=='color') {
			setColorValue(current[0],current[2],current[5],current[8],current[11]);
		}
		counter++;
	}
}
function setIntegerValue(name,value) {
	if (name!='id') {
		setSliderValueFromProperty(name,value);
	}
}
function setStringValue(name,value) {
	if (name!='Author') {
		if (name=='Name') {
			document.getElementById('themename').value=value;
		} else {
			setFontBrowser(name,value);
		}
	}
}
function setColorValue(name,red,green,blue,alpha) {
	setColorBrowser(name,red,green,blue,alpha);
}
function postValues(values,url,ready) {
	xmlHttp=GetXmlHttpObject();
	xmlHttp.onreadystatechange=ready;
	xmlHttp.open("POST",url,true);
	xmlHttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded; charset=utf-8");
	/*xmlHttp.setRequestHeader("Content-length", values.length);
	xmlHttp.setRequestHeader("Connection", "close");*/
	xmlHttp.send(values);
}
function getURL(url,ready) {
	xmlHttp=GetXmlHttpObject();
	xmlHttp.onreadystatechange=ready;
	xmlHttp.open("GET",url,true);
	xmlHttp.send(null);
}
//KeepAlive
function keepAliveTimer() {
	keepAlive=GetXmlHttpObject();
	keepAlive.onreadystatechange=keepAliveReady;
	keepAlive.open("GET","keepAlive.php",true);
	keepAlive.send(null);
}
function keepAliveReady() {
	if (keepAlive.readyState==4) {
		delete(keepAlive);
		setTimeout("keepAliveTimer()",30000);
	}
}
function resize() {
	document.getElementById('inactiveView').style.width=window.innerWidth+"px";
	document.getElementById('inactiveView').style.height=window.innerHeight+"px";
	document.getElementById('modalView').style.width=window.innerWidth+"px";
	document.getElementById('modalView').style.height=window.innerHeight+"px";
	document.getElementById('dialogBox').style.marginLeft=(window.innerWidth-400)/2+"px";
	document.getElementById('dialogBox').style.marginTop=(window.innerHeight-200)/2+"px";
	document.getElementById('alertBox').style.marginLeft=(window.innerWidth-400)/2+"px";
	document.getElementById('alertBox').style.marginTop=(window.innerHeight-200)/2+"px";
	document.getElementById('loadingBox').style.marginLeft=(window.innerWidth-400)/2+"px";
	document.getElementById('loadingBox').style.marginTop=(window.innerHeight-200)/2+"px";
}
//Login
function loginEnter(field,e) {
	var keycode;
	if (window.event) {
		keycode = window.event.keyCode;
	} else {
		keycode = e.which;
	}
	if (keycode == 13) {
		login();
	}
}
function login() {
	showInactiveView();
	document.getElementById('loginButton').focus();
	document.getElementById('loginButton').value='Logging in';
	document.getElementById('loginButton').disabled=true;
	document.getElementById('username').disabled=true;
	userName=document.getElementById('username').value;
	document.getElementById('password').disabled=true;
	userPassword=document.getElementById('password').value;
	postValues('username='+escape(userName)+'&password='+escape(userPassword),'login.php',loginAnswer);
}
function loginAnswer() {
	if (xmlHttp.readyState==4) {
		hideInactiveView();
		var answer=xmlHttp.responseText;
		var splitted=answer.split(';');
		if (splitted[0]=='OK') {
			loggedIn=true;
			userId=splitted[1];
			pushView('selectTheme');
			document.getElementById('logoutButton').value='Logout';
			document.getElementById('logoutButton').disabled=false;
			document.getElementById('logout').style.display='block';
			animateElement(document.getElementById('logout'),'alpha',0,1,500,0,null);
			if (splitted.length>=3) {
				displayAlert(splitted[2],null);
			}
		} else {
			userName='';
			userPassword='';
			displayAlert(answer,loginReset);
		}
		delete(xmlHttp);
	}
}
function loginReset() {
	document.getElementById('loginButton').value='Login';
	document.getElementById('loginButton').disabled=false;
	document.getElementById('username').disabled=false;
	document.getElementById('password').disabled=false;
	document.getElementById('username').focus();
}
//Forgot
function forgotEnter(field,e) {
	var keycode;
	if (window.event) {
		keycode = window.event.keyCode;
	} else {
		keycode = e.which;
	}
	if (keycode == 13) {
		forgot();
	}
}
function forgot() {
	showInactiveView();
	document.getElementById('forgotButton').focus();
	document.getElementById('forgotButton').value='Generating...';
	document.getElementById('forgotButton').disabled=true;
	document.getElementById('forgotusername').disabled=true;
	document.getElementById('forgotmail').disabled=true;
	postValues('username='+escape(document.getElementById('forgotusername').value)+'&mail='+escape(document.getElementById('forgotmail').value),'forgot.php',forgotAnswer);
}
function forgotAnswer() {
	if (xmlHttp.readyState==4) {
		hideInactiveView();
		var answer=xmlHttp.responseText;
		if (answer=='OK') {
			goBack();
			displayAlert('Please check your e-mail for the new password!',null);
		} else {
			displayAlert(answer,forgotReset);
		}
		delete(xmlHttp);
	}
}
function forgotReset() {
	document.getElementById('forgotButton').value='Generate new';
	document.getElementById('forgotButton').disabled=false;
	document.getElementById('forgotusername').disabled=false;
	document.getElementById('forgotmail').disabled=false;
	document.getElementById('forgotusername').focus();
}
//ModAccount
function modEnter(field,e) {
	var keycode;
	if (window.event) {
		keycode = window.event.keyCode;
	} else {
		keycode = e.which;
	}
	if (keycode == 13) {
		modAccount();
	}
}
function modAccount() {
	showInactiveView();
	document.getElementById('modButton').focus();
	document.getElementById('modButton').value='Modifying...';
	document.getElementById('modButton').disabled=true;
	document.getElementById('oldpassword').disabled=true;
	document.getElementById('newpassword').disabled=true;
	document.getElementById('newconfirm').disabled=true;
	document.getElementById('modmail').disabled=true;
	postValues('oldpassword='+escape(document.getElementById('oldpassword').value)+'&newpassword='+escape(document.getElementById('newpassword').value)+'&newconfirm='+escape(document.getElementById('newconfirm').value)+'&mail='+escape(document.getElementById('modmail').value),'modAccount.php',modAnswer);
}
function modAnswer() {
	if (xmlHttp.readyState==4) {
		hideInactiveView();
		var answer=xmlHttp.responseText;
		if (answer=='OK') {
			goBack();
			displayAlert('Successfully changed',null);
		} else {
			displayAlert(answer,modReset);
		}
		delete(xmlHttp);
	}
}
function modReset() {
	document.getElementById('modButton').value='Modify';
	document.getElementById('modButton').disabled=false;
	document.getElementById('oldpassword').disabled=false;
	document.getElementById('newpassword').disabled=false;
	document.getElementById('newconfirm').disabled=false;
	document.getElementById('modmail').disabled=false;
	document.getElementById('oldpassword').focus();
}
//Logout
function logout() {
	shouldLeaveView(currentView,logoutConfirm);
}
function logoutConfirm(enabled) {
	if (enabled) {
		showInactiveView();
		document.getElementById('logoutButton').value='Logging out';
		document.getElementById('logoutButton').disabled=true;
		postValues('','logout.php',logoutAnswer);
	} else {
		document.getElementById('logoutButton').value='Logout';
		document.getElementById('logoutButton').disabled=false;
	}
}
function logoutAnswer() {
	if (xmlHttp.readyState==4) {
		hideInactiveView();
		loggedIn=false;
		ignoreNextDialog();
		goBackToRoot(null);
		userName='';
		userPassword='';
		animateElement(document.getElementById('logout'),'alpha',1,0,250,0,hideLogoutButton);
		delete(xmlHttp);
	}
}
function hideLogoutButton() {
	document.getElementById('logout').style.display='none';
}
//Registration
function regEnter(field,e,safe) {
	var keycode;
	if (window.event) {
		keycode = window.event.keyCode;
	} else {
		keycode = e.which;
	}
	if (keycode == 13) {
		registration();
	}
	if (safe) {
		return safeEnter(field,e);
	}
	return true;
}
var allowedChar='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789():.,?-_+!/*"[]{} ';
function safeEnter(field,e) {
	var keycode;
	if (window.event) {
		keycode = window.event.keyCode;
	} else {
		keycode = e.which;
	}
	return isSafeKey(keycode);
}
function safeEnterCheck(field) {
	var text=field.value;
	var counter=0;
	while (counter<text.length) {
		if (!isSafeKey(text.charCodeAt(counter))) {
			text=text.replace(text.charAt(counter),'');
			counter--;
		}
		counter++;
	}
	field.value=text;
}
function isSafeKey(keycode) {
	var counter=0;
	while (counter<allowedChar.length) {
		if (keycode==allowedChar.charCodeAt(counter)) {
			return true;
		}
		counter++;
	}
	return false;
}
function registration() {
	showInactiveView();
	document.getElementById('regButton').focus();
	document.getElementById('regButton').value='Registrating';
	document.getElementById('regButton').disabled=true;
	safeEnterCheck(document.getElementById('regusername'));
	document.getElementById('regusername').disabled=true;
	document.getElementById('regpassword').disabled=true;
	document.getElementById('regconfirmpassword').disabled=true;
	document.getElementById('regmail').disabled=true;
	document.getElementById('termsofuseaccept').disabled=true;
	var termsOfUseValue='';
	if (document.getElementById('termsofuseaccept').checked) {
		termsOfUseValue='accepted';
	}
	postValues('termsofuse='+termsOfUseValue+'&username='+escape(document.getElementById('regusername').value)+'&password='+escape(document.getElementById('regpassword').value)+'&confirm='+escape(document.getElementById('regconfirmpassword').value)+'&mail='+escape(document.getElementById('regmail').value),'registration.php',regAnswer);
}
function regAnswer() {
	if (xmlHttp.readyState==4) {
		hideInactiveView();
		var answer=xmlHttp.responseText;
		if (answer=='OK') {
			goBack();
			displayAlert('Please check your e-mail within the next 24 hours for the activation link!',null);
		} else {
			displayAlert(answer,registrationReset);
		}
		delete(xmlHttp);
	}
}
function registrationReset() {
	document.getElementById('regButton').value='Create account';
	document.getElementById('regButton').disabled=false;
	document.getElementById('regusername').disabled=false;
	document.getElementById('regpassword').disabled=false;
	document.getElementById('regconfirmpassword').disabled=false;
	document.getElementById('regmail').disabled=false;
	document.getElementById('termsofuseaccept').disabled=false;
	document.getElementById('regusername').focus();
}
//GetTheme
function themesAnswer() {
	if (xmlHttp.readyState==4) {
		var answer=xmlHttp.responseText;
		if (answer=='You are not logged in') {
			displayAlert(answer,null);
		} else if (answer!='') {
			var themes=answer.split(';');
			var counter=0;
			while (counter<themes.length) {
				var themeDatas=themes[counter].split('&');
				addRow(themeDatas[0],themeDatas[1],themeDatas[2]=='YES',themeDatas[3]);
				counter++;
			}
		}
		delete(xmlHttp);
	}
}
function newThemeAnswer() {
	if (xmlHttp.readyState==4) {
		hideInactiveView();
		var answer=xmlHttp.responseText;
		var answer=answer.split(';');
		if (answer[0]=='OK') {
			addRow(answer[1],'New',false,0);
		} else {
			displayAlert(answer,null);
		}
		delete(xmlHttp);
	}
}
function createNewTheme() {
	showInactiveView();
	postValues('','newTheme.php',newThemeAnswer);
}
function loadTheme(id,published) {
	showInactiveView();
	themeId=id;
	document.getElementById('bgUploadThemeId').value=themeId;
	document.getElementById('arrowUploadThemeId').value=themeId;
	document.getElementById('publishButton').disabled=published;
	document.getElementById('saveButton').disabled=published;
	document.getElementById('saveButton').value='Save';
	if (published) {
		document.getElementById('publishButton').value='Published';
	} else {
		document.getElementById('publishButton').value='Publish';
	}
	getURL('users/'+userId+'/'+themeId+'/theme.plist?rand='+Math.random(),loadThemeAnswer);
}
function loadThemeAnswer() {
	if (xmlHttp.readyState==4) {
		hideInactiveView();
		var answer=xmlHttp.responseText;
		loadBackgroundImage();
		setValuesFromArray(getArrayFromPlist(answer));
		loadBackgroundImage();
		loadArrowImage();
		pushView('editor');
		delete(xmlHttp);
	}
}
function publishTheme() {
	displayDialog('Are you sure?<br>Do you want to publish this theme?','Yes','No',publishConfirm);
}
function publishConfirm(buttonId) {
	if (buttonId==1) {
		document.getElementById('publishButton').disabled=true;
		document.getElementById('publishButton').value='Publishing...';
		showInactiveView();
		postValues('theme='+themeId,'publishTheme.php',publishAnswer);
	}
}
function publishAnswer() {
	if (xmlHttp.readyState==4) {
		hideInactiveView();
		var answer=xmlHttp.responseText;
		var splitted=answer.split(';');
		if (splitted[0]=='OK') {
			ignoreNextDialog();
			goBack();
			displayAlert('Successfully published! Please wait until we check it!',null);
		} else {
			displayAlert(answer,null);
			document.getElementById('publishButton').disabled=false;
			document.getElementById('publishButton').value='Publish';
		}
		delete(xmlHttp);
	}
}
function saveTheme() {
	var plist='';
	plist+=getAllSliderPlistFormat();
	plist+=getAllFontBrowserPlistFormat();
	plist+=getAllColorBrowserPlistFormat();
	document.getElementById('saveButton').disabled=true;
	document.getElementById('saveButton').value='Saving...';
	safeEnterCheck(document.getElementById('themename'));
	showInactiveView();
	postValues('username='+escape(userName)+'&password='+escape(userPassword)+'&theme='+themeId+'&themeName='+escape(document.getElementById('themename').value)+'&themeData='+escape(plist),'saveTheme.php',saveAnswer);
}
function saveAnswer() {
	if (xmlHttp.readyState==4) {
		hideInactiveView();
		var answer=xmlHttp.responseText;
		var splitted=answer.split(';');
		if (splitted[0]=='OK') {
			document.getElementById('saveButton').disabled=false;
			document.getElementById('saveButton').value='Save';
			displayAlert('Successfully saved!',null);
		} else {
			displayAlert(answer,null);
			document.getElementById('saveButton').disabled=false;
			document.getElementById('saveButton').value='Save';
		}
		delete(xmlHttp);
	}
}
function deleteThemeAnswer() {
	if (xmlHttp.readyState==4) {
		hideInactiveView();
		var answer=xmlHttp.responseText;
		var splitted=answer.split(';');
		if (splitted[0]=='OK') {
			removeRow(splitted[1]);
		} else {
			displayAlert(answer,null);
		}
		delete(xmlHttp);
	}
}
function deleteTheme(id) {
	deleteThemeId=id;
	displayDialog('Are you sure?<br>Do you want to delete this theme?','Yes','No',deleteThemeConfirm);
}
function deleteThemeConfirm(buttonId) {
	if (buttonId==1) {
		showInactiveView();
		postValues('theme='+deleteThemeId,'deleteTheme.php',deleteThemeAnswer);
	}
}
//InactiveView
function showInactiveView() {
	inactiveCount++;
	document.getElementById('inactiveView').style.display='block';
}
function hideInactiveView() {
	inactiveCount--;
	if (inactiveCount<=0) {
		document.getElementById('inactiveView').style.display='none';
		inactiveCount=0;
	}
}
//NavigationController
function goBack() {
	goBack(null);
}
function goBack(delegate) {
	navigationControllerDelegate=delegate;
	switchView(views[views.length-2],goBackConfirm);
}
function goBackConfirm(enabled) {
	if (enabled) {
		views.splice(views.length-1,1);
		if (views.length<=1 && !loggedIn) {
			hideBackButton();
		}
		if (views.length<=2 && loggedIn) {
			hideBackButton();
		}
		if (navigationControllerDelegate!=null) {
			navigationControllerDelegate(true);
		}
	} else {
		if (navigationControllerDelegate!=null) {
			navigationControllerDelegate(false);
		}
	}
}
function goBackToRoot(delegate) {
	navigationControllerDelegate=delegate;
	switchView('login',goBackToRootConfirm);
}
function goBackToRootConfirm(enabled) {
	if (enabled) {
		hideBackButton();
		views=new Array('login');
		if (navigationControllerDelegate!=null) {
			navigationControllerDelegate(true);
		}
	} else {
		if (navigationControllerDelegate!=null) {
			navigationControllerDelegate(false);
		}
	}
}
function pushView(id) {
	pushView(id,null);
}
function pushView(id,delegate) {
	if (id!=currentView) {
		navigationControllerId=id;
		navigationControllerDelegate=delegate;
		switchView(id,pushViewConfirm);
	} else {
		if (delegate!=null) {
			delegate(false);
		}
	}
}
function pushViewConfirm(enabled) {
	if (enabled) {
		views.push(navigationControllerId);
		if (views.length>=2 && !loggedIn) {
			showBackButton();
		}
		if (views.length>=3 && loggedIn) {
			showBackButton();
		}
		if (navigationControllerDelegate!=null) {
			navigationControllerDelegate(true);
		}
	} else {
		if (navigationControllerDelegate!=null) {
			navigationControllerDelegate(false);
		}
	}
}
function showBackButton() {
	if (document.getElementById('back').style.display=='none') {
		document.getElementById('back').style.display='block';
		animateElement(document.getElementById('back'),'alpha',0,1,500,0,null);
	}
}
function hideBackButton() {
	if (document.getElementById('back').style.display=='block') {
		animateElement(document.getElementById('back'),'alpha',1,0,500,0,hideBackButtonFinal);
	}
}
function hideBackButtonFinal() {
	document.getElementById('back').style.display='none';
}
function switchView(id,delegate) {
	switchViewDelegate=delegate;
	switchViewId=id;
	shouldLeaveView(currentView,switchViewDialog);
}
function switchViewDialog(buttonId) {
	if (buttonId==1) {
		showInactiveView();
		prevView=currentView;
		currentView=switchViewId;
		viewWillAppear(currentView);
		document.getElementById(currentView).style.display='block';
		animateElement(document.getElementById('page'),'height',document.getElementById(prevView).offsetHeight,document.getElementById(currentView).offsetHeight,500,0,hideInactiveView);
		document.getElementById(currentView).style.display='none';
		animateElement(document.getElementById(prevView),'alpha',1,0,250,0,hidePrevView);
		if (switchViewDelegate!=null) {
			switchViewDelegate(true);
		}
	} else {
		if (switchViewDelegate!=null) {
			switchViewDelegate(false);
		}
	}
}
function hidePrevView() {
	document.getElementById(prevView).style.display='none';
	document.getElementById(currentView).style.display='block';
	document.getElementById(currentView).style.opacity='0';
	animateElement(document.getElementById(currentView),'alpha',0,1,250,0,null);
}
function shouldLeaveView(viewId,delegate) {
	leaveDelegate=delegate;
	if (viewId=='editor') {
		displayDialog('Do you want to leave from the editor?','Yes','No',shouldLeaveViewDialog);
	} else {
		ignoreDialog=false;
		if (leaveDelegate!=null) {
			leaveDelegate(true);
		}
	}
}
function shouldLeaveViewDialog(buttonId) {
	if (leaveDelegate!=null) {
		if (buttonId==1) {
			leaveDelegate(true);
		} else {
			leaveDelegate(false);
		}
	}
}
function resetCurrentView() {
	viewWillAppear(currentView);
}
function viewWillAppear(viewId) {
	if (viewId=='login') {
		document.getElementById('loginButton').value='Login';
		document.getElementById('loginButton').disabled=false;
		document.getElementById('username').disabled=false;
		document.getElementById('username').value='';
		document.getElementById('password').disabled=false;
		document.getElementById('password').value='';
		document.getElementById('username').focus();
	}
	if (viewId=='forgot') {
		document.getElementById('forgotButton').value='Generate new';
		document.getElementById('forgotButton').disabled=false;
		document.getElementById('forgotusername').disabled=false;
		document.getElementById('forgotusername').value='';
		document.getElementById('forgotmail').disabled=false;
		document.getElementById('forgotmail').value='';
		document.getElementById('forgotusername').focus();
	}
	if (viewId=='registration') {
		document.getElementById('regButton').value='Create account';
		document.getElementById('regButton').disabled=false;
		document.getElementById('regusername').disabled=false;
		document.getElementById('regusername').value='';
		document.getElementById('regpassword').disabled=false;
		document.getElementById('regpassword').value='';
		document.getElementById('regconfirmpassword').disabled=false;
		document.getElementById('regconfirmpassword').value='';
		document.getElementById('regmail').disabled=false;
		document.getElementById('regmail').value='';
		document.getElementById('termsofuseaccept').disabled=false;
		document.getElementById('termsofuseaccept').checked=false;
		document.getElementById('regusername').focus();
	}
	if (viewId=='myAccount') {
		document.getElementById('modButton').value='Modify';
		document.getElementById('modButton').disabled=false;
		document.getElementById('oldpassword').disabled=false;
		document.getElementById('oldpassword').value='';
		document.getElementById('newpassword').disabled=false;
		document.getElementById('newpassword').value='';
		document.getElementById('newconfirm').disabled=false;
		document.getElementById('newconfirm').value='';
		document.getElementById('modmail').disabled=false;
		document.getElementById('modmail').value='';
		document.getElementById('oldpassword').focus();
	}
	if (viewId=='selectTheme') {
		document.getElementById('tableView').innerHTML='';
		postValues('','getThemes.php',themesAnswer);
	}
}
//Dialog
function displayDialog(text,button1,button2,delegate) {
	if (ignoreDialog) {
		ignoreDialog=false;
		if (delegate!=null) {
			delegate(1);
		}
	} else {
		showInactiveView();
		dialogDelegate=delegate;
		document.getElementById('dialogBox').style.display='block';
		showModalView();
		document.getElementById('dialogText').innerHTML=text;
		document.getElementById('dialogButton1').value=button1;
		document.getElementById('dialogButton2').value=button2;
		document.getElementById('dialogButton2').focus();
		animateElement(document.getElementById('modalView'),'alpha',0,1,250,0,hideInactiveView);
	}
}
function dialogReturn(buttonId) {
	showInactiveView();
	if (dialogDelegate!=null) {
		dialogDelegate(buttonId);
	}
	animateElement(document.getElementById('modalView'),'alpha',1,0,250,0,hideDialogView);
}
function hideDialogView() {
	hideInactiveView();
	document.getElementById('dialogBox').style.display='none';
	hideModalView();
}
function ignoreNextDialog() {
	ignoreDialog=true;
}
//Alert
function displayAlert(text,delegate) {
	showInactiveView();
	dialogDelegate=delegate;
	document.getElementById('alertBox').style.display='block';
	showModalView();
	document.getElementById('alertButton').focus();
	document.getElementById('alertText').innerHTML=text;
	animateElement(document.getElementById('modalView'),'alpha',0,1,250,0,hideInactiveView);
}
function closeAlert() {
	showInactiveView();
	animateElement(document.getElementById('modalView'),'alpha',1,0,250,0,hideAlertView);
}
function hideAlertView() {
	hideInactiveView();
	document.getElementById('alertBox').style.display='none';
	hideModalView();
	if (dialogDelegate!=null) {
		dialogDelegate();
	}
}
//Loading
function showLoading() {
	showInactiveView();
	document.getElementById('loadingBox').style.display='block';
	showModalView();
	animateElement(document.getElementById('modalView'),'alpha',0,1,250,0,hideInactiveView);
}
function hideLoading(delegate) {
	showInactiveView();
	dialogDelegate=delegate;
	animateElement(document.getElementById('modalView'),'alpha',1,0,250,0,hideLoadingView);
}
function hideLoadingView() {
	hideInactiveView();
	document.getElementById('loadingBox').style.display='none';
	hideModalView();
	if (dialogDelegate!=null) {
		dialogDelegate();
	}
}
//ModalView
function showModalView() {
	modalCount++;
	document.getElementById('modalView').style.display='block';
}
function hideModalView() {
	modalCount--;
	if (modalCount<=0) {
		document.getElementById('modalView').style.display='none';
		modalCount=0;
	}
}
//TableView
function addRow(id,text,published,download) {
	showInactiveView();
	var rowCode='<div class="tableRow" id="row'+id+'" style="height:0px;"><table cellspacing="0" cellpadding="0" border="0" width="100%"><tr><td style="cursor:pointer" onClick="loadTheme(\''+id+'\','+published+');">'+text+'</td><td align="right" width="160">';
	if (published) {
		rowCode+='<b>'+download+'</b>';
	} else {
		rowCode+='<input type="button" value="Delete" class="button" onClick="deleteTheme(\''+id+'\');">';
	}
	rowCode+='</td></tr></table></div>';
	var rowElement=document.createElement('div');
	rowElement.innerHTML=rowCode;
	document.getElementById('tableView').appendChild(rowElement);
	animateElement(document.getElementById('row'+id),'height',0,40,250,0,hideInactiveView);
}
function removeRow(rowId) {
	showInactiveView();
	animateElement(document.getElementById('row'+rowId),'height',40,0,250,0,hideInactiveView);
}
//Animator
var animating;
var prevTime;
var animElement=new Array();
var animStyle=new Array();
var animParam=new Array();
var animSelector=new Array();
function setup() {
	resize();
	modalView=document.getElementById('modalView');
	viewWillAppear('login');
	var currentTime = new Date();
	prevTime=currentTime.getMilliseconds()+currentTime.getSeconds()*1000+currentTime.getMinutes()*60000;
	render();
	keepAliveTimer();
}
function animateElement(element,style,defValue,value,time,mode,selector) {
	animElement.push(element);
	animStyle.push(style);
	animParam.push(animatorSetup(defValue,value,time,mode));
	animSelector.push(selector);
	if (!animating) {
		animating=true;
		var currentTime = new Date();
		prevTime=currentTime.getMilliseconds()+currentTime.getSeconds()*1000+currentTime.getMinutes()*60000;
		render();
	}
}
function animator(time) {
	var counter=0;
	var value;
	animating=false;
	while (counter<animElement.length) {
		animating=true;
		animParam[counter][0]-=time;
		if (animParam[counter][3]<animParam[counter][0]) {
			animParam[counter][0]=0;
		}
		value=animatorGetValue(animParam[counter]);
		if (animStyle[counter]=="height") {
			animElement[counter].style.height=value+'px';
		}
		if (animStyle[counter]=="x") {
			animElement[counter].style.left=value+'px';
		}
		if (animStyle[counter]=="y") {
			animElement[counter].style.top=value+'px';
		}
		if (animStyle[counter]=='marginLeft') {
			animElement[counter].style.marginLeft=value+'px';
		}
		if (animStyle[counter]=="alpha") {
			if (value==1) {
				animElement[counter].style.opacity="";
			} else {
				animElement[counter].style.opacity=value;
			}
		}
		if (animParam[counter][0]<=0) {
			if (animSelector[counter]!=null) {
				animSelector[counter]();
			}
			animElement.splice(counter,1);
			animStyle.splice(counter,1);
			animParam.splice(counter,1);
			animSelector.splice(counter,1);
		} else {
			counter++;
		}
	}
}
function animatorGetValue(parameters) {
	if (parameters[0]<=0) {
		return parameters[1];
	} else {
		if (parameters[4]==0) {
			return parameters[2] / 2 - Math.cos(parameters[0] * 3.141592653589793 / parameters[3])/2 * parameters[2] + parameters[1];
		} else if (parameters[4]==1) {
			return parameters[2] / 2 - Math.cos(parameters[0] * (3.141592653589793/2) / parameters[3]) * parameters[2] + parameters[1]+parameters[2] / 2;
		} else if (parameters[4]==2) {
			return parameters[2] / 2 - Math.cos(parameters[0] * (3.141592653589793/2) / parameters[3]+(3.14/2)) * parameters[2] + parameters[1]-parameters[2] / 2;
		}
	}
	return 0;
}
// 0:smooth 1:in 2:out
function animatorSetup(start, end, time, mode) {
	var array=new Array;
	array[0]=time;
	array[1]=end;
	array[2]=start-end;
	array[3]=time;
	array[4]=mode;
	return array;
}
function render() {
	currentTime = new Date();
	var time=(currentTime.getMilliseconds()+currentTime.getSeconds()*1000+currentTime.getMinutes()*60000)-prevTime;
	prevTime=currentTime.getMilliseconds()+currentTime.getSeconds()*1000+currentTime.getMinutes()*60000;
	animator(time);
	if (animating) {
		setTimeout("render()",1);
	}
}
