var fade_dur = 100; // was 250
var disp_dur = plaqueDelay * 1000;
var update_period = 120000;
var update_period_on_error = 15000;

var fade_elems;
var xmlHttp;
var data;
var update_timer;

function start_cycle()
{
	fade_elems = [document.getElementById('plaquesWrapper')];

	xmlHttp=GetXmlHttpObject();
	fade(null, 0, 0, 0, 0, 0);
	update();
}

function GetXmlHttpObject()
{
	var xmlHttp=null;

	try
	{
		// Firefox, Opera 8.0+, Safari
		xmlHttp=new XMLHttpRequest();
	}
	catch (e)
	{
		// Internet Explorer
		try
		{
			xmlHttp=new ActiveXObject("Msxml2.XMLHTTP");
		}
		catch (e)
		{
			xmlHttp=new ActiveXObject("Microsoft.XMLHTTP");
		}
	}
	return xmlHttp;
}

function update()
{
	if (xmlHttp)
	{
		update_timer=window.setTimeout(update, update_period);
		xmlHttp.open("GET", data_url, true);
		xmlHttp.onreadystatechange=refresh;
		xmlHttp.setRequestHeader("content-type", "text/xml"); 
		xmlHttp.send(null);
	}
}

function restart()
{
	if (cycle_lock) {
	    window.setTimeout(function(){restart()}, 10)
	}
    else
    {
        window.clearTimeout(cycle_timer);
        window.clearTimeout(update_timer);
        data_indx = -1;
        started = false;
        update();
    } 
}

var started = false;
function refresh()
{
	if (xmlHttp.readyState==4 || xmlHttp.readyState=="complete")
	{
		if (xmlHttp.status==200 || xmlHttp.status==0)
		{
			data = data_from_xml(xmlHttp.responseXML);

			if (!started)
			{
				started = true;
				cycle_data();
			}
		}
		else
		{
			window.clearTimeout(update_timer);
			update_timer=window.setTimeout(update, update_period_on_error);
		}
	}
}

function add_tag(arry, tagname, tagval)
{
	var res = new Array(arry.length);
	var i;
	for (i=0; i<arry.length; i++)
	{
		res[i] = arry[i];
		res[i][tagname] = tagval;
	}
	return res;
}

function data_from_xml(xml)
{
	var data = {};
	var i;

	var nodes = {};	
	var node_arry = xml.documentElement.childNodes;
    // debugger;
	for (i=0; i<node_arry.length; ++i)
		if (node_arry[i].nodeType == 1)
			nodes[node_arry[i].nodeName] = node_arry[i].getElementsByTagName("record");
	
	data.curr = [];
	data.non_curr = [];
	
	var new_data;
	
	if (nodes.curr)
	{
		new_data = new Array(nodes.curr.length);
		for (i=0; i<nodes.curr.length; ++i)
		{
			new_data[i] = xml_elem_to_obj(nodes.curr[i]);
			new_data[i].anniv = true;
			new_data[i].curr = true;
		}
		
		data.curr = data.curr.concat(new_data);
		data.non_curr = data.non_curr.concat(new_data);
	}
	
	if (nodes.anniv)
	{
		new_data = new Array(nodes.anniv.length);
		for (i=0; i<nodes.anniv.length; ++i)
		{
			new_data[i] = xml_elem_to_obj(nodes.anniv[i]);
			new_data[i].anniv = true;
			new_data[i].curr = false;
		}
		
		data.curr = data.curr.concat(new_data);
		data.non_curr = data.non_curr.concat(new_data);
	}
	
	if (nodes.plaque)
	{
		new_data = new Array(nodes.plaque.length);
		
		for (i=0; i<nodes.plaque.length; ++i)
		{
			new_data[i] = xml_elem_to_obj(nodes.plaque[i]);
			new_data[i].anniv = false;
			new_data[i].curr = false;
		}
		
		data.non_curr = data.non_curr.concat(new_data);
	}
	
	return data;
}

function xml_elem_to_obj(xml_elem, restrict)
{
	var obj = {};
	var ch = xml_elem.childNodes;
	var i;
	for (i=0; i<ch.length; ++i) if (
		ch[i].nodeType == 1 &&
		ch[i].childNodes[0] &&
		ch[i].childNodes[0].nodeType == 3 &&
		(!restrict || restrict.indexOf(ch[i].nodeName) > -1)
	)
		obj[ch[i].nodeName] = ch[i].childNodes[0].nodeValue;
	
	return obj;
}

function sort_by_lname(ra, rb)
{
	var lna = ra.lname.toUpperCase();
	var lnb = rb.lname.toUpperCase();
	
	if (lna < lnb)
		return -1;
	else if (lna > lnb)
		return 1;
	else
		return 0;
}

