/*
 * 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("/inc/history.php", { x: "setcookie" }, cb);
	}

	this.drop_cookie = function(cb)
	{
		this.xhr.get("/inc/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('/inc/history.php', data, cb);
		}
	}

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

	this.load_results = function(cb)
	{
		self.xhr.get('/inc/history.php', { x: 'loadresults' },
			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';
			// IE7 scrollbar bug -> force redraw
			dV.firstChild.nextSibling.style.width = (dV.firstChild.nextSibling.offsetWidth + 1) + 'px';
			dV.firstChild.nextSibling.style.width = (dV.firstChild.nextSibling.offsetWidth - 1) + 'px';
		}

		if( dH )
		{
			dH.innerHTML = self.render_resultlist_horizontal(rows);
			dH.style.display = 'block';
			// IE7 scrollbar bug -> force redraw
			dH.firstChild.style.height = (dH.firstChild.offsetHeight + 1) + 'px';
			dH.firstChild.style.height = null;
		}
	}

	this.draw_details = function(rows)
	{
		var dV = document.getElementById('bas_mh_det_vbox');
		var dH = document.getElementById('bas_mh_det_hbox');

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

		if( dH )
		{
			dH.innerHTML = self.render_detaillist_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.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, posted)
	{
		self.prefill_form(row);
		self.highlight_row(row.aid);
		if(! posted)
		{
//			self.enable_links();
//			self.disable_savelink();
			document.flug.mh_aid_backup.value = row.aid;
			document.flug.mh_date_backup.value = row.searchDate;
			initSearch(0, 'flug', row.aid);
		} else {
			document.flug.mh_aid.value = row.aid;
			document.flug.mh_aid_backup.value = row.aid;
			document.flug.mh_date_backup.value = row.searchDate;
			document.flug.submit();
		}
		return false;
	}

	/* high level search function, triggers new uncached search
	 * with old parameters */
	this.search = function(row, posted)
	{
		self.prefill_form(row);
		self.unhighlight_row();
		if(! posted)
		{
			initSearch(0, 'flug', null);
		} else {
			submitForm('flug');
		}
		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);
						var elem = document.getElementsByName('bas_mh_row_' + rows[0].aid)[0];
						if( elem )
						{
							elem.style.display='none';						
							self.fadeElementByName('bas_mh_row_' + rows[0].aid, 5);
						} else {
							// für ie8: tr wird bei elemByName nicht sauber gefunden
							// wenn blinken, dann von name auf ids wechseln (verlangt, daß nicht 2 listen eingeblendet sind)
//							var trs = document.getElementsByTagName('tr');
//							for(var i=0; i<trs.length;i++)
//							{
//								if(trs[i].name == 'bas_mh_row_' + rows[0].aid)
//								{
//									alert(trs[i]);
//								}
//							}
//							alert('no element');
						}
