var createdlg=null;
var createCatalogId=0;
var deletedlg=null;
var errordlg=null;
var progressdlg=null;
var infodlg=null;
var page=1;
var perpage=10;
var search="";
var expandedCatalogs={};
var locales=[];
var translations={};
var designs=[];

function doInit() {
	var dlgoptions={
		fixedcenter: true,
		visible: false,
		draggable: true,			 
		close: true,
		modal:true,	
		zindex:4,
		constraintoviewport: true
	};
	
	var bodyel=document.getElementsByTagName("body")[0];
	YAHOO.util.Dom.addClass(bodyel,"yui-skin-sam");
	
	if(!embedded) {
		YAHOO.util.Dom.addClass(bodyel,"ptc_body");
		var headerel=document.getElementById("ptc_header");
		headerel.style.display="block";
	}
	
	if(anonymous) {
		var scn=document.getElementById("substep_createdialog_name");
		scn.style.display="none";
		
	}
	
	createdlg = new YAHOO.widget.Panel("createdialog",dlgoptions);
	createdlg.render();
	
	dlgoptions.width = "200px";
	deletedlg = new YAHOO.widget.SimpleDialog("deletedialog",dlgoptions);
	
	dlgoptions.close = false;
	progressdlg = new YAHOO.widget.Panel("progressdialog",dlgoptions);
	progressdlg.render();
	
	dwr.engine.setErrorHandler(handleError);
	dwr.engine.setWarningHandler(handleWarning);
	dwr.engine.setActiveReverseAjax(true);
	
	dwr.engine.beginBatch();
	DWRFacade.getLocales(handleLocales);	
	DWRFacade.getTranslations(locale,handleTranslations);
	DWRFacade.getDesignList(handleDesigns);
	if(!anonymous) {
		var cataloglistel=document.getElementById("cataloglist");
		cataloglistel.style.display="block";
		doCatalogs();
	}
	DWRFacade.echo(handleInit);
	dwr.engine.endBatch();
}

function doShutdown() {
	dwr.engine.setActiveReverseAjax(false);
}

function handleWarning(msg) {
	endProgress();
	if (errordlg && errordlg.cfg.getProperty("visible")) {
		return;
	}
	var dlgoptions={
		fixedcenter: true,
		visible: false,
		draggable: true,			 
		close: true,
		modal:true,	
		zindex:200,
		constraintoviewport: true,
		width: "200px"
	};
	errordlg = new YAHOO.widget.SimpleDialog("errordialog",dlgoptions);
	errordlg.setHeader(translations.errordialog_title);
	errordlg.setBody(translations.errordialog_warning+"<br/>"+msg);
	errordlg.cfg.queueProperty("buttons", [
	{
		text: translations.errordialog_ok, 
		handler:function() {
			errordlg.hide();
		},
		isDefault: true
	}]);
	errordlg.render("ptc_content");
	errordlg.show();
}

function handleError(msg) {
	endProgress();
	if (errordlg && errordlg.cfg.getProperty("visible")) {
		return;
	}
	var dlgoptions={
		fixedcenter: true,
		visible: false,
		draggable: true,			 
		close: false,
		modal:true,	
		zindex:200,
		constraintoviewport: true,
		width: "200px"
	};
	errordlg = new YAHOO.widget.SimpleDialog("errordialog",dlgoptions);
	errordlg.setHeader(translations.errordialog_title);
	errordlg.setBody(translations.errordialog_error+"<br/>"+msg);
	errordlg.cfg.queueProperty("buttons", [
	{
		text: translations.errordialog_reload, 
		handler:function() {
			window.location.reload();
		},
		isDefault: true
	}]);
	errordlg.render("ptc_content");
	errordlg.show();
}

function handleLocales(result) {
	locales=result;
}

function handleTranslations(result) {
	translations=result;
}

