function createSimpleEditor(textareaId) {
	var richEditor = new YAHOO.widget.SimpleEditor(textareaId, {
		height : '300px',
		width : '670px',
		dompath : true,
		focusAtStart : true,
		toolbar : {
			collapse : true,
			titlebar : 'Redigera',
			draggable : false,
			buttons : [ {
				group : 'fontstyle',
				label : 'Teckensnitt och storlek',
				buttons : [ {
					type : 'select',
					label : '',
					value : 'fontname',
					disabled : false,
					menu : [ {
						text : 'Arial'
					}, {
						text : 'Courier New'
					}, {
						text : 'Times New Roman'
					} ]
				}, {
					type : 'spin',
					label : '',
					value : 'fontsize',
					range : [ 9, 75 ],
					disabled : false
				} ]
			}, {
				type : 'separator'
			}, {
				group : 'textstyle',
				label : 'Formattering',
				buttons : [ {
					type : 'push',
					label : 'Fet CTRL + SHIFT + B',
					value : 'bold'
				}, {
					type : 'push',
					label : 'Kursiv CTRL + SHIFT + I',
					value : 'italic'
				}, {
					type : 'push',
					label : 'Understruken CTRL + SHIFT + U',
					value : 'underline'
				}, {
					type : 'push',
					label : 'Skapa länk CTRL + SHIFT + L',
					value : 'createlink'
				}, {
					type : 'separator'
				}, {
					type : 'color',
					label : 'Teckenfärg',
					value : 'forecolor'
				}, {
					type : 'color',
					label : 'Bakgrundsfärg',
					value : 'backcolor'
				}

				]
			}, {
				type : 'separator'
			}, {
				group : 'indentlist',
				label : 'Listor',
				buttons : [ {
					type : 'push',
					label : 'Skapa en osorterad lista',
					value : 'insertunorderedlist'
				}, {
					type : 'push',
					label : 'Skapa en sorterad lista',
					value : 'insertorderedlist'
				} ]
			}

			]
		}
	});
	// richEditor._defaultToolbar.buttonType = 'basic';
	return richEditor;
}

var ProgressAnimationHandler = {
	containerElement : null,
	elementToHide : null,
	show : function(containerElementId, elementToHideId) {
		containerElement = document.getElementById(containerElementId);
		elementToHide = document.getElementById(elementToHideId);
		YAHOO.util.Dom.addClass(elementToHide, 'hideMe');
		YAHOO.util.Dom.addClass(containerElement, 'progressAnimation');
	},
	hide : function() {
		YAHOO.util.Dom.removeClass(containerElement, 'progressAnimation');
	}
};

var RegistrationHandler = {
	handleSuccess : function(o) {
		ProgressAnimationHandler.hide();
		document.getElementById('registerbox-bd').innerHTML = o.responseText;
	},

	handleFailure : function(o) {
		ProgressAnimationHandler.hide();
		alert("Registration failed!");
	},

	startRequest : function(sUrl) {
		ProgressAnimationHandler.show('registerbox-bd', 'register');
		var formObject = document.getElementById('register');
		YAHOO.util.Connect.setForm(formObject);
		YAHOO.util.Connect.asyncRequest('POST', sUrl, registrationCallback);
	}
};

var registrationCallback = {
	success : RegistrationHandler.handleSuccess,
	failure : RegistrationHandler.handleFailure,
	scope : RegistrationHandler
};

var MailFriendHandler = {
	handleSuccess : function(o) {
		document.getElementById('friendtip-bd').innerHTML = o.responseText;
	},

	handleFailure : function(o) {
		alert("Send mail failed!");
	},

	startRequest : function(sUrl) {
		var formObject = document.getElementById('mail_friend_form');
		YAHOO.util.Connect.setForm(formObject);
		YAHOO.util.Connect.asyncRequest('POST', sUrl, mailFriendCallback);
		return false;
	}
};

var mailFriendCallback = {
	success : MailFriendHandler.handleSuccess,
	failure : MailFriendHandler.handleFailure,
	scope : MailFriendHandler
};


var MatchMailExternalHandler = {
	handleSuccess : function(o) {
		for(dialogKey in YAHOO.com.metrojobb.dialogMatchMailExternal){
			YAHOO.com.metrojobb.dialogMatchMailExternal[dialogKey].hide();
		}
	},

	handleFailure : function(o) {
		alert("Call failed");
	},

	startRequest : function(sUrl, formId) {
		var formObject = document.getElementById(formId);
		YAHOO.util.Connect.setForm(formObject, true);
		YAHOO.util.Connect.asyncRequest('POST', sUrl, matchMailExternalCallback, null);
	}
};

