/* Rewrite IATA (International Air Transport Association) Search, * 26.11.2008, Patrick Kirsch */ function BASWL_IATA_Exception_For_IE () { var _self = this; var _what; var _iFr; _self.init_IE = function(what,iFr) { _what = what; _iFr = iFr; }; _self.ExForIE_get_self = function () { return _self; }; _self.aus = function (dummy) { var DivRef = document.getElementById(_what); var IfrRef = document.getElementById(_iFr); DivRef.style.display = "none"; if( IfrRef ) { IfrRef.style.display = "none"; IfrRef.style.width = DivRef.offsetWidth; IfrRef.style.height = DivRef.offsetHeight; IfrRef.style.top = DivRef.style.top; IfrRef.style.left = DivRef.style.left; IfrRef.style.zIndex = DivRef.style.zIndex - 1; IfrRef.style.display = DivRef.style.display; } }; _self.an = function (dummy) { document.getElementById(_what).style.display = ""; var DivRef = document.getElementById(_what); var IfrRef = document.getElementById(_iFr); if( IfrRef ) { IfrRef.style.height = DivRef.offsetHeight - 3; IfrRef.style.top = DivRef.style.top; IfrRef.style.left = DivRef.style.left; IfrRef.style.zIndex = DivRef.style.zIndex - 1; IfrRef.style.display = "block"; } }; _self.div_display = function (select) { document.getElementById(_what).innerHTML = select; var DivRef = document.getElementById(_what); var IfrRef = document.getElementById(_iFr); DivRef.style.display = "block"; if( IfrRef ) { IfrRef.style.width = DivRef.offsetWidth; IfrRef.style.height = DivRef.offsetHeight - 3; IfrRef.style.top = DivRef.style.top; IfrRef.style.left = DivRef.style.left; IfrRef.style.zIndex = DivRef.style.zIndex - 1; } }; _self.stopPropagation_preventDefault = function (event) { if (!event) event = window.event; event.cancelBubble = true; event.preventDefault = false; }; _self._loadXMLDoc_prep_IE = function() { var ajax = new ActiveXObject("Microsoft.XMLHTTP"); return ajax; }; }; /* Browser Objects, with corresponding quirks*/ function BASWL_IATA_Browser() { var _element; this.init_browser = function(element) { _element = element; }; var _nav_safari_dummy = function (event) { if (event.keyCode == 13) { if (event.stopPropagation) event.stopPropagation(); if (event.preventDefault) event.preventDefault(); return false; } return true; }; this.install_browser = function () { var item = document.getElementById(_element); if ((navigator.userAgent.indexOf("Safari") > 0) || (navigator.product == "Gecko") || (navigator.product == "Konqueror/khtml")) { item.addEventListener ("keydown",_nav_safari_dummy,false); item.addEventListener ("keypress",_nav_safari_dummy,false); item.addEventListener ("keyup",this.nav,false); } else { item.attachEvent('onkeyup',this.nav); item.attachEvent('onkeydown',_nav_safari_dummy); item.attachEvent('onkeypress',_nav_safari_dummy); } }; }; function BASWL_IATA_Maske () { var _self = this; _self.what; _self.TempDiv; _self._ajax_request; _self._xmlSource = "../../inc/3lc.php?"; var TempMultiairport; _self.input_hidden; _self.input_hidden_2; // TODO: Sorry; no idea why this field isn't obsolete _self.initVar; // TODO: initializes the 3lc searches (if the use has typed 3 letters) // nonetheless, the autor is not sure, if that is needed ! _self.indexArray = new Array(); // TODO: This is only for Hotel interesting! _self.oldAP = -1; _self.maxAP = 0; _self.startAP = 0; _self.APs = new Array(); _self.Namespace = ""; _self.Maske_get_self = function () { return _self; }; _self.init_formular = function (what_, TempDiv_, TMPmultiairport_, input_hidden_, input_hidden_2_, changeFieldHandler) { _self.what = what_; _self.TempDiv = TempDiv_; _self.ChgFieldHandler = changeFieldHandler; TempMultiairport = TMPmultiairport_; _self.input_hidden = input_hidden_; _self.input_hidden_2 = input_hidden_2_; var elem = document.getElementById(what_); elem.onfocus = ""; elem.onclick = function () { _self.initVAR = false; _self.aus(TempDiv_); document.getElementById(what_).value = ''; document.getElementById(input_hidden_).value = ''; }; _self.input_text = elem; }; /* Workaround for blur event is first event which is executed. */ var old_click = document.body.onclick; document.body.onclick = function (event) { if (document.getElementById(_self.TempDiv).style.display != "none") _self.ChgFieldHandler(0); if (old_click) old_click(event); }; _self.aus = function (div_element) { document.getElementById(div_element).style.display = "none"; }; _self.an = function (div_element) { document.getElementById(div_element).style.display = ""; }; _self.div_display = function (content) { document.getElementById(_self.TempDiv).innerHTML = content; }; _self.init_Maske = function (Namespace_, xmlSource_, startDiv) { _self.Namespace = Namespace_; _self._xmlSource = xmlSource_; _self.aus(startDiv); document.getElementById(startDiv).setAttribute("autocomplete","off"); }; _self.stopPropagation_preventDefault = function (event_) { if (event_.stopPropagation) event_.stopPropagation(); if (event_.preventDefault) event_.preventDefault(); }; var _changeForm_for_starts = function (airport, code) { document.getElementById(_self.what).value = airport; document.getElementById(_self.input_hidden).value = code; }; _self.onBlur_aus = function () { _self.aus(_self.TempDiv); }; _self.changeField = function (index) { _self.aus(_self.TempDiv); _self.oldAP = -1; var items = _self._ajax_request.responseXML.getElementsByTagName("item"); var port3lc = _getElementTextNS("", "portname", items[index], 0); if(port3lc == "N/A") { port3lc = ""; } else { port3lc = " - " + port3lc; } var airport = _getElementTextNS("", "airport", items[index], 0) + port3lc; var code = _getElementTextNS("", "code", items[index], 0); _changeForm_for_starts(airport,code); }; _self.do_with_field = function () { // to be overwritten by child }; _self.buildAirports = function (_letter) { // to be overwritten by child }; _self.action_for_key_escape = function () { // to be overwritten by child }; _self._HilightAirport = function (newAP) { var el; var value=""; el=document.getElementById(_self.Namespace+"_"+_self.oldAP); if (el) el.className = 'lc3'; el=document.getElementById(_self.Namespace+"_"+newAP); if (el) el.className = 'lc3_Hover'; _self.oldAP=newAP; }; var _getElementTextNS = function (bad_code_only_for_compability, LC_type, XML_structure, index) { var result = ""; try { result = XML_structure.getElementsByTagName(LC_type)[index]; } catch(e) { return " "; } if (result) { if (result.childNodes.length > 1) { return result.childNodes[1].nodeValue; } else { return result.firstChild.nodeValue; } } else { return "N/A"; } }; _self.nav = function (event) { if (event.keyCode == 38) { // up arrow if(_self.oldAP > _self.startAP) { _self._HilightAirport(_self.oldAP-1); } } else if (event.keyCode == 40) { // down arrow if(_self.oldAP < _self.maxAP) { _self._HilightAirport(_self.oldAP+1); } } else if (event.keyCode == 27) { // esc _self.action_for_key_escape(); } else if (event.keyCode == 9) { // tab } else if (event.keyCode == 13) { // return _self.do_with_field(); /* Stop progation, depending from which browser */ _self.stopPropagation_preventDefault(event); } else if (event.keyCode == 8) { // backspace if ((document.getElementById(_self.what).value).length < 3){ _self.action_for_key_escape(); return; } _self.buildAirports(document.getElementById(_self.what).value, false, true); } else { if ((48 <= event.keyCode && event.keyCode <= 90) || event.keyCode == 0) { /* Only alphanumeric*/ _airline_code(); } } return false; }; var _airline_code = function () { var letter = document.getElementById(_self.what).value; var letter_esc = escape(letter); if(letter.length < 3) { _self.aus(_self.TempDiv); _self.initVar = false; _self.indexArray = new Array(); if( _self._Maske_self ) _self._Maske_self.indexArray = new Array(); } else if(letter.length == 3) { _self.aus(_self.TempDiv); _self.initVar = true; _self.search_letters = letter.toLowerCase(); _load3lc(_self._xmlSource + 'param=' + letter_esc + '&multi=' + TempMultiairport); } else if(letter.length > 3) { if(_self.initVar == false) { _self.initVar = true; _load3lc(_self._xmlSource + 'param=' + letter_esc + '&multi=' + TempMultiairport); } var letter_comp = letter.toLowerCase(); _self.aus(_self.TempDiv); if (_self._ajax_request.readyState == 4) { if (_self._ajax_request.status == 200) { _self.buildAirports(letter_comp, false, true); } } } }; var _load3lc = function (_url) { var e; try { _self._loadXMLDoc(_url); } catch(e) { var msg = (typeof e == "string") ? e : ((e.message) ? e.message : "Unknown Error"); alert("Unable to get XML data:\n" + msg); return; } }; _self._loadXMLDoc_prep = function () { var ajax = new XMLHttpRequest(); return ajax; }; _self._loadXMLDoc = function (_url) { _self._ajax_request = _self._loadXMLDoc_prep(); if (_self._ajax_request) { if(_self.input_text) _self.input_text.style.cursor = 'wait'; document.body.style.cursor = 'wait'; _self._ajax_request.onreadystatechange = _self._processReqChange; _self._ajax_request.open("GET", _url, true); _self._ajax_request.send(null); //null } else { alert("You have no XMLHTTP, Bookansmile does not work with XMLHTTP disabled!"); } }; _self._processReqChange = function () { if (_self._ajax_request.readyState == 4) { if (_self._ajax_request.status == 200) { var letters = ""; if( _self.search_letters ) { letters = _self.search_letters; _self.search_letters = null; } _self.buildAirports(letters, false, true); } else { alert("There was a problem retrieving the XML data:\n" + _self._ajax_request.statusText); } if(_self.input_text) _self.input_text.style.cursor = null; document.body.style.cursor = null; } }; _self._buildAirports = function(letter) { var divid = 0 ; var full = false; var tmp_land = ""; var select = ""; var items = _self._ajax_request.responseXML.getElementsByTagName("item"); divid = _self.startAP = 0; if(letter == "") { for (var i = 0; i < items.length; i++) { var LC_city = _getElementTextNS("", "airport", items[i], 0); var LC_airportname = _getElementTextNS("", "portname", items[i], 0); var LC_id = _getElementTextNS("", "id", items[i], 0); var LC_land = _getElementTextNS("", "land", items[i], 0); var LC_code = _getElementTextNS("", "code", items[i], 0); var LC_airportname_3lc; if(LC_airportname != "N/A") { LC_airportname_3lc = " - " + LC_airportname; LC_airportname = " - " + LC_airportname + " (" + LC_code + ")"; } else { LC_airportname = " (" + LC_code + ")"; LC_airportname_3lc = ""; } if(LC_id != "DOUBLE") { if(LC_id != "SHORT") { if(LC_land != tmp_land) { select = select + "
" + LC_land + "
"; tmp_land = LC_land; } full = true; _self.APs[divid] = i; select = select + "
" + LC_city + LC_airportname + "
"; divid++; } } if( LC_id == "SHORT") { full = true; _self.APs[divid] = i; select = select + "
" + LC_code + " - " + LC_city + LC_airportname_3lc + "
"; divid++; if(items.length > 1) { select = select + "
"; } } } // end for } // if letter == "" else { for (var i = 0; i < items.length; i++) { var LC_city = _getElementTextNS("", "airport", items[i], 0); var LC_id = _getElementTextNS("", "id", items[i], 0); var LC_land = _getElementTextNS("", "land", items[i], 0); var LC_airportname = _getElementTextNS("", "portname", items[i], 0); var LC_code = _getElementTextNS("", "code", items[i], 0); if(LC_airportname != "N/A") { LC_airportname = " - " + LC_airportname + " (" + LC_code + ")"; } else { LC_airportname = " (" + LC_code + ")"; } var CompA = LC_city + LC_airportname; CompA = CompA.substring(0, letter.length); CompA = CompA.toLowerCase(); CompB = letter; CompC = LC_code ? LC_code.toLowerCase() : ''; if(((CompA == CompB) && LC_id != "SHORT") || (CompB == CompC)) { if(LC_land != tmp_land) { select = select + "
" + LC_land + "
"; tmp_land = LC_land; } full = true; _self.APs[divid] = i; select = select + "
" + LC_city + " " + LC_airportname + "
"; divid++; } } // end for } if(full == true) { _self.div_display(select); _self.an(_self.TempDiv); _self._HilightAirport(_self.startAP); } else { _self.aus(_self.TempDiv); } _self.maxAP=divid-1; }; }; function BASWL_IATA_Fluege () { var _Maske; // Platzhalter für die Instanz var _self = this; var ExForIE_div; var ExForIE_IFr; this.Namespace =""; this.initVAR; this.action_for_key_escape = function () { _Maske.aus(_Maske.TempDiv); _Maske.initVar = false; }; this.do_with_field = function () { if (_Maske.oldAP>-1) { _Maske.changeField(_Maske.APs[_Maske.oldAP]); } else { document.getElementById(_Maske.what).focus(); // is DVON document.getElementById(_Maske.input_hidden_2).value = '0'; // m_over_ } }; _self._init = function (_Namespace,_startDiv,_startIfr, _url_3lc) { this.Namespace = _Namespace; var _Maske_self; var browser = navigator.appName; if (browser == "Microsoft Internet Explorer") { BASWL_IATA_Browser.prototype = new BASWL_IATA_Maske(); BASWL_IATA_Exception_For_IE.prototype = new BASWL_IATA_Browser(); _Maske = new BASWL_IATA_Exception_For_IE(); var _ExForIE_self = _Maske.ExForIE_get_self(); _Maske_self = _Maske.Maske_get_self(); _Maske_self.aus = _ExForIE_self.aus; _Maske_self.an = _ExForIE_self.an; _Maske_self.div_display = _ExForIE_self.div_display; _Maske.stopPropagation_preventDefault = _ExForIE_self.stopPropagation_preventDefault; _Maske.init_IE(_startDiv,_startIfr); _Maske_self._loadXMLDoc_prep = _ExForIE_self._loadXMLDoc_prep_IE; } else { // load general browser BASWL_IATA_Browser.prototype = new BASWL_IATA_Maske(); // create the instance _Maske = new BASWL_IATA_Browser(); _Maske_self = _Maske.Maske_get_self(); } _Maske.init_Maske(this.Namespace, _url_3lc, _startDiv); _Maske_self.buildAirports = _Maske_self._buildAirports; // Simple function override does not work, I have to explicit request the context _Maske_self.do_with_field = this.do_with_field; // Sadly Javascript does not support real class management _Maske_self.action_for_key_escape = this.action_for_key_escape; this.changeField = _Maske.changeField; this.aus = _Maske.aus; this.onBlur = _Maske.onBlur_aus; _Maske_self.initVar = this.initVAR; }; var _keylistener = function (what, TempDiv, TMPmultiairport, input_hidden, input_hidden_2) { _Maske.init_formular(what, TempDiv, TMPmultiairport, input_hidden, input_hidden_2, _Maske.changeField); _Maske.init_browser(what); _Maske.install_browser(); }; this.init = function (_Namespace,srv_param, _url_3lc, object_reference) { document.getElementById(_Namespace+'_res_div').BASWL_IATA_Fluege = object_reference; _self._init(_Namespace+'_namespace',_Namespace+'_res_div', _Namespace+'_res_ifr', _url_3lc); // Namespace resdiv resiframe _keylistener(_Namespace+'_input',_Namespace+'_res_div', srv_param, _Namespace+'_von', _Namespace+'_over_von'); // input resdiv srv-param input_hidden input_hidden }; }; function BASWL_IATA_Hotels () { var _Maske; var _self = this; this.Namespace = ""; this.initVAR; var lines = new Array(); var showmaxhits = 25; _self.buildAirports = function(_letter, redraw, init) { // Reset lines and index array when a new search is triggered (_letter == "") if( init ) { lines = new Array(); _Maske.itemArray = new Array(); } // Build item array on initial request if( _Maske.itemArray.length < 1 ) { var xmlItems = _Maske._ajax_request.responseXML ? _Maske._ajax_request.responseXML.getElementsByTagName("i") : []; for( var i = 0; i < xmlItems.length; i++ ) { var xmlItemData = xmlItems[i].firstChild.nodeValue.split("|"); var xmlItemAltnames = xmlItemData[3].split(","); xmlItemAltnames.unshift(xmlItemData[1]); /* push item */ _Maske.itemArray.push([ xmlItemData[0], // 0: locationid xmlItemAltnames, // 1: [ name, altnames ] xmlItemData[2], // 2: district xmlItemData[4], // 3: country (parseInt(xmlItemData[5]) > 0) // 4: is_subentry ]); } _self._Maske_self.startAP = 2000; _self._Maske_self.maxAP = _self._Maske_self.startAP + xmlItems.length; } var div_id = _self._Maske_self.startAP; var hitcount = 0; var lastmatch = null; // reset AP -> index mapping _self._Maske_self.mapAP = new Array(); // Find matches for( var i = 0; (i < _Maske.itemArray.length) && (hitcount < showmaxhits); i++ ) { var item = _Maske.itemArray[i]; // Check for match for( var j = 0; j < item[1].length; j++ ) { // Found match if( item[1][j].toLowerCase().substring(0, _letter.length) == _letter) { // Store AP -> itemArray index mapping _self._Maske_self.mapAP[div_id] = i; // Country header if( !lastmatch || (lastmatch[3] != item[3]) ) lines.push(String.format('
%s
', item[3])); // Entry lines.push(String.format( '
' + '%s%s%s%s' + '
', _self.Namespace, div_id++, // namespace, div id _self._Maske_self.TempDiv, i, // field id, item index // subentry indentation (item[4]) ? " · " : "", // district for subentry or matched name (item[1][j]) (item[4] && item[2] != 'N/A' && item[2] != '') ? item[2] : item[1][j], // primary name if matched one differs and not subentry (!item[4] && j > 0) ? String.format(" (%s)", item[1][0]) : "", // district name if defined and not subentry (!item[4] && item[2] != 'N/A' && item[2] != '') ? String.format(", %s", item[2]) : "" )); lastmatch = item; hitcount++; break; } } } // Footer if( hitcount >= showmaxhits ) lines.push(String.format( '
...
und %d weitere
', _Maske.itemArray.length - hitcount )); // Render or hide result list if (lines.length > 0) { _Maske.div_display(lines.join("\n")); _Maske.an(_Maske.TempDiv); _Maske._HilightAirport(_Maske.startAP); } else { _Maske.aus(_Maske.TempDiv); } }; _self.changeFieldHotel = function(what) { var item = _Maske.itemArray[what]; if( item ) { // location id document.getElementById(_Maske.input_hidden).value = item[0]; // human readable label document.getElementById(_Maske.what).value = item[1][0] + ((item[2] != 'N/A' && item[2] != '') ? ', ' + item[2] : ''); } _Maske.aus(_Maske.TempDiv); }; _self.do_with_field = function() { if( _Maske.oldAP > -1 ) { _self.changeFieldHotel(_Maske.mapAP[_Maske.oldAP]); } else { document.getElementById(_Maske.input_hidden).focus(); // is DVON document.getElementById(_Maske.input_hidden_2).value = '0'; // m_over_ } }; _self.action_for_key_escape = function () { _Maske.aus(_Maske.TempDiv); _Maske.initVar = false; }; _self._init = function (_Namespace,_startDiv,_startIfr, _url_3lc) { this.Namespace = _Namespace; // Check if IE var browser = navigator.appName; if (browser == "Microsoft Internet Explorer") { BASWL_IATA_Browser.prototype = new BASWL_IATA_Maske(); BASWL_IATA_Exception_For_IE.prototype = new BASWL_IATA_Browser(); _Maske = new BASWL_IATA_Exception_For_IE(); var _ExForIE_self = _Maske.ExForIE_get_self(); _self._Maske_self = _Maske.Maske_get_self(); _self._Maske_self.aus = _ExForIE_self.aus; _self._Maske_self.an = _ExForIE_self.an; _self._Maske_self.div_display = _ExForIE_self.div_display; _self._Maske_self.stopPropagation_preventDefault = _ExForIE_self.stopPropagation_preventDefault; _Maske.init_IE(_startDiv,_startIfr); _self._Maske_self._loadXMLDoc_prep = _ExForIE_self._loadXMLDoc_prep_IE; } else { BASWL_IATA_Browser.prototype = new BASWL_IATA_Maske(); // create the instance _Maske = new BASWL_IATA_Browser(); _self._Maske_self = _Maske.Maske_get_self(); } // target: the super classe (Maske) asks for this.buildAirports and we have to override it with local oder with default implementation Maske._buildAirports _Maske.init_Maske(this.Namespace, _url_3lc,_startDiv); _self._Maske_self.do_with_field = _self.do_with_field; // Sadly Javascript does not support real class management _self._Maske_self.buildAirports = _self.buildAirports; _self._Maske_self.action_for_key_escape = _self.action_for_key_escape; _self._startDiv = _startDiv; this.changeFieldHotel = _self.changeFieldHotel; this.aus = _Maske.aus; this.onBlur = _Maske.onBlur_aus; _self._Maske_self.initVar = this.initVAR; }; var _keylistener = function (what, TempDiv, TMPmultiairport, input_hidden, input_hidden_2) { _Maske.init_formular(what, TempDiv, TMPmultiairport, input_hidden, input_hidden_2, _self.changeFieldHotel); _Maske.init_browser(what); _Maske.install_browser(); }; this.init = function (_Namespace, srv_param, _url_3lc, object_reference) { document.getElementById(_Namespace+'_res_div').BASWL_IATA_Hotels = object_reference; _self._init(_Namespace+'_namespace',_Namespace+'_res_div', _Namespace+'_res_ifr', _url_3lc); // Namespace resdiv resiframe _keylistener(_Namespace+'_input',_Namespace+'_res_div', srv_param, _Namespace+'_von', _Namespace+'_over_von'); // input resdiv srv-param input_hidden input_hidden }; };