function recalculate(id, value, whatchanged) {
	if (value > 100) value = 100;
	if (value < 0) value = 0;
	theslider = sliders[id];
	theinput = $("ratio_"+id);
	switch (whatchanged) {
		case "slider":
			theinput.value = Math.round(parseInt(value), 0);
			break;
		case "ratio":
			theslider.setValue(parseInt(value));
			break;
		default:
			alert("Oi, programmer: Invalid whatchanged parameter: "+whatchanged);
	}
	calculateDelivery();
}

function calculateDelivery() {
	totalratio = 0;
	slider_ids.each(function(id) {
		slider = sliders[id];
		totalratio += slider.value;
	});
	if (totalratio == 0)
		factor = 1;
	else
		factor = 1000 / totalratio;
	slider_ids.each(function(id) {
		delivery = $("delivery_"+id);
		slider = sliders[id];
		delivery.innerHTML = Math.round(slider.value * factor, 0) || "Not in Campaign";
	});
}
var sliders = Array();
var slider_ids = [];

function previewAd() {
	var query = "";
	vars = ["ad_type", "ad_bg", "ad_border", "ad_title", "ad_body", "ad_link"];
	vars.each(function(field) {
		v = $F("preview_"+field);
		if (field == "ad_type") {
			if (v == "-- default --")
				v = "";
			else
				v += "_"+$F("preview_ad_size")
		}
		query += field+"="+escape(v)+"&amp;";
	});
	size = $F("preview_ad_type");
	dims = size.split("_")[1];
	if (!dims) {
		width = "336";
		height = "280";
	} else {
		wh = dims.split("x");
		width = wh[0];
		height = wh[1];
	}
	query += "&amp;ad_campaign="+$F("campaign_id");
	url = "http://ads.bronco.co.uk/display?no_impressions=1&amp;"+query
	$("ad_preview").innerHTML = '<iframe width="'+width+'" height="'+height+'" frameborder="0" src="'+url+'" name="ibronco"></iframe>';
}

/* DHTML color picker */

var dcp_colors = [
	[ "#FFFFCC", "#FFFF66", "#FFCC66", "#F2984C", "#E1771E", "#B47B10", "#A9501B", "#6F3C1B", "#804000", "#CC0000", "#940F04", "#660000" ],
	[ "#C3D9FF", "#99C9FF", "#66B5FF", "#3D81EE", "#0066CC", "#6C82B5", "#32527A", "#2D6E89", "#006699", "#215670", "#003366", "#000033" ],
	[ "#CAF99B", "#80FF00", "#00FF80", "#78B749", "#2BA94F", "#38B63C", "#0D8F63", "#2D8930", "#1B703A", "#11593C", "#063E3F", "#002E3F" ],
	[ "#FFBBE8", "#E895CC", "#FF6FCF", "#C94093", "#9D1961", "#800040", "#800080", "#72179D", "#6728B2", "#6131BD", "#341473", "#400058" ],
	[ "#FFFFFF", "#E6E6E6", "#CCCCCC", "#B3B3B3", "#999999", "#808080", "#7F7F7F", "#666666", "#4C4C4C", "#333333", "#191919", "#000000" ]
]

var cur_picker = "";

function setColor(col) {
	field = $(cur_picker);
	field.value = col;
	if (field.onchange)
		field.onchange();
}

function drawPicker() {
	// draw a picker
	canvas = document.createElement("div");
	canvas.id = "picker";
	canvas.style.position = "absolute";
	canvas.style.display = "none";
	dcp_colors.each(function(row) {
		thisrow = document.createElement("ul");
		row.each(function(color) {
			listitem = document.createElement("li");
			link = document.createElement("a");
			link.style.backgroundColor = color;
			Event.observe(link, "click", function(ev) {
				setColor(color);
			}.bindAsEventListener(color));
			listitem.appendChild(link);
			thisrow.appendChild(listitem);
		});
		canvas.appendChild(thisrow);
	});
	$("content").appendChild(canvas);
	// got a picker, now let's append some buttons for it.
	elements = $$("div.left input");
	elements.each(function (el) {
		if (el.getAttribute("type") != "text")
			return;
		elid = el.id;
		new Insertion.After(el, ' <span class="pickbutton" id="picker_'+elid+'"><span>Pick</span></a>');
		buttonid = "picker_"+elid;
		Event.observe(buttonid, "click", function(ev) {
			showPicker(ev);
		}.bindAsEventListener());
	});
}