var matchMailExternalCallback = {
	upload : MatchMailExternalHandler.handleSuccess,
	failure : MatchMailExternalHandler.handleFailure,
	scope : MatchMailExternalHandler
};



var MatchMailInternalHandler = {
	handleSuccess : function(o) {
		var responseText = YAHOO.lang.trim(o.responseText);
		if (responseText.indexOf("matchAgentInternalUrl:") === 0) {
			YAHOO.com.metrojobb.dialogMatchMailInternal.hide();
			window.location = responseText.substring(22, responseText.length);
		} else {
			YAHOO.com.metrojobb.dialogMatchMailInternal.show();
			document.getElementById('matchMailInternalBox-bd').innerHTML = responseText; 
		}
	},

	handleFailure : function(o) {
		alert("failure");
	},

	startRequest : function(sUrl) {
		var formObject = document
				.getElementById('matchmailregistrationinternalform');
		YAHOO.util.Connect.setForm(formObject, true);
		YAHOO.util.Connect.asyncRequest('POST', sUrl, matchMailInternalCallback, null);
	}
};


var matchMailInternalCallback = {
	upload : MatchMailInternalHandler.handleSuccess,
	failure : MatchMailInternalHandler.handleFailure,
	scope : MatchMailInternalHandler
};


var RemoveAccountConfirmationHandler = {
		handleSuccess : function(o) {
			alert("success");
		},

		handleFailure : function(o) {
			alert("failure");
		},

		startRequest : function(sUrl) {
			var formObject = document
					.getElementById('removeaccountconfirmationform');
			
			YAHOO.util.Connect.setForm(formObject, true);
			YAHOO.util.Connect.asyncRequest('POST', sUrl, removeAccountConfirmationCallback, null);
		}
	};


	var removeAccountConfirmationCallback = {
		upload : RemoveAccountConfirmationHandler.handleSuccess,
		failure : RemoveAccountConfirmationHandler.handleFailure,
		scope : RemoveAccountConfirmationHandler
	};

var LoginHandler = {
	
	openResultInNewWindow : false,
	
	handleSuccess : function(o) {
		var responseTextTrimmed = YAHOO.lang.trim(o.responseText);
		if (responseTextTrimmed.indexOf('success:') === 0) {
			var url = responseTextTrimmed.substring(8, responseTextTrimmed.length);
			if(LoginHandler.openResultInNewWindow) {
				window.open(url, "external");
				window.location.reload();								
			} else {
				window.location = url;								
			}
		} else {
			ProgressAnimationHandler.hide();
			document.getElementById('loginbox-bd').innerHTML = o.responseText;
		}
	},

	handleFailure : function(o) {
		if (o.status === 500) { // this will show error page from error/500.jsp
			alert(navigator.appName);
			if (navigator.appName === 'Microsoft Internet Explorer') {
				alert('Internal server error');
			} else {
				content.document.location.href = "javascript:(function(){document.open();document.write('"
						+ o.responseText + "');document.close();})();";
			}
		} else {
			alert('Internal server error');
		}
	},

	startRequest : function(sUrl, openInNew) {
		 
		if(openInNew === true) {
			openResultInNewWindow = openInNew; 
		} else {
			openResultInNewWindow = false; 			
		}
		
		ProgressAnimationHandler.show('loginbox-bd', 'loginform');
		var formObject = document.getElementById('loginform');
		YAHOO.util.Connect.setForm(formObject);
		YAHOO.util.Connect.asyncRequest('POST', sUrl, loginCallback);
	}
};

var loginCallback = {
	success : LoginHandler.handleSuccess,
	failure : LoginHandler.handleFailure,
	scope : LoginHandler
};

var contextPath;

var setContextPath = function(sContextPath) {
	contextPath = sContextPath;
};

var AgentHandler = {
	handleSuccess : function(o) {
		var responseTextTrimmed = YAHOO.lang.trim(o.responseText);
		if (responseTextTrimmed.indexOf('success:') === 0) {
			window.location = responseTextTrimmed.substring(8,
					responseTextTrimmed.length);
		} else {
			document.getElementById('jobagentbox-bd').innerHTML = o.responseText;
		}
	},

	handleFailure : function(o) {
		// TODO: What do we do here?
		alert("Submit failed!");
	},

	startRequest : function(sUrl) {
		var formObject = document.getElementById('agentform');
		YAHOO.util.Connect.setForm(formObject);
		YAHOO.util.Connect.asyncRequest('POST', sUrl, agentCallback);
	}
};