function handleDesigns(result) {
	designs=result;
	dwr.util.removeAllOptions("createdialog_design");
	for(var i=0;i<designs.length;i++) {
		dwr.util.addOptions("createdialog_design", [{k:designs[i].name, v:designs[i].name}], "k", "v");
	}
	YAHOO.util.Event.addListener("createdialog_design","change",handleDesignSelect);
	handleDesignSelect(null);
}

function handleDesignSelect(event) {
	var dname=dwr.util.getValue("createdialog_design");
	var d=null;
	dwr.util.removeAllOptions("createdialog_language");
	for(var i=0;i<designs.length;i++) {
		if(designs[i].name==dname) {
			d=designs[i];
			break;
		}
	}
	if(d) {
		var havecurrent=false;
		for(var i=0;i<d.locales.length;i++) {
			if(locale==d.locales[i]) havecurrent=true;
			dwr.util.addOptions("createdialog_language", [{k:d.locales[i], v:translations["locale_"+d.locales[i]]}], "k", "v");
		}
		if(havecurrent) dwr.util.setValue("createdialog_language",locale);
	}
}

function handleInit() {
	doLanguageSelect();
	if(anonymous && !embedded) doCreate(0);
}

function doLanguageSelect() {
	dwr.util.removeAllOptions("languageselect");
	for(var i=0;i<locales.length;i++) {
		dwr.util.addOptions("languageselect",[{k:locales[i],v:translations["locale_"+locales[i]]}],"k","v");
	}
	dwr.util.setValue("languageselect",locale);
	YAHOO.util.Event.addListener("languageselect","change",handleLanguageSelect);
}

function handleLanguageSelect(event) {
	doShutdown();
	window.location.href="?locale="+dwr.util.getValue("languageselect");
}

function doCreate(catalogid) {
	createCatalogId=catalogid;
	var n = document.getElementById("createdialog_name");
	var f = document.getElementById("createdialog_file");
	var step4 = document.getElementById("createdialog_step4");
	if(!anonymous) {
		step4.style.display="none";
	}
	n.value = "";
	f.value = "";
	if (catalogid>0) {
		dwr.util.setValue("createdialog_name", dwr.util.getValue("catalogentry_name_catalog"+catalogid));
		n.disabled = true;
		f.disabled = true;
	}
	else {
		n.disabled = false;
		f.disabled = false;
	}
	createdlg.show();
	validateUpload();
}

function handleCreateOutput(event,catalogid) {
	doCreate(catalogid);
}

function getCatalogVO() {
	return {
		name : dwr.util.getValue('createdialog_name')
	};
}

function getOutputVO() {
	return {
		design : dwr.util.getValue("createdialog_design"),
		language : dwr.util.getValue("createdialog_language"),
		width : dwr.util.getValue("createdialog_customsize_width"),
		height : dwr.util.getValue("createdialog_customsize_height"),
		allowPrint : dwr.util.getValue("createdialog_allowPrint"),
		allowDownload : dwr.util.getValue("createdialog_allowDownload"),
		enableTOC : dwr.util.getValue("createdialog_enableTOC"),
		emailAddress : dwr.util.getValue("createdialog_email"),
		emailLocale : locale
	};
}

function validateUpload() {
	var valid=true;
	var f;
	var val;
	
	// file
	f = document.getElementById("createdialog_file");
	m = document.getElementById("createdialog_file_marker");
	YAHOO.util.Dom.removeClass(m, "error");
	if(createCatalogId==0) {
		val=f.value;
		if(val) {
			var suf=val.substr(val.lastIndexOf(".")+1).toLowerCase();
			if(suf!="pdf") {
				YAHOO.util.Dom.addClass(m, "error");
				valid=false;
			}
		} else {
			YAHOO.util.Dom.addClass(m, "error");
			valid=false;
		}
	}
	
	// size
	if(!validateInt("createdialog_customsize_width",640,2048)) valid=false;
	if(!validateInt("createdialog_customsize_height",480,2048)) valid=false;
	
	// email
	if(anonymous) {
		f = document.getElementById("createdialog_email");
		m = document.getElementById("createdialog_email_marker");
		YAHOO.util.Dom.removeClass(m, "error");
		val=f.value;
		if(val) {
			// check email
			var re=new RegExp("^[-!#$%&'*+\\/0-9=?A-Z^_`a-z{|}~]+(\\.[-!#$%&'*+\\/0-9=?A-Z^_`a-z{|}~]+)*@([0-9A-Za-z]([0-9A-Za-z-]{0,61}[0-9A-Za-z])?\\.)*[A-Za-z]([0-9A-Za-z-]{0,61}[0-9A-Za-z])?$");
			if(!re.test(val)) {
				YAHOO.util.Dom.addClass(m, "error");
				valid=false;
			}
		} else {
			YAHOO.util.Dom.addClass(m, "error");
			valid=false;
		}
	}
	
	if(valid) {
		YAHOO.util.Dom.removeClass("createbutton","disabled");
	} else {
		YAHOO.util.Dom.addClass("createbutton","disabled");
	}
		
	return valid;
}