function hidePicker(ev) {
	if (ev == undefined) {
		Element.hide("picker");
		return;
	}
	el = Event.element(ev);
	if (Element.hasClassName(el, "pickbutton") || Element.hasClassName(el.parentNode, "pickbutton"))
		return;
	if (Element.visible("picker"))
//		Element.hide("picker");
		Effect.Fade("picker", {duration:0.25});
}

function showPicker(ev) {
	el = Event.element(ev);
	if (!el.id)
		el = el.parentNode;
	cur_picker = "ad_"+el.id.split("_")[2];
	canvas = $("picker");
	canvas.style.top = Event.pointerY(ev)+"px";
	canvas.style.left= Event.pointerX(ev)+30+"px";
	if (!Element.visible(canvas))
//		Element.show(canvas);
		Effect.Appear(canvas, {duration:0.25});
	document.onmouseup = hidePicker;
	Event.stop(ev);
}

function drawAd() {
	data = Form.serialize("generate_adcode")+"&ad_type="+$F("ad_type")+"_"+$F("ad_size");
	new Ajax.Updater("ad_preview", "/advertisers/adcodes.html", {
		method:"post",
		postBody:data+"&action=GenerateAd"
	});
	str = '&lt;script type="text/javascript"&gt;<br\/>';
	vars = ["ad_type", "ad_bg", "ad_border", "ad_title", "ad_body", "ad_link", "ad_campaign"];
	vars.each(function(field) {
		v = $F(field);
		if (field == "ad_type") {
			if (v == "-- default --")
				v = "";
			else
				v += "_"+$F("ad_size")
		}
		str += pad(field, 15, "&nbsp;")+"= \""+v+"\";<br\/>";
	});
	str += "&lt;\/script&gt;<br\/>";
	str += '&lt;script type="text/javascript" src="http://ads.bronco.co.uk/show_ads.js"&gt;&lt;/script&gt;';
	Element.update("ad_script", str);
}

function selectAdType(sleep) {
	/* I don't know why this works. It should cause an infinite loop. However, it does work, and moreover,
	it is the only version which DOES work with Microsoft's broken software. It's not that the JS engine
	is non-standard, it's just that it flat-out fails.
	
	I don't mind moving the goalposts, as long as the goalposts stay up.*/

	if (!sleep)
		window.setTimeout("selectAdType()", 100);
	types = ["text", "image", "flash"];
	types.each(function(type) {
		if ($F("type_"+type))
			Element.show("notebook_"+type);
		else Element.hide("notebook_"+type);
	});
}

function selectAdSource(sleep) {
	/* I don't know why this works. It should cause an infinite loop. However, it does work, and moreover,
	it is the only version which DOES work with Microsoft's broken software. It's not that the JS engine
	is non-standard, it's just that it flat-out fails.
	
	I don't mind moving the goalposts, as long as the goalposts stay up.*/

	if (!sleep)
		window.setTimeout("selectAdSource()", 100);
	sources = ["db", "xml"];
	sources.each(function(source) {
		if ($F("source_"+source))
			Element.show("notebook_"+source);
		else Element.hide("notebook_"+source);
	});
}

/* Function to pad a string to a certain length with spaces */

function pad(str, num, chr) {
	if (!chr) chr = " ";
	l = str.length;
	for (i = 0; i < num - l; i++)
		str += chr;
	return str;
}

/* Functions to handle adding and removing tags from a tag list, del.icio.us-style */

function swap(tag) {
	parse_tags();
	if (ad_tags.member(tag))
		ad_tags = ad_tags.without(tag);
	else
		ad_tags.push(tag);
	return redraw_tags();
}

function parse_tags() {
	tag_list = $F("tags");
	tags = tag_list.split(",");
	ad_tags = [];
	tags.each(function(tag) {
		if (tag)	ad_tags.push(tag.strip());
	});
}

function redraw_tags() {
	var tag_list = "";
	ad_tags.each(function(tag) {
		tag_list += tag+", ";
	});
	tag_list = tag_list.substring(0, tag_list.length-2)
	$("tags").value = tag_list;
}