var agentCallback = {
	success : AgentHandler.handleSuccess,
	failure : AgentHandler.handleFailure,
	scope : AgentHandler
};

var RemoveHandler = {
	handleSuccess : function(o) {
		var responseTextTrimmed = YAHOO.lang.trim(o.responseText);
		if (responseTextTrimmed.indexOf('success:') === 0) {
			YAHOO.util.Dom.setStyle(YAHOO.lang.trim(responseTextTrimmed
					.substring(8)), 'display', 'none');
		} else {
			// do nothing
		}
	},

	handleFailure : function(o) {
		// TODO: What do we do here?
		alert("Submit failed!");
	},

	startRequest : function(sUrl, confirmText) {
		if (window.confirm(confirmText)) {
			YAHOO.util.Connect.asyncRequest('get', sUrl, removeCallback);
		}
	}
};

var removeCallback = {
	success : RemoveHandler.handleSuccess,
	failure : RemoveHandler.handleFailure,
	scope : RemoveHandler
};

var RegionHandler = {

	selectElmnt : null,

	handleSuccess : function(o) {
		removeAllOptionsButTheFirstOne(RegionHandler.selectElmnt);
		if (o.responseXML !== undefined && o.responseXML !== null) {
			var root = o.responseXML.documentElement;
			var regions = root.getElementsByTagName('region');
			for ( var i = 0; i < regions.length; i++) {
				var region = regions[i];
				var theId = region.getElementsByTagName("id")[0].firstChild.nodeValue;
				var theName = region.getElementsByTagName("name")[0].firstChild.nodeValue;
				addOption(RegionHandler.selectElmnt, theId, theName);
			}
		}

	},

	handleFailure : function(o) {
		alert("Unable to fetch regions...");
	},

	loadRegions : function(selElementId, regionId) {
		// Find regions by parent id
		var sUrl = contextPath + "/region/findByParent.do?regionId=" + regionId;
		// The select we want to load with new regions
		RegionHandler.selectElmnt = document.getElementById(selElementId);

		YAHOO.util.Connect.asyncRequest('GET', sUrl, regionCallback);
	}
};

var regionCallback = {
	success : RegionHandler.handleSuccess,
	failure : RegionHandler.handleFailure,
	scope : RegionHandler
};

var CategoryHandler = {

	selectElmnt : null,
	retainFirst : true,

	handleSuccess : function(o) {
		if (CategoryHandler.retainFirst) {
			removeAllOptionsButTheFirstOne(CategoryHandler.selectElmnt);
		} else {
			CategoryHandler.selectElmnt.options.length = 0;
		}
		if (o.responseXML !== undefined && o.responseXML !== null) {
			var root = o.responseXML.documentElement;
			var categories = root.getElementsByTagName('category');
			for ( var i = 0; i < categories.length; i++) {
				var category = categories[i];
				var theId = category.getElementsByTagName("id")[0].firstChild.nodeValue;
				var theName = category.getElementsByTagName("name")[0].firstChild.nodeValue;
				addOption(CategoryHandler.selectElmnt, theId, theName);
			}
		}

	},

	handleFailure : function(o) {
		alert("Unable to fetch categories, status=[" + o.statusText + "]");
	},

	loadCategories : function(sUrl, selElementId, categoryId) {
		// The select we want to load with new regions
		CategoryHandler.selectElmnt = document.getElementById(selElementId);

		YAHOO.util.Connect.asyncRequest('GET', sUrl, categoryCallback);
	},

	loadChildren : function(selElementId, categoryId) {
		// Find categories by parent id
		var sUrl = contextPath + "/category/findByParent.do?categoryId="
				+ categoryId;
		CategoryHandler.loadCategories(sUrl, selElementId, categoryId);
	},

	loadSiblings : function(selElementId, categoryId) {
		var sUrl = contextPath + "/category/getSiblings?categoryId="
				+ categoryId;
		CategoryHandler.loadCategories(sUrl, selElementId, categoryId);
	}
};

var categoryCallback = {
	success : CategoryHandler.handleSuccess,
	failure : CategoryHandler.handleFailure,
	scope : CategoryHandler
};

var postForm = function(sUrl, formId, targetId) {
	YAHOO.util.Connect.setForm(document.getElementById(formId));
	var cObj = YAHOO.util.Connect.asyncRequest('POST', sUrl, {
		success : function(o) {
			document.getElementById(targetId).innerHTML = o.responseText;
		},
		failure : function(o) {
			alert(o.statusText);
		}
	});
};