//						self.enable_links();
//						self.disable_savelink();
					}
				);
			}
		);

		return false;
	}

	/* high level delete function, removes records for given
	 * aid, reloads result list data */
	this.act_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" class="mh_result_row" onmouseover="this.className=\'mh_result_rowHover\'" onmouseout="this.className=\'mh_result_row\'">' +
					'  <td class="bold" style="padding: 0 0 0 10px;">%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, 1)', rows[i]),
						String.format('return window.bas_mh_inst.search(%j, 1)', rows[i]),
						String.format('return window.bas_mh_inst.act_delete(%j)', rows[i])
				);		
			}
			html += '</table></div>';
		}

		return html;
	}

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

		if( rows.length > 0 )
		{
			html += '<p class="teaser_headline" style="padding: 10px 0 10px 10px;">&#9632; Historie</p>' +
				'<div class="mh_hoch_inner">' +  "\n" +
				'  <div class="bas_mh_scroll">' +  "\n" +
				'    <table style="width:100%" cellspacing="0">' + "\n" 
			;

			for( var i = 0; i < rows.length; i++ )
			{
				html += String.format(
					'      <tr name="bas_mh_row_%s" class="mh_result_row" onmouseover="this.className=\'mh_result_rowHover\'" onmouseout="this.className=\'mh_result_row\'">' + "\n" +
					'        <td title="Ergebnisse anzeigen" class="bold" style="padding: 0 0 0 10px; cursor:pointer;" onclick="%h">%s-%s<br />%s-%s</td>' + "\n" +
					'        <td title="Ergebnisse anzeigen" style="padding: 0 0 0 2px; cursor:pointer" onclick="%h">%s<br />%s</td>' + "\n" +
					'        <td style="padding: 0 5px 0 2px;"><a title="Eintrag l&ouml;schen" href="#" onclick="%h"><img src="/img/diverse/delete.gif"  style="text-decoration: none; border: 0;"></a></td>' + "\n" +
					'      </tr>' + "\n",
						rows[i].aid,
						String.format('window.bas_mh_inst.select(%j, 0)', 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, 0)', rows[i]),
						rows[i].Datum.substr(0, 6) + rows[i].Datum.substr(8, 2),
						(rows[i].oneway == 0) ? rows[i].retDatum.substr(0, 6) + rows[i].retDatum.substr(8, 2) : '---------',
						String.format('return window.bas_mh_inst.act_delete(%j)', rows[i])
				);		
			}

			html += '    </table>' +  "\n" +
					'  </div>' +  "\n" +
					'</div>';
		}

		return html;
	}
	
	this.show_saved_result_info = function()
	{
		var d = document.getElementById('bas_mh_info');
		if( d ) d.style.display = 'block';
		var sdate =  document.flug.mh_date_backup.value;
		sdate = sdate.replace(/ /, ' um ');
		var s1 = document.getElementById('bas_mh_info_date');
		if( sdate && s1 ) s1.innerHTML = sdate;
		self.delayedFadeElementByName('bas_mh_info', 1, 10);
	}
	
	this.delayedFadeElementByName = function(id, count, delay)
	{
		setTimeout('bas_mh_inst.fadeElementByName("' + id + '", ' + count + ');', 1000 * delay);
	}
	
	this.fadeElementByName = function(id, count)
	{
	    var element	= document.getElementsByName(id)[0];
	    var fade	= (typeof arguments[2] == 'number') ? arguments[2] : false;
	    var fadeDir	= arguments[3] ? arguments[3] : false;
	    if (fadeDir == false) 
	    {	// -1 ausfaden / +1 einfaden
	        fadeDir = (element.style.display != 'none') ? -1 : 1;
	    }
	    if (fadeDir < 0) 
	    {
	    	if(! fade)
	    	{
	    		element.style.opacity = 0;
	    	    element.style.MsFilter  = 'progid:DXImageTransform.Microsoft.Alpha(opacity=0)';
	    	    element.style.filter = 'alpha(opacity=0)';
	    	}
	    	fade = fade ? fade - 0.1 : 1;
	        if (fade < 0) 
	        {
	            fade == 0;
	            element.style.display = 'none';
        	    element.style.MsFilter  = 'progid:DXImageTransform.Microsoft.Alpha(opacity=100)';
        	    element.style.filter = 'alpha(opacity=100)';
	            count--;
	            if(count == 0)
	            {
	            	element.style.display = 'none';
	            	document.getElementById(id).style.opacity = 1;
	            	return;
	            } else {
	            	self.fadeElementByName(id, count);
	            	return;
	            }
	        }
	    } else if (fadeDir > 0) {
	    	if(! fade)
	    	{
	    		element.style.opacity = 1;
        	    element.style.MsFilter  = 'progid:DXImageTransform.Microsoft.Alpha(opacity=100)';
        	    element.style.filter = 'alpha(opacity=100)';
	    	}
	    	element.style.display = null;
    	    element.style.MsFilter  = 'progid:DXImageTransform.Microsoft.Alpha(opacity=0)';
    	    element.style.filter = 'alpha(opacity=0)';
	        fade = (fade !== false) ? fade + 0.1 : 0;
	        if (fade > 1) 
	        {
	            fade = 1;
	            count--;
	            if(count == 0)
	            {
	            	element.style.display = null;
	            	return;
	            } else {
	            	element.style.display = null;
	            	self.fadeElementByName(id, count);
	            	return;
	            }
	        }
	    }
	    element.style.opacity = fade;
//	    if(element.filters) 
//	    	element.filters.item('DXImageTransform.Microsoft.Alpha').enabled=1;
	    element.style.MsFilter  = 'progid:DXImageTransform.Microsoft.Alpha(opacity=' + parseInt(fade * 100) + ')';
	    element.style.filter = 'alpha(opacity=' + parseInt(fade * 100) + ')';
	    setTimeout('bas_mh_inst.fadeElementByName("' + id + '", ' + count + ', ' + fade + ', ' + fadeDir + ');', 50);
	}

	/*
	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';
	}
	*/

}