/* UI construct for selecting ads by tag */

function showtag(tag, trigger) {
	cont = draw_adlist();
	new Ajax.Request("/advertisers/inventory.html", {
		method:"post",
		postBody:"action=getads&tag="+escape(tag),
		onSuccess:function(r) {
			json = r.responseText;
			data = eval("("+json+")");
			table = document.createElement("table");
			table.style.width = "100%";
			tbody = document.createElement("tbody");
			table.appendChild(tbody);
			cls = "odd";
			data.each(function(el) {
				if (cls == "odd") cls = "even"; else cls = "odd";
				trow = document.createElement("tr");
				Element.addClassName(trow, cls);
				cell1 = document.createElement("td");
				cell2 = document.createElement("td");
				link = document.createElement("a");
				link.setAttribute("href", "/advertisers/inventory.html?action=Edit&id="+el.id);
				link.appendChild(document.createTextNode(el.title));
				cell1.appendChild(link);
				cell2.appendChild(document.createTextNode(el.url));
				trow.appendChild(cell1);
				trow.appendChild(cell2);
				tbody.appendChild(trow);
			});
			cont.appendChild(table);
			cont.style.background = "";
			new Effect.Highlight(cont);
		}
	});
}

function draw_adlist() {
	if (cont = $("adlist_container")) {
		for (i = 0; i < cont.childNodes.length; i++) {
			Element.remove(cont.childNodes[i]);
		}
	} else {
		cont = document.createElement("div");
		cont.id = "adlist_container";
		Element.addClassName(cont, "adlist_container");
		Element.hide(cont);
		$("content").appendChild(cont);
		trigger = $("inventory");
		trigger.parentNode.insertBefore(cont, trigger.nextSibling);
		Effect.BlindDown(cont);
	}
	cont.style.background = "url('/images/loading.gif') center center no-repeat";
	return cont;
}

/* Controls for adding ads to a campaign */

function show_by_tag() {
	tag = $F("show_tag");
	cont = $("adverts_tags_list");
	infanticide(cont);
	if (tag != "show,all") {
		ads = ads_by_tags[tag];
	} else {
		ads = [];
		for (k in ads_by_id)
			ads.push(ads_by_id[k]);
		ads = ads.sortBy(function(el) { return el.title });
	}
	ads.each(function(ad) {
		litem = make_advert_item(ad, "add");
		cont.appendChild(litem);
	});
}

function show_and_add_by_tag() {
	tag = $F("show_tag");
	ads = ads_by_tags[tag];
	ads.each(function(ad) {
		if (!ads_in_campaign.member(ad.id)) ads_in_campaign.push(ad.id);
	});
	redraw_ads_in_campaign();
}

function select_by_tag() {
	tag = $F("select_tag");
	cont = $("adverts_list");
	ads = ads_by_tags[tag];
	ads.each(function(ad) {
		if (checkbox = $("ad_in_campaign_"+ad.id))
			checkbox.checked = true;
	});
}

function make_advert_item(ad, type, previous_selected) {
	if (type == "add") { id_prefix = "ad_by_tag"; imgsrc = "/images/list-add.gif"; }
	if (type == "remove") { id_prefix = "ad_in_campaign"; imgsrc = "/images/list-remove.gif"; }
	litem = document.createElement("li");
	image = document.createElement("img");
	image.setAttribute("src", imgsrc);
	image.style.cssFloat = image.style.styleFloat = "right";
	//          ^^ FF teh rox          ^^ IE teh ghey
	image.style.cursor = "pointer";
	image.style.marginRight = "50px";
	if (type == "add") {
		Event.observe(image, "click", function(el) {
			add_to_campaign(ad.id);
		});
	}
	if (type == "remove")  {
		Event.observe(image, "click", function(el) {
			remove_from_campaign(ad.id);
		});
	}
	checkbox = document.createElement("input");
	checkbox.setAttribute("type", "checkbox");
	checkbox.id = id_prefix+"_"+ad.id;
	if (type == "remove") {
		hidden = document.createElement("input");
		hidden.setAttribute("type", "hidden");
		hidden.setAttribute("name", "ad_ids[]");
		hidden.setAttribute("value", ad.id);
		litem.appendChild(hidden);
	}
	textlabel = document.createElement("label");
	textlabel.setAttribute("for", id_prefix+"_"+ad.id);
	textlabel.appendChild(document.createTextNode(" "));
	textlabel.appendChild(document.createTextNode(ad.title));
	textlabel.appendChild(document.createElement("br"));
	textlabel.appendChild(document.createTextNode(ad.url));
	litem.appendChild(image);
	litem.appendChild(checkbox);
	litem.appendChild(textlabel);
	return litem;
}

