function affiliateTemplates() {
	var sourceFields 		= new Array();
	var previewFields 		= new Array();
	var modes				= new Array();
	var fieldSwitches 		= new Array();
	var wrappers			= new Array();
	var imageSourceFields 	= new Array();
	var linkTxtFields		= new Array();
	var modeSwitch;
	
	this.addFieldSwitch = function(element, mode) {
		var ele = document.getElementById(element);
		ele.onchange 	= updateAll;
		fieldSwitches[mode] = ele;
	}
	
	this.addModeSwitch = function(element) {
		var ele 		= document.getElementById(element);
		ele.onchange 	= this.handleModeSwitchChange;
		modeSwitch 		= ele;
	}
	
	this.addSourceField = function(element, name) {
		var ele = document.getElementById(element);
		sourceFields[name] = ele;
		ele.onkeyup = updateAll;
	}
	
	this.addPreviewField = function(element, name) {
		var ele = document.getElementById(element);
		previewFields[name] = ele;
	}
	
	this.handleFieldSwitchChange = function(event) {
		if(navigator.appName == 'Microsoft Internet Explorer') {
			var element = window.event.srcElement
		} else{
			var element = event.target;
		}
	}
		
	this.handleModeSwitchChange = function(event) {
		if(navigator.appName == 'Microsoft Internet Explorer') {
			var element = window.event.srcElement
		} else{
			var element = event.target;
		}
		var newMode = element.options[element.options.selectedIndex].value;
		//alert(newMode);
		for (var k in fieldSwitches) {
			if(k == newMode) {
				fieldSwitches[k].style.visibility = 'visible';
				id = fieldSwitches[k].id;
				if(wrappers[id]) {
					document.getElementById(wrappers[id]).style.visibility = 'visible';
				}
			} else {
				fieldSwitches[k].style.visibility = 'hidden';
				id = fieldSwitches[k].id;
				if(wrappers[id]) {
					document.getElementById(wrappers[id]).style.visibility = 'hidden';
				}
			}
		}
		updateAll();
		//alert(element.options.selectedIndex);
	}
	
	this.addMode = function(modeName, fieldType, sourceCode) {
		if(!modes[modeName]) {
			modes[modeName] = new Array();
		}
		modes[modeName][fieldType] = sourceCode;
	}
	
	this.addWrapper = function(ele, wrapper) {
		wrappers[ele] = wrapper;
	}
	
	this.refreshPreview = function(event) {
		if(navigator.appName == 'Microsoft Internet Explorer') {
			var element = window.event.srcElement
		} else{
			var element = event.target;
		}
		
	}
	
	this.addImageSourceField = function(ele, sourceField)  {
		//alert(sourceField);
		imageSourceFields[ele] = document.getElementById(sourceField);
		imageSourceFields[ele].onkeyup = updateAll;
	}
	
	this.addLinkTxtField = function(ele, txtField)  {
		linkTxtFields[ele] = document.getElementById(txtField);
		linkTxtFields[ele].onkeyup = updateAll;
	}
	
	this.init = function(startmode) {
		updateAll();
	}
	
	getMode = function() {
		return modeSwitch.value;
	}
	
	updateAll = function() {
		mode = getMode();
		var sources = modes[mode];
		for(var k in sources) {
			var src = sources[k];
			updateSourceField(sourceFields[k], src, mode);
			updatePreviewField(previewFields[k], src, mode);
			//alert(k + ': ' + src);
		}
	}
	
	updateSourceField = function(field, src, mode) {
		if(linkTxtFields[field.id]) {
			var txt = linkTxtFields[field.id].value;
			src 	= src.replace(eval('/{' + linkTxtFields[field.id].id + '}/g'), txt);
		}
		if(imageSourceFields[field.id]) {
			var txt = imageSourceFields[field.id].value;
			src 	= src.replace(eval('/{' + imageSourceFields[field.id].id + '}/g'), txt);
		}
		if(fieldSwitches[mode]) {
			src 	= src.replace(eval('/{' + fieldSwitches[mode].id + '_value}/g'), fieldSwitches[mode].value);
			src 	= src.replace(eval('/{' + fieldSwitches[mode].id + '_text}/g'), fieldSwitches[mode].options[fieldSwitches[mode].selectedIndex].text);
		}
		field.value = src;
		//alert(field);
	}
	
	updatePreviewField = function(field, src, mode) {
		if(linkTxtFields[field.id]) {
			var txt = linkTxtFields[field.id].value;
			src 	= src.replace(eval('/{' + linkTxtFields[field.id].id + '}/g'), txt);
		}
		if(imageSourceFields[field.id]) {
			var txt = imageSourceFields[field.id].value;
			src 	= src.replace(eval('/{' + imageSourceFields[field.id].id + '}/g'), txt);
		}
		if(fieldSwitches[mode]) {
			src 	= src.replace(eval('/{' + fieldSwitches[mode].id + '_value}/g'), fieldSwitches[mode].value);
			src 	= src.replace(eval('/{' + fieldSwitches[mode].id + '_text}/g'), fieldSwitches[mode].options[fieldSwitches[mode].selectedIndex].text);
		}
		field.innerHTML = src;
		//alert(field);
	}
}