/*
 * history.js - MemberSearchHistory class
 * (c) 2010 Jo-Philipp Wich
 * $Id: xhr.js 182 2008-12-18 16:15:53Z Jo-Philipp.Wich $
 */

BAS_MH = function()
{
	var self = this;

	this.xhr = new BAS_XHR();
	this.aid = null;
	this.sxx = null;
	this.highlights = [ ];
	this.logged_in = false;


	/*
	 * Login state
	 */

	this.has_session = function()
	{
		return !!this.logged_in;
	}


	/*
	 * Cookie management
	 */

	this.has_cookie = function()
	{
		var cookies = document.cookie.split("; ");

		for( var i = 0; i < cookies.length; i++ )
			if( cookies[i].split("=")[0] == "bas_mh" )
				return true;

		return false;
	}

	this.set_cookie = function(cb)
	{
		this.xhr.get("/cnt/history.php", { x: "setcookie" }, cb);
	}

	this.drop_cookie = function(cb)
	{
		this.xhr.get("/cnt/history.php", { x: "dropcookie" }, cb);
	}


	/*
	 * Resultlist management
	 */

	this.parse_bookinglink = function(link)
	{
		if( link )
		{
			/entry=([0-9]{14})/.exec(link); this.aid = RegExp.$1;
			/http:\/\/(.+?)\/./.exec(link); this.sxx = RegExp.$1;
		}
	}

	this.parse_xml_response = function(doc)
	{
		var data = [ ];

		var res = (doc) ? doc.getElementsByTagName('results')[0] : null;
		if( res )
		{
			for( var i = 0; i < res.childNodes.length; i++ )
			{
				var oR = res.childNodes[i];
				if( oR.nodeName == 'result' )
				{
					var row = { };
					for( var j = 0; j < oR.childNodes.length; j++ )
					{
						var oC = oR.childNodes[j];
						if( oC.nodeType == 1 )
							row[oC.nodeName] = oC.firstChild.data;
					}

					data.push(row);
				}
			}
		}

		return data;
	}

	this.save_result = function(form, cb)
	{
		if( form && this.aid && this.sxx )
		{
			var data   = { x: 'saveresult', PREAID: this.sxx, AID: this.aid };
			var fields = new Array(
				'VON','NACH','DVON','MVON','DNACH','MNACH',
				'ADT','ONEWAY','CHD1', 'CHD2','CHD3'
			);

			for( var i = 0; i < fields.length; i++ )
			{
				var val = form[fields[i]] ? form[fields[i]].value : null;

				if( typeof val == 'string' && val.length > 0 )
					data[fields[i]] = val;
			}

			this.xhr.get('/cnt/history.php', data, cb);
		}
	}

	this.drop_result = function(aid, cb)
	{
		self.xhr.get('/cnt/history.php', { x: 'deleteresult', aid: aid }, cb);
	}

	this.load_results = function(cb)
	{
		self.xhr.get('/cnt/history.php', { x: 'loadresults' },
			function(x) {
				/* invoke callback and pass parsed xml data */
				cb(self.parse_xml_response(x.responseXML));
			}
		);
	}

	this.load_details = function(aid, cb)
	{
		self.xhr.get('/cnt/history.php', { x: 'loaddetails', aid: aid },
			function(x) {
				/* invoke callback and pass parsed xml data */
				cb(self.parse_xml_response(x.responseXML));
			}
		);
	}


	this.draw_results = function(rows)
	{
		var dV = document.getElementById('bas_mh_res_vbox');
		var dH = document.getElementById('bas_mh_res_hbox');

		if( dV )
		{
			dV.innerHTML = self.render_resultlist_vertical(rows);
			dV.style.display = 'block';
		}

		if( dH )
		{
			dH.innerHTML = self.render_resultlist_horizontal(rows);
			dH.style.display = 'block';
		}
	}

	this.unhighlight_row = function()
	{
		var hls = self.highlights;
		while( hls.length )
			hls.shift().className = null;
	}

	this.highlight_row = function(aid)
	{
		self.unhighlight_row();

		var trs = document.getElementsByName('bas_mh_row_' + aid);
		for( var i = 0; i < trs.length; i++ )
		{
			trs[i].className = 'highlight';
			self.highlights.push(trs[i]);
		}
	}

	this.disable_savelink = function()
	{
		var l;

		l = document.getElementById('bas_mh_links_nosave');
		if( l ) l.style.display = null;

		l = document.getElementById('bas_mh_links_save');
		if( l ) l.style.display = 'none';
	}

	this.enable_savelink = function()
	{
		var l;

		l = document.getElementById('bas_mh_links_nosave');
		if( l ) l.style.display = 'none';

		l = document.getElementById('bas_mh_links_save');
		if( l ) l.style.display = null;
	}

	this.disable_links = function()
	{
		var d = document.getElementById('bas_mh_links');
		if( d ) d.style.display = 'none';
	}

	this.enable_links = function()
	{
		var d = document.getElementById('bas_mh_links');
		if( d ) d.style.display = 'block';
	}

	this.prefill_form = function(row)
	{
		var form = document.forms.flug;
		if( form )
		{
			form.start_text.value = row.vonAirport;
			form.VON.value = row.von3lc;

			form.ziel_text.value = row.nachAirport;
			form.NACH.value = row.nach3lc;

			form.ADT.value = row.adt;

			for( var c = 1; c <= 3; c++ )
			{
				if( row['chd'+c] > 0 )
				{
					form['CHD'+c].disabled = false;
					form['CHD'+c].value = row['chd'+c];
				}
				else
				{
					form['CHD'+c].disabled = (c > 1); // don't disable first child field
					form['CHD'+c].value = '';
				}
			}

			form.DVON.value = row.Datum.substr(0, 2);
			form.MVON.value = row.Datum.substr(3, 2) + row.Datum.substr(6, 4);

			form.DNACH.value = row.retDatum.substr(0, 2);
			form.MNACH.value = row.retDatum.substr(3, 2) + row.retDatum.substr(6, 4);

			if( row.oneway > 0 )
			{
				form.ow[0].checked = false;
				form.ow[1].checked = true;
				form.DNACH.disabled = true;
				form.MNACH.disabled = true;
				form.ONEWAY.value = 'ONEWAY';
			}
			else
			{
				form.ow[0].checked = true;
				form.ow[1].checked = false;
				form.DNACH.disabled = false;
				form.MNACH.disabled = false;
				form.ONEWAY.value = '';
			}
		}
	}


	/*
	 * UI management
	 */

	/* hide all related UI elements */
	this.hide = function()
	{
		var d;

		d = document.getElementById('bas_mh_res_hbox');
		if( d ) d.style.display = 'none';

		d = document.getElementById('bas_mh_res_vbox');
		if( d ) d.style.display = 'none';

		self.disable_links();
		self.reset();
	}

	/* show all related UI elements (if they have content) */
	this.show = function()
	{
		var d;

		d = document.getElementById('bas_mh_res_hbox');
		if( d ) d.style.display = d.innerHTML ? 'block' : 'none';

		d = document.getElementById('bas_mh_res_vbox');
		if( d ) d.style.display = d.innerHTML ? 'block' : 'none';
	}

	/* high level load function, populates all ui elements
	 * with result data and makes them visible */
	this.load = function()
	{
		self.load_results(
			function(x)
			{
				self.draw_results(x);
				self.show();
			}
		);

		return false;
	}

	/* high level select function, reloads result list data, 
	 * triggers cache search and highlights rows belonging
	 * to the given aid */
	this.select = function(row)
	{
		self.prefill_form(row);
		self.highlight_row(row.aid);
		self.enable_links();
		self.disable_savelink();
		initSearch(0, 'flug', row.aid);
		return false;
	}

	/* high level search function, triggers new uncached search
	 * with old parameters */
	this.search = function(row)
	{
		self.prefill_form(row);
		self.unhighlight_row();
		self.enable_links();
		self.enable_savelink();
		initSearch(0, 'flug', null);
		return false;		
	}

	/* high level save function, creates new record and refreshes
	 * history displays */
	this.save = function(form)
	{
		self.save_result(form,
			function(x)
			{
				self.load_results(
					function(rows)
					{
						self.draw_results(rows);
						self.highlight_row(rows[0].aid);
						self.enable_links();
						self.disable_savelink();
					}
				);
			}
		);

		return false;
	}

	/* high level delete function, removes records for given
	 * aid, reloads result list data */
	this.delete = function(row)
	{
		self.reset();
		self.drop_result(row.aid, self.load);
		return false;
	}

	/* high level reset function, clears result list and
	 * all highlights */
	this.reset = function()
	{
		// XXX: untangle this...
		var d;

		d = document.getElementById('regler');
		if( d ) d.style.display = 'none';

		d = document.getElementById('result');
		if( d ) d.style.display = 'none';

		d = document.forms.flug;
		if( d ) d.reset();

		self.unhighlight_row();
		self.disable_links();
		self.enable_savelink();
	}


	this.render_resultlist_horizontal = function(rows)
	{
		var html = '';

		if( rows.length > 0 )
		{
			html += '<div class="bas_mh_scroll"><table style="width:100%" cellspacing="0">';

			for( var i = 0; i < rows.length; i++ )
			{
				html += String.format(
					'<tr name="bas_mh_row_%s">' +
					'  <td class="bold">%s-%s<br />%s-%s</td>' +
					'  <td>%s<br />%s</td>' +
					'  <td>Gesucht am %s Uhr<br />%d Erwachsene%s, %d Kind%s</td>' +
					'  <td><a href="#" onclick="%h">Ergebnisse ansehen</a></td>' +
					'  <td><a href="#" onclick="%h">Neue Suche</a></td>' +
					( self.has_session()
						? '  <td><a href="#" onclick="%h">L&ouml;schen</a></td>' : '' ) +
					'</tr>',
						rows[i].aid,
						rows[i].von3lc, rows[i].nach3lc,
						(rows[i].oneway == 0) ? rows[i].nach3lc : '-----',
						(rows[i].oneway == 0) ? rows[i].von3lc  : '-----',
						rows[i].Datum,
						(rows[i].oneway == 0) ? rows[i].retDatum : '-------------',
						rows[i].searchDate,
						rows[i].adt,       (rows[i].adt == 1)       ? 'r' : '',
						rows[i].chdAnzahl, (rows[i].chdAnzahl == 1) ? ''  : 'er',
						String.format('return window.bas_mh_inst.select(%j)', rows[i]),
						String.format('return window.bas_mh_inst.search(%j)', rows[i]),
						String.format('return window.bas_mh_inst.delete(%j)', rows[i])
				);		
			}

			html += '</table></div>';
		}

		return html;
	}

	this.render_resultlist_vertical = function(rows)
	{
		var html = '';

		if( rows.length > 0 )
		{
			html += '<span class="teaser_headline">&#9632; Historie</span>' +
				'<p>gespeicherte Abfragen</p>' +
				'<div class="bas_mh_scroll"><table style="width:100%" cellspacing="0">'
			;

			for( var i = 0; i < rows.length; i++ )
			{
				html += String.format(
					'<tr name="bas_mh_row_%s">' +
					'  <td class="bold" style="cursor:pointer" onclick="%h">%s-%s<br />%s-%s</td>' +
					'  <td class="right" style="cursor:pointer" onclick="%h">%s<br />%s</td>' +
					'</tr>',
						rows[i].aid,
						String.format('window.bas_mh_inst.select(%j)', rows[i]),
						rows[i].von3lc, rows[i].nach3lc,
						(rows[i].oneway == 0) ? rows[i].nach3lc : '-----',
						(rows[i].oneway == 0) ? rows[i].von3lc  : '-----',
						String.format('window.bas_mh_inst.select(%j)', rows[i]),
						rows[i].Datum,
						(rows[i].oneway == 0) ? rows[i].retDatum : '-------------'
				);		
			}

			html += '</table></div>';
		}

		return html;
	}
}