function add_to_campaign(adid) {
	if (adid) {
		adid = ""+adid
		if (!ads_in_campaign.member(adid))
			ads_in_campaign.push(adid);
	} else {
		inputs = $A($("adverts_tags_list").getElementsByTagName("input"));
		inputs.each(function(el) {
			if (el.getAttribute("type") != "checkbox" || !el.checked) throw $continue;
			adid = el.id.substring(10);
			if (ads_in_campaign.member(adid)) throw $continue;
			ads_in_campaign.push(adid);
		});
	}
	redraw_ads_in_campaign();
}

function remove_from_campaign(adid) {
	if (adid) {
		adid = ""+adid
		ads_in_campaign = ads_in_campaign.without(adid);
	} else {
		inputs = $A($("adverts_list").getElementsByTagName("input"));
		ads_to_remove = [];
		inputs.each(function(el) {
			if (el.getAttribute("type") != "checkbox" || !el.checked) throw $continue;
			adid = el.id.substring(15);
			ads_to_remove.push(adid)
		});
		new_ads = []
		ads_in_campaign.each(function(oldid) {
			if (!ads_to_remove.member(oldid)) new_ads.push(oldid)
		});
		ads_in_campaign = new_ads;
	}
	redraw_ads_in_campaign();
}

function redraw_ads_in_campaign() {
	cont = $("adverts_list");
	previous_selected = [];
	inputs = $A(cont.getElementsByTagName("input"));
	inputs.each(function(el) {
		if (el.checked)
			previous_selected.push(el.id.substring(15));
	});
	infanticide(cont);
	ads_in_campaign.each(function(adid) {
		info = ads_by_id[adid];
		litem = make_advert_item(info, "remove", previous_selected);
		cont.appendChild(litem);
		if (previous_selected.member(adid))
			litem.getElementsByTagName("input")[0].checked = true;
	});
}

function select_all(cont) {
	cont = $(cont);
	inputs = $A(cont.getElementsByTagName("input"));
	inputs.each(function(el) {
		if (el.getAttribute("type") != "checkbox") throw $continue;
		el.checked = "checked";
	});
}

function deselect_all(cont) {
	cont = $(cont);
	inputs = $A(cont.getElementsByTagName("input"));
	inputs.each(function(el) {
		if (el.getAttribute("type") != "checkbox") throw $continue;
		el.checked = '';
	});
}

function invert_selection(cont) {
	cont = $(cont);
	inputs = $A(cont.getElementsByTagName("input"));
	inputs.each(function(el) {
		if (el.getAttribute("type") != "checkbox") throw $continue;
		if (!$F(el)) el.checked = "checked";
		else el.checked = '';
	});
}

/* Function to remove all child nodes from an element */

function infanticide(el) {
	ell = el.childNodes.length;
	for (i = ell-1; i >= 0; i--) {
		el.removeChild(el.childNodes[i]);
	}
}

/* Auto-suggest distribution */

function suggest(id) {
	b = $("suggest_button");
	b.disabled = "disabled";
	Element.addClassName(b, "loading");
	new Ajax.Request("/advertisers/distribution.html", {
		method:"post",
		postBody:"action=Suggest&id="+id,
		onSuccess:function(t) {
			b = $("suggest_button");
			b.disabled = "";
			Element.removeClassName(b, "loading");
			json = t.responseText;
			data = eval('('+json+')');
			data.each(function(el) {
				sliders[el.id].setValue(el.dist);
			});
		},
		onFailure:function(t) {
			b = $("suggest_button");
			b.disabled = "";
			Element.removeClassName(b, "loading");
		}
	});
}