function validateInt(field,min,max) {
	var valid=true;
	f = document.getElementById(field);
	m = document.getElementById(field+"_marker");
	YAHOO.util.Dom.removeClass(m, "error");
	val=f.value;
	if(val) {
		var re=new RegExp("^[0-9]+$");
		if(!re.test(val)) {
			YAHOO.util.Dom.addClass(m, "error");
			valid=false;
		} else {
			val=Number(val);
			if(val<min || val>max) {
				YAHOO.util.Dom.addClass(m, "error");
				valid=false;
			}
		}
	} else {
		YAHOO.util.Dom.addClass(m, "error");
		valid=false;
	}
	return valid;
}

function doUpload() {
	if(!validateUpload()) return;
	beginProgress();
	createdlg.hide();
	if(createCatalogId==0) {
		DWRFacade.createCatalog(getCatalogVO(), dwr.util.getValue('createdialog_file'), getOutputVO(), handleUpload);
	} else {
		var outputVO=getOutputVO();
		outputVO.catalogId=createCatalogId;
		DWRFacade.createOutput(outputVO, handleUpload);
	}
}

function beginProgress() {
	progressdlg.show();
}

function endProgress() {
	if(progressdlg) {
		progressdlg.hide();
	}
}

function handleUpload(result) {
	endProgress();
	if(!anonymous) {
		if(result) {
			if(createCatalogId==0) {
				createCatalogId=result;
			}
			expandedCatalogs["cat"+createCatalogId]=true;
			doCatalogs();
		}
	} else {
		doInfo();
	}
}

function doInfo() {
	var dlgoptions={
		fixedcenter: true,
		visible: false,
		draggable: true,			 
		close: false,
		modal:true,	
		zindex:200,
		constraintoviewport: true,
		width: "300px"
	};
	infodlg = new YAHOO.widget.SimpleDialog("infodialog",dlgoptions);
	infodlg.setHeader(translations.infodialog_title);
	infodlg.setBody(translations.infodialog_content);
	infodlg.cfg.queueProperty("buttons", [
	{
		text: translations.infodialog_ok, 
		handler:function() {
			infodlg.hide();
		},
		isDefault: true
	}]);
	infodlg.render("ptc_content");
	infodlg.show();
}

function doDeleteCatalog(catalogid) {
	DWRFacade.deleteCatalog(catalogid);
}

function handleDeleteCatalog(event,catalogid) {
	deletedlg.setHeader(translations.deletedialog_title);
	deletedlg.setBody(translations.deletedialog_text_catalog);
	deletedlg.cfg.queueProperty("buttons", [
	{
		text: translations.deletedialog_yes, 
		handler:function() {
			doDeleteCatalog(catalogid);
			deletedlg.hide();
		},
		isDefault: true
	},
	{
		text: translations.deletedialog_no, 
		handler:function() {
			deletedlg.hide();
		}
	}]);
	deletedlg.render("ptc_content");
	deletedlg.show();
}

function doDeleteOutput(outputid) {
	DWRFacade.deleteOutput(outputid);
}