var data_indx = -1;
var cycle_lock = false;
var cycle_timer;
var end_of_cycle = false;
function cycle_data()
{
	if (end_of_cycle) {
	    data_indx = -1;
	    end_of_cycle = false;
	}
	if (!stop_animation){
		cycle_lock = true;
		if (data.non_curr && data.non_curr.length > 0) {
		    for (var i=1; i<=num_plaques;++i)
    	    {
    			++data_indx;
    			if (data_indx < data.non_curr.length) {
    			    gen_html(document.getElementById("plaque"+i), data.non_curr[data_indx]);
    			    if (data_indx + 1 == data.non_curr.length) {
    			        // set end_of_cycle in case where plaques exactly fill spots
    			        end_of_cycle = true;
    			    }
    			}
    			else {
    			    end_of_cycle = true;
    			    gen_html(document.getElementById("plaque"+i), false);
    			}
    		}
    	}
		cycle_lock = false;
		
	    // fade(null, 0, 100, 10, fade_dur, 0);
	    // fade(null, 100, 0, 10, fade_dur, fade_dur+disp_dur);
	    // No fade effect
	    fade(null, 100, 100, 10, fade_dur, 0);
	    fade(null, 100, 100, 10, fade_dur, fade_dur+disp_dur);
	}
	
	cycle_timer = window.setTimeout(cycle_data, disp_dur+fade_dur*2+50);
}

function jump_to(ln)
{
	if (cycle_lock) {
	    window.setTimeout(function(){jump_to(ln)}, 10)
	}
    else
    {
        window.clearTimeout(cycle_timer);
        for (data_indx=-1; data_indx<data.non_curr.length;++data_indx) {
            if (data_indx+1 >= data.non_curr.length)
                break;
    		if (data.non_curr[data_indx+1].lname.toUpperCase()>=ln.toUpperCase())
    			break;
    	}    
    	cycle_data();
    } 
}

function gen_html_curr(elem, dat)
{
	elem.className = dat.curr?'curr-plaque':'plaque';

	gen_html(elem, dat);	
}

function gen_html_non_curr(elem, dat)
{
	elem.className = 'plaque';
	gen_html(elem, dat);
}	

var h=0;

function gen_html(elem, dat)
{
	elem.innerHTML = '';
	if (!dat) {
        // if no data is passed, return HTML for an empty plaque
        elem.onclick = function () {};
        return 0;
    }
	elem.onclick = function () { showExtendedInfo(dat.id, org_id); };
	var div, p;
	
	div = document.createElement('div');
	div.className = "candle";
	if (dat.candle) {
	    div.className = "candle lit"	// lit
	}	
	else {
	    div.className = "candle unlit"	// unlit
	}
	elem.appendChild(div);
	
	div = document.createElement('div');
	div.className = "name";
	p = document.createElement('p');
	p.appendChild(document.createTextNode(dat.fname + ' ' + dat.lname ));
	div.appendChild(p);
	if (dat.hname) {
		p = document.createElement('p');
		p.className = "hebrew";
		p.appendChild(document.createTextNode(dat.hname));
		div.appendChild(p);
	}
	elem.appendChild(div);
	
	div = document.createElement('div');
	div.className = "date";
	if (dat.ddeath)
	{
		p = document.createElement('p');
        p.appendChild(document.createTextNode(dat.ddeath));
		div.appendChild(p);
	}
	if (dat.hddeath)
	{
		p = document.createElement('p');
		p.className = "hebrew";
		p.appendChild(document.createTextNode(dat.hddeath));
		div.appendChild(p);
	}
	elem.appendChild(div);
		
	
}

function fade(id, start, end, step, dur, delay)
{
	var dir;
	if (end>start) dir=1;
	else if (end<start) dir=-1;
	else if (end==start) {set_opacity(id, end); return;}
	var adj_step=dir*Math.abs(step);
	for (opac=start; (end-opac)*dir>=0; opac+=adj_step)
	{
		window.setTimeout("set_opacity('"+id+"',"+opac+")", delay+(opac-start)/(end-start)*dur);
	}
}

function set_opacity(id, opac_percent)
{
	for (i=0; i<fade_elems.length; ++i)
	{
		var opac=opac_percent/100;
		var obj=fade_elems[i];
		
		if (opac_percent==100)
		{
			obj.style.opacity = "";
			obj.style.MozOpacity = "";
			obj.style.KhtmlOpacity = "";
			obj.style.filter = "";
		}
		else
		{
			obj.style.opacity = opac;
			obj.style.MozOpacity = opac;
			obj.style.KhtmlOpacity = opac;
			obj.style.filter = "alpha(opacity=" + opac_percent + ")";
		}
		
		if (document.getElementById("log")) document.getElementById("log").innerHTML=document.getElementById(id).style.cssText;
	}
}