var postFormAndReload = function(sUrl, formId, targetId) {
	YAHOO.util.Connect.setForm(document.getElementById(formId));
	var cObj = YAHOO.util.Connect.asyncRequest('POST', sUrl, {
		success : function(o) {
			var responseTextTrimmed = YAHOO.lang.trim(o.responseText);
			if (responseTextTrimmed.indexOf('<success/>') === 0) {
				window.location.reload();
			} else {
				document.getElementById(targetId).innerHTML = o.responseText;
			}
		},
		failure : function(o) {
			alert(o.statusText);
		}
	});
};

var getHtml = function(sUrl, targetId) {
	YAHOO.util.Connect.asyncRequest('GET', sUrl, {
		success : function(o) {
			document.getElementById(targetId).innerHTML = o.responseText;
		},
		failure : function(o) {
			alert(o.statusText);
		}
	});
};

function addOption(sel, theId, theName) {
	var opt = document.createElement("OPTION");
	opt.value = theId;
	opt.text = theName;
	try {
		sel.add(opt, null); // standards compliant
	} catch (ex) {
		sel.add(opt); // IE only
	}
}

function handleCountryChange(e) {
	var regionId = getSelectedId(e);
	setHiddenRegionIdValue(regionId);
	RegionHandler.loadRegions('select-region-2', regionId);
	removeAllOptionsButTheFirstOne(document.getElementById('select-region-3'));
}

function handleCountyChange(e) {
	var regionId = getSelectedId(e);
	setHiddenRegionIdValue(regionId);
	RegionHandler.loadRegions('select-region-3', regionId);
}

function handleMunicipalityChange(e) {
	var regionId = getSelectedId(e);
	setHiddenRegionIdValue(regionId);
}

function setHiddenRegionIdValue(regionId) {
	var elmnt = document.getElementById('regionObj');
	elmnt.value = regionId;
}

function handleBaseCategoryChange(e, obj) {
	var categoryId = getSelectedId(e);
	setHiddenCategoryIdValue(categoryId, obj.formId);
	CategoryHandler.retainFirst = true;
	CategoryHandler.loadChildren(obj.selectId, categoryId);
}

function handleCategoryChange(e, category) {
	var categoryId = getSelectedId(e);
	setHiddenCategoryIdValue(categoryId, category);
}

function setHiddenCategoryIdValue(categoryId, category) {
	var elmnt = document.getElementById(category);
	elmnt.value = categoryId;
}

function removeAllOptionsButTheFirstOne(elmnt) {
	elmnt.options.length = 1;
}

function getSelectedId(e) {
	var elTarget = YAHOO.util.Event.getTarget(e);
	return elTarget.options[elTarget.selectedIndex].value;
}

function toggleAdditionalCategories(evt) {
	var id = getSelectedId(evt);
	if (id > 0) {
		CategoryHandler.retainFirst = false;
		CategoryHandler.loadSiblings('additionalCategories', id);
		YAHOO.util.Dom.removeClass("additional-categories-container", "hideMe");
	} else {
		YAHOO.util.Dom.addClass("additional-categories-container", "hideMe");
	}
}
function hideAdditionalCategories() {
	YAHOO.util.Dom.addClass("additional-categories-container", "hideMe");
}

// Namespace to prevent function name collisions.
var cygni = {
		
	preventEnterKey: function(elementId) {
	    YAHOO.util.Event.addListener(elementId, "keypress", function(e) {
	    	var keyCode = e.which ? e.which : e.keyCode;
	    	if(keyCode === 13) {
	    		return false;
	    	}
	    });	
	},
	
	disableEnterKey: function(e){
		if (e.keyCode == 13) {
	        return false;
	    }
	},

	triggerClickOnEnter: function(inputElementId, clickElementId) {
	    YAHOO.util.Event.addListener(inputElementId, "keypress", function(e) {
	    	var keyCode = e.which ? e.which : e.keyCode;
	    	if(keyCode === 13) {
	    		cygni.triggerClick(clickElementId);
	    	}
	    });	
	},
	
	// Trigger a synthetic click event on an element.
	triggerClick: function(elementId) {
		var element = document.getElementById(elementId);
		var evt = document.createEvent("MouseEvents");
		evt.initMouseEvent("click", true, true, window,
		  0, 0, 0, 0, 0, false, false, false, false, 0, null);
		element.dispatchEvent(evt);
	}
	
};