function handleDeleteOutput(event,outputid) {
	deletedlg.setHeader(translations.deletedialog_title);
	deletedlg.setBody(translations.deletedialog_text_output);
	deletedlg.cfg.queueProperty("buttons", [
	{
		text: translations.deletedialog_yes, 
		handler:function() {
			doDeleteOutput(outputid);
			deletedlg.hide();
		},
		isDefault: true
	},
	{
		text: translations.deletedialog_no, 
		handler:function() {
			deletedlg.hide();
		}
	}]);
	deletedlg.render("ptc_content");
	deletedlg.show();
}

function handleCatalogs(result) {
	var cataloglist_body=document.getElementById("cataloglist_body");
	cataloglist_body.innerHTML="";
	for(var i=0;i<result.catalogs.length;i++) {
		var catalog=result.catalogs[i];
		var suffix="_catalog"+catalog.id;
		var node=cloneNode("catalogentry",{ idSuffix:suffix });
		YAHOO.util.Dom.removeClass(node, "template")
		cataloglist_body.appendChild(node);
		dwr.util.setValue("catalogentry_name"+suffix,catalog.name);
		dwr.util.setValue("catalogentry_filename"+suffix,catalog.file.name);
		YAHOO.util.Event.addListener("catalogentry_collapse"+suffix,"click",handleCollapse,catalog.id);
		YAHOO.util.Event.addListener("catalogentry_create"+suffix,"click",handleCreateOutput,catalog.id);
		YAHOO.util.Event.addListener("catalogentry_delete"+suffix,"click",handleDeleteCatalog,catalog.id);
		YAHOO.util.Event.addListener("catalogentry_source"+suffix,"click",handleDownloadCatalogSource,getDownloadURL(catalog.file));
		if(expandedCatalogs["cat"+catalog.id]) {
			var catalogentry=document.getElementById("catalogentry"+suffix);
			var icon=document.getElementById("catalogentry_collapse_icon"+suffix);
			doOutputs(catalog.id);
			icon.src=icon.src.replace("_collapsed","_expanded");
			YAHOO.util.Dom.replaceClass(catalogentry, "collapsed", "expanded")
		}
	}
	if (result.catalogs.length>0) {
		YAHOO.util.Dom.addClass("cataloglist_body", "loaded");
	}
	doPager(Math.ceil(result.total/perpage),page);
}

function doCatalogs() {
	DWRFacade.getCatalogList((page-1)*perpage,perpage,search,handleCatalogs);
}

function updateCatalogs() {
	doCatalogs();
}

function handleCollapse(event,catalogid) {
	var suffix="_catalog"+catalogid;
	var catalogentry=document.getElementById("catalogentry"+suffix);
	var body=document.getElementById("catalogentry_body"+suffix);
	var outputs=document.getElementById("catalogentry_output"+suffix);
	var icon=document.getElementById("catalogentry_collapse_icon"+suffix);
	if(YAHOO.util.Dom.hasClass(catalogentry, "collapsed")) {
		expandedCatalogs["cat"+catalogid]=true;
		doOutputs(catalogid);
		icon.src=icon.src.replace("_collapsed","_expanded");
		YAHOO.util.Dom.replaceClass(catalogentry, "collapsed", "expanded")
	} else {
		expandedCatalogs["cat"+catalogid]=false;
		YAHOO.util.Dom.replaceClass(catalogentry, "expanded", "collapsed")
		outputs.innerHTML="";
		icon.src=icon.src.replace("_expanded","_collapsed");
	}
}

function handleDownloadCatalogSource(event,url) {
	doDownload(url);
}

function handleOutputs(result) {
	var catalogid=result.catalogId;
	var suffix="_catalog"+catalogid;
	var outputs=document.getElementById("catalogentry_output"+suffix);
	if(outputs) {
		outputs.innerHTML="";
		if(result.outputs.length>0) {
			for(var o=0;o<result.outputs.length;o++) {
				var output=result.outputs[o];
				appendOutputElement(outputs,output);
			}
		} else {
			outputs.style.display="none";
		}
	}
}

