
var POMAGIC= (document.removeChild && document.insertBefore);

var WIN = navigator.platform.match(/Windows/);
var MAC = navigator.platform.match(/Mac|Apple|Safari/);

var packs = new Array();
var hiddenpacks = new Array();
var langpacks = new Array();
var formatpacks = new Array();
var rowelements = new Array();
var formatchecks = new Array();
var selectallrow;

function selectAll(onoff)
{
	var i;
	for (i=0; i<packs.length; i++)
	{
		if (!hiddenpacks[i])
			document.getElementById('Sku' + packs[i]).checked=onoff;;				
	}

	document.getElementById('selectall1').checked=onoff;
	document.getElementById('selectall2').checked=onoff;

	return true;
}


function countHiddenPacks()
{
	var i, result = 0;
	for (i=0; i<hiddenpacks.length; i++)
		if (hiddenpacks[i]) ++result;

	return result;
}

function indexToRow(index)
{
	var topgarbage=0;
	var rowspersku=2;

	var i, actualrows=0;
	for (i=0; i<index; i++)
	{
		if (hiddenpacks[i]) continue;
		actualrows++;
	}

	return topgarbage + actualrows*rowspersku;
}

function savePOCookie()
{
	var lang = document.getElementById('pocharsetfilter').value;
	var plat = document.getElementById('platformselect').value;

	var cookieval = lang + "," + plat;

	var fc = document.getElementById('formatchecks').getElementsByTagName('input');
	var i;
	for (i=0; i<fc.length; i++)
		if (fc[i].checked) cookieval += "," + fc[i].value;

	var expiry = new Date();
	expiry.setFullYear(expiry.getFullYear()+1);
	
	document.cookie="purchaseoptions=" + cookieval + ";expiry=" + expiry.toUTCString() + ";path=/";
}

function populateFormatCheckboxes()
{
	if (formatchecks.length) return formatchecks;

	var inputs = document.getElementById('pofilterform').getElementsByTagName('input');
	for (i=0; i<inputs.length; i++)
	{
		if (inputs[i].getAttribute('type') != 'checkbox') continue;
		formatchecks[formatchecks.length] = inputs[i];
	}

	return formatchecks;
}


var platform_formats = new Array();
platform_formats['win'] = new Array('opentype-ps','opentype-tt','win-ttf','win-t1');
platform_formats['macosx'] = new Array('opentype-ps','opentype-tt','win-ttf','mac-ttf','mac-t1');
platform_formats['macos9'] = new Array('opentype-ps','mac-ttf','mac-t1');

var p,f;
for (p in platform_formats)
for (f in platform_formats[p])
	platform_formats[p][platform_formats[p][f]] = true;

var formatcheckdivs = new Array();
var hiddencheckdivs = new Array();

function selectFormatsForPlatform()
{
	var i;
	if (!formatcheckdivs.length)
	{
		populateFormatCheckboxes();		
		var temp = document.getElementById('formatchecks').getElementsByTagName('div');

		for (i=0; i<temp.length; i++)
		{
			formatcheckdivs[i] = temp[i];
			hiddencheckdivs[i] = false;
		}
	}

	var plat = document.getElementById('platformselect').value;

	var lastel = false;
	for (i=0; i<formatcheckdivs.length; i++)
	{
		var pfc = formatcheckdivs[i];
		var fmt = pfc.id.substr(pfc.id.indexOf('-')+1);

		var show = true;
		if (!platform_formats[plat]) show = true;
		else if (!platform_formats[plat][fmt]) show=false;

		if (show && !hiddencheckdivs[i]) 
		{
			lastel = pfc;
			continue;
		}
		
		if (!show && hiddencheckdivs[i]) continue;
		
		if (show)
		{
			var nextel;
			if (lastel) nextel = lastel.nextSibling;
			else nextel = document.getElementById('formatchecks').firstChild;

			pfc.getElementsByTagName('input')[0].checked=true;

			if (nextel) nextel.parentNode.insertBefore(pfc,nextel);
			else lastel.parentNode.appendChild(pfc);

			hiddencheckdivs[i] = false;
			lastel = pfc;
		}
		else
		{
			pfc.parentNode.removeChild(pfc);
			pfc.getElementsByTagName('input')[0].checked=false;
			hiddencheckdivs[i] = true;
		}
	}

	if (packs.length)
		filterPurchaseOptions();

	savePOCookie();
}

