// === asset/effect selector code ===

// TODO generalise this :)

var currentAssetSelectorField = "";
var currentAssetSelectorPopup = null;

function showAssetSelector(fieldname) {
	currentAssetSelectorField = fieldname;
	if (currentAssetSelectorPopup != null && !currentAssetSelectorPopup.closed) {
		currentAssetSelectorPopup.close();
	}
	currentAssetSelectorPopup = popup(basePath + "admin/assets_search.htm",
			"assetSearch", "width=500,height=500,scrollbars=yes");
	return false;
}

function selectAsset(id) {
	if (window.opener != null) {
		window.opener.onAssetSelected(id);
	}
}

function onAssetSelected(id) {
	$(currentAssetSelectorField).value = id;
	currentAssetSelectorPopup.close();
	currentAssetSelectorPopup = null;

	new Ajax.Updater(currentAssetSelectorField + "_assetPreview", basePath
			+ "admin/assets_display/" + id + ".htm?thumbnail=true");
}

var currentEffectSelectorField = "";
var currentEffectSelectorPopup = null;

function showEffectSelector(fieldname) {
	currentEffectSelectorField = fieldname;
	if (currentEffectSelectorPopup != null
			&& !currentEffectSelectorPopup.closed) {
		currentEffectSelectorPopup.close();
	}
	currentEffectSelectorPopup = popup(basePath + "admin/effects_search.htm",
			"effectSearch", "width=500,height=500,scrollbars=yes");
	return false;
}

function selectEffect(id) {
	if (window.opener != null) {
		window.opener.onEffectSelected(id);
	}
}

function onEffectSelected(id) {
	$(currentEffectSelectorField).value = id;
	currentEffectSelectorPopup.close();
	currentEffectSelectorPopup = null;

	new Ajax.Updater(currentEffectSelectorField + "_effectPreview", basePath
			+ "admin/effects_display/" + id + ".htm");
}

// === window functions ===

function updateScrollPosition() {
	if (window.location.hash.startsWith("#")) {
		window.location.hash = window.location.hash; // *chuckle*
	}
}

function popup(url, winName, features) {
	remote = window.open(url, winName, features);
	if (remote.opener == null) {
		remote.opener = window;
	}
	remote.focus();
	return remote;
}

// === autocomplete functions ===

function autoComplete(functionname, targetElement, fieldname) {
	var val = $F(targetElement);
	var target = targetElement.identify();

	if (val.length > 3) {
		functionname(val, function(data) {
			if (data != null && typeof data == 'object') {
				onAutoComplete(data, target, fieldname);
			}
		});
	}
}

function onAutoComplete(data, target, fieldname) {
	var suggestBoxHTML = "<div><ul>";
	// cap at ten items ...
	var count = Math.min(10, data.length);
	for (var i = 0; i < count; i++) {
		if (fieldname == undefined) {
			suggestBoxHTML += "<li><a href=\"#\" onClick=\"return onAutoCompleteChosen(this.innerHTML, '"
					+ target
					+ "');\">"
					+ htmlEscapeString(data[i])
					+ "</a></li>";
		} else {
			suggestBoxHTML += "<li><a href=\"#\" onClick=\"return onAutoCompleteChosen(this.innerHTML, '"
					+ target
					+ "');\">"
					+ htmlEscapeString(data[i][fieldname])
					+ "</a></li>";
		}
	}
	suggestBoxHTML += "</ul>";
	suggestBoxHTML += "<!--[if lte IE 6.5]><iframe></iframe><![endif]-->";
	suggestBoxHTML += "</div>";
	
	$("autoComplete_" + target).show();
	Element.update("autoComplete_" + target, suggestBoxHTML);
}

function onAutoCompleteChosen(val, target) {
	$(target).value = val; // TODO htmlunescape?
	$("autoComplete_" + target).hide();

	return false;
}

// === string escaping functions ===

function htmlEscapeString(s) {
	if (s == null) {
		return "";
	}
	return s.replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;")
			.replace(/"/g, "&quot;").replace(/\n/g, "<br />");
}

function jsEscapeString(s) {
	if (s == null) {
		return "";
	}
	return htmlEscapeString(s).replace(/'/g, "\\'");
}

function urlEscapeString(s) {
	if (s == null) {
		return "";
	}
	return escape(s).replace('+', '%2B').replace('%20', '+')
			.replace('*', '%2A').replace('/', '%2F').replace('@', '%40');
}

function clearDefault(thisfield,converttopassword,clearOnlyIfThis) {
	if (thisfield.value == clearOnlyIfThis) {
		thisfield.value = "";
	}
	if (converttopassword) {
		thisfield.type = "password";
	}
}

function setDefault(thisfield,converttopassword,displayText) {
	if (thisfield.value == "") {
		thisfield.value = displayText;
	}
	if (converttopassword) {
		thisfield.type = "password";
	}
}

function restrictCharactersToDigits(myfield, e) {
	if (!e) var e = window.event;
	if (e.keyCode) code = e.keyCode;
	else if (e.which) code = e.which;
	var character = String.fromCharCode(code);

	if (code==27) { this.blur(); return false; }
	
	if (!e.ctrlKey && code!=9 && code!=8 && code!=36 && code!=37 && code!=38 && (code!=39 || (code==39 && character=="'")) && code!=40) {
		if (character.match(/[1234567890]/g)) {
			return true;
		} else {
			return false;
		}
	}
}

function onEnterKeypress(event, func) {
	if (window.event) {
		keynum = window.event.keyCode;
	} else if (event.which) {
		keynum = event.which;
	}
	if (keynum == 13) {
		func();
	}
}

function getCacheBuster(url) {
	var hashPos = url.indexOf("#");
	var questionPos = url.indexOf("?");
	
	var hash="";
	var newurl="";
	if (hashPos > -1) {
		newurl = url.substr(0, hashPos);
		hash = url.substr(hashPos);
	} else {
		newurl = url;
		hash = "";
	}
	
	newurl += (questionPos > -1 ? "&" : "?") + "cachebuster=" + Math.random() + hash;
	
	return newurl;
}
 
function getAbsoluteRequest(page) {
	if (page.startsWith("/")) {
		return basePath + page.substring(1);
	} else if (page.indexOf("://")!=-1) {
		return page;
	} else {
		return basePath + page;
	}
}

function formatMessage(){
	var num = arguments.length; 
	var message = arguments[0];   
	for (var i = 1; i < num; i++) { 
		var r = "\\{" + (i-1) + "\\}"; 
		var re = new RegExp(r, "g"); 
		message = message.replace(re, arguments[i]); 
	} 
	return message; 
}