function appendOutputElement(parent,output,ou,replace) {
	var outputsuffix="_output"+output.id;
	var node=cloneNode("outputentry",{ idSuffix:outputsuffix });
	if(replace) {
		parent.replaceChild(node,replace);
	} else {
		parent.appendChild(node);
	}
	var labelEl=document.getElementById("outputentry_label"+outputsuffix);
	labelEl.innerHTML=formatOutputLabel(output);
	
	var files=[];
	if(output.status=="PENDING") {
		var actionsel=document.getElementById("outputentry_actions"+outputsuffix);
		var progressel=document.getElementById("outputentry_progress"+outputsuffix);
		var indicatorel=document.getElementById("outputentry_progressindicator"+outputsuffix);
		actionsel.style.display="none";
		progressel.style.display="block";
		if(ou) {
			indicatorel.style.width=(ou.progress*100/ou.total)+"%";
		} else {
			indicatorel.style.width="100%";
			indicatorel.style.backgroundColor="#cccccc";
		}
	} else if(output.status=="FAILED") {
		var iconel=document.getElementById("outputentry_icon"+outputsuffix);
		iconel.src="images/page_error.gif";
		if (output.fileLog) {
			files.push({file:getDownloadURL(output.fileLog),label:translations.outputfile_errorlog});
		}
	} else {
		if (output.fileHTML) {
			files.push({file:getDownloadURL(output.fileHTML),label:translations.outputfile_html});
			var previewurl=getPreviewURL(output.fileHTML);
			var labelOuterEl=document.getElementById("outputentry_label_outer"+outputsuffix);
			YAHOO.util.Event.addListener(labelOuterEl,"click",handlePreview,previewurl);
			YAHOO.util.Dom.addClass(labelOuterEl, "click")
		}
		if (output.fileWin) {
			files.push({file:getDownloadURL(output.fileWin),label:translations.outputfile_win});
		}
		if (output.fileMac) {
			files.push({file:getDownloadURL(output.fileMac),label:translations.outputfile_mac});
		}
	}
	if (files.length>0) {
		dwr.util.addOptions("outputentry_downloadlist"+outputsuffix, files, "file", "label");
	}
	
	YAHOO.util.Event.addListener("outputentry_delete"+outputsuffix,"click",handleDeleteOutput,output.id);
	YAHOO.util.Event.addListener("outputentry_downloadlist"+outputsuffix,"change",handleDownloadOutput,output.id);
	YAHOO.util.Dom.removeClass(node, "template")
	return node;
}

function formatOutputLabel(output) {
	var l = formatDate(output.creationDate, translations.outputlabel_dateformat);
	l += ", "+formatString(translations.outputlabel_design, output.design);
	l += ", "+translations["outputlabel_language_"+output.language];
	l += ", "+formatString(translations.outputlabel_size, output.width, output.height);
	var features = "";
	features += (output.allowPrint?(features!=""?", ":"")+translations.outputlabel_printallowed:"")
	features += (output.allowDownload?(features!=""?", ":"")+translations.outputlabel_downloadallowed:"")
	features += (output.enableTOC?(features!=""?", ":"")+translations.outputlabel_tocenabled:"")
	if (features!="") l += ", ("+features+")";
	return l;	
}

function formatDate(d, pattern) {
	return formatString(pattern, padString(d.getDate(), 2, '0'), padString(d.getMonth()+1, 2, '0'), d.getFullYear(), padString(d.getHours(), 2, '0'), padString(d.getMinutes(), 2, '0'), padString(d.getSeconds(), 2, '0'));
}

function formatString(str) {
	for (var i=1; i < arguments.length; i++) {
		str = str.replace("{"+(i-1)+"}", arguments[i]);
	}
	return str;
}

function padString(str, num, pad) {
	var p = [];
	str = str.toString();
	for (var i = num - str.length; i > 0; i--) {
		p.push(pad);
	}
	return p.join('')+str;
}

function doOutputs(catalogid) {
	DWRFacade.getOutputList(catalogid,handleOutputs);
}