function fixEmptyList()
{	
	if (!POMAGIC || !packs.length) return false;
	
	if (countHiddenPacks() < packs.length) return true;

	populateFormatCheckboxes();

	var i;

	//first try turning on all formats

	var prechecked = new Array();
	var fc = document.getElementById('formatchecks').getElementsByTagName('input');
	for (i=0; i<fc.length; i++)
	{
		prechecked[i] = fc[i].checked;
		fc[i].checked = true;
	}

	filterPurchaseOptions();
	
	if (countHiddenPacks() < packs.length) return true;

	//put checks back, try languages
	for (i=0; i<fc.length; i++)
		fc[i].checked = prechecked[i];
	
	document.getElementById('pocharsetfilter').selectedIndex=0;
	
	filterPurchaseOptions();
	
	if (countHiddenPacks() < packs.length) return true;
	
	//try everything
	document.getElementById('platformselect').selectedIndex=0;
	selectFormatsForPlatform();
	for (i=0; i<formatchecks.length; i++)
		formatchecks[i].checked=true;
	
	filterPurchaseOptions();
	
	if (countHiddenPacks() < packs.length) return true;
	
	return false;
}

function addMagic()
{
	if (!POMAGIC) return false;

	populateFormatCheckboxes();
	
	document.getElementById('pocharsetfilter').onchange = filterPOandSetCookie;

	var i;
	for (i=0; i < formatchecks.length; i++)
		formatchecks[i].onclick = filterPOandSetCookie;
}

function addSkuToLists(skuid,fmts,langs)
{
	if (!POMAGIC) return false;

	packs[packs.length] = skuid;

	var formatarray = fmts.split(',');
	var i;

	for (i=0; i<formatarray.length; i++)
	{
		if (!formatpacks[formatarray[i]])
			formatpacks[formatarray[i]] = new Array();
			
		formatpacks[formatarray[i]][skuid] = true;
	}

	var langarray = langs.split(',');

	for (i=0; i<langarray.length; i++)
	{
		if (!langpacks[langarray[i]])
			langpacks[langarray[i]] = new Array();
			
		langpacks[langarray[i]][skuid] = true;
	}
}

function showHidePack(index,show)
{
	if (!POMAGIC) return false;
	
	if (!rowelements || !packs[index] || !rowelements[index]) 
			return false;

	var rownum = indexToRow(index);

	//alert((show ? "show" : "hide") + (hiddenpacks[index] ? " hidden " : " shown ") + "index " + index + ", row " + rownum + "\n");

	if (show && !hiddenpacks[index]) return true;
	if (!show && hiddenpacks[index]) return true;

	var i;

	var table = document.getElementById('popacktable');
	var rows = new Array();

	//don't use getElementsByTagName here because it will pick up child tables
	for (i=0; i<table.childNodes.length; i++)
	if (table.childNodes[i].nodeType == 1 && table.childNodes[i].tagName.toLowerCase()=='tr')
		rows[rows.length] = table.childNodes[i];

	if (show)
	{
		if (!rows[rownum])
			rows[rownum] = table.appendChild(document.createTextNode(""));

		var hr = table.insertBefore(document.getElementById('hrrow').cloneNode(true),rows[rownum]);
		table.insertBefore(rowelements[index],hr);
		hiddenpacks[index] = false;

		document.getElementById('Sku' + packs[index]).checked = false;
	}
	else
	{
		if (rows[rownum+1]) table.removeChild(rows[rownum+1]);
		if (rows[rownum]) table.removeChild(rows[rownum]);
		hiddenpacks[index] = true;
	}

	return true;
}

function filterPOandSetCookie()
{
	filterPurchaseOptions();
	savePOCookie();
}

function filterPurchaseOptions()
{
	if (!POMAGIC) return true;

	populateFormatCheckboxes();

	var lang = document.getElementById('pocharsetfilter').value;
	var fmts = new Array();

	var i,j;

	for (i=0; i<formatchecks.length; i++)
	{
		if (!formatchecks[i].checked) continue;

		fmts[fmts.length] = formatchecks[i].value;
	}

	var numshown=0, numhidden=0;
	for (i=0; i<packs.length; i++)
	{
		var skuid = packs[i];
		
		var langmatch = (lang == 'ALL' || (langpacks[lang] && langpacks[lang][skuid]));
		var fmtmatch = false;

		for (j=0; !fmtmatch && j < fmts.length; j++)
			if (formatpacks[fmts[j]] && formatpacks[fmts[j]][skuid])
				fmtmatch=true;

		showHidePack(i,langmatch && fmtmatch);
	}

	if (countHiddenPacks() == packs.length && !selectallrow)
	{
		selectallrow = document.getElementById('selectall');
		var emptynote = selectallrow.cloneNode(true);

		var b = emptynote.getElementsByTagName('b')[0];
		b.style.color='red';
		b.innerHTML="No packages available.  Please select more formats or another language.";
		
		emptynote.getElementsByTagName('input')[0].style.visibility='hidden';
		
		selectallrow.parentNode.replaceChild(emptynote,selectallrow);
	}
	else if (countHiddenPacks() < packs.length && selectallrow)
	{
		var emptynote = document.getElementById('selectall');
		emptynote.parentNode.replaceChild(selectallrow,emptynote);
		selectallrow = null;
	}
	
	if (countHiddenPacks() == packs.length-1)
	{
		for (i=0; i<packs.length; i++)
		if (!hiddenpacks[i])
		{
			document.getElementById('Sku' + packs[i]).checked=true;
			break;
		}
	}
	else
		selectAll(false);

	return true;
}

function checkForChecks()
{
	var i,failover=0;
	var foundone = false;
	for (i=0; i<packs.length; i++)
	{
		if (hiddenpacks[i]) continue;
		if (failover==0) failover=packs[i];
		if (document.getElementById('Sku' + packs[i]).checked)
		{
			foundone=true;
			break;
		}
	}

	if (!foundone) document.getElementById('Sku' + failover).checked=true;	

	return true;
}

function poShortURL()
{
	if (!window.XMLHttpRequest) return false;

	var x = new XMLHttpRequest();
	if (!x) return false;

	x.open("POST","/ajax-server/shorturl.xml",false);

	var post=window.location.protocol + "//" + window.location.host + window.location.pathname + "?";

	for (var i in packs)
		post += "sku[]=" + packs[i] + "&";

	for (var i in formatchecks)
	if (formatchecks[i].checked)
		post += "filters[format][]=" + formatchecks[i].value + "&";

	post += "filters[platform]=" + document.getElementById('platformselect').value + "&";
	post += "filters[language]=" + document.getElementById('pocharsetfilter').value;

	x.setRequestHeader("Content-type","application/x-www-form-urlencoded; charset=UTF-8");
	x.send("url=" + encodeURIComponent(post));

	var err,url;

	if (x.status != 200) return alert("Unexpected response: " + x.status + " " + x.statusText);
	if (!x.responseXML) return alert("Unexpected response: " + x.responseText);
	if ((err = x.responseXML.getElementsByTagName('error')) && err.length)
		return alert("Error: " + err[0].innerHTML);

	var url;
	if (!(url = x.responseXML.getElementsByTagName('url')) || !url.length)
		return alert("No URL found in response. Sorry!");

	var para = document.getElementById('shorturl');

	if (!para) return alert("You short URL is: " + url[0].firstChild.nodeValue);

	para.style.border="1px solid #00CC00";
	para.style.padding="3px";
	para.innerHTML = "Your short URL is: <b>" + url[0].firstChild.nodeValue + "</b>";

	return false;
}