function updateOutput(ou) {
	var suffix="_catalog"+ou.output.catalogId;
	var outputsuffix="_output"+ou.output.id;
	if(ou.type=="INSERT" || ou.type=="UPDATE") {
		var outputs=document.getElementById("catalogentry_output"+suffix);
		if(outputs) {
			outputs.style.display="block";
			var replace=document.getElementById("outputentry"+outputsuffix);
			if(!replace) {
				replace=document.createElement("div");
				if(outputs.firstChild) {
					outputs.insertBefore(replace,outputs.firstChild);
				} else {
					outputs.appendChild(replace);
				}
			}
			appendOutputElement(outputs,ou.output,ou,replace);
		}
	} else if(ou.type=="DELETE") {
		var outputentry=document.getElementById("outputentry"+outputsuffix);
		if(outputentry) {
			var outputs=outputentry.parentNode;
			outputs.removeChild(outputentry);
			if(outputs.childNodes.length==0) {
				outputs.style.display="none";
			}
		}
	}
}

function getDownloadURL(filevo) {
	return "download/"+escape(filevo.name)+"?id="+filevo.id;
}

function getPreviewURL(filevo) {
	var name=filevo.name;
	name=name.substr(0,name.length-9)+".html";
	return "preview/"+filevo.id+"/"+escape(name);
}

function doDownload(url) {
	var dlframe=document.createElement("iframe");
	dlframe.src=url;
	dlframe.style.display="none";
	document.getElementsByTagName("body")[0].appendChild(dlframe);	
}

function handleDownloadOutput(event,outputid) {
	if (this.selectedIndex>0) {
		doDownload(this.options[this.selectedIndex].value);
		this.selectedIndex=0;
	}
}

function handlePreview(event,url) {
	window.open(url);
}

function doSearch(searchstr) {
	if(search!=searchstr) {
		search=searchstr;
		page=1;
		doCatalogs();
	}
}

function doPager(totalPages,currentPage) {
	var pagerel=document.getElementById("pager");
	var pagesel=document.getElementById("pages");
	pagesel.innerHTML="";
	if(totalPages>1) {
		appendPagerElement(pagesel,"|<",1,false);
		appendPagerElement(pagesel,"<",currentPage>1?currentPage-1:1,false);
		
		var wstart=Math.floor(currentPage/10);
		var wend=Math.min(wstart+10,totalPages);
		for(var i=wstart+1;i<=wend;i++) {
			appendPagerElement(pagesel,i,i,i==page);
		}
		
		appendPagerElement(pagesel,">",currentPage<totalPages?currentPage+1:totalPages,false);
		appendPagerElement(pagesel,">|",totalPages,false);
		
		dwr.util.setValue("pageselectinput",currentPage);
		dwr.util.setValue("pageselecttotal",totalPages);
		pagerel.style.display="block";
	} else {
		pagerel.style.display="none";
	}
}

function appendPagerElement(pParent,pText,pPage, pCurrent) {
	var el=document.createElement("span");
	el.appendChild(document.createTextNode(pText));
	pParent.appendChild(el);
	YAHOO.util.Dom.addClass(el, "click");
	if(pCurrent) YAHOO.util.Dom.addClass(el, "current");
	YAHOO.util.Event.addListener(el,"click",handlePager,pPage);
}

function handlePager(event,newpage) {
	if(page!=newpage) {
		page=newpage;
		expandedCatalogs={};		
		doCatalogs();
	}
}

function handlePagerGo(event) {
	if(event.type=="keyup" && event.keyCode!=13) return;
	handlePager(null,dwr.util.getValue("pageselectinput"));
}

function cloneNode(ele, options) {
  ele = dwr.util._getElementById(ele, "cloneNode()");
  if (ele == null) return null;
  if (options == null) options = {};
  var clone = ele.cloneNode(true);
  if (options.idPrefix || options.idSuffix) {
    dwr.util._updateIds(clone, options);
  } else {
    dwr.util._removeIds(clone);
  }
  return clone;
}


