/*
 * 
 * Copyright(c) 2007-2011, CN-Consult GmbH.
 * 
 * This code is propietary, you have no rights to use it, besides using it in the product this is part of.
 */


if(Ext.DatePicker){Ext.apply(Ext.DatePicker.prototype,{minText:"Dieses Datum liegt vor dem erstmöglichen Datum"});}

Ext.namespace("diloc");Ext.BLANK_IMAGE_URL='lib/ext/resources/images/default/s.gif';Ext.SSL_SECURE_URL='lib/diloc/blank.html';diloc.Application=function()
{var today=new Date();if(today.getMonth()==11)this.dilocBarHtml='<table class="bar"><tr><td class="a-xmas"></td><td class="b">&nbsp;</td><td class="c"></td></tr></table>';else if(today.getMonth()==0)this.dilocBarHtml='<table class="bar"><tr><td class="a-winter"></td><td class="b">&nbsp;</td><td class="c"></td></tr></table>';else this.dilocBarHtml='<table class="bar"><tr><td class="a"></td><td class="b">&nbsp;</td><td class="c"></td></tr></table>';var options={leftWidth:200,splashHtml:'',backendUrl:'backend',headerHeight:40,headerIncludesToolbar:true,loginWindowConfig:{layout:'table',layoutConfig:{columns:1},items:[{html:this.dilocBarHtml,border:false}],width:400,border:false,height:170},loginFormConfig:{width:400,border:false,labelWidth:90},loginUrl:'backend/user/login',loginFocusFieldName:'email',loginHashPassword:true,loginUseChallenge:true,trackActiveModules:true,autoCollapseModulePanels:true};if(navigator.userAgent.indexOf("DiLoc|Sync")>0)
{options.headerHeight=1;this.dilocBarHtml="";}
this.wasDegraded=false;this.inMaintenanceP0=false;this.inMaintenanceP1=false;this.inMaintenanceP2=false;this.maintenanceData=null;this.logoutAction=null;this.displayedMessages=[];this.childWindows=[];this.isChildWindow=false;this.numChildWindows=0;this.currenteExtendedStatus=null;diloc.Application.superclass.constructor.call(this,options);var lt=Ext.get("load-text");lt.hide(gwf.Login.required);Ext.getBody().dom.style.backgroundImage="url(images/waben-verlauf.png)";this.setFooter('<span id="footer">Copyright &copy; 2007-2011 CN-Consult GmbH</span>');this.setHeader(this.dilocBarHtml);console.info("Parent window is: ",window.parent);try
{if(window.opener&&window.opener.dilocParent)
{console.info("We are a child window!!!!!!!!!!!!!!!!!!");this.isChildWindow=true;if(!Ext.isIE)
{diloc.StoreManager=window.opener.diloc.StoreManager;diloc.rail.TrainRunMessageLoader=window.opener.diloc.rail.TrainRunMessageLoader;diloc.rail.TrainManager=window.opener.diloc.rail.TrainManager;diloc.rail.DispositionChangeManager.dispositionChangeData=window.opener.diloc.rail.DispositionChangeManager.dispositionChangeData;}
window.onunload=function()
{window.opener.gwf.App.childWindowClosed(window);};}
else
{window.dilocParent=true;window.onunload=function()
{gwf.App.closeChildWindows();};}}
catch(e)
{window.dilocParent=true;window.onunload=function()
{gwf.App.closeChildWindows();};}
this.afterRenderInit=function()
{Ext.Ajax.timeout=60000;Ext.Ajax.on('requestcomplete',this.requestComplete,this);Ext.get("load-text").remove();Ext.get("waben").remove();Ext.DomHelper.append(Ext.getBody(),{tag:'div',id:'dnotify'});this.notifyElement=Ext.get('dnotify');this.notifyElement.update("Lade Applikation...");this.notifyElement.alignTo(Ext.getBody(),"t-t");if(!this.isChildWindow)
{this.autoLogoutTimeoutId=this.logout.defer(1000*60*5,this,[{autoLogout:true}]);Ext.getBody().on("click",this.bodyClick,this);}
else
{Ext.getBody().on("click",window.opener.gwf.App.bodyClick);}};this.bodyClick=function()
{if(this.autoLogoutTimeoutId)
{window.clearTimeout(this.autoLogoutTimeoutId);this.autoLogoutTimeoutId=this.logout.defer(1000*60*15,this,[{autoLogout:true}]);}};this.closeChildWindows=function()
{for(var i=0;i<this.childWindows.length;i++)
{this.childWindows[i].window.close();}};this.childWindowClosed=function(_window)
{console.info("Child Window got closed!",_window);Ext.each(this.childWindows,function(_childWindow){if(_childWindow.window==_window)
{this.childWindows.remove(_childWindow);}},this);};this.hideStatus=function()
{this.notifyElement.hide(true);this.notifyElement.isShowing=false;};this.showStatus=function()
{if(this.numUnfinishedBackgroundJobs>0)
{this.notifyElement.alignTo(Ext.getBody(),"t-t");if(!this.notifyElement.isShowing)
{this.notifyElement.isShowing=true;this.notifyElement.show(true);}}};this.onAfterModulesLoaded=function()
{this.logoutAction=new Ext.Action({text:'Abmelden',handler:this.logout,scope:this,iconCls:'action-logout',tooltip:'Hier klicken zum Abmelden'});this.aboutAction=new Ext.Action({text:'',handler:this.about,scope:this,iconCls:'action-about',tooltip:'Über DiLoc'});this.newWindowAction=new Ext.Action({text:'',handler:this.newWindow,scope:this,iconCls:'action-newwindow',tooltip:'Ein neues Fenster öffnen'});this.statusMenu=new Ext.menu.Menu({allowOtherMenus:true,items:[{text:'Status wird geladen...'}]});this.statusButton=new Ext.Button({text:'',scope:this,iconCls:'status-unknown',tooltip:'Zeigt den Status von DiLoc|Rail',menu:this.statusMenu});this.userSettingsButton=new Ext.Button({text:diloc.User.email(),handler:this.showUserSettingsDialog,tooltip:'Benutzereinstellungen'});var tb=this.headerToolbar();tb.addSpacer();tb.add("->");tb.add(this.userSettingsButton);if(!this.isChildWindow)
{tb.add("-");tb.add({enableToggle:true,toggleHandler:this.toggleAutologout,scope:this,iconCls:'toggle-autologout',tooltip:'Auto-Logout aktivieren/deaktivieren',pressed:!this.isChildWindow});tb.add(this.logoutAction);tb.add("-");tb.add(this.statusButton);tb.add(this.aboutAction);tb.add(this.newWindowAction);}
tb.doLayout();diloc.rail.DispositionChangeManager.init();this.hideStatus.defer(1000,this);this.updateStatus.defer(5000,this);this.hideLoadProgress.defer(700,this);};this.newWindow=function()
{var windowNumber=this.numChildWindows++;var newWindow={name:"diloc_window"+windowNumber};newWindow.window=window.open(window.location.href,newWindow.name,"resizable=yes,dependant=yes,status=no,toolbar=no,menubar=no,directories=no");if(newWindow.window)
{this.childWindows.push(newWindow);}
else
{this.errorMsg("Neues Fenster","Fehler beim Erzeugen des neuen Fensters.");}};this.hideLoadProgress=function()
{this.centerOverlay.fadeOut({duration:0.5,callback:function(){this.loadProgressBar.destroy();delete this.loadProgressBar;this.centerOverlay.remove();delete this.centerOverlay;delete this.componentLoadProgressIncrease;delete this.componentLoadProgress;delete this.loadProgressContainer;delete this.loadProgressText;delete this.loadProgressBarContainer;this.showExhaustedComponentsDialog();},scope:this});};this.toggleAutologout=function(_button,_enable)
{console.log("ta:",_enable);_button.el.dom.getElementsByTagName('button')[0].blur();if(_enable==false)
{window.clearTimeout(this.autoLogoutTimeoutId);this.autoLogoutTimeoutId=null;_button.setIconClass('toggle-autologout-disabled');}
else
{_button.setIconClass('toggle-autologout');this.autoLogoutTimeoutId=this.logout.defer(1000*60*15,this,[{autoLogout:true}]);}};this.about=function()
{console.log("About!");if(!this.aboutWindow)
{this.aboutWindow=new Ext.Window({bodySyle:"background-image:url('images/about.png')",width:389,height:293,closeAction:'hide',plain:false,bodyBorder:false,resizable:false,stateId:'aboutWindow',buttonAlign:'center',cls:'about-window',html:'<div id="about_version"></div><div id="about_copyright">&copy; 2007-2010 CN-Consult GmbH</div><div id="about_license"></div><div id="about_versions"></div>',buttons:[{text:'Schließen',handler:this.hideAbout,scope:this}]});var versionGetter=new gwf.helpers.ActionExecutor({successSilent:true});versionGetter.on("success",this.aboutVersionLoaded,this);versionGetter.execute("server","versions");}
this.aboutWindow.show();};this.hideAbout=function(){if(this.aboutWindow)this.aboutWindow.hide();};this.aboutVersionLoaded=function(response)
{var version=response.data;console.log(version);var aboutVersion=Ext.get("about_version");aboutVersion.update("Version "+version.dilocVersion);aboutVersion.on("click",function(){document.getElementById('about_versions').style.display="block";});document.getElementById('about_license').innerHTML="Dieses Produkt ist lizenziert für "+diloc.User.customerName()+".";document.getElementById('about_versions').innerHTML="r"+version.svnRevision+", Frontend:&nbsp;"+version.frontendVersion+", Backend:&nbsp;"+version.backendVersion+", DB-Schema:&nbsp;"+version.schemaVersion+", Propel:&nbsp;"+version.propelVersion+", PHP:&nbsp;"+version.phpVersion+", MySQL:&nbsp;"+version.mysqlVersion+".";};this.updateStatus=function()
{if(this.isChildWindow)return;if(!this.updateStatusExecutor)
{this.updateStatusExecutor=new gwf.helpers.ActionExecutor({silent:true});this.updateStatusExecutor.on("failure",this.onUpdateStatusFailure,this);this.updateStatusExecutor.on("success",this.onUpdateStatusSuccess,this);}
if(this.inMaintenanceP2!==true)
{this.updateStatusExecutor.execute("server","status",{},"Aktualisiere Status-Informationen");}};this.showCheckStatus=function(_name,_description,_help)
{if(_help)
{Ext.MessageBox.alert(_name,_description+"<br/>"+_help);}
else Ext.MessageBox.alert(_name,_description);};this.onUpdateStatusSuccess=function(_jsonData)
{var data=_jsonData.data;if(data.extendedStatus)
{var overallStatus=1;this.statusMenu.removeAll();for(var i=0;i<data.extendedStatus.length;i++)
{var check=data.extendedStatus[i];if(check.state<overallStatus)overallStatus=check.state;this.statusMenu.addMenuItem({text:check.name,iconCls:'status-'+check.state,tooltip:check.description,handler:this.showCheckStatus.createDelegate(this,[check.name,check.description,check.help])});}
this.statusButton.setIconClass("status-"+overallStatus);this.currenteExtendedStatus=data.extendedStatus;}
if(data.state=="DEGRADED")
{Ext.MessageBox.show({title:'Server-Status',msg:'<br/><b>Server nicht voll verfügbar!</b><br/><br/><br/>Da es Probleme mit dem Server gibt, sollten Sie auf Speicher-Operationen verzichten, und Daten nur lesen, um Datenverlust zu vermeiden. Sie werden benachrichtigt wenn der Server wieder voll funktionsfähig ist.',buttons:Ext.Msg.OK,icon:Ext.MessageBox.WARNING});this.wasDegraded=true;}
if(data.state=="OK"&&this.wasDegraded==true)
{Ext.MessageBox.show({title:'Server-Status',msg:'<br/><b>Server wieder verfügbar!</b><br/><br/><br/>Die Probleme am Server wurden behoben, Sie können alle Dienste weider voll nutzen.',buttons:Ext.Msg.OK,icon:Ext.MessageBox.INFO});this.wasDegraded=false;}
if(data.state=="OK"&&data.message&&data.messageId&&typeof this.displayedMessages[data.messageId]=="undefined")
{this.displayedMessages[data.messageId]=true;Ext.MessageBox.show({title:'Server-Status',msg:'<br/><b>Nachricht vom Server:</b><br/><br/><br/>'+data.message,buttons:Ext.Msg.OK,icon:Ext.MessageBox.INFO});}
if(data.state=="MAINTENANCE_P0"&&!this.inMaintenanceP0)
{Ext.MessageBox.show({title:'Server-Status',msg:'<br/><b>Heute ist eine Wartung geplant!</b><br/><br/><br/>Die geplante Wartung wird am '+data.downtimeStart+' beginnen.<br/>Sie werden direkt vor der Wartung nochmals benachrichtigt, und haben Zeit zu Speichern.',buttons:Ext.Msg.OK,icon:Ext.MessageBox.INFO});this.inMaintenanceP0=true;}
if(data.state=="MAINTENANCE_P1"&&!this.inMaintenanceP1)
{var waitTime=5;if(data.waitTime&&data.waitTime>0&&data.waitTime<=15)waitTime=data.waitTime;Ext.MessageBox.show({title:'Server-Status',msg:'<br/><b>Wartung wird in '+waitTime+' Minuten durchgeführt!</b><br/><br/><br/>Die geplante Wartung wird in '+waitTime+' Minuten durchgeführt.<br/>Danach werden Sie automatisch abgemeldet. - Bitte beenden Sie Ihre Arbeiten und speichern Sie alle Änderungen.',buttons:Ext.Msg.OK,icon:Ext.MessageBox.WARNING});this.logoutAction.disable();this.maintenanceData=data;this.inMaintenanceP1=true;this.startLogoutCountdown(waitTime);Ext.each(this.childWindows,function(_childWindow){_childWindow.window.gwf.App.startLogoutCountdown(waitTime);});}
this.updateStatus.defer(1000*60,this);};this.startLogoutCountdown=function(_waitTime)
{this.logoutTime=new Date();this.logoutTime=this.logoutTime.add(Date.SECOND,_waitTime*60);this.logoutCountdown();};this.logoutCountdown=function()
{if(!this.toolbarCountdown)
{var toolbar=this.headerToolbar();this.toolbarCountdown=new Ext.Toolbar.TextItem({text:"",style:"color:red; font-weight:bold"});toolbar.insertButton(0,this.toolbarCountdown);toolbar.doLayout();this.logoutCountdown.defer(1000,this);}
else
{var countdownEl=Ext.get(this.toolbarCountdown.getEl());countdownEl.setStyle("color","red");countdownEl.setStyle("font-weight","bold");var now=new Date();var msecsToMaintenance=now.getElapsed(this.logoutTime);countdownEl.highlight("FF0000",{endColor:'222222',duration:0.9,attr:'color'});this.toolbarCountdown.setText("Wartung in: "+this.msecToString(msecsToMaintenance)+"&nbsp;&nbsp;");if(msecsToMaintenance<1000)
{if(!this.isChildWindow)
{diloc.StoreManager.stopUpdates();diloc.rail.TrainRunMessageLoader.stopUpdates();this.logout({forMaintenance:true});}
this.inMaintenanceP2=true;}
else
{this.logoutCountdown.defer(1000,this);}}};this.msecToString=function(_msec)
{var seconds=Math.floor(_msec/1000);var minutes=Math.floor(seconds/60);seconds=seconds-(minutes*60);if(minutes<10)minutes="0"+minutes;if(seconds<10)seconds="0"+seconds;return minutes+":"+seconds;};this.onUpdateStatusFailure=function(_message)
{this.errorMsg("Fehler beim aktualisieren der Status-Informationen: "+_message);this.updateStatus.defer(1000*120,this);};this.requestComplete=function(connection,response,options)
{var responseObject={};try{eval("responseObject="+response.responseText);if(responseObject.backendError)
{console.log("options:",options);if(options.request&&options.request.scope&&options.request.scope.jobId)
{this.completeBackgroundJob(options.request.scope.jobId);}
if(responseObject.backendError=="DatabaseUnavailable")
{Ext.MessageBox.show({title:'Datenbank nicht verfügbar',msg:'<b>Fehler beim Zugriff auf die DiLoc-Datenbank:<br/>Die Datebank-Verbindung konnte nicht aufgebaut werden!</b><br/><br/><br/>Versuchen Sie es später nochmal, oder setzen Sie sich mit dem Support in Verbindung.',buttons:Ext.Msg.OK,animEl:'this.loginFormPanel',icon:Ext.MessageBox.ERROR});}
else
{if(options.scope.options&&options.scope.options.params)
{if(options.scope.options.params.ignoreNoObjectError&&options.scope.options.params.ignoreNoObjectError==true)
{}
else
this.errorMsg("Backend-Fehler",responseObject.backendError);}
else
this.errorMsg("Backend-Fehler",responseObject.backendError);}}}
catch(e)
{function prettyParams(params)
{if(!params||gwf.util.isEmptyObject(params))return"No parameters passed.<br/>";var str="Params: <br/>";for(var i in params)
{str+="&nbsp;&nbsp;&nbsp;&nbsp;"+i+": "+params[i]+"<br/>";}
return str;}
var errorText="Called Backend URL: "+options.url+"<br/>"+prettyParams(options.params)+"Backend-Error:"+response.responseText;var errorDialog=new Ext.Window({title:'Anwendungsfehler',width:400,layout:'form',labelAlign:'top',bodyStyle:'padding:10px;',modal:true,constrain:true,items:[{xtype:'panel',html:'Ein Fehler ist aufgetreten! Dies sollte eigentlich nicht passieren. Bitte entschuldigen Sie die Unannehmlichkeiten.<br/>Wenn Sie uns helfen möchten den Fehler zu beheben, können Sie uns einen Fehlerbericht zusenden.<br/><br/><br/>',border:false,bodyStyle:"background-color:transparent; padding-left:75px; background-image:url(images/icons/custom/error3.png); background-repeat:no-repeat;"},{xtype:'textarea',fieldLabel:'Beschreiben Sie was Sie gemacht haben, als der Fehler auftrat',width:366,height:100},{xtype:'panel',title:'Fehlerdetails...',html:errorText,collapsible:true,collapsed:true,titleCollapse:true,hideCollapseTool:true,bodyStyle:'padding:3px;'}]});errorDialog.addButton({text:'Fehlerbericht senden',handler:this.sendErrorReport.createDelegate(this,[errorText,errorDialog]),scope:this});errorDialog.addButton({text:'Abbrechen',handler:errorDialog.close,scope:errorDialog});errorDialog.show();}};this.sendErrorReport=function(_errorText,_errorDialog)
{var params={errorText:_errorText,userEmail:diloc.User.email(),userDescription:_errorDialog.items.items[1].getValue(),hostname:window.location.host};var errorSender=new gwf.helpers.ActionExecutor({silent:true});_errorDialog.getEl().mask("Sende Fehlerbericht...");errorSender.on("success",function(){Ext.MessageBox.alert('Fehlerbericht senden',"Der Fehlerbericht wurde erfolgreich gesendet. Vielen Dank für Ihre Mithilfe!");_errorDialog.close();},this);errorSender.on("failure",function(_result){Ext.MessageBox.alert('Fehlerbericht senden',"Beim Senden des Fehlerberichts ist ein Fehler aufgetreten. - Schade!<br/>Falls der Anwendungsfehler erneut auftaucht, versuchen Sie bitte nochmal einen Fehlerbericht zu senden. Danke!");Ext.MessageBox.setIcon(Ext.MessageBox.ERROR);_errorDialog.close();},this);errorSender.execute("server","sendErrorReport",params,"Sende Fehlerbericht");};this.logout=function(_options)
{diloc.StoreManager.stopUpdates();diloc.rail.TrainManager.stopUpdates();if(typeof _options=="undefined")this.logoutOptions={};else this.logoutOptions=_options;var executor=new gwf.helpers.ActionExecutor({successSilent:true});executor.on("success",this.onLogoutSuccess,this);var stateData="";if(typeof Ext.state.Manager.getProvider().getSaveString=="function")stateData=Ext.state.Manager.getProvider().getSaveString();executor.execute("user","logout",{state:stateData},"Melde ab...");this.closeChildWindows();};this.onLogoutSuccess=function()
{if(this.logoutOptions.forMaintenance)
{var countdownEl=Ext.get(this.toolbarCountdown.getEl());countdownEl.update("");var content=this.prepareContentElement(null);content.update('<div class="maintenance"><h1>Wartung wird durchgeführt, bitte warten...</h1><div id="maintenance_progress"></div></div>');this.maintenanceProgress=new Ext.ProgressBar({renderTo:Ext.get("maintenance_progress"),width:500});this.maintenanceProgress.updateProgress(0.03,"Initialisiere...");Ext.getBody().mask();this.updateMaintenanceStatus();}
else if(this.logoutOptions.autoLogout)
{window.location.href="?autologout";}
else
{window.location.href="?logout";}};this.updateMaintenanceStatus=function()
{if(!this.updateMaintenanceExecutor)
{if(!this.maintenanceData.statusUpdateURL)
{this.maintenanceProgress.updateProgress(0.04,"Dauer des Updates unbestimmt. Bitte warten...");this.maintenanceProgress.wait({interval:1000,duration:1000*60*10,increment:10,scope:this,fn:this.maintenanceProgressTimeout});}
else
{this.updateMaintenanceExecutor=new gwf.helpers.ActionExecutor({successSilent:true,useScriptTagProxy:true});this.updateMaintenanceExecutor.on("success",this.onUpdateMaintenanceStatusSuccess,this);this.updateMaintenanceExecutor.on("failure",this.onUpdateMaintenanceStatusFailure,this);this.updateMaintenanceStatus.defer(100,this);}}
else
{this.updateMaintenanceExecutor.executeUrl(this.maintenanceData.statusUpdateURL);this.updateMaintenanceStatus.defer(5000,this);}};this.onUpdateMaintenanceStatusSuccess=function(_jsonData)
{if(_jsonData.status.finished)
{if(_jsonData.status.finished==true)
{this.maintenanceProgress.updateProgress(1.0,"Abgeschlossen");Ext.getBody().unmask();Ext.MessageBox.show({title:'Server-Status',msg:'<br/><b>Update fertig!</b><br/><br/><br/>Das aktualisierte DiLoc|Rail wird jetzt neu geladen...',buttons:Ext.Msg.OK,icon:Ext.MessageBox.INFO,scope:this,fn:this.maintenanceProgressTimeoutOk});}}
if(_jsonData.status.progress&&_jsonData.status.message)
{var progress=_jsonData.status.progress;if(progress>0.99)progress=0.99;this.maintenanceProgress.updateProgress(progress,_jsonData.status.message);}};this.onUpdateMaintenanceStatusFailure=function()
{};this.maintenanceProgressTimeout=function()
{Ext.getBody().unmask();Ext.MessageBox.show({title:'Server-Status',msg:'<br/><b>Update eventuell fertig.</b><br/><br/><br/>DiLoc|Rail wird jetzt neu geladen...',buttons:Ext.Msg.OK,icon:Ext.MessageBox.INFO,scope:this,fn:this.maintenanceProgressTimeoutOk});};this.maintenanceProgressTimeoutOk=function()
{if(this.maintenanceData.finishURL)window.location.href=this.maintenanceData.finishURL;else window.location.reload(true);};this.onLoginSucceeded=function(result)
{if(result)
{diloc.User.initialize(result);}
Ext.getBody().dom.style.backgroundImage="";this.createLayout();this.centerOverlay=Ext.getBody().createChild({id:'centeroverlay',html:''});this.centerOverlay.setBox(this.center.getEl().getBox());var viewPortSize=this.viewport.getSize();this.centerOverlay.setWidth(viewPortSize.width);this.centerOverlay.setHeight(this.centerOverlay.getHeight()+27+17);this.centerOverlay.setLeft(0);this.centerOverlay.setTop(this.centerOverlay.getTop()-27);this.loadProgressContainer=this.centerOverlay.createChild({style:'width: 300px;'});this.loadProgressContainer.center(this.centerOverlay);this.loadProgressContainer.setTop(300-40);this.loadProgressBarContainer=this.loadProgressContainer.createChild({style:'width: 300px;'});this.loadProgressText=this.loadProgressContainer.createChild({cls:'text'});var loadProgressBarConfig={renderTo:this.loadProgressBarContainer,textEl:this.loadProgressText,value:0,width:300,text:'Lade Komponenten...'};if(!Ext.isIE)loadProgressBarConfig.height=10;this.loadProgressBar=new Ext.ProgressBar(loadProgressBarConfig);this.appPlugin=new diloc.app.plugins.UserSettings();this.appPlugin.init(this);this.addModule(new diloc.modules.WelcomeScreen());var head=document.getElementsByTagName("head")[0];var componentScript=document.createElement('script');componentScript.type='text/javascript';componentScript.src=this.backendUrl('components','load');head.appendChild(componentScript);};this.showExhaustedComponents=function(_exhaustedComponents)
{this.exhaustedComponents=_exhaustedComponents;};this.showExhaustedComponentsDialog=function()
{if(this.exhaustedComponents)
{var messageText="<div class=\"messagebox-container\">";if(this.exhaustedComponents.length==1)
{messageText+="Aufgrund nicht ausreichender Lizenzen wurde das Modul '"+this.exhaustedComponents[0].modulename+"' nicht geladen.<br/><br/>";}
else
{messageText+="Aufgrund nicht ausreichender Lizenzen wurden folgende Module nicht geladen:<br/><br/><ul class=\"list\">";for(var i=0;i<this.exhaustedComponents.length;i++)
{messageText+="<li>"+this.exhaustedComponents[i].modulename+"</li>";}
messageText+="</ul>";}
messageText+="</div>";var window=new Ext.Window({html:messageText,title:'Komponenten nicht geladen',buttons:[{text:'Ok',handler:function(){window.close();}}],stateful:false,width:300});window.show();}};this.startComponentLoading=function(_numComponents)
{console.log("Loading "+_numComponents+" components...");this.componentLoadProgressIncrease=1/(_numComponents+1);this.componentLoadProgress=0;};this.componentAvailable=function(_type,_constructor,_rights,_name)
{this.componentLoadProgress+=this.componentLoadProgressIncrease;this.loadProgressBar.updateProgress(this.componentLoadProgress,"Lade Komponente '"+_name+"'...");var evalStr="";if(_type=="gwfmodule")
{try
{var module=new _constructor();if(typeof module.setRights=="function")module.setRights(_rights);this.addModule(module);}
catch(e)
{console.error("Could not load module with constructor ",_constructor,e);}}
else if(_type=="app_plugin")
{var appPlugin=new _constructor();appPlugin.init(this);}
else if(_type.endsWith("_plugin"))
{var moduleName=_type.substring(0,_type.indexOf("_plugin"));console.log("Searching for module "+moduleName);var module=this.findModuleByName(moduleName);if(module)
{if(typeof module.addPlugin=="function")
{var plugin=new _constructor();if(typeof plugin.setRights=="function")plugin.setRights(_rights);module.addPlugin(plugin);}
else
{console.error("Module "+moduleName+" does not support plugins! No way to add the plugin "+_type+"! :-(");}}
else
{console.info("Could not find module "+moduleName+"!");}}
if(this.componentLoadProgress>=1-this.componentLoadProgressIncrease-0.001)
{this.loadProgressBar.updateProgress(1,'Bereite Benutzeroberfläche vor...');}};this.createLoginFormFieldItems=function()
{var items=[{fieldLabel:'Email-Adresse',name:'email',vtype:'email',allowBlank:false,width:182,msgTarget:'side',validationDelay:1500,autoCreate:{tag:'input',type:'text',size:'20',autocomplete:'on'}},{fieldLabel:'Passwort',name:'password',inputType:'password',allowBlank:false,width:182,msgTarget:'side'}];return items;};this.prepareFormContent=function(_title,_module)
{var title="";if(_title)title=_title;var contentElement=this.prepareContentElement(_module);contentElement.dom.style.backgroundImage="url(images/form-background.png)";contentElement.dom.style.backgroundRepeat="no-repeat";contentElement.update('<h2 class="form-title">'+title+'</h2><div id="form-content"></div>');return Ext.get("form-content");};this.loginActionFailed=function(_form,_action)
{if(_action.result&&_action.result.backendError)
{if(_action.result.backendError=="NoLicensesLeft")
{Ext.MessageBox.show({title:'Zugriffslizenzen alle in Benutzung',msg:'<br/><b>Sie haben keine freien Zugriffslizenzen mehr!</b><br/><br/><br/>Melden Sie andere Benutzer ab, oder warten Sie eine Weile und versuchen Sie es später nochmal.',buttons:Ext.Msg.OK,animEl:'this.loginFormPanel',icon:Ext.MessageBox.WARNING});this.loginFormPanel.getEl().unmask();}
else if(_action.result.backendError=="AlreadyLoggedIn")
{Ext.MessageBox.show({title:'Benutzer schon angemeldet',msg:'<br/><b>Sie sind bereits angemeldet!</b><br/><br/><br/>Melden Sie sich an der anderen Arbeitsstation ab, bevor Sie sich wo anders anmelden.',buttons:Ext.Msg.OK,animEl:'this.loginFormPanel',icon:Ext.MessageBox.WARNING});this.loginFormPanel.getEl().unmask();}
else if(_action.result.backendError=="DatabaseUnavailable")
{Ext.MessageBox.show({title:'Datenbank nicht verfügbar',msg:'<b>Fehler beim Zugriff auf die DiLoc-Datenbank:<br/>Die Datebank-Verbindung konnte nicht aufgebaut werden!</b><br/><br/><br/>Versuchen Sie es später nochmal, oder setzen Sie sich mit dem Support in Verbindung.',buttons:Ext.Msg.OK,animEl:'this.loginFormPanel',icon:Ext.MessageBox.ERROR});this.loginFormPanel.getEl().unmask();}
else if(_action.result.backendError=="SessionExpired")
{Ext.MessageBox.show({title:'Sicherheits-Token ungültig',msg:'<b>Der Sicherheits-Token ist abgelaufen:</b><br/><br/>Der für die sichere Anmeldung verwendete Sicherheits-Token ist abgelaufen.<br/><br/>DiLoc wird neu gestartet, dadurch erhalten Sie einen neuen Sicherheits-Token, und Sie können sich neu anmelden.',buttons:Ext.Msg.OK,animEl:'this.loginFormPanel',icon:Ext.MessageBox.WARNING,fn:function(){window.location.reload();}});this.loginFormPanel.getEl().unmask();}
else
{Ext.MessageBox.show({title:'Unbekannter Fehler',msg:'<br/><b>Ein unbekannter Fehler ist aufgetreten!</b><br/><br/><br/>Versuchen Sie es später nochmal, oder setzen Sie sich mit dem Support in Verbindung.<br/><br/><br/>Fehlercode: '+_action.result.backendError,buttons:Ext.Msg.OK,animEl:'this.loginFormPanel',icon:Ext.MessageBox.ERROR});this.loginFormPanel.getEl().unmask();}}
else
{this.loginFormPanel.getForm().findField("password").focus(true);this.loginFormPanel.getEl().unmask();}};this.setStatusTextImpl=function(_msg)
{if(_msg!==""&&_msg!=="Lade daten")
{if(_msg[0]=="!")
{this.notifyElement.update(_msg.substr(1));this.showStatus();}
else
{this.notifyElement.update(_msg);this.showStatus.defer(300,this);}}
else
{this.hideStatus();}};this.on("afterLayoutRender",this.afterRenderInit,this);this.on("afterModulesLoaded",this.onAfterModulesLoaded,this);this.on("loginSucceeded",this.onLoginSucceeded,this);};Ext.extend(diloc.Application,gwf.Application,{backendUrl:function(_class,_action,_params)
{if(_class&&_action&&_params)
{if(_params.id)return this.options.backendUrl+"/"+_class+"/"+_params.id+"/"+_action;else return this.options.backendUrl+"/"+_class+"/"+_action;}
else if(_class&&_action&&!_params)
{return this.options.backendUrl+"/"+_class+"/"+_action;}
else return this.options.backendUrl;}});

Ext.ns("diloc");diloc.StateProvider=function(config){diloc.StateProvider.superclass.constructor.call(this);this.loadFromSaveString(diloc.User.getStateData());Ext.apply(this,config);};Ext.extend(diloc.StateProvider,Ext.state.Provider,{set:function(name,value){if(typeof value=="undefined"||value===null){this.clear(name);return;}
diloc.StateProvider.superclass.set.call(this,name,value);},getSaveString:function()
{return Ext.util.JSON.encode(this.state);},loadFromSaveString:function(_data)
{if(_data==""||_data==null||typeof _data=="undefined")this.state={};else
{try{this.state=Ext.util.JSON.decode(_data);}
catch(e)
{this.state=this.decodeValue(_data);}}}});

Ext.namespace("diloc","diloc.User");diloc.User.initialize=function(loginResult)
{this._customerId=0;console.log(loginResult);if(loginResult)
{if(loginResult.data)
{this._customerId=loginResult.data.customerId;this._userId=loginResult.data.id;this._customerName=loginResult.data.customerName;this._isAdmin=loginResult.data.isAdmin;this._isSuperAdmin=loginResult.data.isSuperAdmin;this._email=loginResult.data.email;this._customerApiKey=loginResult.data.customerApiKey;this._customerCreatedOn=loginResult.data.customerCreatedOn;this._customerIsDemo=loginResult.data.customerIsDemo;this._dispositionChangesetId=loginResult.data.dispositionChangesetId;this._dispositionChanges=loginResult.data.dispositionChanges;this._customerHasGPS=loginResult.data.customerHasGPS;this._stateData=loginResult.data.state;if(loginResult.data.stateInDb==true)
{console.log("USING DB STATE");Ext.state.Manager.setProvider(new diloc.StateProvider());}
else
{console.log("USING COOKIE STATE");Ext.state.Manager.setProvider(new Ext.state.CookieProvider());}}}};diloc.User.id=function()
{return this._userId;};diloc.User.customerId=function()
{return this._customerId;};diloc.User.customerName=function()
{return this._customerName;};diloc.User.isAdmin=function()
{return this._isAdmin;};diloc.User.isSuperAdmin=function()
{return this._isSuperAdmin;};diloc.User.email=function()
{return this._email;};diloc.User.customerCreatedOn=function()
{return this._customerCreatedOn;};diloc.User.customerApiKey=function()
{return this._customerApiKey;};diloc.User.isDemoUser=function()
{return this._customerIsDemo;};diloc.User.hasDispositionChangeset=function()
{if(this._dispositionChangesetId==null)return false;else return true;};diloc.User.dispositionChangesetId=function()
{return this._dispositionChangesetId;};diloc.User.dispositionChanges=function()
{return this._dispositionChanges;};diloc.User.hasGPS=function()
{return this._customerHasGPS;};diloc.User.getStateData=function()
{return this._stateData;};

diloc.AdminPlugin=function(_config)
{this.config={treePrefix:'x',priority:0,treeLoaderBaseAttrs:null,internalName:'unknown',iconCls:null,nodeText:'Unknown',backendController:'',visibleObjectName:'Objekt',editTitle:'Objekt bearbeiten',createTitle:'Objekt anlegen',addTooltip:'Neues Objekt hinzufügen',nameValue:'name',addButtonIconCls:'',needsSuperAdminForCreate:false};Ext.apply(this.config,_config);this.currentObjectId=null;this.superAdminMode=diloc.User.isSuperAdmin();this.adminModule=null;this.rights={};this.addEvents("saved");this.prioriy=function()
{return this.config.priority;};this.setAdminModule=function(_adminModule)
{this.adminModule=_adminModule;};this.addToolbarActions=function(_toolbar)
{if(this.rights.write&&this.rights.create&&((this.config.needsSuperAdminForCreate==true&&diloc.User.isSuperAdmin())||this.config.needsSuperAdminForCreate==false))
{_toolbar.add({iconCls:this.config.addButtonIconCls,handler:this.objectAdd,scope:this,tooltip:this.config.addTooltip});}};this.setRights=function(_rights)
{this.rights=_rights;};this.addNodeToCustomer=function(_node)
{var loader=new Ext.tree.TreeLoader({dataUrl:gwf.App.backendUrl(this.config.backendController,'listTree'),baseAttrs:this.config.treeLoaderBaseAttrs});var node=new Ext.tree.AsyncTreeNode({text:this.config.nodeText,id:this.config.internalName+'_'+_node.id,expandable:true,leaf:false,loader:loader,iconCls:this.config.iconCls,customerId:_node.id});node.on("beforeappend",this.beforeAppend,this);node.on("expand",this.nodeOnExpand,this);_node.appendChild(node);};this.beforeAppend=function(_tree,_parentNode,_childNode)
{_childNode.on("click",this.nodeClick,this);};this.nodeOnExpand=function(_node)
{this.reloadNode=_node;if(this.selectNodeAfterLoadId)
{console.info("Trying to select node with id",this.selectNodeAfterLoadId);var node=_node.findChild("id",this.config.treePrefix+this.selectNodeAfterLoadId);if(node)
{console.info("Selecting node",node);node.select();this.currentNode=node;}}
this.createCustomerId=_node.attributes.customerId;this.selectNodeAfterLoadId=null;};this.nodeClick=function(_node)
{console.log("Clicked on node:",_node.id);console.info(this.config);var pos=_node.id.indexOf(this.config.treePrefix);this.currentObjectId=_node.id.substring(pos+this.config.treePrefix.length);this.reloadNode=_node.parentNode;this.currentNode=_node;if(this.formItemsLoaded)
{if(this.formPanel&&this.formIsForCreate!=true)
{this.formPanel.getForm().reset();this.formPanel.getEl().dom.style.opacity=0.5;this.formPanel.load({url:gwf.App.backendUrl(this.config.backendController,"get",{id:this.currentObjectId}),params:{something:'nothing'}});}
else
this.createFormPanel();}
else
{this.loadFormItems();}};this.createFormPanel=function(_objectData)
{var url=gwf.App.backendUrl(this.config.backendController,"update",{id:this.currentObjectId});var buttonText="Speichern";var baseParams=undefined;var title=this.config.editTitle;if(this.currentObjectId==null)
{url=gwf.App.backendUrl(this.config.backendController,"create");buttonText="Anlegen";if(this.superAdminMode)
{baseParams={customerId:this.customerId};}
else baseParams={customerId:diloc.User.customerId()};title=this.config.createTitle;this.formIsForCreate=true;}
else this.formIsForCreate=false;var contentElement=this.adminModule.prepareFormContent(title,this);this.layoutPanel=new Ext.Panel({layout:'column',renderTo:contentElement,border:false,items:[{labelWidth:150,url:url,xtype:'form',width:400,bodyStyle:'padding:15px;',defaultType:'textfield',defaults:{width:200,msgTarget:'under',disabled:!this.rights.write},items:this.formItems,border:false,hideMode:'visibility',baseParams:baseParams,plugins:new gwf.plugins.OOSubmit(),id:this.config.internalName+'_form',buttonAlign:'center',buttons:[{text:buttonText,handler:this.saveObject,scope:this}]},{columnWidth:1,xtype:'panel',border:false,bodyStyle:'padding:15px;',id:this.config.internalName+'_rightpanel'}]});this.rightPanel=Ext.getCmp(this.config.internalName+'_rightpanel');this.formPanel=Ext.getCmp(this.config.internalName+'_form');this.formPanel.getForm().on("actioncomplete",this.formActionComplete,this);this.formPanel.getForm().on("actionfailed",this.formActionFailed,this);this.formPanel.getForm().on("beforeaction",this.formActionBefore,this);if(this.currentObjectId!==null&&!_objectData)
{console.log("Object.load");this.formPanel.load({url:gwf.App.backendUrl(this.config.backendController,"get",{id:this.currentObjectId})});}
else if(_objectData)
{this.formPanel.getForm().setValues(_objectData.data);}
this.initializeRightPanel(this.rightPanel,this.currentObjectId);this.layoutPanel.doLayout();};this.formActionBefore=function(_form,_action)
{this.formPanel.getEl().dom.style.opacity=0.5;if(_action.type=="submit"||_action.type=="oosubmit")
{this.actionJobId=gwf.App.addBackgroundJob('Speichere '+this.config.visibleObjectName+" ...");}
if(_action.type=="load")
{this.beforeLoad();this.actionJobId=gwf.App.addBackgroundJob('Lade '+this.config.visibleObjectName+" ...");}};this.formActionFailed=function(_form,_action)
{if(this.actionJobId)
{gwf.App.completeBackgroundJob(this.actionJobId);}
this.formPanel.getEl().dom.style.opacity=1.0;};this.getTreeEntryText=function(_data)
{return _data[this.config.nameValue];};this.formActionComplete=function(_form,_action)
{if(this.actionJobId){gwf.App.completeBackgroundJob(this.actionJobId);this.actionJobId=null;}
if(_action.type=="oosubmit")
{if(this.formIsForCreate)
{this.currentObjectId=_action.result.data.id;this.createFormPanel(_action.result);gwf.App.msg("Aktion erfolgreich",this.config.visibleObjectName+" wurde erfoglreich angelegt.");if(this.reloadNode)this.reloadNode.reload();this.selectNodeAfterLoadId=_action.result.data.id;this.updateRightPanel(_action.result);}
else
{this.formPanel.getEl().dom.style.opacity=1.0;if(this.currentNode)this.currentNode.setText(this.getTreeEntryText(_action.result.data));this.fireEvent("saved",_action.result);}}
else if(_action.type=="load")
{this.updateRightPanel(_action.result);this.formPanel.getEl().dom.style.opacity=1.0;}
else this.formPanel.getEl().dom.style.opacity=1.0;};this.loadFormItems=function()
{var actionExecutor=new gwf.helpers.ActionExecutor({successSilent:true});actionExecutor.on("success",this.loadFormItemsComplete,this);actionExecutor.execute(this.config.backendController,"formItems");};this.loadFormItemsComplete=function(_data)
{this.formItems=_data.data;this.formItemsLoaded=true;this.createFormPanel();};this.objectAdd=function()
{this.currentObjectId=null;var customerId=this.adminModule.getCurrentCustomerId();if(this.createCustomerId)
{customerId=this.createCustomerId;this.createCustomerId=null;}
this.adminModule.clearTreeSelection();if(customerId!==false)
{this.customerId=customerId;this.currentNode=null;if(this.formItemsLoaded)
{this.createFormPanel();}
else this.loadFormItems();}};this.saveObject=function()
{var url=gwf.App.backendUrl(this.config.backendController,"update",{id:this.currentObjectId});if(this.formIsForCreate==true)
{url=gwf.App.backendUrl(this.config.backendController,"create");}
this.formPanel.getForm().submit({url:url});};this.formDeactivated=function()
{if(this.layoutPanel)
{this.destroyRightPanel();this.layoutPanel.destroy();delete this.layoutPanel;delete this.formPanel;delete this.rightPanel;}};this.initializeRightPanel=function(_panel,_currentObjectId)
{};this.updateRightPanel=function(_result)
{};this.destroyRightPanel=function(_result)
{};this.beforeLoad=function()
{};};Ext.extend(diloc.AdminPlugin,Ext.util.Observable,{});

Ext.namespace("diloc","diloc.dispositionplugins");diloc.dispositionplugins.Base=function()
{diloc.dispositionplugins.Base.superclass.constructor.call(this);this.rights={read:true,write:false,create:false};this.addEvents('trainSelected');this.selectRecord=function(_record)
{};this.generateTreeNode=function()
{return null;};this.generateTabItem=function()
{return null;};this.treeNodeClick=function(_node)
{};this.activate=function()
{};this.moduleDeactivated=function()
{};this.setDispositionModule=function(_module)
{this.dispositionModule=_module;};this.setRights=function(_rights)
{this.rights=_rights;};};Ext.extend(diloc.dispositionplugins.Base,Ext.util.Observable,{});

Ext.namespace("diloc","diloc.syncmanagerplugins");diloc.syncmanagerplugins.Base=function()
{diloc.syncmanagerplugins.Base.superclass.constructor.call(this);this.syncmanagerModule=null;this.rights={read:true,write:false,create:false};this.generateTreeNode=function()
{return null;};this.treeNodeClick=function(_node,_event)
{};this.treeContextClick=function(_node,_event)
{};this.moduleDeactivated=function()
{};this.setSyncManagerModule=function(_module)
{this.syncmanagerModule=_module;};this.setRights=function(_rights)
{this.rights=_rights;};};Ext.extend(diloc.syncmanagerplugins.Base,Ext.util.Observable,{});

Ext.namespace("diloc","diloc.dispositioninformationplugins");diloc.dispositioninformationplugins.Base=function()
{diloc.dispositioninformationplugins.Base.superclass.constructor.call(this);this.dispositionInformationModule=null;this.rights={read:true,write:false,create:false};this.generateTabPanel=function()
{return null;};this.moduleDeactivated=function()
{};this.setDispositionInformationModule=function(_module)
{this.dispositionInformationModule=_module;};this.setRights=function(_rights)
{this.rights=_rights;};};Ext.extend(diloc.dispositioninformationplugins.Base,Ext.util.Observable,{});

Ext.ns("JPaint");if(Ext.isIE)
{console={};console.log=function()
{};console.warn=function()
{};console.info=function()
{};}

Ext.ns("JPaint");JPaint.Point=function(_x,_y)
{this.x=_x;this.y=_y;this.move=function(_dx,_dy)
{this.x+=_dx;this.y+=_dy;};};

JPaint.Color=function(_color)
{this.r=0;this.g=0;this.b=0;this.a=null;this.fromString=function(_color)
{if(_color.startsWith('#'))
{var hex=_color.substring(1);this.r=parseInt(hex.substring(0,2),16);this.g=parseInt(hex.substring(2,4),16);this.b=parseInt(hex.substring(4,6),16);if(hex.length>6)
{this.a=parseInt(hex.substring(6,8),16);}}
else if(_color.startsWith('r'))
{var begin=_color.indexOf("(")+1;var end=_color.indexOf(")");var colorString=_color.substring(begin,end);var colors=colorString.split(',');this.r=parseInt(colors[0],10);this.g=parseInt(colors[1],10);this.b=parseInt(colors[2],10);if(colors.length>3)this.a=parseInt(colors[3],10);}
else if(_color.length==6)
{var hex=_color;this.r=parseInt(hex.substring(0,2),16);this.g=parseInt(hex.substring(2,4),16);this.b=parseInt(hex.substring(4,6),16);}
else if(_color.length==8)
{var hex=_color;this.r=parseInt(hex.substring(0,2),16);this.g=parseInt(hex.substring(2,4),16);this.b=parseInt(hex.substring(4,6),16);this.a=parseInt(hex.substring(6,8),16);}};this.asHexString=function()
{this.sanitize();var toHex=function(color)
{var hexColor=color.toString(16).toUpperCase();if(hexColor=="0")hexColor="00";return hexColor;};var hex="#";hex+=toHex(this.r);hex+=toHex(this.g);hex+=toHex(this.b);if(this.a!==null)hex+=toHex(this.a);return hex;};this.asRgbString=function()
{this.sanitize();if(this.a!==null)
{return"rgba("+this.r+","+this.g+","+this.b+","+this.a+")";}
else
{return"rgb("+this.r+","+this.g+","+this.b+")";}};this.setRgb=function(_r,_g,_b)
{this.r=_r;this.g=_g;this.b=_b;};this.setRgba=function(_r,_g,_b,_a)
{this.r=_r;this.g=_g;this.b=_b;this.a=_a;};this.setAlpha=function(_a)
{this.a=_a;};this._rgbToHsv=function(r,g,b){r=r/255;g=g/255;b=b/255;var max=Math.max(r,g,b),min=Math.min(r,g,b);var h,s,v=max;var d=max-min;s=max==0?0:d/max;if(max==min){h=0;}else{switch(max){case r:h=(g-b)/d+(g<b?6:0);break;case g:h=(b-r)/d+2;break;case b:h=(r-g)/d+4;break;}
h/=6;}
return[h,s,v];};this._hsvToRgb=function(h,s,v){var r,g,b;var i=Math.floor(h*6);var f=h*6-i;var p=v*(1-s);var q=v*(1-f*s);var t=v*(1-(1-f)*s);switch(i%6){case 0:r=v,g=t,b=p;break;case 1:r=q,g=v,b=p;break;case 2:r=p,g=v,b=t;break;case 3:r=p,g=q,b=v;break;case 4:r=t,g=p,b=v;break;case 5:r=v,g=p,b=q;break;}
return[Math.round(r*255),Math.round(g*255),Math.round(b*255)];};this._rgbToHsl=function(r,g,b){r/=255,g/=255,b/=255;var max=Math.max(r,g,b),min=Math.min(r,g,b);var h,s,l=(max+min)/2;if(max==min){h=s=0;}else{var d=max-min;s=l>0.5?d/(2-max-min):d/(max+min);switch(max){case r:h=(g-b)/d+(g<b?6:0);break;case g:h=(b-r)/d+2;break;case b:h=(r-g)/d+4;break;}
h/=6;}
return[h,s,l];};this._hslToRgb=function(h,s,l){var r,g,b;if(s==0){r=g=b=l;}else{function hue2rgb(p,q,t){if(t<0)t+=1;if(t>1)t-=1;if(t<1/6)return p+(q-p)*6*t;if(t<1/2)return q;if(t<2/3)return p+(q-p)*(2/3-t)*6;return p;};var q=l<0.5?l*(1+s):l+s-l*s;var p=2*l-q;r=hue2rgb(p,q,h+1/3);g=hue2rgb(p,q,h);b=hue2rgb(p,q,h-1/3);}
return[Math.round(r*255),Math.round(g*255),Math.round(b*255)];};this.makeDarker=function(_percent)
{var hsl=this._rgbToHsl(this.r,this.g,this.b);var l=hsl[2]*(1-(_percent/100));if(l>1)l=1;var rgb=this._hslToRgb(hsl[0],hsl[1],l);this.r=rgb[0];this.g=rgb[1];this.b=rgb[2];};this.createDarkerColor=function(_percent)
{var color=this.clone();color.makeDarker(_percent);return color;};this.makeLighter=function(_percent)
{var hsl=this._rgbToHsl(this.r,this.g,this.b);var l=hsl[2]*(1+(_percent/100));if(l>1)l=1;var rgb=this._hslToRgb(hsl[0],hsl[1],l);this.r=rgb[0];this.g=rgb[1];this.b=rgb[2];};this.createLighterColor=function(_percent)
{var color=this.clone();color.makeLighter(_percent);return color;};this.clone=function()
{return new JPaint.Color(this.asHexString());};this.sanitize=function()
{if(this.r>255)this.r=255;if(this.r<0)this.r=0;if(this.g>255)this.g=255;if(this.g<0)this.g=0;if(this.b>255)this.b=255;if(this.b<0)this.b=0;if(this.a!==null)
{if(this.a>255)
this.a=255;if(this.a<0)
this.a=0;}};this.randomize=function()
{if(this.r!==0)
{this.r=Math.round(this.r*Math.random()*2);}
if(this.g!==0)
{this.g=Math.round(this.g*Math.random()*2);}
if(this.b!==0)
{this.b=Math.round(this.b*Math.random()*2);}
if(this.a!==null)
{this.a=Math.round(this.a*Math.random()*2);}
this.sanitize();}
if(typeof _color=="object")
{this.r=_color.r;this.g=_color.g;this.b=_color.b;this.a=_color.a;}
else this.fromString(_color);};

JPaint.Painter=function()
{this.prepareRender=function(_renderable)
{console.warn("prepareRender not implemented by painter!");};this.cleanupRender=function(_renderable)
{console.warn("cleanupRender not implemented by painter!");};this.renderText=function(_x,_y,_fontSize_fontFamily,_text)
{console.warn("renderText not implemented by painter!");};this.renderCircle=function(_x,_y,_radius)
{console.warn("renderCircle not implemented by painter!");};this.renderRect=function(_x1,_y1,_width,_height)
{console.warn("renderRect not implemented by painter!");};this.renderLine=function(_x1,_y1,_x2,_y2)
{console.warn("renderLine not implemented by painter!");};this.renderPolyline=function(_points)
{console.warn("renderPolyline not implemented by painter!");};this.clear=function()
{};};

JPaint.CanvasPainter=function(canvasElement)
{this.doFill=false;this.doLine=false;if(canvasElement)
{this.canvas=canvasElement;this.ctx=this.canvas.getContext('2d');this.ctx.fillStyle='#ffffff';}
else alert("Could not initialize CanvasPainter: canvas-element was not there!");JPaint.CanvasPainter.superclass.constructor.call(this);this.prepareRender=function(_renderable)
{this.ctx.save();if(_renderable.fillColor!==null)
{this.ctx.fillStyle=_renderable.fillColor;this.doFill=true;}
if(_renderable.lineColor!==null)
{this.doLine=true;}
if(_renderable.rotateTranslateX)this.ctx.translate(_renderable.rotateTranslateX,_renderable.rotateTranslateY);if(_renderable.rotation!==null&&!isNaN(_renderable.rotation)&&_renderable.rotation!==undefined)this.ctx.rotate(_renderable.rotation);if(_renderable.rotateTranslateX)this.ctx.translate(-_renderable.rotateTranslateX,-_renderable.rotateTranslateY);this.ctx.strokeStyle=_renderable.lineColor;this.ctx.lineWidth=_renderable.lineWidth;};this.cleanupRender=function(_renderable)
{this.doFill=false;this.doLine=false;this.ctx.restore();};this.renderCircle=function(_x,_y,_radius)
{this.ctx.beginPath();this.ctx.arc(_x,_y,_radius,(Math.PI/180)*0,(Math.PI/180)*360,false);if(this.doFill)this.ctx.fill();this.ctx.stroke();this.ctx.closePath();};this.renderPolyline=function(_points)
{this.ctx.beginPath();this.ctx.moveTo(_points[0].x,_points[0].y);for(var i=1;i<_points.length;i++)
{this.ctx.lineTo(_points[i].x,_points[i].y);}
if(this.doFill)this.ctx.fill();if(this.doLine)this.ctx.stroke();this.ctx.closePath();};this.renderRect=function(_x,_y,_width,_height,_radius)
{this.ctx.beginPath();this.ctx.moveTo(_x,_y+_radius);this.ctx.lineTo(_x,_y+_height-_radius);this.ctx.quadraticCurveTo(_x,_y+_height,_x+_radius,_y+_height);this.ctx.lineTo(_x+_width-_radius,_y+_height);this.ctx.quadraticCurveTo(_x+_width,_y+_height,_x+_width,_y+_height-_radius);this.ctx.lineTo(_x+_width,_y+_radius);this.ctx.quadraticCurveTo(_x+_width,_y,_x+_width-_radius,_y);this.ctx.lineTo(_x+_radius,_y);this.ctx.quadraticCurveTo(_x,_y,_x,_y+_radius);if(this.doLine)this.ctx.stroke();if(this.doFill)this.ctx.fill();this.ctx.closePath();};this.renderText=function(_x,_y,_fontSize,_fontFamily,_text)
{this.ctx.font=_fontSize+" "+_fontFamily;this.ctx.fillText(_text,_x,_y);};this.measureText=function(_fontSize,_fontFamily,_text)
{this.ctx.save();this.ctx.font=_fontSize+" "+_fontFamily;var metrics=this.ctx.measureText(_text);this.ctx.restore();return metrics;};this.clear=function()
{this.ctx.clearRect(0,0,this.canvas.width,this.canvas.height);};};Ext.extend(JPaint.CanvasPainter,JPaint.Painter,{});

JPaint.Renderable=function()
{this.lineColor='black';this.fillColor=null;this.painter=null;this.lineWidth=1;this.rotation=null;this.rotateTranslateX=null;this.rotateTranslateY=null;this.render=function(_painter)
{console.warn("render() not implemented in this renderable!");};this.setLineColor=function(_color)
{if(_color&&typeof _color=="object")this.lineColor=_color.asRgbString();else this.lineColor=_color;};this.setFillColor=function(_color)
{if(_color&&typeof _color=="object")this.fillColor=_color.asRgbString();else this.fillColor=_color;};this.setLineWidth=function(_width)
{this.lineWidth=_width;};this.setRotation=function(_rotation)
{if(_rotation!==NaN&&typeof _rotation=="number")this.rotation=_rotation;};this.setPainter=function(_painter)
{this.painter=_painter;};this.move=function(dx,dy)
{console.warn("move not implemented on object!");};this.setRotationCenter=function(_point)
{this.rotateTranslateX=_point.x;this.rotateTranslateY=_point.y;};};

JPaint.Circle=function(center,radius)
{this.center=center;this.radius=radius;JPaint.Circle.superclass.constructor.call(this);this.render=function(_painter)
{var painter=_painter;if(!painter)painter=this.painter;painter.prepareRender(this);painter.renderCircle(this.center.x,this.center.y,this.radius);painter.cleanupRender(this);};this.move=function(_dx,_dy)
{this.center.move(_dx,_dy);};};Ext.extend(JPaint.Circle,JPaint.Renderable,{});

JPaint.Polyline=function(points)
{this.points=points;JPaint.Polyline.superclass.constructor.call(this);this.addPoint=function(point)
{this.points.push(point);};this.render=function(_painter)
{var painter=_painter;if(!painter)painter=this.painter;painter.prepareRender(this);painter.renderPolyline(this.points);painter.cleanupRender(this);};this.move=function(_dx,_dy)
{for(var i=0;i<this.points.length;i++)
{this.points[i].move(_dx,_dy);}};};Ext.extend(JPaint.Polyline,JPaint.Renderable,{});

JPaint.Rect=function(_x,_y,_width,_height,_radius)
{this.x=_x;this.y=_y;this.width=_width;this.height=_height;this.radius=null;if(_radius)this.radius=_radius;JPaint.Rect.superclass.constructor.call(this);this.render=function(_painter)
{var painter=_painter;if(!painter)painter=this.painter;painter.prepareRender(this);if(this.radius!==null)painter.renderRect(this.x,this.y,this.width,this.height,this.radius);else painter.renderRect(this.x,this.y,this.width,this.height,0);painter.cleanupRender(this);};this.move=function(_dx,_dy)
{this.x+=_dx;this.y+=_dy;};this.setRotation=function(_rotation)
{this.rotation=_rotation;this.setRotationCenter(new JPaint.Point(this.x+this.width/2,this.y-1+this.height/2));};};Ext.extend(JPaint.Rect,JPaint.Renderable,{});

JPaint.Text=function(_x,_y,_fontSize,_fontFamily,_text,_alignment)
{this.x=_x;this.y=_y;this.fontSize=_fontSize;this.fontFamily=_fontFamily;this.text=_text;this.alignment=null;this.alignmentOffset=null;JPaint.Text.superclass.constructor.call(this);this.setText=function(_text)
{this.text=_text;};this.render=function(_painter)
{var painter=_painter;if(!painter)painter=this.painter;if(this.alignment)this.calculateAlignmentOffset();painter.prepareRender(this);if(this.alignmentOffset)
{painter.renderText(this.x+this.alignmentOffset[0],this.y+this.alignmentOffset[1],this.fontSize,this.fontFamily,this.text);}
else painter.renderText(this.x,this.y,this.fontSize,this.fontFamily,this.text);painter.cleanupRender(this);};this.calculateAlignmentOffset=function()
{if(this.alignment!==null&&!this.alignmentOffset)
{if(this.alignment=="right")
{this.alignmentOffset=[-this.getWidth(),0];}
if(this.alignment=="left")
{this.alignmentOffset=[0,0];}
if(this.alignment=="center")
{this.alignmentOffset=[-this.getWidth()/2,0];}
if(this.rotateTranslateX!==null)
{this.rotateTranslateX+=this.alignmentOffset[0];this.rotateTranslateY+=this.alignmentOffset[1];}}};this.move=function(_dx,_dy)
{this.x+=_dx;this.y+=_dy;};this.getWidth=function()
{var metrics=this.painter.measureText(this.fontSize,this.fontFamily,this.text);return metrics.width;};this.setAlignment=function(_alignment)
{if(_alignment=="left"||_alignment=="right"||_alignment=="center")
{this.alignment=_alignment;this.alignmentOffset=null;}
else
{console.warn("Unknown alignment '"+_alignment+"' ignored!");}};this.setRotation=function(_rotation)
{this.rotation=_rotation;if(this.painter)
{var metrics=this.painter.measureText(this.fontSize,this.fontFamily,this.text);var rotationCenter=new JPaint.Point(this.x+metrics.width/2,this.y-parseInt(this.fontSize,10)/2+1);this.setRotationCenter(rotationCenter);}
else
{console.warn("Could not adjust rotation-center, because painter is not set!");}};this.setText=function(_text)
{this.text=_text;this.alignmentOffset=null;};this.clone=function()
{var text=new JPaint.Text(this.x,this.y,this.fontSize,this.fontFamily,this.text);text.setPainter(this.painter);text.setFillColor(this.fillColor);return text;};if(_alignment)this.setAlignment(_alignment);};Ext.extend(JPaint.Text,JPaint.Renderable,{});

Ext.namespace("diloc","diloc.dispositionplugins");diloc.dispositionplugins.Train=function()
{diloc.dispositionplugins.Train.superclass.constructor.call(this);this.messageGrid=null;this.trainRunTemplate=null;this.constructor=function()
{};this.updateTrainView=function()
{if(this.deactivated)return;this.originalTrainRunData=gwf.util.clone(this.currentTrain.data.trainRun);if(this.currentTrain.data.trainRun.trainComment==""||this.currentTrain.data.trainRun.trainComment==null||this.currentTrain.data.trainRun.trainComment.stripTags()=="")
this.currentTrain.data.trainRun.trainComment="Kein Kommentar vorhanden.";if(this.currentTrain.data.trainRun.trainLining==""||this.currentTrain.data.trainRun.trainLining==null||this.currentTrain.data.trainRun.trainLining.stripTags()=="")
this.currentTrain.data.trainRun.trainLining="Keine Bespannung vorhanden.";if(!this.trainRunTemplate)this.setupTemplate();this.trainRunTemplate.update(this.currentTrain.data);};this.setupTemplate=function()
{var west=Ext.getCmp('trv-train-west');west.on('resize',this.onWestResize,this);var templateContainer=Ext.get('trv_trainview');if(!templateContainer)
alert("SetupTemplate() was called, but container was not there!");this.trainRunTemplate=new gwf.helpers.Template(templateContainer,"<div id='trainview'>"+"<h2>Zug&nbsp;<b>{number}</b><br/><small>({departureStation:this.stationRenderer} - {arrivalStation:this.stationRenderer})</small></h2>"+"<div class='freetext'><h3>Kommentar</h3><div id='trv_comment'>{trainRun.trainComment}<div id='trv_editcomment'></div></div></div>"+"<div class='freetext'><h3>Bespannung</h3><div id='trv_lining'><div id='trv_editlining'></div>{trainRun.trainLining}</div></div>"+"</div>");this.trainRunTemplate.stationRenderer=function(_value)
{var parts=_value.split("|");return parts[2];};this.trainRunTemplate.render();if(this.rights.write)
{this.editCommentButton=new Ext.Button({renderTo:Ext.get('trv_editcomment'),iconCls:'edit',handler:this.editComment,scope:this});Ext.get('trv_comment').hover(this.genMouseOverFunction('comment'),this.genMouseOutFunction('comment'));this.editLiningButton=new Ext.Button({renderTo:Ext.get('trv_editlining'),iconCls:'edit',handler:this.editLining,scope:this});Ext.get('trv_lining').hover(this.genMouseOverFunction('lining'),this.genMouseOutFunction('lining'));}
this.onWestResize(west);};this.onWestResize=function(_component)
{console.log("Westresize!",arguments);var freetexts=_component.el.query('.freetext');console.log("freetexts:",freetexts);for(var i=0;i<freetexts.length;i++)
{Ext.get(freetexts[i]).setWidth(Ext.get(_component.body.dom).getWidth()-20);}};this.genMouseOverFunction=function(_elementToShow)
{return function()
{var element=Ext.get("trv_"+_elementToShow);if(!element.doHoverFunction)
{element.doHoverFunction=function()
{if(this.doHover==true&&this.fadeInFinished!==true)
{element.animate({backgroundColor:{from:'#EAEAEA',to:'#ffffff'},borderColor:{from:'#EAEAEA',to:'#D1D1D1'}},0.5,this.overFinish,'easeOut','color');Ext.get("trv_edit"+_elementToShow).show(true);}
this.doHover=false;};}
element.doHover=true;element.doHoverFunction.defer(600,element);};};this.genMouseOutFunction=function(_elementToShow)
{return function()
{var element=Ext.get("trv_"+_elementToShow);element.doHover=false;if(!element.doHoverOutFunction)
{element.doHoverOutFunction=function()
{if(this.doHover==false)
{this.animate({backgroundColor:{from:'#ffffff',to:'#EAEAEA'},borderColor:{from:'#D1D1D1',to:'#EAEAEA'}},0.5,Ext.emptyFn,'easeIn','color');Ext.get("trv_edit"+_elementToShow).hide(true);this.fadeInFinished=false;}};}
if(element.dom.style.backgroundColor!==""&&element.dom.style.backgroundColor!="rgb(234, 234, 234)")
{element.fadeInFinished=true;element.doHoverOutFunction.defer(600,element);}};};this.createHtmlEditorDialog=function()
{this.htmlEditorDialog=new diloc.rail.dialogs.HtmlEditor();this.htmlEditorDialog.on("textUpdated",this.htmlEditorTextUpdated,this);};this.htmlEditorTextUpdated=function(_newValue,_valueId)
{var trainRunUpdater=new gwf.helpers.ActionExecutor({successSilent:true});trainRunUpdater.on("success",this.trainRunUpdateSuccess,this);var params={id:this.currentTrain.data.trainRun.id};if(_valueId=="comment")
params.trainComment=_newValue;if(_valueId=="lining")
params.trainLining=_newValue;trainRunUpdater.execute('trainrun','update',params,"Speichere Zuglaufdaten");};this.trainRunUpdateSuccess=function(_result)
{this.currentTrain.updateTrainRun(_result.data);};this.editComment=function()
{if(!this.htmlEditorDialog)
this.createHtmlEditorDialog();this.htmlEditorDialog.show(this.originalTrainRunData.trainComment,"comment");};this.editLining=function()
{if(!this.htmlEditorDialog)
this.createHtmlEditorDialog();this.htmlEditorDialog.show(this.originalTrainRunData.trainLining,"lining");};this.currentTrainUpdated=function()
{console.log("The current train was updated!");this.updateTrainView();};this.selectRecord=function(_record)
{this.currentTrainRecord=_record;if(this.currentTrain)
{this.currentTrain.un("updated",this.currentTrainUpdated,this);delete this.currentTrain;}
var train=diloc.rail.TrainManager.getTrainByExistingTrainRunId(_record.get('id'));if(train)
{this.currentTrain=train;this.currentTrain.on("updated",this.currentTrainUpdated,this);Ext.getCmp('trv_rtrgrid').showTrain(this.currentTrain);}
this.updateTrainView();this.messageGrid.filters.getFilter("trainRunId").setValue({eq:this.currentTrainRecord.data.id*1});this.messageGrid.filters.getFilter("trainRunId").setActive(true);};this.activate=function()
{console.log("changing to train-tab!");if(!this.messageGrid)
this.messageGrid=Ext.getCmp("trv_trmgrid");if(!this.trainRunTemplate)
{this.setupTemplate();}
this.deactivated=false;};this.moduleDeactivated=function()
{if(this.messageGrid)this.messageGrid.destroy();delete this.messageGrid;this.trainRunTemplate=null;this.deactivated=true;};this.generateTabItem=function()
{return{title:'Zug',layout:'border',frame:false,cls:'trvborderlayout',id:'trv-traintab',items:[{region:'west',width:200,html:'<div id="trv_trainview"></div>',split:true,autoScroll:true,border:false,collapseMode:'mini',collapsable:true,bodyStyle:'background-color:rgb(234,234,234)',id:'trv-train-west'},{region:'center',xtype:'tabpanel',activeItem:0,border:false,id:'trv-train-content',items:[{title:'Live-Fahrplan',xtype:'diloc-runningtrainroutegrid',id:'trv_rtrgrid',doAutoLoad:false,rights:this.rights},{title:'Zuglaufmeldungen',xtype:'diloc-messagegrid',id:'trv_trmgrid',mode:'trainrun',doAutoLoad:false,rights:this.rights}]}]};};this.constructor();};Ext.extend(diloc.dispositionplugins.Train,diloc.dispositionplugins.Base,{});

Ext.namespace("diloc","diloc.rail","diloc.rail.formfields");diloc.rail.formfields.TravelTimeField=Ext.extend(Ext.form.TimeField,{initComponent:function()
{return diloc.rail.formfields.TravelTimeField.superclass.initComponent.call(this);},setValue:function(_value)
{if(!this.departureField)
{var form=this.findParentByType("form").getForm();this.departureField=form.findField('departureTime');}
if(typeof _value=="string")
{return diloc.rail.formfields.TravelTimeField.superclass.setValue.call(this,_value);}
else if(typeof _value=="number")
{var departureDate=Date.parseDate(this.departureField.getValue(),"H:i");var arrivalDate=departureDate.add(Date.SECOND,_value);return diloc.rail.formfields.TravelTimeField.superclass.setValue.call(this,arrivalDate.format('H:i'));}},getSubmitValue:function()
{var departureDate=Date.parseDate(this.departureField.getValue(),"H:i");var arrivalDate=Date.parseDate(this.getValue(),"H:i");var timeDiff=(arrivalDate.getTime()-departureDate.getTime())/1000;if(timeDiff<0)
{arrivalDate=arrivalDate.add(Date.DAY,1);timeDiff=(arrivalDate.getTime()-departureDate.getTime())/1000;}
return timeDiff;}});Ext.ComponentMgr.registerType('diloctraveltimefield',diloc.rail.formfields.TravelTimeField);

Ext.namespace("diloc","diloc.rail","diloc.rail.formfields");diloc.rail.formfields.StationField=Ext.extend(Ext.form.TextField,{initComponent:function()
{this.on("render",this.initNameElement,this);this.on("change",this.valueChanged,this);this.on("specialkey",this.specialKey,this);return diloc.rail.formfields.StationField.superclass.initComponent.call(this);},specialKey:function(_field,_event)
{if(_event.getKey()==Ext.EventObject.RETURN)
{this.valueChanged(_field,this.getValue());}},initNameElement:function()
{if(!this.nameElement)
{this.nameElement=this.el.insertSibling({tag:'div',cls:'stationfield-name'},'after');}},valueChanged:function(_field,_newValue,_oldValue)
{if(_newValue=="")
{if(this.allowBlank==false)
{this.markInvalid("Dieses Feld darf nicht leer sein!");this.updateData("","error");}
else
{this.updateData("");this.clearInvalid();}
this.stationFound=false;}
else
{this.updateData("Suche...","loading");this.stationUpdater=new gwf.helpers.ActionExecutor({successSilent:true});this.stationUpdater.on("success",this.stationUpdateSuccess,this);this.stationUpdater.execute("station","getInfo",{idCode:_newValue});}},stationUpdateSuccess:function(_result)
{var data=_result.data;if(data.length>1)
{this.chooseData=data;for(var i=0;i<this.chooseData.length;i++)
{this.chooseData[i].text=this.chooseData[i].name+" ("+this.chooseData[i].railwaySystemName+")";}
this.chooseDialog=new diloc.rail.dialogs.Chooser({selectOptions:this.chooseData,title:'Station auswählen',description:'Es gibt mehrere Stationen mit dem Code \''+this.getValue()+'\'.<br/>Bitte wählen Sie eine der Folgenden aus:'});this.chooseDialog.on("optionChosen",this.optionChosen,this);this.chooseDialog.on("canceled",this.optionCanceled,this);this.chooseDialog.show();}
else if(data.length==0)
{this.updateData("Keine Station gefunden!","error");this.markInvalid("Station "+this.getValue()+" wurde nicht gefunden!");this.stationFound=false;}
else
{this.updateData(data[0],"ok");}},optionCanceled:function()
{this.nameElement.update("("+this.stationName+")");this.setValue(this.stationIdCode);},updateData:function(_data,_class)
{this.nameElement.removeClass("loading");this.nameElement.removeClass("ok");this.nameElement.removeClass("error");if(_class)this.nameElement.addClass(_class);if(_class&&_class!="error")
{this.clearInvalid();}
if(typeof _data=="string")
{this.nameElement.update(_data);}
else
{this.nameElement.update("("+_data.name+")");this.stationId=_data.id;this.stationName=_data.name;this.stationIdCode=_data.idCode;this.stationFound=true;}},optionChosen:function(_optionId)
{for(var i=0;i<this.chooseData.length;i++)
{if(this.chooseData[i].id==_optionId)
{this.updateData(this.chooseData[i],"ok");}}},setValue:function(_value)
{if(_value.indexOf("|")>0)
{var values=_value.split("|");this.stationId=values[0];this.stationIdCode=values[1];this.stationName=values[2];this.updateData("("+this.stationName+")");this.stationFound=true;return diloc.rail.formfields.StationField.superclass.setValue.call(this,this.stationIdCode);}
else
{diloc.rail.formfields.StationField.superclass.setValue.call(this,_value);}},validate:function()
{return this.stationFound;},getSubmitValue:function()
{return this.stationId;}});Ext.ComponentMgr.registerType('dilocstationfield',diloc.rail.formfields.StationField);console.log('dilocstationfield was registered!');

Ext.namespace("diloc","diloc.rail","diloc.rail.formfields");diloc.rail.formfields.GpsDeviceTypeField=Ext.extend(Ext.form.ComboBox,{editable:false,displayField:'name',valueField:'id',mode:'remote',width:130,loadingText:'Lade Typen...',forceSelection:true,triggerAction:'all',initComponent:function()
{this.store=new Ext.data.JsonStore({url:gwf.App.backendUrl("gpsdevicetype","list"),autoLoad:true,root:'data',totalProperty:'totalCount',fields:[{name:'id'},{name:'name'}]});this.store.on("load",this.storeLoaded,this);return diloc.rail.formfields.GpsDeviceTypeField.superclass.initComponent.call(this);},storeLoaded:function(store)
{console.log(store);},getSubmitValue:function()
{return this.getValue();}});Ext.ComponentMgr.registerType('dilocgpsdevicetypefield',diloc.rail.formfields.GpsDeviceTypeField);

Ext.namespace("diloc","diloc.rail","diloc.rail.formfields");diloc.rail.formfields.TrainGridTimeField=Ext.extend(Ext.form.TextField,{displayFormat:'H:i:s',dataFormat:'H:i:s',referenceFieldName:'',referenceFieldFormat:'H:i:s',grid:null,originalValue:null,getCurrentRecord:function()
{if(this.grid)
{return this.grid.currentEditorRecord;}
else return null;},setValue:function(_value)
{console.log("setValue",this);var record=this.getCurrentRecord();if(typeof _value=="string")
{this.originalValue=_value;if(_value&&_value.indexOf(":")>0)
{var valueDate=Date.parseDate(_value,this.dataFormat);return diloc.rail.formfields.TrainGridTimeField.superclass.setValue.call(this,valueDate.format(this.displayFormat));}
else return diloc.rail.formfields.TrainGridTimeField.superclass.setValue.call(this,_value);}
else if(typeof _value=="number"&&this.dataFormat=='s')
{this.originalValue=_value;return diloc.rail.formfields.TrainGridTimeField.superclass.setValue.call(this,Date.parseDate(record.get(this.referenceFieldName),this.referenceFieldFormat).add(Date.SECOND,_value).format(this.displayFormat));}
else return diloc.rail.formfields.TrainGridTimeField.superclass.setValue.call(this,_value);},getValue:function()
{var rawValue=this.getRawValue();var valueDate=null;if(rawValue.indexOf(':')<0)
{var formats=[null,"H","H",null,"Hi",null,"His"];if(formats[rawValue.length])valueDate=Date.parseDate(rawValue,formats[rawValue.length]);}
else
{if(rawValue.split(":").length==this.displayFormat.split(':').length-1)rawValue+=":00";else if(rawValue.split(":").length==this.displayFormat.split(':').length-2)rawValue+=":00:00";valueDate=Date.parseDate(rawValue,this.displayFormat);}
if(valueDate)
{if(this.referenceFieldName!=='')
{var record=this.getCurrentRecord();console.log("getValue in seconds!");var referenceDate=Date.parseDate(record.get(this.referenceFieldName),this.referenceFieldFormat);if(!referenceDate)return this.originalValue;var timeValue=valueDate.getTime();var timeDiff=(timeValue-referenceDate.getTime())/1000;if(timeDiff<0)
{timeDiff=(valueDate.add(Date.DAY,1).getTime()-referenceDate.getTime())/1000;}
console.log("TimeDiff-Value is: ",timeDiff);return timeDiff;}
else return valueDate.format(this.dataFormat);}
else
return this.originalValue;}});

Ext.namespace("diloc","diloc.rail","diloc.rail.formfields");diloc.rail.formfields.TrainRouteArrivalTimeField=Ext.extend(diloc.rail.formfields.TrainGridTimeField,{format:'H:i:s',altFormats:'H:i|His',initComponent:function()
{return diloc.rail.formfields.TrainRouteArrivalTimeField.superclass.initComponent.call(this);},setValue:function(_value)
{console.log("setValue("+_value+") called!");if(typeof _value=="string")
{return diloc.rail.formfields.TrainRouteArrivalTimeField.superclass.setValue.call(this,_value);}
else if(typeof _value=="number")
{this.nextGetValueIsBogus=true;this.originalValue=_value;return diloc.rail.formfields.TrainRouteArrivalTimeField.superclass.setValue.call(this,this.trainRouteGrid.trainDepartureTime.add(Date.SECOND,_value).format(this.format));}},getValue:function()
{console.log("getValue() called!");var arrivalDate=Date.parseDate(diloc.rail.formfields.TrainRouteArrivalTimeField.superclass.getValue.call(this),this.format);if(!arrivalDate)return this.originalValue;var timeDiff=(arrivalDate.getTime()-this.trainRouteGrid.trainDepartureTime.getTime())/1000;if(timeDiff<0)
{timeDiff=(arrivalDate.add(Date.DAY,1).getTime()-this.trainRouteGrid.trainDepartureTime.getTime())/1000;}
if(this.trainRouteGrid.currentTrainRecord.data.travelTime<=timeDiff)
{if(!this.nextGetValueIsBogus)
{Ext.MessageBox.alert("Hinweis","Die von Ihnen eingegebene Ankunftszeit ist später als die Ankunftszeit des Zuges am Zielbahnhof! Bitte überprüfen Sie die Werte.");this.nextGetValueIsBogus=true;}
else this.nextGetValueIsBogus=false;}
return timeDiff;}});

Ext.namespace("diloc","diloc.rail","diloc.rail.formfields");diloc.rail.formfields.TrainRouteDepartureTimeField=Ext.extend(diloc.rail.formfields.TrainGridTimeField,{increment:1,format:'H:i:s',altFormats:'H:i|His',initComponent:function()
{return diloc.rail.formfields.TrainRouteDepartureTimeField.superclass.initComponent.call(this);},setValue:function(_value)
{if(typeof _value=="string")
{return diloc.rail.formfields.TrainRouteDepartureTimeField.superclass.setValue.call(this,_value);}
else if(typeof _value=="number")
{this.nextGetValueIsBogus=true;this.originalValue=_value;return diloc.rail.formfields.TrainRouteDepartureTimeField.superclass.setValue.call(this,this.trainRouteGrid.trainDepartureTime.add(Date.SECOND,this.trainRouteGrid.currentEditorRecord.get('time')+_value).format(this.format));}},getValue:function()
{var departureDate=Date.parseDate(diloc.rail.formfields.TrainRouteDepartureTimeField.superclass.getValue.call(this),this.format);if(!departureDate)return this.originalValue;var timeDiff=(departureDate.getTime()-this.trainRouteGrid.trainDepartureTime.add(Date.SECOND,this.trainRouteGrid.currentEditorRecord.get('time')).getTime())/1000;if(timeDiff<0)
{timeDiff=(departureDate.add(Date.DAY,1).getTime()-this.trainRouteGrid.trainDepartureTime.add(Date.SECOND,this.trainRouteGrid.currentEditorRecord.get('time')).getTime())/1000;}
if(this.trainRouteGrid.currentTrainRecord.data.travelTime<=this.trainRouteGrid.currentEditorRecord.get('time')+timeDiff)
{if(!this.nextGetValueIsBogus)
{Ext.MessageBox.alert("Hinweis","Die von Ihnen eingegebene Abfahrtszeit ist später als die Ankunftszeit des Zuges am Zielbahnhof! Bitte überprüfen Sie die Werte.");this.nextGetValueIsBogus=true;}
else this.nextGetValueIsBogus=false;}
return timeDiff;}});

Ext.namespace("diloc","diloc.rail","diloc.rail.formfields");diloc.rail.formfields.TrainRouteTtTimeField=Ext.extend(diloc.rail.formfields.TrainGridTimeField,{format:'H:i:s',altFormats:'H:i|His',initComponent:function()
{return diloc.rail.formfields.TrainRouteTtTimeField.superclass.initComponent.call(this);},setValue:function(_value)
{console.log("setValue("+_value+") called!");if(typeof _value=="string")
{return diloc.rail.formfields.TrainRouteTtTimeField.superclass.setValue.call(this,_value);}
else if(typeof _value=="number")
{this.nextGetValueIsBogus=true;this.originalValue=_value;return diloc.rail.formfields.TrainRouteTtTimeField.superclass.setValue.call(this,this.trainRouteGrid.trainTtDepartureTime.add(Date.SECOND,_value).format(this.format));}
else return diloc.rail.formfields.TrainRouteTtTimeField.superclass.setValue.call(this,_value);},getValue:function()
{console.log("TrainRouteTtTimeField::getValue() called!",diloc.rail.formfields.TrainRouteTtTimeField.superclass.getRawValue.call(this));if(diloc.rail.formfields.TrainRouteTtTimeField.superclass.getRawValue.call(this)=="")return null;var arrivalDate=Date.parseDate(diloc.rail.formfields.TrainRouteTtTimeField.superclass.getValue.call(this),this.format);if(!arrivalDate)return this.originalValue;var timeDiff=(arrivalDate.getTime()-this.trainRouteGrid.trainTtDepartureTime.getTime())/1000;if(timeDiff<0)
{timeDiff=(arrivalDate.add(Date.DAY,1).getTime()-this.trainRouteGrid.trainTtDepartureTime.getTime())/1000;}
if(this.trainRouteGrid.currentTrainRecord.data.travelTime<=timeDiff)
{if(!this.nextGetValueIsBogus)
{Ext.MessageBox.alert("Hinweis","Die von Ihnen eingegebene Zeit ist später als die Ankunftszeit des Zuges am Zielbahnhof! Bitte überprüfen Sie die Werte.");this.nextGetValueIsBogus=true;}
else this.nextGetValueIsBogus=false;}
return timeDiff;}});

Ext.namespace("diloc","diloc.rail","diloc.rail.formfields");diloc.rail.formfields.GridStationField=Ext.extend(Ext.form.TextField,{parentGrid:null,fieldName:'',saveStationFunction:null,initComponent:function()
{this.addEvents("stationupdated");this.on("change",this.valueChanged,this);this.on("blur",function(){console.warn("BLUR");});return diloc.rail.formfields.GridStationField.superclass.initComponent.call(this);},initNameElement:function()
{if(!this.nameElement)
{this.nameElement=this.el.insertSibling({tag:'div',cls:'stationfield-name'},'after');}},valueChanged:function(_field,_newValue,_oldValue)
{console.log("value changed!",arguments);if(_newValue==""||_newValue==null)
{console.log("Changed to empty value???");}
else if(_newValue.indexOf("|")>0)
{console.log("YEAH, the user entered the same value twice, we pretend we got the data from the backend :-) :-)");this.updateData({id:_newValue.split("|")[0],idCode:_newValue.split("|")[1],name:_newValue.split("|")[2]},"ok");this.fireEvent("stationupdated",this.stationId,this.stationIdCode);if(this.parentGrid.changeToolbar)this.parentGrid.changeToolbar("trainrouteeditable");}
else
{this.stationIdCode=_newValue;this.updateData("Suche...","loading");this.stationUpdater=new gwf.helpers.ActionExecutor({successSilent:true});this.stationUpdater.on("success",this.stationUpdateSuccess,this);this.stationUpdater.execute("station","getInfo",{idCode:_newValue});}},stationUpdateSuccess:function(_result)
{var data=_result.data;if(data.length>1)
{this.chooseData=data;for(var i=0;i<this.chooseData.length;i++)
{this.chooseData[i].text=this.chooseData[i].name+" ("+this.chooseData[i].railwaySystemName+")";}
if(this.chooseDialog)
{this.chooseDialog.destroy();delete this.chooseDialog;}
this.chooseDialog=new diloc.rail.dialogs.Chooser({selectOptions:this.chooseData,title:'Station auswählen',description:'Es gibt mehrere Stationen mit dem Code \''+this.stationIdCode+'\'.<br/>Bitte wählen Sie eine der Folgenden aus:'});this.chooseDialog.on("optionChosen",this.optionChosen,this);this.chooseDialog.on("canceled",this.optionCanceled,this);this.chooseDialog.show();}
else if(data.length==0)
{this.updateData("Keine Station gefunden!","error");this.markInvalid("Station "+this.stationIdCode+" wurde nicht gefunden!");this.stationFound=false;if(this.parentGrid.changeToolbar)this.parentGrid.changeToolbar("trainrouteeditabledisabled");}
else
{this.updateData(data[0],"ok");this.fireEvent("stationupdated",this.stationId,this.stationIdCode);if(this.parentGrid.changeToolbar)this.parentGrid.changeToolbar("trainrouteeditable");}},optionCanceled:function()
{this.stationIdCode=this.valueBackup.split('|')[1];this.updateData(this.valueBackup.split('|')[2],'ok');console.info("currentEditorRecord.modified:",this.parentGrid.currentEditorRecord.modified);delete this.parentGrid.currentEditorRecord.modified[this.fieldName];this.parentGrid.getView().refreshRow(this.parentGrid.currentEditorRecord);if(gwf.util.isEmptyObject(this.parentGrid.currentEditorRecord.modified))
{this.parentGrid.currentEditorRecord.reject();}},setRecordValue:function(_value)
{this.parentGrid.currentEditorRecord.set(this.fieldName,this.stationId+"|"+this.stationIdCode+"|"+_value);},updateData:function(_data,_class)
{if(_class&&(_class=="error"||_class=="loading"))
{this.setRecordValue("__"+_class);}
else
{if(_class&&_class!="error")
{this.clearInvalid();}
if(typeof _data=="string"&&_class!="loading"&&_class!="error")
{this.setRecordValue(_data);}
else
{this.stationId=_data.id;this.stationName=_data.name;this.stationIdCode=_data.idCode;this.stationFound=true;this.setRecordValue(_data.name);if(this.saveStationFunction)this.saveStationFunction(this.stationId);}}},optionChosen:function(_optionId)
{for(var i=0;i<this.chooseData.length;i++)
{if(this.chooseData[i].id==_optionId)
{this.updateData(this.chooseData[i],"ok");this.fireEvent("stationupdated",this.stationId,this.stationIdCode);}}},getValue:function()
{var value=diloc.rail.formfields.GridStationField.superclass.getValue.call(this);console.log("## getValue() value:",value,"backup:",this.valueBackup);if(!value)return null;if(value==this.stationIdCode)return this.stationId+"|"+this.stationIdCode+"|"+this.stationName;else
{console.info("CASE?????????????????????????????????????????????????");return value;}},setValue:function(_value)
{if(_value===null)
{this.clearInvalid();return diloc.rail.formfields.GridStationField.superclass.setValue.call(this,"");}
console.info("## setValue() called!",arguments,this.valueBackup);if(_value=="_E_"||_value=="&nbsp;")
{this.valueBackup=_value;return diloc.rail.formfields.GridStationField.superclass.setValue.call(this,"");}
else if(_value.indexOf("|")>0)
{var values=_value.split("|");this.stationId=values[0];this.stationIdCode=values[1];this.stationName=values[2];this.stationFound=true;if(this.stationName=="__error")
{this.stationFound=false;this.markInvalid("Station "+this.stationIdCode+" wurde nicht gefunden!");}
else
{this.stationFound=true;this.clearInvalid();}
this.valueBackup=_value;if(values[1]=="_E_")
{return diloc.rail.formfields.GridStationField.superclass.setValue.call(this,"");}
return diloc.rail.formfields.GridStationField.superclass.setValue.call(this,this.stationIdCode);}
else
{if(_value!=this.valueBackup)
{console.log("Editor used for new record!",this.parentGrid.currentEditorRecord.get(this.nameFieldname));if(this.parentGrid.currentEditorRecord.get(this.nameFieldname)=="__error")
{this.stationFound=false;this.markInvalid("Station "+_value+" wurde nicht gefunden!");}
else
{this.stationFound=true;this.clearInvalid();}}
this.valueBackup=_value;return diloc.rail.formfields.GridStationField.superclass.setValue.call(this,_value);}},validate:function()
{return this.stationFound;},getSubmitValue:function()
{return this.stationId;}});

Ext.namespace("diloc","diloc.rail","diloc.rail.formfields");diloc.rail.formfields.DayCodeField=Ext.extend(Ext.form.TextField,{grid:'null',currentRecord:null,initComponent:function()
{this.on("change",this.valueChanged,this);return diloc.rail.formfields.DayCodeField.superclass.initComponent.call(this);},valueChanged:function(_field,_newValue,_oldValue)
{var begin=_newValue.substr(0,1)*1;var end=_newValue.substr(1,1)*1;var fieldNames=['blah','travelsMonday','travelsTuesday','travelsWednesday','travelsThursday','travelsFriday','travelsSaturday','travelsSunday'];console.info(begin,end);for(var i=1;i<9;i++)
{if(i<=end&&i>=begin)
{if(this.currentRecord.get(fieldNames[i])!=true)this.currentRecord.set(fieldNames[i],true);}
else
{if(this.currentRecord.get(fieldNames[i])!=false)this.currentRecord.set(fieldNames[i],false);}}},setValue:function(_value)
{this.currentRecord=this.grid.currentEditorRecord;diloc.rail.formfields.DayCodeField.superclass.setValue.call(this,_value);}});Ext.ComponentMgr.registerType('dilocdaycodefield',diloc.rail.formfields.DayCodeField);

Ext.namespace("diloc.rail.formfields");Ext.ux.form.Spinner.MinuteStrategy=function(config){Ext.ux.form.Spinner.MinuteStrategy.superclass.constructor.call(this,config);};Ext.extend(Ext.ux.form.Spinner.MinuteStrategy,Ext.ux.form.Spinner.Strategy,{defaultValue:0,spin:function(field,down,alternate){var v=field.getRawValue();var totalSeconds=this.defaultValue;var minutes=0;var seconds=0;if(v&&v!="")
{minutes=v.split(":")[0].substr(1)*1;seconds=v.split(":")[1]*1;if(isNaN(minutes))minutes=0;if(isNaN(seconds))seconds=0;totalSeconds=minutes*60+seconds;if(v.startsWith("-"))totalSeconds*=-1;}
if(down)
{if(alternate)
{totalSeconds--;}
else
totalSeconds-=60;}
else
{if(alternate)
{totalSeconds++;}
else
totalSeconds+=60;}
var value="";if(totalSeconds>0)value="+";if(totalSeconds<0)value="-";var minutes=Math.abs(Math.absfloor(totalSeconds/60));var seconds=Math.abs(Math.abs(totalSeconds)-minutes*60);if(minutes<10&&minutes>=0)minutes="0"+minutes;if(seconds<10&&seconds>=0)seconds="0"+seconds;value+=minutes+":"+seconds;field.setRawValue(value);},fixBoundries:function(date){var dt=date;var min=(typeof this.minValue=='string')?Date.parseDate(this.minValue,this.format):this.minValue;var max=(typeof this.maxValue=='string')?Date.parseDate(this.maxValue,this.format):this.maxValue;if(this.minValue!=undefined&&dt<min){dt=min;}
if(this.maxValue!=undefined&&dt>max){dt=max;}
return dt;}});diloc.rail.formfields.MinuteSpinner=function(config){diloc.rail.formfields.MinuteSpinner.superclass.constructor.call(this,config);}
Ext.extend(diloc.rail.formfields.MinuteSpinner,Ext.ux.form.Spinner,{strategy:new Ext.ux.form.Spinner.MinuteStrategy(),getSubmitValue:function()
{var v=this.getRawValue();var totalSeconds=0;if(v&&v!="")
{minutes=v.split(":")[0].substr(1)*1;seconds=v.split(":")[1]*1;if(isNaN(minutes))
minutes=0;if(isNaN(seconds))
seconds=0;totalSeconds=minutes*60+seconds;if(v.startsWith("-"))totalSeconds*=-1;return totalSeconds;}
return null;},setValue:function(_value)
{if(_value!=null)
{var totalSeconds=_value;var value="";if(totalSeconds>0)value="+";if(totalSeconds<0)value="-";var minutes=Math.abs(Math.absfloor(totalSeconds/60));var seconds=Math.abs(Math.abs(totalSeconds)-minutes*60);if(minutes<10&&minutes>=0)minutes="0"+minutes;if(seconds<10&&seconds>=0)seconds="0"+seconds;value+=minutes+":"+seconds;this.setRawValue(value);}}});Ext.reg('dilocminutespinner',diloc.rail.formfields.MinuteSpinner);

Ext.namespace("diloc.rail.formfields");diloc.rail.formfields.HtmlEditor=Ext.extend(Ext.form.HtmlEditor,{enableFormat:true,enableFontSize:false,enableColors:false,enableAlignments:false,enableLists:false,enableSourceEdit:false,enableLinks:false,enableFont:false,enableTemplates:true,editorBackground:null,actionMode:'wrap',validationEvent:false,deferHeight:true,initialized:false,activated:false,sourceEditMode:false,onFocus:Ext.emptyFn,iframePad:3,hideMode:'offsets',defaultAutoCreate:{tag:"textarea",style:"width:500px;height:300px;",autocomplete:"off"},initComponent:function(){if(this.enableTemplates)
{if(!this.templateGroup&&this.ownerCt.templateGroup)
{this.templateGroup=this.ownerCt.templateGroup;}
var templatePlugin=new diloc.rail.formfields.HtmlEditor.Template({group:this.templateGroup});if(Ext.isArray(this.plugins))this.plugins.push(templatePlugin);else this.plugins=[templatePlugin];}
if(!this.editorBackground&&this.ownerCt.editorBackground)
{this.editorBackground=this.ownerCt.editorBackground;}
diloc.rail.formfields.HtmlEditor.superclass.initComponent.call(this);},initEditor:function(){try{var dbody=this.getEditorBody(),ss=this.el.getStyles('font-size','font-family','background-image','background-repeat','background-color','color'),doc,fn;ss['background-attachment']='fixed';dbody.bgProperties='fixed';ss['font-family']='"Helvetica", "Arial", "sans-serif"';ss['font-size']='13px';if(this.editorBackground)
{ss['background-image']='url('+this.editorBackground+')';ss['background-repeat']='repeat-y';ss['background-attachment']='scroll';dbody.bgProperties='scroll';}
Ext.DomHelper.applyStyles(dbody,ss);doc=this.getDoc();if(doc){try{Ext.EventManager.removeAll(doc);}catch(e){}}
fn=this.onEditorEvent.createDelegate(this);Ext.EventManager.on(doc,{mousedown:fn,dblclick:fn,click:fn,keyup:fn,buffer:100});if(Ext.isGecko){Ext.EventManager.on(doc,'keypress',this.applyCommand,this);}
if(Ext.isIE||Ext.isWebKit||Ext.isOpera||Ext.isGecko){Ext.EventManager.on(doc,'keydown',this.fixKeys,this);}
doc.editorInitialized=true;this.initialized=true;this.pushValue();this.setReadOnly(this.readOnly);this.fireEvent('initialize',this);}catch(e){}},getDocMarkup:function(){var h=Ext.fly(this.iframe).getHeight()-this.iframePad*2;return String.format('<html><head><style type="text/css">body{line-height: 14px !important;  border: 0; margin: 0; padding: {0}px; height: {1}px; cursor: text} span.tab { white-space:pre; background-image:url("images/tab.png"); background-repeat:no-repeat  !important;} pre.tab { display: inline; font-family: "Helvetica", "Arial", "sans-serif"; font-size: 13px; background-image:url("images/tab.png"); background-repeat:no-repeat  !important; } p { margin-bottom: 0; }</style></head><body></body></html>',this.iframePad,h);},fixKeys:function(){if(Ext.isGecko){return function(e){var k=e.getKey(),doc=this.getDoc();if(k==e.TAB)
{e.stopEvent();this.win.focus();this.execCmd('InsertHTML','<span class="tab">\t</span>');this.deferFocus();}};}
if(Ext.isIE){return function(e){var k=e.getKey(),doc=this.getDoc(),r;if(k==e.TAB){e.stopEvent();r=doc.selection.createRange();if(r){r.collapse(true);r.pasteHTML('<pre class="tab">\t</pre>');this.deferFocus();}}else if(k==e.ENTER){r=doc.selection.createRange();if(r){var target=r.parentElement();if(!target||target.tagName.toLowerCase()!='li'){e.stopEvent();r.pasteHTML('<br />');r.collapse(false);r.select();}}}};}else if(Ext.isOpera){return function(e){var k=e.getKey();if(k==e.TAB){e.stopEvent();this.win.focus();this.execCmd('InsertHTML','<span class="tab">\t</span>');this.deferFocus();}};}else if(Ext.isWebKit){return function(e){var k=e.getKey();if(k==e.TAB){e.stopEvent();this.execCmd('InsertHTML','<span class="tab">\t</span>');this.deferFocus();}else if(k==e.ENTER){e.stopEvent();this.execCmd('InsertHtml','<br /><br />');this.deferFocus();}};}}()});Ext.reg('diloc-htmleditor',diloc.rail.formfields.HtmlEditor);

Ext.namespace("diloc","diloc.rail.stores");diloc.rail.stores.Station={};diloc.rail.stores.Station.init=function()
{diloc.rail.stores.Station.reader=new Ext.data.JsonReader({fields:[{name:'id'},{name:'trainNumber'},{name:'trainOrigin'},{name:'stationDbId'},{name:'stationName'},{name:'timestamp',type:'date',dateFormat:'Y-m-d h:i:s'},{name:'latenessType'},{name:'latenessAmount'},{name:'latenessCode'},{name:'infoText'},{name:'attachmentAvailable'}],root:'data',id:'id',totalProperty:'totalCount'});diloc.rail.stores.Station.store=new Ext.data.Store({reader:diloc.rail.stores.Station.reader,url:gwf.App.backendUrl("station","list"),autoLoad:true,storeId:'diloc.StationStore'});};

Ext.namespace("diloc","diloc.rail.stores");diloc.rail.stores.GpsDevice={};diloc.rail.stores.GpsDevice.init=function()
{diloc.rail.stores.GpsDevice.reader=new Ext.data.JsonReader({fields:[{name:'id'},{name:'name'},{name:'latitude'},{name:'longitude'},{name:'idCode'},{name:'currentTrainId'},{name:'train'}],root:'data',id:'id',totalProperty:'totalCount'});var storeConfig={reader:diloc.rail.stores.GpsDevice.reader,url:gwf.App.backendUrl("gpsdevice","listUnbinded"),autoLoad:true};diloc.rail.stores.GpsDevice.store=new Ext.data.Store(storeConfig);return diloc.rail.stores.GpsDevice.store;};

Ext.namespace("diloc","diloc.rail.stores");diloc.rail.stores.TrainRuns={};diloc.rail.stores.TrainRuns.init=function()
{diloc.rail.stores.TrainRuns.reader=new Ext.data.ArrayReader({fields:[{name:'id'},{name:'status'},{name:'trainComment'},{name:'trainLining'},{name:'train.number',sortType:Ext.data.SortTypes.asFloat},{name:'train.departureStation'},{name:'train.arrivalStation'},{name:'date',type:'date',dateFormat:'m/d/y'},{name:'lastTrainRunMessage.stationIdCode'},{name:'lastTrainRunMessage.stationName'},{name:'lastTrainRunMessage.timestamp',type:'date',dateFormat:'Y-m-d h:i:s'},{name:'lastTrainRunMessage.latenessType'},{name:'lastTrainRunMessage.latenessAmount'},{name:'lastTrainRunMessage.latenessCode'},{name:'lastTrainRunMessage.infoText'},{name:'lastTrainRunMessage.attachmentAvailable'},{name:'lastTrainRunMessage.type'},{name:'trainLat'},{name:'trainLong'}],root:'data',idIndex:0,totalProperty:'totalCount'});var sortInfo=null;var trainRunGridState=Ext.state.Manager.get("trv_trainrungrid",{});if(trainRunGridState.sort)sortInfo=trainRunGridState.sort;var storeConfig={reader:diloc.rail.stores.TrainRuns.reader,remoteSort:false,fields:[{name:'id'},{name:'status'},{name:'trainComment'},{name:'trainLining'},{name:'train.number',sortType:Ext.data.SortTypes.asFloat},{name:'train.departureStation'},{name:'train.arrivalStation'},{name:'lastTrainRunMessage.stationIdCode'},{name:'lastTrainRunMessage.stationName'},{name:'lastTrainRunMessage.timestamp',type:'date',dateFormat:'Y-m-d h:i:s'},{name:'lastTrainRunMessage.latenessType'},{name:'lastTrainRunMessage.latenessAmount'},{name:'lastTrainRunMessage.latenessCode'},{name:'lastTrainRunMessage.infoText'},{name:'lastTrainRunMessage.attachmentAvailable'},{name:'lastTrainRunMessage.type'},{name:'trainLat'},{name:'trainLong'}],destroy:Ext.emptyFn};if(sortInfo)storeConfig.sortInfo=sortInfo;diloc.rail.stores.TrainRuns.store=new Ext.data.GroupingStore(storeConfig);diloc.rail.TrainManager.supplyTrainRunsStore(diloc.rail.stores.TrainRuns.store);return diloc.rail.stores.TrainRuns.store;};

Ext.namespace("diloc","diloc.rail.stores");diloc.rail.stores.ImportantStations={};diloc.rail.stores.ImportantStations.init=function()
{diloc.rail.stores.ImportantStations.reader=new Ext.data.JsonReader({fields:[{name:'id'},{name:'text'}],root:'data',id:'id',totalProperty:'totalCount'});var storeConfig={reader:diloc.rail.stores.ImportantStations.reader,url:gwf.App.backendUrl("station","listImportant"),remoteSort:false,autoLoad:{params:{limit:10,start:0},autoRefresh:true},destroy:Ext.emptyFn};diloc.rail.stores.ImportantStations.store=new Ext.data.Store(storeConfig);var storePlugin=new gwf.plugins.StoreBackgroundJobs("wichtige Stationen");storePlugin.init(diloc.rail.stores.ImportantStations.store);return diloc.rail.stores.ImportantStations.store;};

Ext.namespace("diloc","diloc.rail.stores");diloc.rail.stores.StationTrainAttributes={};diloc.rail.stores.StationTrainAttributes.init=function()
{diloc.rail.stores.StationTrainAttributes.store=new Ext.data.JsonStore({url:gwf.App.backendUrl("stationtrainattribute","list"),root:'data',fields:['id','idCode'],storeId:'trainAttributeStore'});diloc.rail.stores.StationTrainAttributes.store.load({callback:function(_records,_options,_success){this.insert(0,[new this.recordType({id:"null",idCode:"-"})]);}});var storePlugin=new gwf.plugins.StoreBackgroundJobs("Zugmerkmale");storePlugin.init(diloc.rail.stores.StationTrainAttributes.store);return diloc.rail.stores.StationTrainAttributes.store;};

Ext.namespace("diloc");diloc._StoreManager=function()
{this.storeCollection=new Ext.util.MixedCollection();this.updatesEnabled=true;this.stopUpdates=function()
{this.updatesEnabled=false;};this._addStore=function(_storeName,_createFn,_updateInterval)
{var newStore=_createFn();if(_updateInterval)
{newStore.numberOfFailedLoads=0;newStore.on("load",this._checkUpdateStore.createDelegate(this,[_updateInterval*1000],0));newStore.on("loadexception",this._checkUpdateStoreException.createDelegate(this,[_updateInterval*2*1000,newStore],0));}
this.storeCollection.add(_storeName,newStore);return newStore;};this._checkUpdateStore=function(_time,_store)
{if(_store.numberOfFailedLoads>0)
{_store.numberOfFailedLoads=0;if(_store.failedLoadErrorShown)gwf.App.msg("Hinweis","Das aktualisieren der Daten funktioniert wieder.<br/>Sie sehen wieder aktuelle Daten.",3);_store.failedLoadErrorShown=false;}
this._updateStore.defer(_time,this,[_store],0);};this._checkUpdateStoreException=function(_time,_store)
{_store.numberOfFailedLoads+=1;if(_store.numberOfFailedLoads<3)this._updateStore.defer(_time,this,[_store],0);else
{gwf.App.errorMsg('Fehler','Beim aktualisieren der Daten sind mehrfach Fehler aufgetreten.<br/>Die Daten die Sie sehen sind möglicherweise veraltet.<br/>Bitte überprüfen Sie die Verbindung zum Server!');_store.numberOfFailedLoads=1;_store.failedLoadErrorShown=true;this._updateStore.defer(_time,this,[_store],0);}};this._updateStore=function(_store)
{if(this.updatesEnabled==true)
{_store.load(_store);}};this.get=function(_storeName)
{if(this.storeCollection.containsKey(_storeName))return this.storeCollection.get(_storeName);else
{if(_storeName=="GpsDeviceStore")return this._addStore(_storeName,diloc.rail.stores.GpsDevice.init,60);else if(_storeName=="TrainRunStore")return this._addStore(_storeName,diloc.rail.stores.TrainRuns.init);else if(_storeName=="ImportantStations")return this._addStore(_storeName,diloc.rail.stores.ImportantStations.init);else if(_storeName=="StationTrainAttributes")return this._addStore(_storeName,diloc.rail.stores.StationTrainAttributes.init);else return null;}};};diloc.StoreManager=new diloc._StoreManager();

Ext.namespace("diloc.rail.buttons");diloc.rail.buttons.ExportButton=Ext.extend(Ext.Button,{text:'Exportieren',iconCls:'button-export',initComponent:function()
{if(!this.store)alert("You have to pass a store as config option to ExportButton!");var menuItems=[{text:'Tabelle in Excel-Format',iconCls:'button-export-excel',handler:this.excel8Export,scope:this},{text:'Tabelle in CSV-Format',iconCls:'button-export-csv',handler:this.csvExport,scope:this},{text:'Tabelle in XML-Format',iconCls:'button-export-xml',handler:this.xmlExport,scope:this}];if(this.includeTrmPdf){menuItems.push({text:'Anhänge & Statistiken als PDF',iconCls:'button-export-pdf',handler:this.pdfExport,scope:this});}
this.menu=new Ext.menu.Menu({items:menuItems});if(this.store.getTotalCount()==0)
{this.disabled=true;}
this.store.on("load",this.storeLoad,this);},storeLoad:function()
{if(this.store.getTotalCount()==0)
{this.disable();}
else this.enable();},excel8Export:function()
{if(this.store.getTotalCount()>65534)
{Ext.Msg.show({title:'Save Changes?',msg:'Excel 97-2003 Unterstützt keine Dateien mit mehr als 65536 Zeilen. Möchten sie stattdessen in CSV exportieren?',buttons:Ext.Msg.YESNOCANCEL,fn:this.processQuestion,icon:Ext.MessageBox.QUESTION,scope:this});}
else gwf.App.startExport("excel8",this.store);},csvExport:function()
{gwf.App.startExport("csv",this.store);},xmlExport:function()
{gwf.App.startExport("xml",this.store);},pdfExport:function()
{gwf.App.startExport("pdf",this.store,{additionalExportData:'stats'});},processQuestion:function(btn,text)
{if(btn=='yes')
{this.csvExport();}}});

InformationFormUi=Ext.extend(Ext.form.FormPanel,{width:550,layout:'form',padding:10,labelWidth:80,initComponent:function(){this.items=[{xtype:'compositefield',fieldLabel:'Gültigkeit',anchor:'100%',items:[{xtype:'displayfield',value:'Von',flex:1,submitValue:false,width:30,fieldLabel:'Label'},{xtype:'datefield',flex:1,name:'validFrom',width:100,ref:'../validFromInput'},{xtype:'displayfield',value:'Bis',flex:1,submitValue:false,width:30,fieldLabel:'Label'},{xtype:'datefield',flex:1,fieldLabel:'Label',name:'validTo',width:100,ref:'../validToInput'}]},{xtype:'compositefield',fieldLabel:'Text',anchor:'100%',items:[{xtype:'displayfield',fieldLabel:'Label',flex:1,submitValue:false},{xtype:'displayfield',submitValue:false,value:'Referenz:',fieldLabel:'Label'},{xtype:'textfield',flex:1,fieldLabel:'Label',name:'reference',width:100}]},{anchor:'100%, -80',fieldLabel:'Label',hideLabel:true,name:'text',ref:'htmlField',xtype:'diloc-htmleditor'},{xtype:'numberfield',fieldLabel:'Wichtigkeit',name:'importance',width:150,allowNegative:false,ref:'importanceField'}];InformationFormUi.superclass.initComponent.call(this);}});

InformationForm=Ext.extend(InformationFormUi,{initComponent:function(){this.templateGroup='di_generalinformation';this.editorBackground='images/htmleditor-bg-generaldispositioninformation.png';this.plugins=[new diloc.rail.plugins.AutoFormPanelMask()];InformationForm.superclass.initComponent.call(this);this.importanceField.replaceWith({xtype:'uxspinner',strategy:new Ext.ux.form.Spinner.NumberStrategy({allowDecimals:false})});if(this.ownerCt.currentDate&&(this.validFromInput.getValue()==''))this.validFromInput.setValue(this.ownerCt.currentDate);this.validFromInput.on("select",this.onValidFromSelected,this);this.validToInput.on("select",this.onValidToSelected,this);this.on("afterrender",this.onValidFromSelected,this);this.on("afterrender",this.onValidToSelected,this);},onValidFromSelected:function()
{if(this.validToInput.getValue()=='')
{this.validToInput.setValue(this.validFromInput.getValue());}
this.validToInput.setMinValue(this.validFromInput.getValue());},onValidToSelected:function()
{this.validFromInput.setMaxValue(this.validToInput.getValue());}});Ext.reg('diloc-di-dispositioninformation-form',InformationForm);

OrderFormUi=Ext.extend(Ext.form.FormPanel,{border:false,padding:10,initComponent:function(){this.items=[{xtype:'compositefield',fieldLabel:'Gültigkeit',anchor:'100%',items:[{xtype:'displayfield',value:'Von',flex:1,fieldLabel:'Label',submitValue:false,width:30},{xtype:'datefield',flex:1,fieldLabel:'Von',name:'validFrom',altFormats:'m/d/y',width:100,ref:'../validFromInput'},{xtype:'displayfield',value:'Bis',flex:1,fieldLabel:'Label',submitValue:false,width:30},{xtype:'datefield',flex:1,fieldLabel:'Label',name:'validTo',altFormats:'m/d/y',width:100,ref:'../validToInput'}]},{xtype:'compositefield',fieldLabel:'Zeitbereich',anchor:'100%',items:[{xtype:'displayfield',value:'Von',flex:1,fieldLabel:'Label',submitValue:false,width:30},{xtype:'timefield',flex:1,fieldLabel:'Label',name:'beginTime',altFormats:'H:i:s',width:100},{xtype:'displayfield',value:'Bis',flex:1,fieldLabel:'Label',submitValue:false,width:30},{xtype:'timefield',flex:1,fieldLabel:'Label',name:'endTime',altFormats:'H:i:s',width:100},{xtype:'checkbox',boxLabel:'Auch am Ende Anzeigen',name:'showAtEndTime',flex:1}]},{xtype:'compositefield',fieldLabel:'Text',anchor:'100%',items:[{xtype:'displayfield',fieldLabel:'Label',submitValue:false,flex:1},{xtype:'displayfield',value:'Referenz:',fieldLabel:'Label',submitValue:false},{xtype:'textfield',name:'reference',fieldLabel:'Referenz'}]},{anchor:'100%, -85',name:'text',hideLabel:true,xtype:'diloc-htmleditor'}];OrderFormUi.superclass.initComponent.call(this);}});

OrderForm=Ext.extend(OrderFormUi,{initComponent:function(){this.templateGroup='di_order';this.editorBackground='images/htmleditor-bg-generaldispositioninformation.png';this.plugins=[new gwf.plugins.OOSubmit(),new diloc.rail.plugins.AutoFormPanelMask()];OrderForm.superclass.initComponent.call(this);if(this.ownerCt.currentDate&&(this.validFromInput.getValue()==''))this.validFromInput.setValue(this.ownerCt.currentDate);this.validFromInput.on("select",this.onValidFromSelected,this);this.validToInput.on("select",this.onValidToSelected,this);this.on("afterrender",this.onValidFromSelected,this);this.on("afterrender",this.onValidToSelected,this);},onValidFromSelected:function()
{if(this.validToInput.getValue()=='')
{this.validToInput.setValue(this.validFromInput.getValue());}
this.validToInput.setMinValue(this.validFromInput.getValue());},onValidToSelected:function()
{this.validFromInput.setMaxValue(this.validToInput.getValue());}});Ext.reg('diloc-di-dispositionorder-form',OrderForm);

TrainOrderFormUi=Ext.extend(Ext.form.FormPanel,{padding:10,initComponent:function(){this.items=[{xtype:'compositefield',fieldLabel:'Bemerkung',anchor:'100%',items:[{xtype:'displayfield',flex:1,fieldLabel:'Label',submitValue:false},{xtype:'displayfield',value:'Referenz:',fieldLabel:'Label',submitValue:false},{xtype:'textfield',name:'reference',autoWidth:true}]},{anchor:'100%, -60',hideLabel:true,name:'comment',height:200,xtype:'diloc-htmleditor'},{xtype:'checkbox',fieldLabel:'Anzeigen',anchor:'100%',name:'showAtDate',ref:'showAtDate'}];TrainOrderFormUi.superclass.initComponent.call(this);}});

TrainOrderForm=Ext.extend(TrainOrderFormUi,{initComponent:function(){this.templateGroup='train_comment';this.editorBackground='images/htmleditor-bg-traininformation.png';this.plugins=[new diloc.rail.plugins.AutoFormPanelMask()];TrainOrderForm.superclass.initComponent.call(this);this.initPlugin(new gwf.plugins.OOSubmit());var showAtDateValue=this.ownerCt.trainRecord.get('displayInDispositionInformationValue');if(Ext.isArray(showAtDateValue))
{this.showAtDate.replaceWith({xtype:'checkboxgroup',fieldLabel:'Anzeigen',name:'showAtDate',items:[{boxLabel:'Mo',name:'showAtDate1'},{boxLabel:'Di',name:'showAtDate2'},{boxLabel:'Mi',name:'showAtDate3'},{boxLabel:'Do',name:'showAtDate4'},{boxLabel:'Fr',name:'showAtDate5'},{boxLabel:'Sa',name:'showAtDate6'},{boxLabel:'So',name:'showAtDate7'}],getSubmitValue:function()
{var submitValue="[";this.items.each(function(_field){if(!_field.getValue())submitValue+='0';else submitValue+='1';if(_field.name=='showAtDate7')submitValue+=']';else submitValue+=',';});return submitValue;}});}
this.showAtDate.setValue(showAtDateValue);}});Ext.reg('diloc-di-trainorder-form',TrainOrderForm);

InformationWindowUi=Ext.extend(Ext.Window,{title:'Allgemeine Informationen hinzufügen',width:500,height:478,layout:'fit',hideBorders:true,initComponent:function(){this.items=[{width:747,ref:'informationForm',xtype:'diloc-di-dispositioninformation-form'}];this.fbar={xtype:'toolbar',items:[{xtype:'button',text:'Speichern',ref:'../saveButton'},{xtype:'button',text:'Abbrechen',ref:'../cancelButton'}]};InformationWindowUi.superclass.initComponent.call(this);}});

Ext.ns("diloc.rail.dialogs");diloc.rail.dialogs.InformationWindow=Ext.extend(InformationWindowUi,{rights:{read:true,write:false,create:false},informationRecord:null,currentDate:null,stateId:'di-informationwindow',initComponent:function(){this.addEvents('savedsuccessfully');diloc.rail.dialogs.InformationWindow.superclass.initComponent.call(this);if(this.informationRecord)this.informationForm.getForm().loadRecord(this.informationRecord);this.saveButton.on("click",this.onSaveButtonClicked,this);this.cancelButton.on("click",function(){this.close();},this);},onSaveButtonClicked:function()
{if(this.informationRecord&&this.rights.write)
{var url=gwf.App.backendUrl("generaldispositioninformation","update",{id:this.informationRecord.get('id')});var params={};}
else if(this.rights.write&&this.rights.create)
{var url=gwf.App.backendUrl("generaldispositioninformation","create",{});var params={customerId:diloc.User.customerId()};}
if(url)
{this.informationForm.getForm().submit({url:url,params:params,success:this.onFormSubmitSuccess,scope:this});}},onFormSubmitSuccess:function(_form,_action)
{this.fireEvent('savedsuccessfully',_form,_action,this);this.close();}});

DirectiveWindowUi=Ext.extend(Ext.Window,{title:'Neue Anordnung hinzufügen',width:556,height:528,layout:'fit',labelWidth:150,initComponent:function(){this.items=[{ref:'orderForm',xtype:'diloc-di-dispositionorder-form'}];this.fbar={xtype:'toolbar',items:[{xtype:'button',text:'Speichern',ref:'../saveButton'},{xtype:'button',text:'Abbrechen',ref:'../cancelButton'}]};DirectiveWindowUi.superclass.initComponent.call(this);}});

Ext.ns("diloc.rail.dialogs");diloc.rail.dialogs.DirectiveWindow=Ext.extend(DirectiveWindowUi,{rights:{read:true,write:false,create:false},orderRecordId:null,currentDate:null,stateId:'di-directivewindow',initComponent:function()
{this.addEvents('savedsuccessfully');diloc.rail.dialogs.DirectiveWindow.superclass.initComponent.call(this);this.saveButton.on("click",this.onSaveButtonClicked,this);this.cancelButton.on("click",function(){this.close();},this);this.on('show',this.onWindowShow,this);},onWindowShow:function()
{if(this.orderRecordId)
{this.orderForm.getForm().load({url:gwf.App.backendUrl('dispositionorder','get',{id:this.orderRecordId})});}},onSaveButtonClicked:function()
{if(this.orderRecordId&&this.rights.write)
{var url=gwf.App.backendUrl("dispositionorder","update",{id:this.orderRecordId});var params={};}
else if(this.rights.write&&this.rights.create)
{var url=gwf.App.backendUrl("dispositionorder","create",{});var params={customerId:diloc.User.customerId()};}
if(url)
{this.orderForm.getForm().submit({url:url,params:params,success:this.onFormSubmitSuccess,scope:this});}},onFormSubmitSuccess:function(_form,_action){this.fireEvent('savedsuccessfully');this.close();}});

LinkWindowUi=Ext.extend(Ext.Window,{title:'Anordnung nochmal darstellen',width:375,height:141,layout:'fit',hideBorders:true,initComponent:function(){this.items=[{xtype:'form',padding:10,ref:'form',items:[{xtype:'timefield',fieldLabel:'Uhrzeit',anchor:'100%',name:'timestamp'},{xtype:'checkbox',boxLabel:'An allen Tagen der Gültigkeit um diese Uhrzeit darstellen',anchor:'100%',hideLabel:true,labelStyle:'right',name:'allDays'}]}];this.fbar={xtype:'toolbar',items:[{xtype:'button',text:'Ok',ref:'../saveButton'},{xtype:'button',text:'Abbrechen',ref:'../cancelButton'}]};LinkWindowUi.superclass.initComponent.call(this);}});

Ext.ns("diloc.rail.dialogs");diloc.rail.dialogs.LinkWindow=Ext.extend(LinkWindowUi,{rights:{read:true,write:false,create:false},dispositionOrderId:null,trainId:null,currentDate:null,preselectedTime:null,initComponent:function(){this.addEvents('savedsuccessfully');diloc.rail.dialogs.LinkWindow.superclass.initComponent.call(this);this.form.initPlugin(new gwf.plugins.OOSubmit());var timestampField=this.form.getForm().findField("timestamp");var currentDate=this.currentDate;if(timestampField)
{timestampField.getSubmitValue=function()
{var returnDate=Date.parseDate(currentDate.format("Y-m-d")+' '+timestampField.getValue(),'Y-m-d H:i');return returnDate.format('U');};if(this.preselectedTime!=null)
{timestampField.setValue(this.preselectedTime);this.on('show',function(){timestampField.focus(true,100);});}}
this.saveButton.on("click",this.onSaveButtonClicked,this);this.cancelButton.on("click",function(){this.close();},this);},onSaveButtonClicked:function(){if(this.dispositionOrderId&&this.rights.write&&this.rights.create)
{var url=gwf.App.backendUrl("dispositionorder","createInstance",{});var params={dispositionOrderId:this.dispositionOrderId};}
else if(this.trainId&&this.rights.write&&this.rights.create)
{var url=gwf.App.backendUrl("dispositionorder","createTrainInstance",{});var params={trainId:this.trainId};}
if(url)
{this.form.getForm().submit({url:url,params:params,success:this.onFormSubmitSuccess,scope:this});}},onFormSubmitSuccess:function(_form,_action){this.fireEvent('savedsuccessfully',_action);this.close();}});

TrainOrderWindowUi=Ext.extend(Ext.Window,{title:'Zug bearbeiten',width:500,height:315,layout:'fit',hideBorders:true,initComponent:function(){this.items=[{ref:'trainOrderForm',xtype:'diloc-di-trainorder-form'}];this.fbar={xtype:'toolbar',items:[{xtype:'button',text:'Ok',ref:'../saveButton'},{xtype:'button',text:'Abbrechen',ref:'../cancelButton'}]};TrainOrderWindowUi.superclass.initComponent.call(this);}});

Ext.ns("diloc.rail.dialogs");diloc.rail.dialogs.TrainOrderWindow=Ext.extend(TrainOrderWindowUi,{rights:{read:true,write:false,create:false},trainRecord:null,currentDate:null,stateId:'di-trainorderwindow',initComponent:function(){this.addEvents('savedsuccessfully');diloc.rail.dialogs.TrainOrderWindow.superclass.initComponent.call(this);if(this.trainRecord)this.trainOrderForm.getForm().loadRecord(this.trainRecord);this.saveButton.on("click",this.onSaveButtonClicked,this);this.cancelButton.on("click",function(){this.close();},this);},onSaveButtonClicked:function()
{if(this.rights.write)
{var url=gwf.App.backendUrl("dispositionorder","updateTrain",{id:this.trainRecord.get('trainId')});this.trainOrderForm.getForm().submit({url:url,params:{date:this.currentDate.format("Y-m-d")},success:this.onFormSubmitSuccess,scope:this});}},onFormSubmitSuccess:function(_form,_action){this.fireEvent('savedsuccessfully');this.close();}});

MessageBoxUi=Ext.extend(Ext.Window,{title:'Message-Box',width:400,height:200,buttonAlign:'center',border:false,plain:true,padding:10,layout:'fit',autoHeight:true,cls:'x-window-dlg',modal:true,initComponent:function(){this.items=[{xtype:'container',tpl:['<img src="{blankImage}" class="{iconClass}" style="float:left; width:32px; height:32px; margin-right:10px; margin-bottom:10px;"/>{text}'],data:{text:"This is the text. It is very long and even has some <br/> newlines in it. WE also use some <b>bold</b> text to denote something that is important. I will enter some more text now so that the box is resized."},height:53,autoHeight:true,ref:'textPanel'},{xtype:'checkbox',boxLabel:'Diese Meldung nicht mehr zeigen',height:30,autoHeight:true,style:'margin-top:15px;',ref:'checkbox'}];MessageBoxUi.superclass.initComponent.call(this);}});

Ext.ns("diloc.rail.dialogs");diloc.rail.dialogs.MessageBox=Ext.extend(MessageBoxUi,{initComponent:function(){diloc.rail.dialogs.MessageBox.superclass.initComponent.call(this);},afterRender:function()
{diloc.rail.dialogs.MessageBox.superclass.afterRender.call(this);console.log("Afterrender");this.textPanel.update({text:this.options.text,iconClass:this.options.icon,blankImage:Ext.BLANK_IMAGE_URL});}});diloc.rail.MessageBox={};diloc.rail.MessageBox.show=function(_options)
{var state=Ext.state.Manager.get('diloc-msg-'+_options.id,false);if(state==true)
{if(_options.okScope)
{_options.okHandler.apply(_options.okScope,['ok',null]);}
else _options.okHandler('ok');return;}
var okHandler=function(_buttonId,_button)
{if(this.dialog.checkbox.checked==true)
{Ext.state.Manager.set('diloc-msg-'+_options.id,true);}
if(_options.okHandler)
{if(_options.okScope)
{_options.okHandler.apply(_options.okScope);}
else _options.okHandler();}
else
{if(_options.scope)
{_options.handler.apply(_options.scope,[_buttonId,_button]);}
else if(_options.handler)_options.handler(_buttonId,_button);}
this.dialog.close();};var abortHandler=function(_buttonId,_button)
{if(_options.handler)
{if(_options.scope)
{_options.handler.apply(_options.scope,[_buttonId,_button]);}
else _options.handler(_buttonId,_button);}
this.dialog.close();};var dialogConfig={fbar:{xtype:'toolbar',items:[]}};if(_options.buttons["ok"])
{dialogConfig.fbar.items.push({xtype:'button',text:'Ok',handler:okHandler.createDelegate(this,['ok'],0)});}
if(_options.buttons["yes"])
{dialogConfig.fbar.items.push({xtype:'button',text:'Ja',handler:okHandler.createDelegate(this,['yes'],0)});}
if(_options.buttons["no"])
{dialogConfig.fbar.items.push({xtype:'button',text:'Nein',handler:abortHandler.createDelegate(this,['no'],0)});}
if(_options.buttons["cancel"])
{dialogConfig.fbar.items.push({xtype:'button',text:'Abbrechen',handler:abortHandler.createDelegate(this,['cancel'],0)});}
dialogConfig.options=_options;dialogConfig.title=_options.title;this.dialog=new diloc.rail.dialogs.MessageBox(dialogConfig);this.dialog.show();};

Ext.namespace("diloc","diloc.rail","diloc.rail.dialogs");diloc.rail.dialogs.TrainRunMessageAttachment=function(_readOnly)
{this.loadAttachmentOnFormItemsComplete=false;this.enableDirtyChecks=true;this.readOnly=false;if(typeof _readOnly!="undefined")this.readOnly=_readOnly;this.construct=function()
{this.addEvents('attachmentstatechanged');this.dialog=new Ext.Window({title:'Anhang zur Zuglaufmeldung',width:460,height:370,closeAction:'hide',bodyBorder:false,stateId:'trmAttachmentDialog',layout:'fit'});if(!this.readOnly)
{this.saveButton=this.dialog.addButton({text:'Ok',handler:this.saveAttachment,scope:this});}
var closeText="Abbrechen";if(this.readOnly)closeText="Schließen";this.closeButton=this.dialog.addButton({text:closeText,handler:this.hide,scope:this});var e=new gwf.helpers.ActionExecutor({successSilent:true});e.on("success",this.formItemsLoaded,this);e.execute("trainrunmessageattachment","formItems");};this.formItemsLoaded=function(_data)
{var formItems=_data.data;console.log(formItems);this.formPanel=new Ext.form.FormPanel({items:formItems,labelWidth:150,trackResetOnLoad:true,labelAlign:'top',url:gwf.App.backendUrl('trainrunmessageattachment',"update"),defaults:{readOnly:this.readOnly},width:450,bodyStyle:'padding:15px;',defaultType:'textfield',plugins:[new gwf.plugins.FormClear()]});this.formPanel.on("actioncomplete",this.onFormPanelActionComplete,this);this.formPanel.on("actionfailed",this.onFormPanelActionFailed,this);this.dialog.add(this.formPanel);this.dialog.doLayout();if(this.loadAttachmentOnFormItemsComplete==true)
{this.loadCurrentAttachment();console.log(this.formPanel.buttons);if(this.saveButton)this.saveButton.disable();}};this.loadCurrentAttachment=function()
{this.formPanel.getEl().mask("Lade Anhang...");this.formPanel.load({url:gwf.App.backendUrl("trainrunmessageattachment","get",{id:this.currentAttachmentId}),params:{something:'nothing',ignoreNoObjectError:true}});};this.saveAttachment=function()
{if(this.formPanel.getForm().findField("comment").getValue()==""&&this.formPanel.getForm().findField("latenessCode").getValue()=="")
{this.formPanel.getEl().mask("Lösche Anhang...");}
else
{this.formPanel.getEl().mask("Speichere Anhang...");}
this.formPanel.getForm().submit({url:gwf.App.backendUrl("trainrunmessageattachment","update",{id:this.currentAttachmentId}),success:this.onSaveAttachmentSuccess,scope:this});};this.onFormPanelActionComplete=function(_form,_action)
{if(_action.type=="submit")
{var tmpRecord=new Ext.data.Record(_action.result.data);this.formPanel.getForm().loadRecord(tmpRecord);this.saveButton.disable();this.saveButton.getEl().dom.getElementsByTagName('button')[0].blur();var record=this.currentRecord;if(record)
{if(tmpRecord.get('latenessCode')==''&&tmpRecord.get('comment')=='')
{record.set(this.currentValueName,false);this.fireEvent('attachmentstatechanged',this.currentAttachmentId,false);}
else
{if(record.get(this.currentValueName)==false)
{record.set(this.currentValueName,true);this.fireEvent('attachmentstatechanged',this.currentAttachmentId,true);}}
record.commit();}
this.hide();}
if(_action.type=="load")
{if(this.saveButton)this.saveButton.disable();}
this.formPanel.getEl().unmask();};this.onFormPanelActionFailed=function(_form,_action)
{this.formPanel.getEl().unmask();if(_action.failureType=="load")
{this.formPanel.clear();}};this.checkFormDirty=function()
{if(this.formPanel)
{if(this.formPanel.getForm().isDirty()==true)
{this.saveButton.enable();}}
if(this.enableDirtyChecks==true)this.checkFormDirty.defer(500,this);else this.enableDirtyChecks=true;};this.reallyHide=function()
{if(this.dialog)this.dialog.hide();this.enableDirtyChecks=false;};this.confirmHandler=function(_buttonClicked)
{if(_buttonClicked=="yes")this.reallyHide();};this.construct();};Ext.extend(diloc.rail.dialogs.TrainRunMessageAttachment,Ext.util.Observable,{show:function(_record,_idName,_valueName,_loadData)
{this.currentAttachmentId=_record.get(_idName);this.currentRecord=_record;this.currentValueName=_valueName;if(this.dialog)this.dialog.show();if(typeof _loadData!="undefined"&&_loadData==true)
{if(this.formPanel)
{if(this.saveButton)this.saveButton.disable();this.loadCurrentAttachment();}
else
{this.loadAttachmentOnFormItemsComplete=true;}}
else
{if(this.formPanel)
{this.formPanel.clear();}}
this.checkFormDirty();},hide:function()
{if(this.formPanel.getForm().isDirty())
{Ext.MessageBox.confirm('Schließen?','<br/><b>Änderungen noch nicht gespeichert!</b><br/><br/><br/>Die von Ihnen vorgenommenen Änderungen an diesem Anhang sind noch nicht gespeichert!<br/>Möchten sie wirklich fortfahren und alle Änderungen verwerfen?',this.confirmHandler,this);}
else this.reallyHide();}});

Ext.namespace("diloc","diloc.rail","diloc.rail.dialogs");diloc.rail.dialogs.HtmlEditor=function(_value)
{this.construct=function(_value)
{this.value=_value;this.addEvents("textUpdated");this.dialog=new Ext.Window({title:'Text Bearbeiten',width:460,height:360,closeAction:'hide',bodyBorder:false,border:false,stateId:'htmleditordialog',layout:'fit',items:[{xtype:'htmleditor',value:_value,id:'htmleditordialog_editor'}]});this.saveButton=this.dialog.addButton({text:'Speichern',handler:this.saveText,scope:this});this.closeButton=this.dialog.addButton({text:'Schließen',handler:this.hide,scope:this});};this.saveText=function()
{if(this.htmlEditor.isDirty())
this.fireEvent("textUpdated",this.htmlEditor.getValue(),this.valueId);this.reallyHide();};this.confirmHandler=function(_buttonClicked)
{if(_buttonClicked=="yes")this.reallyHide();};this.reallyHide=function()
{if(this.dialog)this.dialog.hide();this.enableDirtyChecks=false;};this.show=function(_value,_valueId)
{this.valueId=_valueId;this.htmlEditor=this.dialog.getComponent("htmleditordialog_editor");this.htmlEditor.setValue(_value);this.htmlEditor.originalValue=_value;this.dialog.show();Ext.getCmp('htmleditordialog_editor').tb.enableOverflow=true;Ext.getCmp('htmleditordialog_editor').tb.doLayout();};this.construct(_value);};Ext.extend(diloc.rail.dialogs.HtmlEditor,Ext.util.Observable,{hide:function()
{if(this.htmlEditor.isDirty())
{Ext.MessageBox.confirm('Schließen?','<br/><b>Änderungen noch nicht gespeichert!</b><br/><br/><br/>Die von Ihnen vorgenommenen Änderungen an diesem Text sind noch nicht gespeichert!<br/>Möchten sie wirklich fortfahren und alle Änderungen verwerfen?',this.confirmHandler,this);}
else this.reallyHide();}});

Ext.namespace("diloc","diloc.rail","diloc.rail.dialogs");diloc.rail.dialogs.Chooser=function(_config)
{this.config=_config;this.construct=function()
{this.addEvents("optionChosen","canceled");var radioItems=[];for(var i=0;i<this.config.selectOptions.length;i++)
{radioItems.push({xtype:'radio',boxLabel:this.config.selectOptions[i].text,name:'chooser',value:this.config.selectOptions[i].id});}
var groupHeight=null;if(radioItems.length>5)
{groupHeight=5*25;}
this.dialog=new Ext.Window({title:this.config.title,width:400,closeAction:'hide',border:false,stateId:'choosedialog',stateful:false,resizable:false,bodyStyle:"padding:10px;",layout:'table',layoutConfig:{columns:1},items:[{xtype:'panel',html:this.config.description,border:false,bodyStyle:'background:none; padding-bottom:15px;',width:370},{items:radioItems,id:'chooser_radiogroup',border:true,height:groupHeight,style:'overflow:auto;',ctCls:'chooser',columns:1}]});this.selectButton=this.dialog.addButton({text:'Auswählen',handler:this.chooseItem,scope:this});this.closeButton=this.dialog.addButton({text:'Abbrechen',handler:this.cancel,scope:this});};this.cancel=function()
{this.fireEvent("canceled");this.reallyHide();};this.chooseItem=function()
{var radioGroup=Ext.getCmp('chooser_radiogroup');var somethingSelected=false;for(var i=0;i<radioGroup.items.items.length;i++)
{if(radioGroup.items.items[i].checked==true)
{this.fireEvent("optionChosen",radioGroup.items.items[i].value);somethingSelected=true;}}
if(!somethingSelected)
{this.fireEvent("canceled");}
this.reallyHide();};this.confirmHandler=function(_buttonClicked)
{if(_buttonClicked=="yes")this.reallyHide();};this.reallyHide=function()
{if(this.dialog)this.dialog.hide();this.enableDirtyChecks=false;};this.show=function()
{this.dialog.show();};this.destroy=function()
{if(this.dialog)
{this.dialog.destroy();delete this.dialog;}};this.construct();};Ext.extend(diloc.rail.dialogs.Chooser,Ext.util.Observable,{hide:function()
{this.reallyHide();}});

diloc.rail.dialogs.DispoChange=Ext.extend(Ext.Window,{constructor:function(_trainInfo,config)
{this.addEvents("dispositionchangeadded","dispositionchangesaved","dispositionchangedeleted");this.trainInfo=_trainInfo;Ext.apply(this,{layout:'card',title:'Dispositions-Änderung',width:400,height:400});Ext.apply(this,config);diloc.rail.dialogs.DispoChange.superclass.constructor.call(this,config);},initComponent:function()
{var arrivalDiff='';if(this.trainInfo.forecastStation.arrivalDiff!=null)
{var forecastArrival=new Date(this.trainInfo.forecastStation.arrivalTimestamp*1000);arrivalDiff=forecastArrival.format("H:i:s");if(this.trainInfo.forecastStation.arrivalDiff!==0)
{arrivalDiff+=" ("+diloc.rail.util.latenessToString(this.trainInfo.forecastStation.arrivalDiff,'intelli')+")";}}
else arrivalDiff="-";var departureDiff='';if(this.trainInfo.forecastStation.departureDiff!=null)
{var forecastDeparture=new Date(this.trainInfo.forecastStation.departureTimestamp*1000);departureDiff=forecastDeparture.format("H:i:s");if(this.trainInfo.forecastStation.departureDiff!==0)
{departureDiff+=" ("+diloc.rail.util.latenessToString(this.trainInfo.forecastStation.departureDiff,'intelli')+")";}}
else departureDiff="-";this.trainAttributeStore=diloc.StoreManager.get('StationTrainAttributes');var stayTypes=['Durchfahrt','Halt','Bedingter Halt','Außerordentlicher Halt'];var theWindow=this;Ext.apply(this,{title:'Dispositions-Änderung',width:400,layout:'card',forceLayout:true,activeItem:0,deferredRender:false,plain:true,autoHeight:true,items:[{html:'<div style="margin-top:80px; margin-bottom:80px;text-align:center;">Überprüfe Bedingungen...</div>',xtype:'panel',itemId:'loading',bodyStyle:'padding:10px;',autoHeight:true},{xtype:'form',autoHeight:true,defaultMargins:{top:0,right:0,bottom:10,left:0},plugins:[new gwf.plugins.OOSubmit()],trackResetOnLoad:true,hideBorders:true,bodyStyle:'padding:10px;',itemId:'form',items:[{html:"<h2>Zug "+this.trainInfo.number+" in "+this.trainInfo.stationIdCode+"</h2>",itemId:'title',autoHeight:true},{xtype:'panel',layout:'table',defaults:{bodyStyle:'padding:5px;'},hideBorders:true,layoutConfig:{columns:3},autoHeight:true,forceLayout:true,items:[{html:''},{html:'<b>Ankunft</b>',hidden:this.trainInfo.isDeparture},{html:'<b>Abfahrt</b>',hidden:this.trainInfo.isArrival},{html:'Fahrplan'},{html:this.trainInfo.plannedDeparture.add(Date.SECOND,this.trainInfo.trainRouteStation.time).format("H:i:s"),hidden:this.trainInfo.isDeparture},{html:this.trainInfo.plannedDeparture.add(Date.SECOND,this.trainInfo.trainRouteStation.time+this.trainInfo.trainRouteStation.stayDuration).format("H:i:s"),hidden:this.trainInfo.isArrival},{html:'Prognose'},{html:arrivalDiff,hidden:this.trainInfo.isDeparture},{html:departureDiff,hidden:this.trainInfo.isArrival},{html:'Anpassung'},{xtype:'dilocminutespinner',name:'arrivalLatenessDiff',hidden:this.trainInfo.isDeparture,width:121},{xtype:'dilocminutespinner',name:'departureLatenessDiff',hidden:this.trainInfo.isArrival,width:121},{html:'Gleis'},{xtype:'textfield',emptyText:this.trainInfo.trainRouteStation.arrivalTrack,name:'arrivalTrack',hidden:this.trainInfo.isDeparture,width:121},{xtype:'textfield',emptyText:this.trainInfo.trainRouteStation.departureTrack,name:'departureTrack',hidden:this.trainInfo.isArrival,width:121}]},{xtype:'fieldset',title:'Reihung',border:true,autoHeight:true,style:'padding-top:2px;',listeners:{collapse:function(){theWindow.syncSize();}},defaults:{anchor:'-15',xtype:'combo',store:this.trainAttributeStore,mode:'local',lazyRender:true,typeAhead:true,forceSelection:true,triggerAction:'all',displayField:'idCode',valueField:'id'},items:[{xtype:'box',style:'color:gray;',html:'Die hier eingegebenen Änderungen gelten für den restlichen Zuglauf!'},{fieldLabel:'Spitze',name:'departureFrontStationTrainAttributeId'},{fieldLabel:'Mitte',name:'departureMiddleStationTrainAttributeId'},{fieldLabel:'Schluss',name:'departureBackStationTrainAttributeId'}]},{xtype:'fieldset',title:'Optionen',border:true,autoHeight:true,items:[{xtype:'textfield',fieldLabel:'Hinweis-Text',anchor:'-20',name:'adviceText',maxLength:45},{xtype:'combo',fieldLabel:'Halte-Typ ändern',anchor:'-20',name:'stayType',forceSelection:true,local:true,triggerAction:'all',store:[['null','Fahrplan: '+stayTypes[this.trainInfo.trainRouteStation.stayType]],[0,'D - Durchfahrt'],[1,'H - Halt'],[2,'B - Bedingter Halt'],[3,'A - Außerordentlicher Halt']]},{xtype:'checkbox',fieldLabel:'Nicht einsteigen',name:'dontBoard'},{xtype:'checkbox',fieldLabel:'Zug endet hier',name:'trainEndsHere'}]}]}]});diloc.rail.dialogs.DispoChange.superclass.initComponent.call(this,arguments);this.deleteButton=this.addButton({text:'Löschen',disabled:true,handler:this.deleteDispositionChange,scope:this});this.cancelButton=this.addButton({text:'Abbrechen',handler:this.cancel,scope:this});this.saveButton=this.addButton({text:'Ok',disabled:true,handler:this.save,scope:this});},initializeContent:function()
{var conditionChecker=new gwf.helpers.ActionExecutor({successSilent:true});conditionChecker.on("success",function(_result){if(_result.data.locked)
{var loadingScreen=this.findByItemId('loading');loadingScreen.body.dom.innerHTML='<div style="margin-top:160px; text-align:center;">Der Zug '+this.trainInfo.number+' ist in '+_result.data.lockedStationIdCode+' schon in Bearbeitung durch '+_result.data.lockedUsername+'.<br/>Um Unstimmigkeiten zu vermeiden ist ein gleichzeitiges Bearbeiten durch zwei Benutzer nicht möglich.</div>';}
else
{console.info("Condition is:",_result.data);this.getLayout().setActiveItem(1);this.center();this.dispositionChange=_result.data.dispositionChange;if(_result.data.dispositionChange.stayType==null)
{this.dispositionChange.stayType='null';this.dispositionChange.originalStayType=this.trainInfo.trainRouteStation.stayType;}
this.dispositionChange.trainId=this.trainInfo.trainId;this.dispositionChange.trainDate=this.trainInfo.plannedDepartureDate;this.dispositionChange._trainInfo=this.trainInfo;this.form.setValues(this.dispositionChange);if(!this.dispositionChange.isAutoCreated)
{this.deleteButton.enable();}
if(_result.data.alreadyExistingDispositionChangeUserName!=null)
{this.titleComponent=this.findByItemId('title');if(this.titleComponent)
{this.titleComponent.getEl().dom.innerHTML+="Beinhaltet Änderungen von "+_result.data.alreadyExistingDispositionChangeUserName;if(_result.data.alreadyExistingDispositionChangeComment)this.titleComponent.getEl().dom.innerHTML+=":<br/>"+'<i>"'+_result.data.alreadyExistingDispositionChangeComment.replace(/\n/g,"<br/>")+'"</i>';else this.titleComponent.getEl().dom.innerHTML+=".";}}}},this);var params={stationId:this.trainInfo.stationId,trainId:this.trainInfo.trainId,plannedDepartureDate:this.trainInfo.plannedDepartureDate};conditionChecker.execute("dispositionchange","checkConditions",params);this.form=this.findByItemId('form').getForm();this.checkDirtyTask={run:this.checkDirty,scope:this,interval:500};Ext.TaskMgr.start(this.checkDirtyTask);},checkDirty:function()
{if(this.form.isDirty())
{this.saveButton.enable();}},afterRender:function()
{diloc.rail.dialogs.DispoChange.superclass.afterRender.apply(this,arguments);var component=this.findByItemId('title');if(component)
{console.log(component);}
this.initializeContent.defer(100,this);},cancel:function()
{if(this.dispositionChange&&this.dispositionChange.isAutoCreated==true)
{this.deleteDispositionChange(true);}
else
{this.close();}},deleteDispositionChange:function(_isCleanup)
{var deleter=new gwf.helpers.ActionExecutor({successSilent:true});this.isCleanup=false;if(_isCleanup==true)this.isCleanup=true;deleter.on("success",function(_result){if(!this.isCleanup)
{this.fireEvent("dispositionchangedeleted",this.dispositionChange);console.log("RESULT is:",_result);this.trainInfo.proxy.updateForecast(_result.data.forecast);}
this.close();},this);deleter.on("failure",this.close,this);if(this.isCleanup)this.getEl().mask("Räume auf...");else this.getEl().mask("Lösche Dispositions-Änderung...");deleter.execute("dispositionchange","delete",{id:this.dispositionChange.id});},save:function(_button,_event)
{if(_event.shiftKey)
{diloc.rail.MessageBox.show({title:'Direkt speichern?',text:'Wenn Sie die Änderungen jetzt direkt speichern, werden Sie sofort aktiv geschaltet und direkt an Fahrgastinformationsysteme weitergegeben. Diese Aktion kann nicht rückgängig gemacht werden.',buttons:Ext.MessageBox.OKCANCEL,icon:Ext.MessageBox.WARNING,id:'dcwarning',okHandler:function()
{this.getEl().mask("Direkt Speichern...");this.form.submit({url:gwf.App.backendUrl("dispositionchange","update",{id:this.dispositionChange.id}),success:this.directSaveSucess,scope:this});},okScope:this});}
else
{this.getEl().mask("Speichern...");this.form.submit({url:gwf.App.backendUrl("dispositionchange","update",{id:this.dispositionChange.id}),success:this.saveSuccess,scope:this});}},directSaveSucess:function(_form,_action)
{this.getEl().mask("Aktivieren...");if(this.dispositionChange.isAutoCreated)
{Ext.apply(this.dispositionChange,_action.result.data);console.log("Fireing added event!");this.fireEvent("dispositionchangeadded",this.dispositionChange);this.trainInfo.proxy.updateForecast(_action.result.data.forecast);}
else
{Ext.apply(this.dispositionChange,_action.result.data);console.log("Fireing saved event!");this.fireEvent("dispositionchangesaved",this.dispositionChange);this.trainInfo.proxy.updateForecast(_action.result.data.forecast);}
diloc.rail.DispositionChangeManager.directlySaveDispoChanges.defer(500,diloc.rail.DispositionChangeManager,[function(){this.close();},this]);},saveSuccess:function(_form,_action)
{if(this.dispositionChange.isAutoCreated)
{Ext.apply(this.dispositionChange,_action.result.data);console.log("Fireing added event!");this.fireEvent("dispositionchangeadded",this.dispositionChange);this.trainInfo.proxy.updateForecast(_action.result.data.forecast);}
else
{Ext.apply(this.dispositionChange,_action.result.data);console.log("Fireing saved event!");this.fireEvent("dispositionchangesaved",this.dispositionChange);this.trainInfo.proxy.updateForecast(_action.result.data.forecast);}
console.info("Result is:",_action.result);this.close();}});

Ext.namespace("diloc","diloc.rail","diloc.rail.util");diloc.rail.dialogs.FileViewer=Ext.extend(Ext.Window,{buttonAlign:'right',autoResize:true,height:300,width:500,initComponent:function()
{this.browserHeight=Ext.getBody().getHeight();this.browserWidth=Ext.getBody().getWidth();this.layout='fit';this.fbar=[{text:'Schließen',scope:this,handler:this.close}];if(this.mimeType=="image/jpeg"||this.mimeType=="image/gif"||this.mimeType=="image/png")
{this.preLoaderOnLoad=function(){if(this.autoResize==true)
{this.resizeWindow(objImagePreloader.width,objImagePreloader.height);}
objImagePreloader.onload=function(){};};var objImagePreloader=new Image();objImagePreloader.onload=this.preLoaderOnLoad.createDelegate(this);objImagePreloader.src=this.src;this.addClass("fileviewer-loading");this.items={xtype:'container',html:'<img src="'+objImagePreloader.src+'" />',autoScroll:true};}
else if(this.mimeType=="application/pdf")
{if(this.autoResize==true)
{this.resizeWindow('3000','3000');}
this.addClass("fileviewer-loading");this.items={xtype:'container',html:'<iframe src="'+this.src+'" width="100%" height="100%" /></iframe>'};}
else
{this.items={xtype:'container',html:'<h3>Entschuldigung</h3><p>Leider konnte die Datei ('+this.src+') nicht angezeigt werden.</p>'};}
this.width=this.width+14;this.height=this.height+67;this.resizeWindow(this.width,this.height);diloc.rail.dialogs.FileViewer.superclass.initComponent.call(this);},resizeWindow:function(_width,_height)
{if((_width+14)>(this.browserWidth-114))
{_width=this.browserWidth-114;}
if((_height+67)>(this.browserHeight-167))
{_height=this.browserHeight-167;}
console.log("RESIZE to w",_width+14,"h",_height+67);this.setSize(_width+14,_height+67);if(this.rendered)this.center();}});

Ext.namespace("diloc","diloc.rail","diloc.rail.util");diloc.rail.dialogs.CustomerStation=Ext.extend(Ext.Window,{buttonAlign:'right',layout:'vbox',border:false,layoutConfig:{align:'stretch'},height:567,width:625,resizable:false,initComponent:function()
{console.log("customer Station Dialog",this);var tplStationInformation=new Ext.XTemplate('<div class="customerstation-station">','<tpl for=".">','<div><span class="customerstation-station-label">Mindesthaltezeit</span> <tpl if="!Ext.isEmpty(minimumStayDuration)">{minimumStayDuration}</tpl> Sek.<br clear="all" /></div>','<div><span class="customerstation-station-label">Stationsmanager</span> <tpl if="!Ext.isEmpty(stationManager)">{stationManager}</tpl><br clear="all" /></div>','<div><span class="customerstation-station-label">Telefon</span> <tpl if="!Ext.isEmpty(telephone)"><a href="callto:{telephone}">{telephone}</a></tpl><br clear="all" /></div>','<div><span class="customerstation-station-label">Adresse</span> <tpl if="!Ext.isEmpty(street)">{street}</tpl><br clear="all" /></div>','<div><span class="customerstation-station-label">&nbsp;</span> <tpl if="!Ext.isEmpty(zip)">{zip}</tpl> <tpl if="!Ext.isEmpty(city)">{city}</tpl><br clear="all" /></div>','<div><span class="customerstation-station-label">&nbsp;</span> <tpl if="!Ext.isEmpty(country)">{country}</tpl><br clear="all" /></div>','</tpl></div>');var tplPhoneNumbers=new Ext.XTemplate('<div class="customerstation-phone">','<tpl for=".">','<div><span class="customerstation-phone-name">{name}</span> <a href="callto:{number}">{number}</a><br clear="all" /></div>','</tpl></div>');this.fbar=[{text:'Schließen',scope:this,handler:this.close}];this.items=[{xtype:'panel',layout:'hbox',flex:1,cls:'customer-station no-bottom-border',layoutConfig:{align:'stretch'},items:[{ref:'../customerStationInformation',xtype:'panel',title:'Stationsinformationen',tpl:tplStationInformation,border:false,flex:1},{ref:'../customerStationPhoneNumbers',xtype:'panel',title:'Telefonnummern',autoScroll:true,tpl:tplPhoneNumbers,border:false,flex:1}]},{xtype:'diloc-customerstationtrackgrid',title:'Gleise',border:true,ref:'customerStationTracks',height:200}];diloc.rail.dialogs.CustomerStation.superclass.initComponent.call(this);},afterRender:function()
{diloc.rail.dialogs.CustomerStation.superclass.afterRender.call(this,arguments);this.customerStationTracks.getStore().loadData(this.data);this.customerStationTracks.setCustomerStationId(this.data.id);this.customerStationInformation.update(this.data);this.customerStationPhoneNumbers.update(this.data.phoneNumbers);}});

Ext.namespace("diloc","diloc.rail","diloc.rail.dialogs");diloc.rail.dialogs.TemplateConfigDialog=function(_config){this.config=_config;this.construct=function(){this.dialog=new Ext.Window({title:'Vorlagen verwalten',width:300,height:450,layout:'fit',hideBorders:true,items:[{ref:'templatesGrid',xtype:'editorgrid',title:this.config.name,clicksToEdit:2,viewConfig:{forceFit:true},store:this.config.templateStore,colModel:new Ext.grid.ColumnModel([{header:'Name',dataIndex:'name',editor:new Ext.form.TextField(),align:'left',sortable:false,width:230},{header:'Pos.',dataIndex:'position',sortable:false,resizable:false,fixed:true,hidden:true,width:30},{xtype:'actioncolumn',width:30,sortable:false,fixed:true,items:[{icon:'images/icons/silk/delete.png',tooltip:'Löschen',handler:this.deleteSelectedTemplate}]}]),sm:new Ext.grid.RowSelectionModel({singleSelect:true}),tbar:new Ext.Toolbar({items:['->',{tooltip:'Nach oben verschieben',iconCls:'move-up',handler:this.moveUp,scope:this},{tooltip:'Nach unten verschieben',iconCls:'move-down',handler:this.moveDown,scope:this}]})}],fbar:{xtype:'toolbar',items:[{xtype:'button',text:'Schließen',handler:function(){this.close();},scope:this}]}});};this.deleteSelectedTemplate=function(_grid,_rowIndex,_colIndex){Ext.Msg.show({title:'Löschen',msg:'Soll diese Vorlage <b>unwiederruflich</b> gelöscht werden?',buttons:Ext.Msg.YESNO,fn:function(_btn){if(_btn=="yes")
{var deleteTemplate=new gwf.helpers.ActionExecutor({successSilent:true});deleteTemplate.on("success",function(_response){_grid.getStore().removeAt(_rowIndex);},this);deleteTemplate.execute("texttemplate","delete",{id:_grid.getStore().getAt(_rowIndex).get('id')});}},scope:this});};this.show=function()
{this.dialog.show();this.dialog.templatesGrid.on("afteredit",this.templatesGridAfterEdit,this);this.dialog.templatesGrid.on("beforeedit",this.templatesGridBeforeEdit,this);};this.close=function()
{this.dialog.close();this.destroy();};this.destroy=function()
{if(this.dialog)
{this.dialog.destroy();delete this.dialog;}};this.moveUp=function()
{var selectedRecord=this.dialog.templatesGrid.getSelectionModel().getSelected();var index=this.config.templateStore.indexOf(selectedRecord);if(selectedRecord.get('position')>1)
{selectedRecord.set('position',selectedRecord.get('position')-1);var upperRecord=this.config.templateStore.getAt(index-1);upperRecord.set('position',upperRecord.get('position')+1);this.config.templateStore.sort('position','ASC');this.templatesGridAfterEdit({record:selectedRecord,field:'position',value:selectedRecord.get('position')});this.templatesGridAfterEdit({record:upperRecord,field:'position',value:upperRecord.get('position')});}};this.moveDown=function()
{var selectedRecord=this.dialog.templatesGrid.getSelectionModel().getSelected();var index=this.config.templateStore.indexOf(selectedRecord);if(index<this.config.templateStore.getCount()-1)
{selectedRecord.set('position',selectedRecord.get('position')+1);var lowerRecord=this.config.templateStore.getAt(index+1);if(lowerRecord)
{lowerRecord.set('position',lowerRecord.get('position')-1);}
this.config.templateStore.sort('position','ASC');this.templatesGridAfterEdit({record:selectedRecord,field:'position',value:selectedRecord.get('position')});this.templatesGridAfterEdit({record:lowerRecord,field:'position',value:lowerRecord.get('position')});}};this.templatesGridBeforeEdit=function(_event)
{};this.templatesGridAfterEdit=function(_event)
{var saveExecutor=new gwf.helpers.ActionExecutor({successSilent:true});saveExecutor.on("success",this.onUpdateTemplateSuccess,this);saveExecutor.execute("texttemplate","update",_event.record.data,"Speichere Dokument",_event.record);};this.onUpdateTemplateSuccess=function(_data,_record)
{_record.commit();};this.construct();};

Ext.namespace("diloc","diloc.rail","diloc.rail.util");Ext.ux.grid.filter.NumericFilter.prototype.menuItemCfgs.emptyText='Wert eingeben';diloc.rail.MessageGrid=function(_options)
{};diloc.rail.MessageGrid=Ext.extend(Ext.grid.EditorGridPanel,{mode:'browser',autoLoadData:true,doAutoLoad:true,loadMask:{msg:'Lade Zuglaufmeldungen...'},rights:{write:false,create:false},latenessMenu:null,initComponent:function()
{if(this.mode=='browser')this.isBrowser=true;else if(this.mode=='statistics')this.isStatistic=true;else if(this.mode=='trainrun')this.isTrainrun=true;else alert("MessageGrid: config.mode must be one of 'browser', 'trainrun' or 'statistics'!!");this.store=null;this.reader=null;this.highestId=0;this.doSort=false;this.currentRefreshTimeout=null;this.setup();return diloc.rail.MessageGrid.superclass.initComponent.call(this);},storeUpdate:function(_store,_record,_operation)
{if(_operation==Ext.data.Record.COMMIT)
{var id=_record.get('id');var infoText=_record.get('infoText');}
else console.log("store update: "+_operation);},storeAdd:function(_store,_records,_index)
{this.doSort=true;},storeLoad:function(_store,_records,_options)
{if(this.isBrowser||this.isTrainrun)
{for(recordPos in _records)
{if(_records[recordPos].id>this.highestId)
this.highestId=_records[recordPos].id;}
if(this.doSort&&this.storeSortState)
this.store.sort(this.storeSortState.field,this.storeSortState.direction);this.doSort=false;if(_options.autoRefresh==true)
this.currentRefreshTimeout=this.refresh.defer(1000*10,this);}
if(this.isStatistic)
{var timeFilter=this.filters.getFilter("timestamp");var dateFilterValues=timeFilter.getValue();var dateRange=this.detectDateRange(dateFilterValues);var text="";if(dateRange=='month')text='Ein Monat';if(dateRange=='day')text='Ein Tag';if(dateRange=='week')text='Eine Woche';if(dateRange!='nodates')
{this.forwardButton.enable();this.backwardButton.enable();this.forwardButton.getEl().dom.getElementsByTagName('button')[0].qtip=text+" später";this.backwardButton.getEl().dom.getElementsByTagName('button')[0].qtip=text+" früher";}
else
{this.forwardButton.disable();this.backwardButton.disable();this.forwardButton.getEl().dom.getElementsByTagName('button')[0].qtip='';this.backwardButton.getEl().dom.getElementsByTagName('button')[0].qtip='';}
if(this.store.getTotalCount()==0)
{this.statisticsButton.disable();}
else this.statisticsButton.enable();}},gridPanelAfterEdit:function(_info)
{var id=_info.record.get('id');var infoText=_info.value;var saveExecutor=new gwf.helpers.ActionExecutor({successSilent:true});saveExecutor.on("success",this.saveInfoTextSuccess,this);saveExecutor.execute("trainrunmessages","setInfoText",{id:id,infoText:infoText},"Speichere Info-Text",_info.record);},gridPanelValidateEdit:function(_info)
{if(_info.value==""&&_info.originalValue==null)return false;if(_info.value==null&&_info.originalValue==null)return false;if(_info.value==null)return false;return true;},saveInfoTextSuccess:function(_data,_record)
{_record.commit();if(this.isStatistic)
{if(this.filters.getFilter("infoText").active===true)
{this.refresh();}}},setup:function()
{var messageGridReader=new Ext.data.JsonReader({fields:[{name:'id'},{name:'trainNumber'},{name:'trainOrigin'},{name:'stationIdCode'},{name:'stationName'},{name:'timestamp',type:'date',dateFormat:'Y-m-d h:i:s'},{name:'type'},{name:'latenessType'},{name:'latenessAmount'},{name:'latenessCode'},{name:'infoText'},{name:'attachmentAvailable'},{name:'trainRunId'},{name:'trainId'}],root:'data',id:'id',totalProperty:'totalCount'});var url="";if(this.isBrowser)url=gwf.App.backendUrl("trainrunmessages","last");if(this.isStatistic)url=gwf.App.backendUrl("trainrunmessages","list");var storeConfig={reader:messageGridReader};if(this.isBrowser)
{Ext.apply(storeConfig,{url:gwf.App.backendUrl("trainrunmessages","last"),sortInfo:{field:'timestamp',direction:'ASC'}});}
if(this.isStatistic||this.isTrainrun)
{Ext.apply(storeConfig,{url:gwf.App.backendUrl("trainrunmessages","list"),remoteSort:true});}
console.log("storeConfig:",storeConfig);this.store=new Ext.data.Store(storeConfig);this.store.on("add",this.storeAdd,this);this.store.on("load",this.storeLoad,this);this.store.on("update",this.storeUpdate,this);this.store.on("beforeLoad",this.storeBeforeLoad,this);var infoTextColumn={header:'Info-Text',dataIndex:'infoText',sortable:!this.isBrowser};if(this.rights.write)
{infoTextColumn.editor=new Ext.form.TextField({maxLength:32,maxLengthText:'Die maximal-länge für den Info-Text is 32 Zeichen!',validationDelay:20});}
this.cm=new Ext.grid.ColumnModel({defaults:{sortable:true},columns:[{header:'A',dataIndex:'attachmentAvailable',renderer:diloc.rail.util.attachmentRenderer,width:20,resizable:false,tooltip:'Anhänge'},{header:'Zug-ID',dataIndex:'trainId',hidden:true,width:60},{header:'Zugnummer',dataIndex:'trainNumber',hidden:this.isTrainrun,width:60,sortable:false},{header:'Ausgangsbahnhof',dataIndex:'trainOrigin',hidden:this.isTrainrun,sortable:false},{header:'Zuglauf-Nummer',dataIndex:'trainRunId',hidden:true},{header:'Uhrzeit',dataIndex:'timestamp',renderer:Ext.util.Format.dateRenderer('d.m.Y H:i:s'),width:80},{header:'Meldepunkt',dataIndex:'stationIdCode',renderer:diloc.rail.util.messagePointRenderer},{header:'Typ',dataIndex:'type',renderer:diloc.rail.util.messageTypeRenderer,width:60},{header:'Verspätung',dataIndex:'latenessAmount',renderer:diloc.rail.util.latenessRenderer,width:60},{header:'Verspätungs-Code',dataIndex:'latenessCode',renderer:diloc.rail.util.latenessCodeRenderer,width:70},infoTextColumn]});if(this.isStatistic||this.isTrainrun)
{var filterConfig={autoReload:true,local:false,filters:[{type:'string',dataIndex:'trainNumber'},{type:'string',dataIndex:'stationDbId'},{type:'date',dataIndex:'timestamp'},{type:'numeric',dataIndex:'latenessAmount'},{type:'string',dataIndex:'infoText'},{type:'boolean',dataIndex:'attachmentAvailable'},{type:'numeric',dataIndex:'trainRunId'},{type:'list',dataIndex:'type',phpMode:true,options:[{id:2,text:'Abfahrt Start'},{id:3,text:'Ankunft'},{id:4,text:'Abfahrt'},{id:5,text:'Durchfahrt'},{id:1,text:'Ankunft Ziel'}]},{type:'numeric',dataIndex:'latenessCode'},{type:'numeric',dataIndex:'trainId'}]};var importantStationsStore=diloc.StoreManager.get('ImportantStations');console.log("important stations store:",importantStationsStore);if(importantStationsStore.getCount()>0)
{filterConfig.filters.push({type:'list',dataIndex:'stationIdCode',phpMode:true,store:importantStationsStore,loadOnShow:false,loaded:true});}
var filters=new Ext.ux.grid.GridFilters(filterConfig);}
this.sm=new Ext.grid.RowSelectionModel({singeleSelect:true});this.sm.on("selectionchange",this.onSelectionChange,this);var topToolbar=[];if(this.isStatistic)
{this.backwardButton=new Ext.Toolbar.Button({iconCls:'backward',tooltip:'Zurück',handler:this.onBackwardClick,scope:this});this.forwardButton=new Ext.Toolbar.Button({iconCls:'forward',tooltip:'Vorwärts',handler:this.onForwardClick,scope:this});this.statisticsButton=new Ext.Toolbar.Button({iconCls:'stats',tooltip:'Statistiken berechnen',handler:this.onStatsClick,scope:this});topToolbar.push(this.backwardButton);topToolbar.push(this.forwardButton);topToolbar.push('-');topToolbar.push(this.statisticsButton);topToolbar.push('-');}
var attachmentText="Anhang bearbeiten";if(!this.rights.write)attachmentText="Anhang ansehen";this.attachmentButton=new Ext.Toolbar.Button({text:attachmentText,handler:this.onAttachmentClick,scope:this,iconCls:'attachment',disabled:true});topToolbar.push(this.attachmentButton);if(!this.isBrowser&&typeof gwf.App.startExport=="function")
{topToolbar.push(new diloc.rail.buttons.ExportButton({store:this.store,includeTrmPdf:true}));}
var gridPanelOptions={layout:'fit',frame:false,border:false,clicksToEdit:2,tbar:topToolbar};if(this.isBrowser)
{Ext.apply(gridPanelOptions,{title:'Zuglaufdaten-Browser',iconCls:'icon-grid',view:new Ext.grid.GridView({scrollToTop:Ext.emptyFn,forceFit:true,getRowClass:diloc.rail.util.messageGridRowClass})});}
if(this.isStatistic||this.isTrainrun)
{Ext.apply(gridPanelOptions,{plugins:[filters],view:new Ext.grid.GridView({scrollToTop:Ext.emptyFn,forceFit:true,emptyText:'Keine Meldungen mit diesen Filterkriterien gefunden.',getRowClass:diloc.rail.util.messageGridRowClass}),pageSize:25,bbar:new Ext.PagingToolbar({store:this.store,pageSize:25,displayInfo:true,displayMsg:'Meldungen {0}-{1} von {2}',stateId:this.isStatistic?'statistics-pt':'trainrun-pt',plugins:[filters,new Ext.ux.Andrie.pPageSize({beforeText:'Zeige',afterText:'Zuglaufmeldungen',variations:[25,50,75,100,150,200,300,500]})]})});}
Ext.apply(this,gridPanelOptions);Ext.apply(this.initialConfig,gridPanelOptions);this.on("afteredit",this.gridPanelAfterEdit,this);this.on("validateedit",this.gridPanelValidateEdit,this);this.on("celldblclick",this.gridPanelCellDblClick,this);this.on("headercontextmenu",this.gridPanelHeaderContextMenu,this);},onSelectionChange:function()
{if(this.selModel.hasSelection())
{var trmRecord=this.selModel.getSelected();if((this.rights.write&&this.rights.create)||trmRecord.get("attachmentAvailable")==true)
{this.attachmentButton.enable();}
else this.attachmentButton.disable();}
else
{this.attachmentButton.disable();}},createLatenessMenu:function()
{if(!this.latenessMenu&&this.view&&this.view.hmenu)
{this.latenessMenu=this.view.hmenu.add({text:"Anzeige",menu:new Ext.menu.Menu(),iconCls:'number-format'});this.latenessMenu.menu.add(new Ext.menu.CheckItem({text:'Minuten (abgerundet)',group:'ldisplaymode',checked:true,listeners:{'checkchange':{fn:this.changeLatenessRenderer.createDelegate(this,['default'],true),scope:this}}}));this.latenessMenu.menu.add(new Ext.menu.CheckItem({text:'Minuten (gerundet)',group:'ldisplaymode',listeners:{'checkchange':{fn:this.changeLatenessRenderer.createDelegate(this,['round'],true),scope:this}}}));this.latenessMenu.menu.add(new Ext.menu.CheckItem({text:'Intelligent',group:'ldisplaymode',listeners:{'checkchange':{fn:this.changeLatenessRenderer.createDelegate(this,['intelli'],true),scope:this}}}));this.latenessMenu.menu.add(new Ext.menu.CheckItem({text:'mm:ss',group:'ldisplaymode',listeners:{'checkchange':{fn:this.changeLatenessRenderer.createDelegate(this,['mm:ss'],true),scope:this}}}));this.view.hmenu.on("beforeshow",this.beforeHeaderMenuShow,this);}},storeBeforeLoad:function(_store,_options)
{if(this.isStatistic||this.isTrainrun)
{_options.params=_options.params||{};if(!_options.params.limit)
_options.params.limit=this.bottomToolbar.pageSize;if(!_options.params.start)
_options.params.start=0;this.store.lastOptions=_options;}},beforeHeaderMenuShow:function(_menu)
{var view=this.getView();var columnName=view.cm.config[view.hdCtxIndex].dataIndex;if(columnName=="latenessAmount")
{this.latenessMenu.setVisible(true);}
else this.latenessMenu.setVisible(false);},changeLatenessRenderer:function(_checkItem,_checked,_newFormat)
{if(_checked==true)
{console.log("Activating default renderer with format: "+_newFormat);var view=this.getView();view.cm.config[view.hdCtxIndex].renderer=diloc.rail.util.latenessRenderer.createDelegate(this,[_newFormat],true);view.refresh();}},changeLatenessRenderer_default:function(_checkItem,_checked)
{if(_checked==true)
{console.log("Activating default renderer");var view=this.getView();view.cm.config[view.hdCtxIndex].renderer=diloc.rail.util.latenessRenderer;view.refresh();}},changeLatenessRenderer_mmss:function(_checkItem,_checked)
{if(_checked==true)
{console.log("Activating mm:ss renderer");var view=this.getView();view.cm.config[view.hdCtxIndex].renderer=function(_value)
{};view.refresh();}},onRender:function(_element,_position)
{if(this.doAutoLoad==true)
{if(this.isBrowser)
{this.store.load({autoRefresh:true});}
if(this.isStatistic||this.isTrainrun)
{this.store.load({params:{limit:this.bottomToolbar.pageSize,start:0},autoRefresh:this.isTrainrun});}}
return diloc.rail.MessageGrid.superclass.onRender.call(this,_element,_position);},afterRender:function()
{this.createLatenessMenu();return diloc.rail.MessageGrid.superclass.afterRender.call(this);},refresh:function()
{if(this.isBrowser)
{var count=this.store.getCount();var lastRecord=this.store.getAt(count-1);this.storeSortState=this.store.getSortState();this.store.load({params:{sinceId:this.highestId},add:true,autoRefresh:true});}
if(this.isStatistic)
{this.store.load();}
if(this.isTrainrun)
{this.store.load();}},onAttachmentClick:function()
{if(this.selModel.hasSelection())
{var trmRecord=this.selModel.getSelected();if(trmRecord.get("attachmentAvailable")==true||(this.rights.write&&this.rights.create))
{if(!this.trmAttachmentDialog)
{this.trmAttachmentDialog=new diloc.rail.dialogs.TrainRunMessageAttachment(!this.rights.write);}
this.trmAttachmentDialog.show(trmRecord,'id','attachmentAvailable',true);}
else
{gwf.App.errorMsg("Rechte-Fehler","Sie besitzen nicht die erforderlichen Rechte um Anhänge erzeugen zu können.");}}},gridPanelHeaderContextMenu:function(_grid,_colundIndex,_event)
{console.log("Header Context Menu arguments:",arguments);},gridPanelCellDblClick:function(_grid,_rowIndex,_columnIndex,_event)
{if(_columnIndex==0)this.onAttachmentClick();},suspend:function()
{if(this.isBrowser)clearTimeout(this.currentRefreshTimeout);},detectDateRange:function(_dateFilterValues)
{if(this.filters.getFilter("timestamp").active==false)return'nodates';if(_dateFilterValues.before&&_dateFilterValues.after)
{if((_dateFilterValues.before.getElapsed(_dateFilterValues.after)/(1000*60*60*24))>8)
{return'month';}
else return'week';}
else if(_dateFilterValues.on)
{return'day';}
else return'unknown';},changeDateRange:function(_factor)
{var timeFilter=this.filters.getFilter("timestamp");var dateFilterValues=timeFilter.getValue();var dateRange=this.detectDateRange(dateFilterValues);if(dateRange=='day')
{timeFilter.setValue({on:dateFilterValues.on.add(Date.DAY,1*_factor)});}
if(dateRange=='month')
{timeFilter.setValue({after:dateFilterValues.after.add(Date.MONTH,1*_factor).getFirstDateOfMonth(),before:dateFilterValues.after.add(Date.MONTH,1*_factor).getLastDateOfMonth().add(Date.DAY,1)});}
if(dateRange=='week')
{timeFilter.setValue({after:dateFilterValues.after.add(Date.DAY,7*_factor),before:dateFilterValues.before.add(Date.DAY,7*_factor)});}
timeFilter.setActive(false);timeFilter.setActive(true);},onForwardClick:function()
{this.changeDateRange(1);},onBackwardClick:function()
{this.changeDateRange(-1);},onStatsClick:function()
{var params=gwf.util.clone(this.store.lastOptions.params);var statGrabber=new gwf.helpers.ActionExecutor({successSilent:true});statGrabber.on("success",function(_result){var template=new Ext.XTemplate('<div class="mgr_stats">','<div class="stat_title">','<span class="title">Statistiken {dateText}</span>','<span class="subtitle">{filterText} <span style="color:red">{filterInfo}</span</span>','</div>','<div class="leftside">','<div class="value"><span class="title">Anzahl analysierte Zuglaufmeldungen</span><span class="value">{trainRunMessageCount} Zuglaufmeldungen</span></div>','<div class="value"><span class="title">Anzahl Abfahrtsmeldungen mit Verspätung >5 Min</span><span class="value">{lateTrainRunMessageCount} Zuglaufmeldungen</span></div>','<div class="value"><span class="title">Summe Verspätungsminuten</span><span class="value">{latenessMinutes} Minuten</span></div>','<div class="value"><span class="title">Durchschnittliche Verspätung über alle Züge</span><span class="value">{totalLatenessAverage:this.latenessFormat} Minuten</span></div>','<div class="value"><span class="title">Durchschnittliche Verspätung verspäteter Züge</span><span class="value">{latenessAverage:this.latenessFormat}  Minuten</span></div>','<div class="value"><span class="title">Maximale Verspätung</span><span class="value">{biggestLateness} Minuten (Zug {biggestLatenessTrainNumber})</span></div>','','','</div>','','<div class="rightside">','<table>','<tr>','<td><img src="{latenessBarUrl}"></img></td>','<td><img src="{latenessPieUrl}"></img></td>','</tr>','<tr>','<td colspan="2"><img src="{topLateStationsBarUrl}"></img></td>','</tr>','<tr>','<td colspan="2"><img src="{topLatenessCodesBarUrl}"></img></td>','</tr>','</table>','','</div>','</div>');template.latenessFormat=gwf.format.floatformat.createDelegate(gwf.format.floatformat,[2],1);var window=new Ext.Window({layout:'fit',title:'Statistiken',width:910,height:600,stateId:'stat-window',resizable:false,html:template.apply(_result.data)});window.show();},this);statGrabber.execute("trainrunmessages","stats",params,"Berechne Statistiken...");}});Ext.reg('diloc-messagegrid',diloc.rail.MessageGrid);diloc.rail.util.latenessRenderer=function(_value,_metaData,_record,_rowIndex,_colIndex,_store,_format)
{if(_record.data.latenessType==3)return"?";if(_value==0)return"-";if(_value===null)return"";if(_value>179)_metaData.css="red";var value="";if(typeof _format=="undefined"||_format=='default')
{if(_value>0)value="+";if(_value<0)value="";var minuteValue=_value/60;if(minuteValue<0)minuteValue=Math.ceil(minuteValue);else minuteValue=Math.floor(minuteValue);if(minuteValue==0)return"-";value=value+minuteValue;}
else if(_format=="mm:ss")
{if(_value>0)value="+";if(_value<0)value="-";var minutes=Math.abs(Math.absfloor(_value/60));var seconds=Math.abs(Math.abs(_value)-minutes*60);if(minutes<10&&minutes>=0)minutes="0"+minutes;if(seconds<10&&seconds>=0)seconds="0"+seconds;value+=minutes+":"+seconds;}
else if(_format=="intelli")
{if(_value<60*5&&_value>-5*60)value=diloc.rail.util.latenessRenderer(_value,_metaData,_record,_rowIndex,_colIndex,_store,'mm:ss');else value=diloc.rail.util.latenessRenderer(_value,_metaData,_record,_rowIndex,_colIndex,_store,'default');}
else if(_format=='round')
{if(_value>0)value="+";if(_value<0)value="";var minuteValue=Math.round(_value/60);if(minuteValue==0)return"-";value=value+minuteValue;}
else{value=_value;}
return value;};diloc.rail.util.latenessCodeRenderer=function(_value,_metaData,_record)
{if(_value==0)return"-";else return _value;};diloc.rail.util.messagePointRenderer=function(_value,metaData,record)
{if(record.get("stationName")==undefined)
return _value+" - "+record.get("lastTrainRunMessage.stationName");return _value+" - "+record.get("stationName");};diloc.rail.util.messageGridRowClass=function(row,index,cols)
{if(row.get('attachmentAvailable')==true)return"attachment";else return"";};diloc.rail.util.attachmentRenderer=function(_value,_metaData,record)
{if(_value==true)_metaData.css="attachment";return"";};diloc.rail.util.messageTypeRenderer=function(_value,metaData,record)
{if(_value==5)
{return"Durchfahrt";}
else if(_value==3)
{return"Ankunft";}
else if(_value==4)
{return"Abfahrt";}
else if(_value==1)
{return"Ankunft Ziel";}
else if(_value==2)
{return"Abfahrt Start";}
else if(_value==0)
{return"Unbekannt";}};diloc.rail.util.latenessToString=function(_value,_format)
{return diloc.rail.util.latenessRenderer(_value,{},{data:{latenessType:0}},0,0,{},_format);};

Ext.namespace("diloc","diloc.rail","diloc.rail.util");diloc.rail.TrainRunGrid=Ext.extend(Ext.grid.GridPanel,{rights:{read:true,write:false,create:false},initComponent:function()
{console.log("initComponent is called!");this.store=null;this.reader=null;this.highestId=0;this.doSort=false;this.currentRefreshTimeout=null;this.filters=null;this.addEvents("trainruncountchanged");console.log("Before this.setup()");this.setup();diloc.rail.TrainRunGrid.superclass.initComponent.call(this);},storeLoad:function(_store,_records,_options)
{if(!this.lastTotalCount)this.lastTotalCount=_store.getTotalCount();if(this.lastTotalCount!=_store.getTotalCount())
{this.fireEvent("trainruncountchanged");}
this.lastTotalCount=_store.getTotalCount();if(_options.autoRefresh==true)
this.currentRefreshTimeout=this.refresh.defer(1000*10,this);},setup:function()
{this.store=diloc.StoreManager.get('TrainRunStore');this.cm=new Ext.grid.ColumnModel({defaults:{sortable:true},columns:[{header:'S',dataIndex:'status',width:16,resizable:false,renderer:this.statusRenderer,groupName:'Status'},{header:'Zuglauf-Nummer',dataIndex:'id',hidden:true,groupable:false},{header:'Zugnummer',dataIndex:'train.number',groupable:false},{header:'Zuglauf-Datum',dataIndex:'date',groupable:false,renderer:Ext.util.Format.dateRenderer("Y-m-d"),hidden:true},{header:'Ausgangsbahnhof',dataIndex:'train.departureStation',renderer:diloc.rail.util.departureStationRenderer,sortable:false},{header:'Zielbahnhof',dataIndex:'train.arrivalStation',renderer:diloc.rail.util.departureStationRenderer,sortable:false},{header:'Letzter Meldepunkt',dataIndex:'lastTrainRunMessage.stationIdCode',renderer:diloc.rail.util.messagePointRenderer},{header:'Letztes Meldekürzel',dataIndex:'lastTrainRunMessage.stationIdCode',hidden:true},{header:'Typ',dataIndex:'lastTrainRunMessage.type',renderer:diloc.rail.util.messageTypeRenderer},{header:'Uhrzeit',dataIndex:'lastTrainRunMessage.timestamp',renderer:Ext.util.Format.dateRenderer('d.m.Y H:i:s'),groupable:false},{header:'Verspätung',dataIndex:'lastTrainRunMessage.latenessAmount',renderer:diloc.rail.util.latenessRenderer,groupable:false}]});this.sm=new Ext.grid.RowSelectionModel({singeleSelect:true});var gridPanelOptions={layout:'fit',frame:false,border:false,plugins:this.filters,view:new Ext.grid.GroupingView({forceFit:true,groupTextTpl:'{text} ({[values.rs.length]} {[values.rs.length > 1 ? "Züge" : "Zug"]})',groupMode:'value',scrollToTop:Ext.emptyFn,emptyText:'Keine fahrenden Züge gefunden. - Die Tabelle wird automatisch aktualisiert.',getRowClass:function(_record){if(_record.data.status!=1)return"disabled";}})};Ext.apply(this,gridPanelOptions);this.on("cellcontextmenu",this.onCellContextMenu,this);},onCellContextMenu:function(_grid,_rowIndex,_cellIndex,_event)
{var fieldName=_grid.getColumnModel().getDataIndex(_cellIndex);var record=_grid.getStore().getAt(_rowIndex);var items=[];var singleSelection=true;if(_grid.getSelectionModel().getCount()>1)singleSelection=false;if(singleSelection&&fieldName=='status'&&record.data.status==1&&this.rights.write)
{items.push({text:'Zuglauf beenden',iconCls:'train-arrived',handler:function(){record.set('status',2);var trainRunCloser=new gwf.helpers.ActionExecutor({successSilent:true});trainRunCloser.on("success",function(_result,_record){_record.data.arrivalTime=_result.data.arrivalTime;_record.commit();this.store.fireEvent('datachanged',this.store);},this);trainRunCloser.execute("trainrun","close",{id:record.get("id")},'!Beende Zuglauf...',record);},scope:this});}
if(singleSelection&&fieldName=='status'&&record.data.status==0&&this.rights.write)
{items.push({text:'Zuglauf löschen',iconCls:'train-notdepartured-delete',handler:function(){var trainRunCloser=new gwf.helpers.ActionExecutor({successSilent:true});trainRunCloser.on("success",function(_result,_record)
{this.store.remove(_record);diloc.rail.TrainManager.deleteTrainByTrainRunId(_record.get('id'));this.store.fireEvent('datachanged',this.store);},this);trainRunCloser.execute("trainrun","close",{id:record.get("id")},'!Lösche Zuglauf...',record);},scope:this});}
if(!singleSelection&&fieldName=='status'&&this.rights.write)
{var selectedRecords=_grid.getSelectionModel().getSelections();var actionOptions=[];for(var i=0;i<selectedRecords.length;i++)
{var record=selectedRecords[i];var doDelete=false;var begin="Beende";if(record.data.status==0)
{doDelete=true;begin="Lösche";}
actionOptions.push({text:begin+' Zuglauf '+record.get('train.number')+" ...",params:{id:record.get('id')},record:record,wasDelete:doDelete});}
items.push({text:'Zugläufe beenden',iconCls:'train-arrived',handler:function(){for(var i=0;i<selectedRecords.length;i++)
{selectedRecords[i].set('status',2);}
var multiTrainRunCloser=new gwf.helpers.MultiActionExecutor({successSilent:true});multiTrainRunCloser.on("actionSuccess",function(_options,_result){if(_options.wasDelete)
{this.store.remove(_options.record);diloc.rail.TrainManager.deleteTrainByTrainRunId(_options.record.get('id'));}
else
{_options.record.data.arrivalTime=_result.data.arrivalTime;_options.record.commit();}
this.store.fireEvent('datachanged',this.store);},this);multiTrainRunCloser.on("failure",function(_options,_result){_options.record.reject();this.store.fireEvent('datachanged',this.store);},this);multiTrainRunCloser.execute("Beende Zugläufe","trainrun","close",actionOptions);},scope:this});}
if(items.length>0)
{var contextMenu=new Ext.menu.Menu({items:items});contextMenu.showAt(_event.getXY());}
_event.preventDefault();},statusRenderer:function(_value,_meta)
{var cls="";if(_value==0)cls="notdepartured";if(_value==1)cls="traveling";if(_value==2)cls="arrived";if(typeof _meta.id!=="undefined")
{_meta.css=cls;return'<span style="padding-left:30px">'+_value+'</span>';}
else
{return'<div class="'+cls+'" alt="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</div>';}},refresh:function()
{this.store.load({autoRefresh:true});},suspend:function()
{clearTimeout(this.currentRefreshTimeout);},setRights:function(rights)
{this.rights=rights;}});Ext.reg('diloc-trainrungrid',diloc.rail.TrainRunGrid);diloc.rail.util.departureStationRenderer=function(_value)
{var parts=_value.split("|");return parts[1]+" - "+parts[2];};

Ext.namespace("diloc","rail");diloc.rail.TrainMap=Ext.extend(Ext.ux.GMapPanel,{trainRunStore:null,trainMarkers:[],currentSelectedMarker:null,followTrain:false,initComponent:function()
{var baseIcon=new GIcon(G_DEFAULT_ICON);baseIcon.shadow=null;baseIcon.iconSize=new GSize(22,41);baseIcon.shadowSize=null;baseIcon.iconAnchor=new GPoint(11,40);baseIcon.infoWindowAnchor=new GPoint(18,4);this.normalTrainIcon=new GIcon(baseIcon,"images/icons/map/train-normal-transparent.png");this.selectedTrainIcon=new GIcon(baseIcon,"images/icons/map/train-orange-transparent.png");this.lateTrainIcon=new GIcon(baseIcon,"images/icons/map/train-late-transparent.png");this.earlyTrainIcon=new GIcon(baseIcon,"images/icons/map/train-early-transparent.png");console.log("Icons configured!");this.tbar=new Ext.Toolbar({items:[{tooltip:'Ausgwählten Zug verfolgen',iconCls:'follow-train',toggleHandler:this.toggleFollowTrain,enableToggle:true,scope:this},{tooltip:'Alle Züge anzeigen',iconCls:'show-all-trains',handler:this.showAllTrains,scope:this}]});diloc.rail.TrainMap.superclass.initComponent.call(this);},onMapReady:function()
{if(this.trainRunStore)
{this.trainRunStoreUpdated(this.trainRunStore);}},setTrainRunStore:function(_store)
{this.trainRunStore=_store;this.trainRunStore.on("load",this.trainRunStoreUpdated,this);this.trainRunStoreUpdated(_store);},onMarkerClick:function(_marker)
{this.selectMarker(_marker);var data=_marker.trainRunRecordData;var trainComment=data.trainComment;var trainNumber=data["train.number"];if(trainComment.startsWith("&nbsp;"))
{trainComment=trainComment.substr(6);}
var latenessAmount=Math.absfloor(data["lastTrainRunMessage.latenessAmount"]/60);var latenessType=data["lastTrainRunMessage.latenessType"];var lateness="Unbekannt";if(latenessType==3)
{lateness="Keine Referenz für Verspätung vorhanden.";}
else if(latenessType==1)
{lateness=latenessAmount+" Min. verspätet";}
else if(latenessType==2)
{lateness=(latenessAmount*-1)+" Min. zu früh";}
else if(latenessType==0)
{lateness="pünktlich";}
_marker.openInfoWindowHtml('<div class="train-info-window"><h1>Zug '+trainNumber+"</h1><p>"+trainComment+"</p><h1>Letzter Meldepunkt</h1>"+data["lastTrainRunMessage.stationName"]+"<br/>"+lateness+"</div>");this.trainView.setCurrentTrain(trainNumber);},trainRunStoreUpdated:function(_store)
{if(this.gmap)
{if(!this.clickEventSubscribed)
{GEvent.bind(this.gmap,'click',this,function(_overlay)
{if(_overlay&&typeof _overlay.maximize!="function")this.onMarkerClick(_overlay);});this.clickEventSubscribed=true;}
var count=_store.getCount();console.log("Updating train positions!");var runningTrainNumbers={};for(var i=0;i<count;i++)
{var record=_store.getAt(i);console.log("trainLat: ",typeof record.get("trainLat"));if(record.get("trainLat")!=="")
{var trainNumber=record.get("train.number");runningTrainNumbers[trainNumber]=true;console.log("Updating Train "+trainNumber);var pos=new GLatLng(record.get("trainLat"),record.get("trainLong"));if(this.trainMarkers[trainNumber])
{this.trainMarkers[trainNumber].setLatLng(pos);this.trainMarkers[trainNumber].trainRunRecordData=record.data;}
else
{var markerOptions={icon:this.normalTrainIcon,title:'Zug '+trainNumber,draggable:false};this.trainMarkers[trainNumber]=new GMarker(pos,markerOptions);this.trainMarkers[trainNumber].trainRunRecordData=record.data;this.gmap.addOverlay(this.trainMarkers[trainNumber]);}}}
if(this.followTrain==true&&this.currentSelectedMarker)
{this.gmap.panTo(this.currentSelectedMarker.getLatLng());}
for(var inTrain in this.trainMarkers)
{var marker=runningTrainNumbers[inTrain];if(typeof marker=="boolean")
{if(marker===true)
{}
else
{this.gmap.removeOverlay(this.trainMarkers[inTrain]);this.trainMarkers[inTrain]=null;}}}}},showAllTrains:function()
{console.log("Showing all trains");var bounds=new GLatLngBounds();for(var trainNumber in this.trainMarkers)
{if(typeof this.trainMarkers[trainNumber]=="object")
bounds.extend(this.trainMarkers[trainNumber].getLatLng());}
this.gmap.setZoom(this.gmap.getBoundsZoomLevel(bounds));this.gmap.setCenter(bounds.getCenter());},selectMarker:function(_marker)
{if(this.currentSelectedMarker)
{this.currentSelectedMarker.setImage(this.normalTrainIcon.image);}
this.currentSelectedMarker=_marker;this.currentSelectedMarker.setImage(this.selectedTrainIcon.image);},selectTrain:function(_trainNumber)
{if(this.trainMarkers[_trainNumber])
{this.selectMarker(this.trainMarkers[_trainNumber]);this.onMarkerClick(this.trainMarkers[_trainNumber]);}},toggleFollowTrain:function(_button,_followTrain)
{this.followTrain=_followTrain;},setTrainView:function(_trainView)
{this.trainView=_trainView;}});Ext.reg('diloc-trainmap',diloc.rail.TrainMap);

Ext.namespace("diloc","diloc.rail","diloc.rail.util");diloc.rail.TrainRouteGrid=Ext.extend(Ext.grid.EditorGridPanel,{autoLoadData:true,doAutoLoad:true,loadMask:{msg:'Lade Zug-Fahrplan...'},trainId:null,clicksToEdit:2,stationInEdit:false,selModel:new Ext.grid.RowSelectionModel({moveEditorOnEnter:false}),frame:false,border:false,isActive:false,viewConfig:{emptyText:'Bitte wählen Sie einen Zug aus, um dessen Fahrplan zu bearbeiten.'},stripeRows:true,currentMode:'',startDate:0,endDate:0,trainAttributeStore:null,initComponent:function()
{this.addEvents("trainrouteexceptioncreated","trainroutecreated");this.store=null;this.reader=null;this.currentTrainRecord=null;this.tbar=new Ext.Toolbar({items:[{text:'Fahrplan anlegen',iconCls:'trg-create',menu:{items:[{text:'Leerer Fahrplan',iconCls:'trg-empty',handler:this.createEmpty,scope:this},{text:'Von ähnlichem Zug...',iconCls:'trg-train',handler:this.createFromTrain,scope:this},{text:'Von Zuglauf...',iconCls:'trg-trainrun',handler:this.createFromTrainRun,scope:this}]}},{text:'Fahrplan bearbeiten',iconCls:'trg-edit',menu:{items:[{text:'Kopie erzeugen',iconCls:'trg-copy',handler:this.editCopy,scope:this},{text:'Leerer Fahrplan',iconCls:'trg-empty',handler:this.editEmpty,scope:this}]},hidden:true},{tooltip:'Neue Station einfügen',iconCls:'trg-add',handler:this.createRow,scope:this,disabled:true},{tooltip:'Station löschen',iconCls:'trg-delete',handler:this.deleteRow,scope:this,disabled:true},{text:'Haltezeit aller Stationen ...',iconCls:'trg-setstays',menu:{items:[{text:'auf 1 Minute setzen ',handler:this.setStayDurations.createDelegate(this,[1]),scope:this},{text:'auf 2 Minuten setzen',handler:this.setStayDurations.createDelegate(this,[2]),scope:this},{text:'auf 3 Minuten setzen',handler:this.setStayDurations.createDelegate(this,[3]),scope:this},{text:'auf 4 Minuten setzen',handler:this.setStayDurations.createDelegate(this,[4]),scope:this},{text:'auf 5 Minuten setzen',handler:this.setStayDurations.createDelegate(this,[5]),scope:this}]},disabled:true},'-',{text:'Mehr Spalten anzeigen',enableToggle:true,toggleHandler:this.toggleDetails,pressed:true,scope:this,ref:"../detailsButton"}]});this.defineButtonReferences();var messageGridReader=new Ext.data.JsonReader({fields:[{name:'id'},{name:'station'},{name:'stationId'},{name:'time'},{name:'stayDuration'},{name:'ttTime'},{name:'ttDepartureTime'},{name:'stayType'},{name:'dontBoard'},{name:'trainRouteId'},{name:'arrivalTrack'},{name:'departureTrack'},{name:'departureFrontStationTrainAttributeId'},{name:'departureMiddleStationTrainAttributeId'},{name:'departureBackStationTrainAttributeId'},{name:'arrivalFrontStationTrainAttributeId'},{name:'arrivalMiddleStationTrainAttributeId'},{name:'arrivalBackStationTrainAttributeId'}],root:'data',id:'id',totalProperty:'totalCount'});var storeConfig={reader:messageGridReader,url:gwf.App.backendUrl("trainroute","stations",{id:0}),sortInfo:{field:'time',direction:'ASC'}};this.store=new Ext.data.Store(storeConfig);attributeComboConfig={store:Ext.StoreMgr.lookup('trainAttributeStore'),mode:'local',lazyRender:true,typeAhead:true,forceSelection:true,editable:true,triggerAction:'all',displayField:'idCode',valueField:'id'};var dontBoardColumn=new diloc.rail.TrainRouteGridCheckColumn({header:'NE',tooltip:'Nicht einsteigen',dataIndex:'dontBoard',width:30});this.cm=new Ext.grid.ColumnModel([{header:'St.-Kürzel',dataIndex:'station',renderer:this.stationCodeRenderer.createDelegate(this),width:70,editor:new diloc.rail.formfields.GridStationField({validationDelay:20,parentGrid:this,fieldName:'station',saveStationFunction:this.saveStation.createDelegate(this)})},{header:'St.-Name',dataIndex:'station',width:130,renderer:this.stationNameRenderer.createDelegate(this)},{header:'Halte-Typ',dataIndex:'stayType',width:60,renderer:this.stayTypeRenderer.createDelegate(this),editor:new Ext.form.ComboBox({forceSelection:true,local:true,triggerAction:'all',store:[[0,'D - Durchfahrt'],[1,'H - Halt'],[2,'B - Bedingter Halt'],[3,'A - Außerordentlicher Halt']],listAlign:'tr-br',listWidth:150})},dontBoardColumn,{header:'Ankunft',dataIndex:'time',renderer:this.renderArrival.createDelegate(this,['H:i:s'],true),width:70,editor:new diloc.rail.formfields.TrainRouteArrivalTimeField({validationDelay:20,trainRouteGrid:this})},{header:'KB-Ankunft',dataIndex:'ttTime',tooltip:'Kursbuch-Ankunft',renderer:this.renderTtTime.createDelegate(this,['H:i'],true),width:70,editor:new diloc.rail.formfields.TrainRouteTtTimeField({format:'H:i',displayFormat:'H:i',dataFormat:'H:i',validationDelay:20,trainRouteGrid:this}),hidden:true},{header:'Gleis',dataIndex:'arrivalTrack',renderer:this.trackRenderer.createDelegate(this,['arrivalTrack'],true),width:50,editor:new Ext.form.TextField()},{header:'Spitze',dataIndex:'arrivalFrontStationTrainAttributeId',renderer:this.trainAttributeRenderer.createDelegate(this,['arrivalFrontStationTrainAttributeId'],true),editor:new Ext.form.ComboBox(attributeComboConfig),width:50,hidden:true},{header:'Mitte',dataIndex:'arrivalMiddleStationTrainAttributeId',renderer:this.trainAttributeRenderer.createDelegate(this,['arrivalMiddleStationTrainAttributeId'],true),editor:new Ext.form.ComboBox(attributeComboConfig),width:50,hidden:true},{header:'Schluss',dataIndex:'arrivalBackStationTrainAttributeId',renderer:this.trainAttributeRenderer.createDelegate(this,['arrivalBackStationTrainAttributeId'],true),editor:new Ext.form.ComboBox(attributeComboConfig),width:50,hidden:true},{header:'Abfahrt',dataIndex:'stayDuration',renderer:this.renderDeparture.createDelegate(this,['H:i:s'],true),width:70,editor:new diloc.rail.formfields.TrainRouteDepartureTimeField({validationDelay:20,trainRouteGrid:this})},{header:'KB-Abfahrt',tooltip:'Kursbuch-Abfahrt',dataIndex:'ttDepartureTime',renderer:this.renderTtTime.createDelegate(this,['H:i'],true),width:70,editor:new diloc.rail.formfields.TrainRouteTtTimeField({format:'H:i',displayFormat:'H:i',dataFormat:'H:i',validationDelay:20,trainRouteGrid:this})},{header:'Gleis',dataIndex:'departureTrack',renderer:this.trackRenderer.createDelegate(this,['departureTrack'],true),width:50,editor:new Ext.form.TextField()},{header:'Spitze',dataIndex:'departureFrontStationTrainAttributeId',renderer:this.trainAttributeRenderer.createDelegate(this,['departureFrontStationTrainAttributeId'],true),editor:new Ext.form.ComboBox(attributeComboConfig),width:50},{header:'Mitte',dataIndex:'departureMiddleStationTrainAttributeId',renderer:this.trainAttributeRenderer.createDelegate(this,['departureMiddleStationTrainAttributeId'],true),editor:new Ext.form.ComboBox(attributeComboConfig),width:50},{header:'Schluss',dataIndex:'departureBackStationTrainAttributeId',renderer:this.trainAttributeRenderer.createDelegate(this,['departureBackStationTrainAttributeId'],true),editor:new Ext.form.ComboBox(attributeComboConfig),width:50}]);var gridPanelOptions={plugins:[new Ext.ux.grid.ColumnHeaderGroup({rows:[[{colspan:4},{header:'Ankunft',colspan:6,align:'center'},{header:'Abfahrt',colspan:6,align:'center'}]],hierarchicalColMenu:true}),dontBoardColumn],viewConfig:{getRowClass:function(_record)
{if(_record.data.arrivalFrontStationTrainAttributeId||_record.data.arrivalMiddleStationTrainAttributeId||_record.data.arrivalBackStationTrainAttributeId||_record.data.departureFrontStationTrainAttributeId||_record.data.departureMiddleStationTrainAttributeId||_record.data.departureBackStationTrainAttributeId)
{return'highlight';}
else return'';}}};Ext.apply(this,gridPanelOptions);this.on("beforeedit",this.onBeforeEdit,this);this.on("afteredit",this.onAfterEdit,this);this.on("afterrender",this.onAfterRender,this);this.store.on("load",this.onStoreLoad,this);return diloc.rail.TrainRouteGrid.superclass.initComponent.call(this);},setTrainAttributeStore:function(_trainAttributeStore)
{console.log("TrainAttribute-Store is:",_trainAttributeStore);this.trainAttributeStore=_trainAttributeStore;},onAfterRender:function()
{this.defineButtonReferences();var cm=this.getColumnModel();if(cm.isHidden(14))
{this.detailsButton.toggle(false,true);this.setParentLayoutWidth.defer(500,this,[575]);}
else
{this.setParentLayoutWidth.defer(500,this,[755]);}},setParentLayoutWidth:function(_width)
{this.ownerCt.ownerCt.layout.east.getSplitBar().setCurrentSize(_width);this.ownerCt.ownerCt.doLayout();},toggleDetails:function(_button,_state)
{var detailsColumns=[3,13,14,15];console.log(this.ownerCt);if(_state==true)
{this.setParentLayoutWidth(755);var cm=this.getColumnModel();for(var i=0;i<detailsColumns.length;i++)cm.setHidden(detailsColumns[i],false);}
else
{this.setParentLayoutWidth(575);var cm=this.getColumnModel();for(var i=0;i<detailsColumns.length;i++)cm.setHidden(detailsColumns[i],true);}},defineButtonReferences:function()
{console.info("TopToolbar:",this.getTopToolbar());if(this.getTopToolbar()&&this.getTopToolbar().items)
{var tb=this.getTopToolbar();this.createButton=tb.items.items[0];this.editButton=tb.items.items[1];this.addRowButton=tb.items.items[2];this.deleteRowButton=tb.items.items[3];this.setTimeButton=tb.items.items[4];this.detailsButton=tb.items.items[6];}},reset:function(_mode,_startDate,_endDate)
{console.info("TrainRouteGrid was resetted to ",arguments);if(_mode)this.currentMode=_mode;this.changeToolbar("nothing");this.view.emptyText="Bitte wählen Sie einen Zug aus, um dessen Fahrplan zu bearbeiten.";this.store.removeAll();if(_startDate)this.startDate=_startDate;if(_endDate)this.endDate=_endDate;this.setTitle("Fahrplan");},setStayDurations:function(_minutes)
{var seconds=_minutes*60;this.store.each(function(_record){_record.set('stayDuration',seconds);var event={value:seconds,field:'stayDuration',record:_record};this.onAfterEdit(event);},this);},createEmpty:function()
{var emptyCreator=new gwf.helpers.ActionExecutor({successSilent:true});emptyCreator.on("success",function(_result){this.currentTrainRecord.data.trainRouteId=_result.data.id;var view=this.getView();view.emptyText="Der Fahrplan enthält noch keine Stationen, sie können jetzt neue Stationen hinzufügen.";view.refresh();this.fireEvent("trainroutecreated");this.changeToolbar("trainrouteeditable");},this);emptyCreator.execute("train","createTrainRoute",{id:this.currentTrainRecord.data.id},"!Lege Fahrplan an...");},editEmpty:function()
{var message="Es wird ein leerer Ausnahmefahrplan für <b>"+Date.parseDate(this.startDate,"Y-m-d").format("l, \\d\\e\\n d.m.Y")+"</b> angelegt!<br/><br/>Möchten Sie fortfahren?";if(this.currentMode=="exception-week")
{message=addonText="Es wird ein leerer Ausnahmefahrplan für die Zeit zwischen dem <b>"+Date.parseDate(this.startDate,"Y-m-d").format("d.m.Y")+" und "+Date.parseDate(this.endDate,"Y-m-d").format("d.m.Y")+"</b> angelegt!<br/><br/>Möchten Sie fortfahren?";}
Ext.MessageBox.show({title:'Ausnahmefahrplan anlegen?',msg:message,buttons:{ok:'Ausnahmefahrplan anlegen',cancel:'Abbrechen'},icon:Ext.MessageBox.WARNING,fn:function(_button)
{if(_button=='ok')
{var emptyCreator=new gwf.helpers.ActionExecutor({successSilent:true});emptyCreator.on("success",function(_result)
{this.currentTrainRecord.data.trainRouteId=_result.data.id;this.currentTrainRecord.data.trainRouteIdColor+=this.currentMode.substr(10);this.currentTrainRecord.data.status=this.mergeStatus(this.currentTrainRecord.data.status,this.currentMode.substr(10));this.fireEvent("trainrouteexceptioncreated");var view=this.getView();view.emptyText="Der Fahrplan enthält noch keine Stationen, sie können jetzt neue Stationen hinzufügen.";this.store.removeAll();view.refresh();this.changeToolbar("trainrouteeditable");},this);emptyCreator.execute("train","createTrainRoute",{id:this.currentTrainRecord.data.id,startDate:this.startDate,endDate:this.endDate},"!Lege Ausnahmefahrplan an...");}},scope:this});},editCopy:function(_doRightAway)
{if(_doRightAway==true)this.editCopyDo('ok');else
{var message="Es wird ein Ausnahmefahrplan für <b>"+Date.parseDate(this.startDate,"Y-m-d").format("l, \\d\\e\\n d.m.Y")+"</b> als Kopie vom aktuellen Fahrplan angelegt!<br/><br/>Möchten Sie fortfahren?";if(this.currentMode=="exception-week")
{message=addonText="Es wird ein Ausnahmefahrplan für die Zeit zwischen dem <b>"+Date.parseDate(this.startDate,"Y-m-d").format("d.m.Y")+" und "+Date.parseDate(this.endDate,"Y-m-d").format("d.m.Y")+"</b> als Kopie vom aktuellen Fahrplan angelegt!<br/><br/>Möchten Sie fortfahren?";}
Ext.MessageBox.show({title:'Ausnahmefahrplan anlegen?',msg:message,buttons:{ok:'Ausnahmefahrplan anlegen',cancel:'Abbrechen'},icon:Ext.MessageBox.WARNING,fn:this.editCopyDo,scope:this});}},editCopyDo:function(_button)
{if(_button=='ok')
{this.store.proxy.conn.url=gwf.App.backendUrl("train","createTrainRoute",{id:this.currentTrainRecord.data.id});this.nextLoadIsCreate=true;this.store.load({params:{trainRouteId:this.currentTrainRecord.data.trainRouteId,startDate:this.startDate,endDate:this.endDate}});this.changeToolbar("trainrouteeditable");}},createRow:function()
{var createTrainRouteStation=new gwf.helpers.ActionExecutor({successSilent:true});var selectedRecord=this.getSelectionModel().getSelected();if(selectedRecord)
{this.insertRow=this.store.indexOf(selectedRecord)+1;}
else
{this.insertRow=this.store.getCount();}
createTrainRouteStation.on("success",function(_result){this.store.insert(this.insertRow,new Ext.data.Record({data:_result.data,id:_result.data.id}));this.startEditing(this.insertRow,0);},this);createTrainRouteStation.execute("trainroutestation","create",{trainRouteId:this.currentTrainRecord.data.trainRouteId,stationId:0},"!Füge Station hinzu...");},changeToolbar:function(_mode)
{if(!this.createButton)
{this.defineButtonReferences();if(!this.createButton)return;}
console.info("Changing toolbar to: "+_mode);if(_mode=="nothing")
{this.createButton.show();this.createButton.disable();this.editButton.hide();this.addRowButton.disable();this.deleteRowButton.disable();this.setTimeButton.disable();}
if(_mode=="notrainrouteavailable")
{this.createButton.show();this.createButton.enable();this.editButton.hide();this.addRowButton.disable();this.deleteRowButton.disable();this.setTimeButton.disable();}
if(_mode=="trainroute")
{this.createButton.hide();this.editButton.show();this.addRowButton.disable();this.deleteRowButton.disable();this.setTimeButton.disable();this.isReadOnly=true;}
if(_mode=="trainrouteeditable")
{this.createButton.hide();this.editButton.hide();this.addRowButton.enable();this.deleteRowButton.enable();this.setTimeButton.enable();this.isReadOnly=false;}
if(_mode=="trainrouteeditabledisabled")
{this.createButton.hide();this.editButton.hide();this.addRowButton.disable();this.deleteRowButton.disable();this.setTimeButton.disable();this.isReadOnly=false;}
if(_mode=="readonly")
{console.log("We entered read-only mode because of rights!");this.createButton.hide();this.editButton.hide();this.addRowButton.disable();this.deleteRowButton.disable();this.setTimeButton.disable();this.isReadOnly=true;}},deleteRow:function(_record,_mode)
{var deleteTrainRouteStation=new gwf.helpers.ActionExecutor({successSilent:true});var record=null;if(_mode=='deleteRecord')record=_record;else record=this.getSelectionModel().getSelected();if(record)
{deleteTrainRouteStation.on("success",function(_result){this.store.remove(record);},this);deleteTrainRouteStation.execute("trainroutestation","delete",{id:record.get("id")},"!Lösche Station...");}},setTrainRecord:function(_trainRecord)
{if(!this.currentTrainRecord)this.loadOnActive=true;if(this.currentTrainRecord&&this.currentTrainRecord.data.id!=_trainRecord.data.id)
{this.loadOnActive=true;}
this.currentTrainRecord=_trainRecord;this.trainDepartureTime=Date.parseDate(this.currentTrainRecord.data.departureTime,"H:i:s");this.trainTtDepartureTime=Date.parseDate(this.currentTrainRecord.data.ttDepartureTime,"H:i:s");if(this.isActive)this.loadDefaultTrainRoute();this.stationInEdit=false;},refresh:function(_fieldName,_trainRecord)
{if(_fieldName&&_fieldName=="trainRouteId")
{if(_trainRecord)this.currentTrainRecord=_trainRecord;this.loadDefaultTrainRoute();}
else
{if(_trainRecord)this.currentTrainRecord=_trainRecord;this.trainDepartureTime=Date.parseDate(this.currentTrainRecord.data.departureTime,"H:i:s");this.trainTtDepartureTime=Date.parseDate(this.currentTrainRecord.data.ttDepartureTime,"H:i:s");this.updateToolbarFromCurrentState();this.getView().refresh();}},updateToolbarFromCurrentState:function()
{if(this.currentTrainRecord.data.trainRouteId)
{console.log("Current mode and trainRouteIdColor is: ",this.currentMode,this.currentTrainRecord.data.trainRouteIdColor);if(this.currentTrainRecord.data.trainRouteIdColor&&this.currentTrainRecord.data.trainRouteIdColor.indexOf("week")>=0&&this.currentMode=="exception-week")
{this.changeToolbar("trainrouteeditable");}
else if(this.currentTrainRecord.data.trainRouteIdColor&&this.currentTrainRecord.data.trainRouteIdColor.indexOf("day")>=0&&this.currentMode=="exception-day")
{this.changeToolbar("trainrouteeditable");}
else if(this.currentMode=="standard-week"||this.currentMode=="standard-day")
{if(!this.currentTrainRecord.data.locked)this.changeToolbar("trainrouteeditable");else this.changeToolbar("readonly");}
else
{this.changeToolbar("trainroute");}}
else
{if(this.currentMode.startsWith("exception"))
{this.view.emptyText="Kein Zug-Fahrplan vorhanden. Wechseln Sie zur Standardwoche um einen anzulegen.";this.changeToolbar("nothing");this.store.removeAll();this.view.refresh.defer(10,this.view);}
else
{this.view.emptyText="Kein Zug-Fahrplan vorhanden. Klicken Sie auf <b>Fahrplan anlegen</b> um einen Fahrplan zu anzulegen.";this.store.loadData({data:[],totalCount:0,success:true});if(!this.currentTrainRecord.data.locked)
this.changeToolbar("notrainrouteavailable");else
{this.view.emptyText="Kein Zug-Fahrplan vorhanden. Da der Zug geschlossen ist, ist das hinzufügen eines Fahrplans nicht mehr möglich.";this.changeToolbar("readonly");}
this.view.refresh.defer(10,this.view);}}},loadDefaultTrainRoute:function()
{this.loadOnActive=false;if(this.rights.write==false)this.changeToolbar("readonly");if(this.currentTrainRecord.data.trainRouteId)
{this.view.emptyText="Der neue Fahrplan enthält noch keine Stationen, sie können jetzt neue Stationen hinzufügen.";this.store.proxy.conn.url=gwf.App.backendUrl("trainroute","stations",{id:this.currentTrainRecord.data.trainRouteId});this.store.load();}
this.updateToolbarFromCurrentState();},setActive:function()
{this.isActive=true;if(this.loadOnActive)
{this.loadDefaultTrainRoute();}
else this.view.refresh();},setInactive:function()
{this.isActive=false;},createFromTrain:function()
{var trainFetcher=new gwf.helpers.ActionExecutor({successSilent:true});trainFetcher.on("success",function(_result){this.chooseData=_result.data;if(this.chooseData.length==0)
{Ext.MessageBox.alert("Fahrplan anlegen","Keine ähnlichen Züge mit einem Fahrplan für Zug "+this.currentTrainRecord.data.number+" gefunden.");}
else
{for(var i=0;i<this.chooseData.length;i++)
{this.chooseData[i].text="Zug "+this.chooseData[i].number+", Abfahrt "+Date.parseDate(this.chooseData[i].departureTime,"H:i:s").format("H:i")+" Uhr";}
this.chooseDialog=new diloc.rail.dialogs.Chooser({selectOptions:this.chooseData,title:'Zug auswählen',description:'Wählen Sie einen der folgenden Züge aus:'});this.chooseDialog.on("optionChosen",function(_optionId)
{this.store.proxy.conn.url=gwf.App.backendUrl("train","createTrainRoute",{id:this.currentTrainRecord.data.id});this.nextLoadIsCreate=true;this.store.load({params:{trainId:_optionId}});this.changeToolbar("trainrouteeditable");},this);this.chooseDialog.show();}},this);trainFetcher.execute("train","similarTrains",{id:this.currentTrainRecord.data.id,limit:5},"!Suche ähnliche Züge...");},createFromTrainRun:function()
{var trainRunFetcher=new gwf.helpers.ActionExecutor({successSilent:true});trainRunFetcher.on("success",function(_result){this.chooseData=_result.data;if(this.chooseData.length==0)
{Ext.MessageBox.alert("Fahrplan anlegen","Keine vorhandenen Zugläufe für Zug "+this.currentTrainRecord.data.number+" gefunden.");}
else
{for(var i=0;i<this.chooseData.length;i++)
{this.chooseData[i].text="Zug "+this.currentTrainRecord.data.number+" vom "+Date.parseDate(this.chooseData[i].departureTime,"Y-m-d H:i:s").format("d. F Y");}
this.chooseDialog=new diloc.rail.dialogs.Chooser({selectOptions:this.chooseData,title:'Zuglauf auswählen',description:'Wählen Sie einen der folgenden Zugläufe aus:'});this.chooseDialog.on("optionChosen",function(_optionId)
{this.store.proxy.conn.url=gwf.App.backendUrl("train","createTrainRoute",{id:this.currentTrainRecord.data.id});this.nextLoadIsCreate=true;this.store.load({params:{trainRunId:_optionId}});this.changeToolbar("trainrouteeditable");},this);this.chooseDialog.show();}},this);trainRunFetcher.execute("train","newestTrainRuns",{id:this.currentTrainRecord.data.id,limit:5},"!Suche Zugläufe...");},saveStation:function(_id)
{this.onAfterEdit({record:this.currentEditorRecord,field:'stationId',value:_id});},onStoreLoad:function(_store,_records)
{if(this.nextLoadIsCreate)
{if(_records[0])
{this.currentTrainRecord.data.trainRouteId=_records[0].data.trainRouteId;if(this.currentMode.startsWith("exception"))
{if(!this.currentTrainRecord.data.trainRouteIdColor)this.currentTrainRecord.data.trainRouteIdColor="";this.currentTrainRecord.data.trainRouteIdColor+=this.currentMode.substr(10);this.currentTrainRecord.data.status=this.mergeStatus(this.currentTrainRecord.data.status,this.currentMode.substr(10));this.fireEvent("trainrouteexceptioncreated");}
else
{this.fireEvent("trainroutecreated");}}
this.nextLoadIsCreate=false;}},mergeStatus:function(oldStatus,addonStatus)
{var newStatus=oldStatus;if(oldStatus==null||typeof oldStatus=="undefined"||oldStatus=="")
{newStatus="exception"+addonStatus;}
else if(addonStatus=="day")
{if(oldStatus=="exceptionparentweek")newStatus="exceptiondayparentweek";}
else if(addonStatus=="week")
{if(oldStatus=="subday")newStatus="exceptionweeksubday";}
return newStatus;},onBeforeEdit:function(_event)
{if(this.isReadOnly==true)_event.cancel=true;if(_event.record.data.stayType==0&&(_event.field=="stayDuration"||_event.field=="ttDepartureTime"||_event.field.indexOf("departure")>=0))_event.cancel=true;if(this.stationInEdit==true)
{if(_event.field!="station"||_event.record!=this.currentEditorRecord)
{_event.cancel=true;}}
else
{if(_event.field=="station")
{}
this.currentEditorRecord=_event.record;}},onAfterEdit:function(_event)
{if(_event.field!="station")
{var id=_event.record.get('id');var value=_event.value;var field=_event.field;var data={id:id};data[field]=_event.value;if(_event.value==null)data[field]='null';var saveExecutor=new gwf.helpers.ActionExecutor({successSilent:true});saveExecutor.on("success",this.onUpdateTrainRouteStationSuccess.createDelegate(this,[field],true));saveExecutor.execute("trainroutestation","update",data,"Speichere Halt",_event.record);}
else
{if(_event.originalValue!="_E_")
this.stationInEdit=true;if(_event.value=="")
{_event.record.set("station.idCode",_event.originalValue);_event.record.commit();this.stationInEdit=false;}
console.log("afteredit!",_event,this.currentEditorRecord.get('station.idCode'));if(_event.value==this.currentEditorRecord.get('station.idCode'))
{this.stationInEdit=false;}}},onUpdateTrainRouteStationSuccess:function(_result,_record,_fieldName)
{this.stationInEdit=false;console.log("Modified:",_record.modified,_result.data[_fieldName]);_record.data[_fieldName]=_result.data[_fieldName];if(_record.isModified('time'))
{this.store.sort('time','ASC');}
_record.commit();},containsStationId:function(_stationId)
{var recordIndex=this.store.findExact("stationId",_stationId);console.log("Checking for station id",_stationId,recordIndex);if(recordIndex==-1)return false;else return true;},cutFromStationId:function(_stationId)
{var recordIndex=this.store.findExact("stationId",_stationId);if(recordIndex>=0)
{var record=this.store.getAt(recordIndex);var minTime=record.get('time');this.store.each(function(_record){console.log("Checking if record needs to be deleted:",_record.data,minTime);if(_record.data.time>=minTime)
{this.deleteRow(_record,'deleteRecord');}},this);if(record.get('arrivalTrack'))var track=record.get('arrivalTrack');else var track=record.get('departureTrack');return{travelTime:minTime,arrivalTrack:track};}
else return{travelTime:-1,arrivalTrack:-1};},cutToStationId:function(_stationId)
{var recordIndex=this.store.findExact("stationId",_stationId);if(recordIndex>=0)
{var record=this.store.getAt(recordIndex);var maxTime=record.get('time');var stayTime=0;if(record.get('stayType')==1||record.get('stayType')==2)
{stayTime=record.get('stayDuration')||0;}
if(record.get('ttDepartureTime'))
{var maxTtDepartureTime=record.get('ttDepartureTime');}
else
{var maxTtDepartureTime=maxTime+stayTime;}
this.store.each(function(_record){console.log("Checking if record needs to be deleted:",_record.data,maxTime);if(_record.data.time<=maxTime)
{this.deleteRow(_record,'deleteRecord');}
else
{if(_record.get('ttTime'))
{var newTtTime=_record.get('ttTime')-maxTtDepartureTime;_record.set('ttTime',newTtTime);this.onAfterEdit({field:'ttTime',value:newTtTime,record:_record});}
if(_record.get('ttDepartureTime'))
{var newTtDepartureTime=_record.get('ttDepartureTime')-maxTtDepartureTime;_record.set('ttDepartureTime',newTtDepartureTime);this.onAfterEdit({field:'ttDepartureTime',value:newTtDepartureTime,record:_record});}
var newTime=_record.get('time')-maxTime-stayTime;_record.set('time',newTime);this.onAfterEdit({field:'time',value:newTime,record:_record});}},this);if(record.get('departureTrack'))var track=record.get('departureTrack');else var track=record.get('arrivalTrack');return{travelTime:maxTime+stayTime,departureTrack:track,ttTravelTime:maxTtDepartureTime};}
else return{travelTime:-1,departureTrack:-1,ttTravelTime:-1};},renderArrival:function(_value,_meta,_record,_rowIndex,_colIndex,_store,_format)
{if(this.isReadOnly==true)_meta.css="disabled";var prefix="";var suffix="";if(this.currentTrainRecord.data.travelTime<=_value)
{prefix='<div ext:qtitle="Warnung" ext:qtip="Ankunftszeit später als Ankunftszeit des Zuges!">';_meta.css="bogus";suffix="</div>";}
if(_value==null)return"";else return prefix+this.trainDepartureTime.add(Date.SECOND,_value).format(_format)+suffix;},renderDeparture:function(_value,_meta,_record,_rowIndex,_colIndex,_store,_format)
{if(this.isReadOnly==true)_meta.css="disabled";if(_record.data.stayType==0)return"-";var prefix="";var suffix="";if(this.currentTrainRecord.data.travelTime<=_record.get("time")+_value)
{prefix='<div ext:qtitle="Warnung" ext:qtip="Abfahrtszeit später als Ankunftszeit des Zuges!">';_meta.css="bogus";suffix="</div>";}
if(_value==null)return"";else return prefix+this.trainDepartureTime.add(Date.SECOND,_record.get("time")+_value).format(_format)+suffix;},renderTtTime:function(_value,_meta,_record,_rowIndex,_colIndex,_store,_format)
{if(this.isReadOnly==true)_meta.css="disabled";if(_record.data.stayType==0)return"-";var prefix="";var suffix="";if(this.currentTrainRecord.data.travelTime<=_value)
{prefix='<div ext:qtitle="Warnung" ext:qtip="Zeit später als Ankunftszeit des Zuges!">';_meta.css="bogus";suffix="</div>";}
if(_value==null)return"";else return prefix+this.trainTtDepartureTime.add(Date.SECOND,_value).format(_format)+suffix;},stationCodeRenderer:function(value,metaData,record,_rowIndex,_colIndex,_store,_fieldName)
{if(this.isReadOnly==true)metaData.css="disabled";if(!value)return'';var values=value.split("|");if(record.data[_fieldName+'Color'])metaData.css=record.data[_fieldName+'Color'];if(values.length>0)
{if(values[1]=="_E_")return"";else return values[1];}
else
return value;},stationNameRenderer:function(_value,_meta,_record,_rowIndex,_colIndex,_store,_fieldName)
{if(this.isReadOnly==true)_meta.css="disabled ";if(!_value)return'';var value=_value.split("|")[2];_meta.css+="station-name";if(value=="__error")
{_meta.attr='style="background-image:url(images/icons/silk/cancel.png);"';return _value.split("|")[1]+" nicht gefunden.";}
else if(value=="__loading")
{_meta.attr='style="background-image:url(images/icons/custom/black-load.gif);"';return"Lade...";}
else
{if(_record.modified&&_record.modified[_fieldName])
_meta.attr='style="background-image:url(images/icons/silk/accept.png);"';else
_meta.attr='style="background-image:url(images/icons/silk_disabled/accept.png);"';return value;}
return value;},trackRenderer:function(_value,_meta,_record,_rowIndex,_colIndex,_store,_fieldName)
{if(this.isReadOnly==true)_meta.css="disabled";if(_fieldName=="departureTrack"&&_record.data.stayType==0)return"-";return _value;},stayTypeRenderer:function(_value,_meta,_record,_rowIndex,_colIndex,_store,_fieldName)
{if(this.isReadOnly==true)_meta.css="disabled";var stayTypes=['D','H','B','A'];if(_value!==null)return stayTypes[_value];else return"-";},trainAttributeRenderer:function(_value,_meta,_record,_rowIndex,_colIndex,_store,_fieldName)
{if(this.isReadOnly==true)_meta.css="disabled";if(_value==null)return"-";if(_fieldName.indexOf("departure")>=0&&_record.data.stayType==0)return"-";var attributeRecord=this.trainAttributeStore.getById(_value);if(attributeRecord)return attributeRecord.get('idCode');else return"-";}});Ext.reg('diloc-trainroutegrid',diloc.rail.TrainRouteGrid);diloc.rail.TrainRouteGridCheckColumn=function(config){Ext.apply(this,config);if(!this.id){this.id=Ext.id();}
this.renderer=this.renderer.createDelegate(this);};diloc.rail.TrainRouteGridCheckColumn.prototype={init:function(grid){this.grid=grid;this.grid.on('render',function(){var view=this.grid.getView();view.mainBody.on('mousedown',this.onMouseDown,this);},this);},onMouseDown:function(e,t){if(t.className&&t.className.indexOf('x-grid3-cc-'+this.id)!=-1){if(this.grid.isReadOnly==true||t.className.indexOf('disabled')>0)
{e.stopEvent();return;}
else
{e.stopEvent();var index=this.grid.getView().findRowIndex(t);var record=this.grid.store.getAt(index);record.set(this.dataIndex,!record.data[this.dataIndex]);this.grid.onAfterEdit({field:this.dataIndex,value:record.data[this.dataIndex],record:record});}}},renderer:function(v,p,record){p.css+=' x-grid3-check-col-td';var tooltip='';var classAdd='';if(this.grid.isReadOnly==true)classAdd=' disabled';return'<div '+tooltip+' class="diloc-check-grid '+
(v?'on':'')+classAdd+' x-grid3-cc-'+
this.id+'"> </div>';}};

Ext.namespace("diloc","diloc.rail","diloc.rail.util");diloc.rail.RunningTrainRouteGrid=Ext.extend(Ext.grid.EditorGridPanel,{loadMask:{msg:'Lade Zug-Fahrplan...'},trainId:null,clicksToEdit:2,selModel:new Ext.grid.RowSelectionModel(),frame:false,border:false,isActive:false,viewConfig:{emptyText:'Bitte wählen Sie einen Zug aus, damit Daten angezeigt werden können.'},stripeRows:true,initComponent:function()
{this.store=null;this.reader=null;this.currentTrainRecord=null;var gridReader=new Ext.data.ArrayReader({fields:[{name:'id'},{name:'station'},{name:'stayType'},{name:'arrivalMessageId'},{name:'arrivalTime'},{name:'arrivalLatenessCode'},{name:'arrivalInfoText'},{name:'arrivalAttachment'},{name:'arrivalDone'},{name:'departureMessageId'},{name:'departureTime'},{name:'departureLatenessCode'},{name:'departureInfoText'},{name:'departureAttachment'},{name:'departureDone'}],root:'data',idIndex:0,totalProperty:'totalCount'});var storeConfig={reader:gridReader};this.store=new Ext.data.Store(storeConfig);var infoTextArrival={header:'Info-Text',dataIndex:'arrivalInfoText'};var infoTextDeparture={header:'Info-Text',dataIndex:'departureInfoText'};if(this.rights.write)
{infoTextArrival.editor=new Ext.form.TextField({maxLength:32,maxLengthText:'Die maximal-länge für den Info-Text is 32 Zeichen!',validationDelay:20});infoTextDeparture.editor=new Ext.form.TextField({maxLength:32,maxLengthText:'Die maximal-länge für den Info-Text is 32 Zeichen!',validationDelay:20});}
this.cm=new Ext.grid.ColumnModel({defaults:{sortable:false},columns:[{header:'Name',dataIndex:'station',renderer:this.stationRenderer,width:200},{header:'Halt-Typ',dataIndex:'stayType',renderer:this.stayTypeRenderer,width:60},{header:'Zeit',dataIndex:'arrivalTime',renderer:this.arrivalTimeRenderer,width:120},{header:'VCode',tooltip:'Verspätungs-Code',dataIndex:'arrivalLatenessCode',renderer:diloc.rail.util.latenessCodeRenderer,width:50},infoTextArrival,{header:'A',dataIndex:'arrivalAttachment',width:20,tooltip:'Anhang',renderer:diloc.rail.util.attachmentRenderer},{header:'Zeit',dataIndex:'departureTime',renderer:this.departureTimeRenderer,width:120},{header:'VCode',tooltip:'Verspätungs-Code',dataIndex:'departureLatenessCode',renderer:diloc.rail.util.latenessCodeRenderer,width:50},infoTextDeparture,{header:'A',dataIndex:'departureAttachment',tooltip:'Anhang',width:20,renderer:diloc.rail.util.attachmentRenderer}]});var gridPanelOptions={plugins:[new Ext.ux.grid.ColumnHeaderGroup({rows:[[{header:'Station',colspan:2,align:'center'},{header:'Ankunft',colspan:4,align:'center'},{header:'Abfahrt',colspan:4,align:'center'}]],hierarchicalColMenu:true})]};Ext.apply(this,gridPanelOptions);this.on("beforeedit",this.onBeforeEdit,this);this.on("afteredit",this.onAfterEdit,this);this.on("validateedit",this.onValidateEdit,this);this.on("celldblclick",this.onCellDoubleClick,this);return diloc.rail.RunningTrainRouteGrid.superclass.initComponent.call(this);},onBeforeEdit:function(_info)
{if(_info.field=="departureInfoText")
{if(_info.record.get('departureMessageId')==null)return false;}
if(_info.field=="arrivalInfoText")
{if(_info.record.get('arrivalMessageId')==null)return false;}},onAfterEdit:function(_info)
{console.log("afteredit!",_info);var id=-1;if(_info.field=="arrivalInfoText")id=_info.record.get('arrivalMessageId');if(_info.field=="departureInfoText")id=_info.record.get('departureMessageId');var infoText=_info.value;if(infoText=="")infoText="       ";var saveExecutor=new gwf.helpers.ActionExecutor({successSilent:true});saveExecutor.on("success",function(_data,_record){_record.commit();this.currentTrain.updateTrainRunMessageInfoText(id,infoText);},this);saveExecutor.execute("trainrunmessages","setInfoText",{id:id,infoText:infoText},"Speichere Info-Text",_info.record);},onValidateEdit:function(_info)
{if(_info.value==""&&_info.originalValue==null)return false;if(_info.value==null&&_info.originalValue==null)return false;if(_info.value==null)return false;return true;},onCellDoubleClick:function(_grid,_rowIndex,_columnIndex,_event)
{var record=_grid.getStore().getAt(_rowIndex);var fieldName=_grid.getColumnModel().getDataIndex(_columnIndex);var messageId=-1;var attachmentAvailable=record.get(fieldName);var idFieldName="";if(fieldName=="arrivalAttachment"){messageId=record.get('arrivalMessageId');idFieldName='arrivalMessageId';}
if(fieldName=="departureAttachment")
{messageId=record.get('departureMessageId');idFieldName='departureMessageId';}
if(messageId>0)
{if(attachmentAvailable==true||(this.rights.write&&this.rights.create))
{if(!this.trmAttachmentDialog)
{this.trmAttachmentDialog=new diloc.rail.dialogs.TrainRunMessageAttachment(!this.rights.write);this.trmAttachmentDialog.on('attachmentstatechanged',function(_messageId,_attachmentAvailable)
{this.currentTrain.updateTrainRunMessageAttachment(_messageId,_attachmentAvailable);},this);}
this.trmAttachmentDialog.show(record,idFieldName,fieldName,true);}
else
{gwf.App.errorMsg("Rechte-Fehler","Sie besitzen nicht die erforderlichen Rechte um Anhänge erzeugen zu können.");}}},stayTypeRenderer:function(_value,_meta,_record,_rowIndex,_colIndex,_store,_fieldName)
{if(_record.get('arrivalDone')==false)_meta.css="future";var stayTypes=['D','H','B','A'];if(_value!==null)return stayTypes[_value];else return"-";},stationRenderer:function(_value,_meta,_record)
{if(_record.get('arrivalDone')==false)_meta.css="future";var parts=_value.split("|");return parts[1]+" - "+parts[2];},arrivalTimeRenderer:function(_value,_meta,_record)
{if(_record.get('arrivalDone')==false)_meta.css="future";return _value;},departureTimeRenderer:function(_value,_meta,_record)
{if(_record.get('departureDone')==false)_meta.css="future";return _value;},showTrain:function(_train)
{if(this.currentTrain)
{this.currentTrain.un("updated",this.trainUpdated,this);}
this.currentTrain=_train;this.currentTrain.on("updated",this.trainUpdated,this);this.trainUpdated();},trainUpdated:function()
{var train=this.currentTrain.data;console.log("Generating grid for the following train:",train);var stations=[];var id=0;if(train.trainRoute)
{var departureStation=[id,train.departureStation,null,null,null,null,null,false];var departureMessage=this.getMessageForStation(train.departureStationId,'departure');if(departureMessage)
{departureStation.push(true);var departure=Date.parseDate(departureMessage.timestamp,"Y-m-d H:i:s");var lateness=diloc.rail.util.latenessToString(departureMessage.latenessAmount,"default");if(lateness=="-"||lateness=="")lateness="";else lateness="("+lateness+")";departureStation.push(departureMessage.id,departure.format("H:i:s")+"&nbsp;&nbsp;"+lateness,departureMessage.latenessCode,departureMessage.infoText,departureMessage.attachmentAvailable,true);}
else
{departureStation.push(false);departureStation.push(null,train.departureTime,null,null,false,false);}
stations.push(departureStation);id++;for(var i=0;i<train.trainRoute.stations.length;i++)
{var trainRouteStation=train.trainRoute.stations[i];var station=[id,trainRouteStation.station,trainRouteStation.stayType];var arrivalMessage=this.getMessageForStation(trainRouteStation.stationId,'arrival');if(arrivalMessage)
{var arrival=Date.parseDate(arrivalMessage.timestamp,"Y-m-d H:i:s");var lateness=diloc.rail.util.latenessToString(arrivalMessage.latenessAmount,"default");if(lateness=="-"||lateness=="")lateness="";else lateness="("+lateness+")";station.push(arrivalMessage.id,arrival.format("H:i:s")+"&nbsp;&nbsp;"+lateness,arrivalMessage.latenessCode,arrivalMessage.infoText,arrivalMessage.attachmentAvailable,true);}
else
{var forecastStation=this.getForecastForStation(trainRouteStation.stationId);if(forecastStation)
{var arrival=new Date(forecastStation.arrivalTimestamp*1000);var lateness=diloc.rail.util.latenessToString(forecastStation.arrivalDiff,"default");if(lateness=="-"||lateness=="")lateness="";else lateness="("+lateness+")";station.push(null,arrival.format("H:i:s")+"&nbsp;&nbsp;"+lateness,null,null,false,false);}
else
{var arrival=Date.parseDate(train.trainRun.departureTime,"Y-m-d H:i:s").add(Date.SECOND,trainRouteStation.time);station.push(null,arrival.format("H:i:s"),null,null,false,false);}}
var departureMessage=this.getMessageForStation(trainRouteStation.stationId,'departure');if(departureMessage)
{var departure=Date.parseDate(departureMessage.timestamp,"Y-m-d H:i:s");var lateness=diloc.rail.util.latenessToString(departureMessage.latenessAmount,"default");if(lateness=="-"||lateness=="")lateness="";else lateness="("+lateness+")";station.push(departureMessage.id,departure.format("H:i:s")+"&nbsp;&nbsp;"+lateness,departureMessage.latenessCode,departureMessage.infoText,departureMessage.attachmentAvailable,true);}
else
{var forecastStation=this.getForecastForStation(trainRouteStation.stationId);if(forecastStation)
{if(forecastStation.departureTimestamp==null)
{station.push(null,"Durchfahrt",null,null,false,false);}
else
{var departure=new Date(forecastStation.departureTimestamp*1000);var lateness=diloc.rail.util.latenessToString(forecastStation.departureDiff,"default");if(lateness=="-"||lateness=="")lateness="";else lateness="("+lateness+")";station.push(null,departure.format("H:i:s")+"&nbsp;&nbsp;"+lateness+"",null,null,false,false);}}
else
{if(trainRouteStation.stayType==0)
{station.push(null,"Durchfahrt",null,null,false,false);}
else
{var stayTime=trainRouteStation.stayTime||0;var departure=Date.parseDate(train.trainRun.departureTime,"Y-m-d H:i:s").add(Date.SECOND,trainRouteStation.time+stayTime);station.push(null,departure.format("H:i:s"),null,null,false);}}}
stations.push(station);id++;}
var arrivalStation=[id,train.arrivalStation,null];var arrivalMessage=this.getMessageForStation(train.arrivalStationId,'arrival');if(arrivalMessage)
{var departure=Date.parseDate(arrivalMessage.timestamp,"Y-m-d H:i:s");var lateness=diloc.rail.util.latenessToString(arrivalMessage.latenessAmount,"default");if(lateness=="-"||lateness=="")lateness="";else lateness="("+lateness+")";arrivalStation.push(arrivalMessage.id,departure.format("H:i:s")+"&nbsp;&nbsp;"+lateness,arrivalMessage.latenessCode,arrivalMessage.infoText,arrivalMessage.attachmentAvailable,true);}
else
{var forecastStation=this.getForecastForStation(train.arrivalStationId);if(forecastStation)
{var arrival=new Date(forecastStation.arrivalTimestamp*1000);var lateness=diloc.rail.util.latenessToString(forecastStation.arrivalDiff,"default");if(lateness=="-"||lateness=="")lateness="";else lateness="("+lateness+")";arrivalStation.push(null,arrival.format("H:i:s")+"&nbsp;&nbsp;"+lateness,null,null,false,false);}
else
{var arrival=Date.parseDate(train.trainRun.departureTime,"Y-m-d H:i:s").add(Date.SECOND,train.travelTime);arrivalStation.push(null,arrival.format("H:i:s"),null,null,false,false);}}
arrivalStation.push(null,null,null,null,false,false);stations.push(arrivalStation);}
else
{for(var i=0;i<train.trainRun.trainRunMessages.length;i++)
{var trm=train.trainRun.trainRunMessages[i];var station=[id,trm.stationId+"|"+trm.stationIdCode+"|"+trm.stationName,null];if([1,3,5].contains(trm.type))
{var time=Date.parseDate(trm.timestamp,"Y-m-d H:i:s");station.push(trm.id,time.format("H:i:s"),trm.latenessCode,trm.infoText,trm.attachmentAvailable,true);i++;trm=train.trainRun.trainRunMessages[i];if(trm&&[2,4].contains(trm.type))
{var time=Date.parseDate(trm.timestamp,"Y-m-d H:i:s");station.push(trm.id,time.format("H:i:s"),trm.latenessCode,trm.infoText,trm.attachmentAvailable,true);}
else
{i--;}}
else
{station.push(null,null,null,null,null,false);station.push(trm.id,trm.timestamp,trm.latenessCode,trm.infoText,trm.attachmentAvailable,true);}
stations.push(station);id++;}}
var store=this.getStore();if(store)store.loadData({data:stations});else{console.log("This is:",this);alert("Could not update store because we could not get it!! Try to find out what this is!");}},getMessageForStation:function(_stationId,_messageType)
{var types=[];if(_messageType=='departure')types.push(4,2);if(_messageType=='arrival')types.push(1,3,5);for(var i=0;i<this.currentTrain.data.trainRun.trainRunMessages.length;i++)
{if(this.currentTrain.data.trainRun.trainRunMessages[i].stationId==_stationId&&types.contains(this.currentTrain.data.trainRun.trainRunMessages[i].type))
{return this.currentTrain.data.trainRun.trainRunMessages[i];}}
return null;},getForecastForStation:function(_stationId)
{if(this.currentTrain.data.forecast==null||!Ext.isArray(this.currentTrain.data.forecast.stations))return null;for(var i=0;i<this.currentTrain.data.forecast.stations.length;i++)
{if(this.currentTrain.data.forecast.stations[i].stationId==_stationId)
{return this.currentTrain.data.forecast.stations[i];}}
return null;},destroy:function()
{if(this.currentTrain)this.currentTrain.un("updated",this.trainUpdated,this);delete this.currentTrain;return diloc.rail.RunningTrainRouteGrid.superclass.destroy.call(this);}});Ext.reg('diloc-runningtrainroutegrid',diloc.rail.RunningTrainRouteGrid);

Ext.namespace("diloc","diloc.rail");diloc.rail.TrainGrid=Ext.extend(Ext.grid.EditorGridPanel,{autoLoadData:true,doAutoLoad:true,loadMask:{msg:'Lade Züge...'},rights:{read:true,write:false,create:false},currentTrainRecord:null,useBufferView:false,initComponent:function()
{this.addEvents("trainchanged","currenttrainupdated","traindeselected");this.trainCategoryStore=new Ext.data.JsonStore({url:gwf.App.backendUrl("traincategory","list"),root:'data',fields:['id','idCode']});this.trainCategoryStore.load();this.trainAttributeStore=diloc.StoreManager.get('StationTrainAttributes');this.lineStore=new Ext.data.JsonStore({url:gwf.App.backendUrl("line","list"),root:'data',fields:['id','idCode']});this.lineStore.load();this.dayChecksDisabled=false;var trainGridReader=new Ext.data.JsonReader({fields:[{name:'id'},{name:'status'},{name:'number'},{name:'departureStation'},{name:'arrivalStation'},{name:'departureTime'},{name:'travelTime'},{name:'categoryId'},{name:'lineId'},{name:'departureTrack'},{name:'arrivalTrack'},{name:'ttDepartureTime'},{name:'ttTravelTime'},{name:'departureFrontStationTrainAttributeId'},{name:'departureMiddleStationTrainAttributeId'},{name:'departureBackStationTrainAttributeId'},{name:'arrivalFrontStationTrainAttributeId'},{name:'arrivalMiddleStationTrainAttributeId'},{name:'arrivalBackStationTrainAttributeId'},{name:'travelsMonday'},{name:'travelsTuesday'},{name:'travelsWednesday'},{name:'travelsThursday'},{name:'travelsFriday'},{name:'travelsSaturday'},{name:'travelsSunday'},{name:'departureStationColor'},{name:'arrivalStationColor'},{name:'departureTimeColor'},{name:'travelTimeColor'},{name:'categoryIdColor'},{name:'lineIdColor'},{name:'departureTrackColor'},{name:'arrivalTrackColor'},{name:'ttDepartureTimeColor'},{name:'ttTravelTimeColor'},{name:'departureFrontStationTrainAttributeIdColor'},{name:'departureMiddleStationTrainAttributeIdColor'},{name:'departureBackStationTrainAttributeIdColor'},{name:'arrivalFrontStationTrainAttributeIdColor'},{name:'arrivalMiddleStationTrainAttributeIdColor'},{name:'arrivalBackStationTrainAttributeIdColor'},{name:'travelsMondayColor'},{name:'travelsTuesdayColor'},{name:'travelsWednesdayColor'},{name:'travelsThursdayColor'},{name:'travelsFridayColor'},{name:'travelsSaturdayColor'},{name:'travelsSundayColor'},{name:'commentColor'},{name:'liningColor'},{name:'referenceColor'},{name:'arrivalDontBoard'},{name:'arrivalDontBoardColor'},{name:'displayedArrivalStation'},{name:'displayedArrivalStationColor'},{name:'trainRouteId'},{name:'trainRouteIdColor'},{name:'noTravels'},{name:'lining'},{name:'comment'},{name:'reference'},{name:'vp'},{name:'locked'}],root:'data',id:'id',totalProperty:'totalCount'});var storeConfig={reader:trainGridReader,url:gwf.App.backendUrl("schedulemanager","list"),remoteSort:true,pruneModifiedRecords:true};console.log("storeConfig:",storeConfig);this.store=new Ext.data.Store(storeConfig);this.store.on("load",this.storeLoad,this);this.store.on("update",this.onStoreUpdate,this);var dontBoardColumn=new diloc.rail.TrainGridCheckColumn({header:'NE',tooltip:'Nicht einsteigen',dataIndex:'arrivalDontBoard',width:30});var mondayColumn=new diloc.rail.TrainGridCheckColumn({header:'Mo',dataIndex:'travelsMonday',width:30});var tuesdayColumn=new diloc.rail.TrainGridCheckColumn({header:'Di',dataIndex:'travelsTuesday',width:30});var wednesdayColumn=new diloc.rail.TrainGridCheckColumn({header:'Mi',dataIndex:'travelsWednesday',width:30});var thursdayColumn=new diloc.rail.TrainGridCheckColumn({header:'Do',dataIndex:'travelsThursday',width:30});var fridayColumn=new diloc.rail.TrainGridCheckColumn({header:'Fr',dataIndex:'travelsFriday',width:30});var saturdayColumn=new diloc.rail.TrainGridCheckColumn({header:'Sa',dataIndex:'travelsSaturday',width:30});var sundayColumn=new diloc.rail.TrainGridCheckColumn({header:'So',dataIndex:'travelsSunday',width:30});attributeComboConfig={store:this.trainAttributeStore,mode:'local',lazyRender:true,typeAhead:true,forceSelection:true,editable:true,triggerAction:'all',displayField:'idCode',valueField:'id'};this.cm=new Ext.grid.ColumnModel([{header:'S',dataIndex:'status',width:25,resizable:false,tooltip:'Status',renderer:this.statusRenderer.createDelegate(this)},{header:'Zugnummer',dataIndex:'number',editor:new Ext.form.TextField({maxLength:16}),width:80},{header:'Gattung',dataIndex:'categoryId',renderer:this.categoryRenderer.createDelegate(this),editor:new Ext.form.ComboBox({store:this.trainCategoryStore,mode:'local',lazyRender:true,typeAhead:true,forceSelection:true,editable:true,triggerAction:'all',displayField:'idCode',valueField:'id'}),width:50},{header:'Linie',dataIndex:'lineId',renderer:this.lineRenderer.createDelegate(this),editor:new Ext.form.ComboBox({store:this.lineStore,mode:'local',lazyRender:true,typeAhead:true,forceSelection:true,editable:true,triggerAction:'all',displayField:'idCode',valueField:'id'}),width:50},{header:'Kürzel',dataIndex:'departureStation',renderer:this.stationCodeRenderer.createDelegate(this,['departureStation'],true),editor:new diloc.rail.formfields.GridStationField({parentGrid:this,fieldName:'departureStation',listeners:{'stationupdated':{fn:this.onStationUpdated.createDelegate(this,['departure'],true),scope:this}}}),width:50},{header:'Name',dataIndex:'departureStation',renderer:this.stationNameRenderer.createDelegate(this,['departureStation'],true),width:120},{header:'Gleis',dataIndex:'departureTrack',editor:new Ext.form.TextField({maxLength:5}),renderer:this.passthroughRenderer.createDelegate(this,['departureTrack'],true),width:50},{header:'Abfahrt',dataIndex:'departureTime',renderer:this.passthroughRenderer.createDelegate(this,['departureTime'],true),editor:new diloc.rail.formfields.TrainGridTimeField({grid:this}),width:60},{header:'KB-Abfahrt',tooltip:'Kursbuch-Abfahrt',dataIndex:'ttDepartureTime',renderer:this.ttDepartureTimeRenderer,editor:new diloc.rail.formfields.TrainGridTimeField({displayFormat:'H:i'}),width:70},{header:'Spitze',dataIndex:'departureFrontStationTrainAttributeId',renderer:this.trainAttributeRenderer.createDelegate(this,['departureFrontStationTrainAttributeId'],true),editor:new Ext.form.ComboBox(attributeComboConfig),width:50},{header:'Mitte',dataIndex:'departureMiddleStationTrainAttributeId',renderer:this.trainAttributeRenderer.createDelegate(this,['departureMiddleStationTrainAttributeId'],true),editor:new Ext.form.ComboBox(attributeComboConfig),width:50},{header:'Schluss',dataIndex:'departureBackStationTrainAttributeId',renderer:this.trainAttributeRenderer.createDelegate(this,['departureBackStationTrainAttributeId'],true),editor:new Ext.form.ComboBox(attributeComboConfig),width:50},{header:'Kürzel',dataIndex:'arrivalStation',renderer:this.stationCodeRenderer.createDelegate(this,['arrivalStation'],true),editor:new diloc.rail.formfields.GridStationField({parentGrid:this,fieldName:'arrivalStation',listeners:{'stationupdated':{fn:this.onStationUpdated.createDelegate(this,['arrival'],true),scope:this}}}),width:50},{header:'Name',dataIndex:'arrivalStation',renderer:this.stationNameRenderer.createDelegate(this,['arrivalStation'],true),width:120},{header:'Gleis',dataIndex:'arrivalTrack',editor:new Ext.form.TextField({maxLength:5}),renderer:this.passthroughRenderer.createDelegate(this,['arrivalTrack'],true),width:50},{header:'Ankunft',dataIndex:'travelTime',renderer:this.arrivalTimeRenderer,editor:new diloc.rail.formfields.TrainGridTimeField({grid:this,referenceFieldName:'departureTime',dataFormat:'s'}),width:60},{header:'KB-Ankunft',tooltip:'Kursbuch-Ankunft',dataIndex:'ttTravelTime',renderer:this.ttArrivalTimeRenderer,editor:new diloc.rail.formfields.TrainGridTimeField({displayFormat:'H:i',grid:this,referenceFieldName:'ttDepartureTime',dataFormat:'s'}),width:70,hidden:true},{header:'Spitze',dataIndex:'arrivalFrontStationTrainAttributeId',renderer:this.trainAttributeRenderer.createDelegate(this,['arrivalFrontStationTrainAttributeId'],true),editor:new Ext.form.ComboBox(attributeComboConfig),width:50,hidden:true},{header:'Mitte',dataIndex:'arrivalMiddleStationTrainAttributeId',renderer:this.trainAttributeRenderer.createDelegate(this,['arrivalMiddleStationTrainAttributeId'],true),editor:new Ext.form.ComboBox(attributeComboConfig),width:50,hidden:true},{header:'Schluss',dataIndex:'arrivalBackStationTrainAttributeId',renderer:this.trainAttributeRenderer.createDelegate(this,['arrivalBackStationTrainAttributeId'],true),editor:new Ext.form.ComboBox(attributeComboConfig),width:50,hidden:true},{header:'K-Ziel',tooltip:'Kunden-Zielbahnhof (Anzeige)',dataIndex:'displayedArrivalStation',renderer:this.passthroughRenderer.createDelegate(this,['displayedArrivalStation'],true),editor:new Ext.form.TextField({maxLength:45}),width:50},dontBoardColumn,mondayColumn,tuesdayColumn,wednesdayColumn,thursdayColumn,fridayColumn,saturdayColumn,sundayColumn,{header:'VP',renderer:this.codeRenderer,dataIndex:'vp',width:30,editor:new diloc.rail.formfields.DayCodeField({grid:this})},{header:'Aktiv',dataIndex:'noTravels',hidden:true,width:40},{header:'FP',dataIndex:'trainRouteId',renderer:this.trainRouteIdRenderer,width:25}]);this.cm.defaultSortable=false;this.sm=new Ext.grid.RowSelectionModel({singeleSelect:true,moveEditorOnEnter:false});var topToolbar=[];this.currentRangeTextItem=new Ext.Toolbar.TextItem("Bereich");topToolbar.push(this.currentRangeTextItem);var filterTriggerClick=function(){this.filterInputfield.reset();this.filterInputfield.setHideTrigger(true);this.store.clearFilter();this.updateBottomToolbarStatus(this.store);this.filterInputfield.focus();};this.filterInputfield=new Ext.form.TriggerField({emptyText:"Zugnummer",enableKeyEvents:true,width:80,hideLabel:true,triggerClass:'x-form-clear-trigger',onTriggerClick:filterTriggerClick.createDelegate(this),hideTrigger:true});this.addTrainButton=new Ext.Toolbar.Button({text:'Zug anlegen',handler:this.addTrain,iconCls:'button-train-add',scope:this});this.copyTrainButton=new Ext.Toolbar.Button({text:'Zug kopieren',handler:this.copyTrain,iconCls:'button-train-copy',disabled:true,scope:this});this.saveButton=new Ext.Toolbar.Button({text:'Änderungen speichern',handler:this.saveChanges,iconCls:'trains-save',scope:this,disabled:true});this.rejectButton=new Ext.Toolbar.Button({text:'Änderungen verwerfen',handler:this.rejectChanges,iconCls:'trains-decline',scope:this,disabled:true});topToolbar.push('-');topToolbar.push(this.filterInputfield);if(this.rights.write)topToolbar.push('-');if(this.rights.write&&this.rights.create)topToolbar.push(this.addTrainButton);if(this.rights.write&&this.rights.create)topToolbar.push(this.copyTrainButton);if(this.rights.write)topToolbar.push(this.saveButton);if(this.rights.write)topToolbar.push(this.rejectButton);this.gridStatusText=new Ext.Toolbar.TextItem({text:"... Züge"});var bottomToolbar=new Ext.Toolbar({items:[{iconCls:'x-tbar-loading',tooltip:'Neu laden',handler:function(){this.store.load();},scope:this}]});bottomToolbar.add("->");bottomToolbar.add(this.gridStatusText);var gridPanelOptions={stateId:'diloc-traingrid_v4',layout:'fit',frame:false,border:false,stripeRows:true,clicksToEdit:2,tbar:topToolbar,cls:'traingrid',bbar:bottomToolbar,plugins:[new Ext.ux.grid.ColumnHeaderGroup({rows:[[{colspan:4},{header:'Startbahnhof',colspan:8,align:'center'},{header:'Zielbahnhof',colspan:10,align:'center'},{header:'Verkehrstage',colspan:8,align:'center'},{colspan:2}]],hierarchicalColMenu:true}),dontBoardColumn,mondayColumn,tuesdayColumn,wednesdayColumn,thursdayColumn,fridayColumn,saturdayColumn,sundayColumn]};if(this.useBufferView==true)gridPanelOptions.view=new Ext.ux.grid.BufferView({cacheSize:100});Ext.apply(this,gridPanelOptions);this.filterInputfield.on("keyup",this.filterTrainStore,this);this.on("beforeedit",this.gridPanelBeforeEdit,this);this.on("cellclick",this.gridPanelCellClick,this);this.on("cellcontextmenu",this.onCellContextMenu,this);this.on("validateedit",this.gridPanelValidateEdit,this);this.on("afteredit",this.gridPanelAfterEdit,this);return diloc.rail.TrainGrid.superclass.initComponent.call(this);},getHiddenEditors:function()
{var cm=this.getColumnModel();var editors=[];for(var i=0;i<cm.getColumnCount();i++)
{if(cm.isHidden(i))
{var editor=cm.getCellEditor(i);if(editor)
{editor.field.fieldLabel=cm.getColumnHeader(i);editors.push(editor);}}}
return editors;},setRange:function(_scheduleId,_beginDate,_endDate,_description,_editMode,_dayFilter)
{Ext.get(this.currentRangeTextItem.getEl()).update("Aktueller Bereich: <b>"+_description+"</b>");console.log("New Range is:",_beginDate,_endDate,_dayFilter,_editMode);this.currentScheduleId=_scheduleId;this.currentBeginDate=_beginDate;this.currentEndDate=_endDate;this.lastSelectedTrainRecord=this.getSelectionModel().getSelected();this.store.removeAll();if((_beginDate!==0&&_beginDate==_endDate)||(_dayFilter>=0&&_dayFilter!==null))
{this.dayChecksDisabled=true;if(!Ext.isIE)
{var cm=this.getColumnModel();for(var i=22;i<30;i++)
cm.setHidden(i,true);}}
else
{this.dayChecksDisabled=false;if(!Ext.isIE)
{var cm=this.getColumnModel();for(var i=22;i<30;i++)
cm.setHidden(i,false);}}
this.editMode=_editMode;if(_editMode<1)
{var message='Da dieser Fahrplan schon in Verwendung ist, können in der Standardwoche nur nicht-geschlossene Züge bearbeitet werden.<br/><br/>Sie können jedoch Ausnahmen definieren.';if(_editMode==-1)
{message='Dieser Fahrplan ist schon abgelaufen. Sie können daher keine Änderungen an der Standardwoche mehr durchführen, und auch keine Ausnahmen definieren.';this.addTrainButton.disable();this.copyTrainButton.disable();}
else
{this.addTrainButton.enable();}
if(this.lastNotifyScheduleId!==_scheduleId)
{if(!this.notifyWindow)
{this.notifyWindow=new Ext.ux.window.MessageWindow({title:'Hinweis',autoDestroy:false,autoHeight:true,autoHide:true,bodyStyle:'text-align:center; padding:7px;',help:false,html:message,showFx:{duration:0.5,mode:'standard',useProxy:false},hideFx:{delay:4000},origin:{el:this.el,increment:false,pos:"tl-tl",offY:25,offX:0},textPin:'Schließen',width:300});this.notifyWindow.show(Ext.getDoc());}
else
{if(!this.notifyWindow.isVisible())
{this.notifyWindow.setMessage(message);this.notifyWindow.show();}}}
this.lastNotifyScheduleId=_scheduleId;}
else
{if(this.notifyWindow)this.notifyWindow.hide();if(_beginDate==0&&_endDate==0)
{this.addTrainButton.enable();}
else
{this.addTrainButton.disable();this.copyTrainButton.disable();}}
this.saveButton.disable();this.rejectButton.disable();if(_beginDate!==0)
{this.store.baseParams={beginDate:_beginDate,endDate:_endDate,scheduleId:_scheduleId};}
else this.store.baseParams={scheduleId:_scheduleId,dayFilter:_dayFilter};var loadParams={};this.store.load({params:loadParams});},gridPanelCellClick:function(_grid,_rowIndex,_columnIndex,_event)
{var record=_grid.getStore().getAt(_rowIndex);if(record)
{if(this.editMode==0)this.copyTrainButton.enable();else if(this.editMode==1&&this.currentBeginDate==0&&this.currentEndDate==0)this.copyTrainButton.enable();else this.copyTrainButton.disable();if(this.currentTrainRecord!=record)
{this.currentTrainRecord=record;this.fireEvent("trainchanged",record);}}},onCellContextMenu:function(_grid,_rowIndex,_cellIndex,_event)
{_event.preventDefault();this.gridPanelCellClick(this,_rowIndex,_cellIndex,_event);var selectedRecords=this.getSelectionModel().getSelections();var record=_grid.getStore().getAt(_rowIndex);var clickedOnAlreadySelectedRow=false;for(var i=0;i<selectedRecords.length;i++)
{if(selectedRecords[i]==record)clickedOnAlreadySelectedRow=true;}
if(!clickedOnAlreadySelectedRow)
{this.getSelectionModel().selectRow(_rowIndex);selectedRecords=this.getSelectionModel().getSelections();}
var fieldName=_grid.getColumnModel().getDataIndex(_cellIndex);var colorFieldName=fieldName+"Color";var originalFieldName=fieldName;if(fieldName=="departureStation")fieldName="departureStationId";if(fieldName=="arrivalStation")fieldName="arrivalStationId";var items=[];console.info("Context-Record is:",record);if(fieldName=='status')
{if(selectedRecords.length==1)
{if(record.modified)items.push({text:'Alle Änderungen des Zuges verwerfen',iconCls:'trains-decline',handler:function(){record.reject();this.fireEvent("currenttrainupdated",null,record);},scope:this});if(this.currentBeginDate==0&&this.currentEndDate==0&&record.data.locked!==true)
{items.push({text:'Zug Schließen',iconCls:'train-lock',handler:function(){record.set('locked',true);},scope:this});}
if(record.data.locked!==true&&this.currentBeginDate==0&&this.currentEndDate==0)
{items.push({text:'Zug Löschen',iconCls:'train-delete',handler:function(){Ext.Msg.show({title:'Zug löschen?',msg:'Wollen Sie den Zug <b>'+record.get('number')+"</b> wirklich löschen?<br/><br/>Hinweis: Das löschen funktioniert nur, wenn der Zug noch nie gefahren ist, und keine Zuglaufmeldungen für den Zug existieren!",buttons:Ext.Msg.YESNO,fn:function(_button){if(_button=='yes')
{var deleter=new gwf.helpers.ActionExecutor();deleter.on("success",function(_result,_record){console.log("Deleting record from STORE!",_record);this.store.remove(_record);this.getSelectionModel().selectRow(_rowIndex);this.gridPanelCellClick(this,_rowIndex,_cellIndex,_event);},this);deleter.execute("train","delete",{id:record.get("id")},"!Lösche Zug",record);}},scope:this});},scope:this});}
if(this.currentBeginDate==0&&this.currentEndDate==0&&record.data.locked==true&&diloc.User.isAdmin())
{items.push({text:'Zug Öffnen',iconCls:'train-unlock',handler:function(){record.set('locked',false);},scope:this});}
if(record.get("status")=="exceptionweek"||record.get("status")=="exceptionday"||record.get("status")=="exceptionweeksubday"||record.get("status")=="exceptiondayparentweek")
{var trainRouteResetted=false;if(record.get('trainRouteIdColor')!=null)trainRouteResetted=true;items.push({text:'Alle Ausnahmen zurücksetzen',iconCls:'cell-revert',handler:function(){var reverter=new gwf.helpers.ActionExecutor();reverter.on("success",function(_result,_record){_record.data=_result.data;this.getView().refreshRow(_record);if(this.currentTrainRecord==_record)
{console.info("Firing event currenttrainupdated!!!!");if(trainRouteResetted)this.fireEvent("currenttrainupdated","trainRouteId",_record);else this.fireEvent("currenttrainupdated",null,_record);}},this);reverter.execute("schedulemanager","resetException",{id:record.get("id"),beginDate:this.currentBeginDate,endDate:this.currentEndDate,fieldName:fieldName},'!Setze Außname zurück...',record);},scope:this});}}
if(this.currentBeginDate!==0&&this.currentBeginDate==this.currentEndDate&&(record.get("status")=="exceptionday"||record.get("status")=="exceptiondayparentweek"||selectedRecords.length>1))
{var today=new Date();var currentDay=Date.parseDate(this.currentBeginDate,"Y-m-d");var nextDay=currentDay.add(Date.DAY,1);console.info(currentDay.format("d/m/Y"));items.push({text:'Ausnahmen kopieren auf...',menu:new Ext.menu.DateMenu({handler:this.copyExceptions,scope:this,minDate:today.add(Date.DAY,1),value:nextDay,format:'Y-m-d',disabledDates:[this.currentBeginDate],disabledDatesText:'Sie können die Ausnahme nicht auf den gleichen Tag kopieren',showToday:false})});}}
if(record.get(colorFieldName)!==null)
{var color=record.get(colorFieldName);if(color=="week"||color=="day"||color=="weeksubday"||color=="parentweekday")
{items.push({text:'Ausnahme zurücksetzen',iconCls:'cell-revert',handler:function(){var reverter=new gwf.helpers.ActionExecutor();reverter.on("success",function(_result,_record){_record.data[originalFieldName]=_result.data[originalFieldName];_record.data[colorFieldName]=_result.data[colorFieldName];_record.data["status"]=_result.data["status"];this.getView().refreshRow(_record);if(this.currentTrainRecord==_record)
{console.info("Firing event currenttrainupdated!!!!");this.fireEvent("currenttrainupdated",fieldName,_record);}},this);reverter.execute("schedulemanager","resetException",{id:record.get("id"),beginDate:this.currentBeginDate,endDate:this.currentEndDate,fieldName:fieldName},'!Setze Außname zurück...',record);},scope:this});}}
if(record.modified&&record.modified[originalFieldName]!==undefined)
{items.push({text:'Änderung verwerfen',iconCls:'trains-decline',handler:function(){record.set(originalFieldName,record.modified[originalFieldName]);delete record.modified[originalFieldName];if(this.currentTrainRecord==record)
{this.fireEvent("currenttrainupdated",null,this.currentTrainRecord);}
if(gwf.util.isEmptyObject(record.modified))record.reject();this.getView().refreshRow(record);},scope:this});}
if(items.length>0)
{var contextMenu=new Ext.menu.Menu({items:items});contextMenu.showAt(_event.getXY());}},addTrain:function(_btn)
{console.info("Adding Train...");this.addTrainWindow=new Ext.Window({title:'Zug anlegen',layout:'form',width:335,height:220,bodyStyle:'padding: 5px;',defaults:{width:200},items:[{xtype:'textfield',fieldLabel:'Zugnummer',allowBlank:false,name:'number'},{xtype:'timefield',fieldLabel:'Abfahrts-Zeit',format:'H:i:s',altFormats:'g:ia|g:iA|g:i a|g:i A|h:i|g:i|H:i|ga|ha|gA|h a|g a|g A|gi|hi|his|gia|hia|g|H|gi a|hi a|giA|hiA|gi A|hi A',allowBlank:false,name:'departuretime'},{xtype:'dilocstationfield',fieldLabel:'Abfahrtsbahnhof',allowBlank:true,name:'departurestation'},{xtype:'dilocstationfield',fieldLabel:'Ankunftsbahnhof',allowBlank:true,name:'arrivalstation'}],fbar:[{xtype:'button',text:'Zug Anlegen',handler:this.addTrainDo,scope:this},{xtype:'button',text:'Abbrechen',handler:this.addTrainCancel,scope:this}]});this.addTrainWindow.show();this.addTrainWindow.find('name','number')[0].focus(false,100);},addTrainCancel:function()
{this.addTrainWindow.close();delete this.addTrainWindow;},addTrainDo:function()
{var numberField=this.addTrainWindow.find('name','number')[0];var departureTimeField=this.addTrainWindow.find('name','departuretime')[0];var departureStationField=this.addTrainWindow.find('name','departurestation')[0];var arrivalStationField=this.addTrainWindow.find('name','arrivalstation')[0];console.log("Fields are:",numberField,departureTimeField,departureStationField,arrivalStationField);if(departureStationField.getValue()!=""&&departureStationField.getSubmitValue()==null||arrivalStationField.getValue()!=""&&arrivalStationField.getSubmitValue()==null)
{return;}
if(numberField.getValue()!==""&&departureTimeField.getValue()!=="")
{var params={number:numberField.getValue(),departureStationId:0,arrivalStationId:0,scheduleId:this.currentScheduleId,departureTime:departureTimeField.getValue(),travelTime:3600};if(departureStationField.getValue()!==""&&departureStationField.getSubmitValue()!=null)params.departureStationId=departureStationField.getSubmitValue();if(arrivalStationField.getValue()!==""&&arrivalStationField.getSubmitValue()!=null)params.arrivalStationId=arrivalStationField.getSubmitValue();console.info("New train would be:",params);var createTrainExecutor=new gwf.helpers.ActionExecutor({silent:true});createTrainExecutor.on("success",function(_result)
{var TrainRecord=Ext.data.Record.create(this.store.reader.meta);this.store.add([new TrainRecord(_result.data)]);this.addTrainCancel();},this);createTrainExecutor.on("failure",function(_error){if(_error.number)
{this.addTrainWindow.getEl().unmask();Ext.MessageBox.show({title:'Zug anlegen',msg:"Es existiert bereits ein Zug mit dieser Zugnummer!",icon:Ext.MessageBox.WARNING,buttons:Ext.MessageBox.OK});}
else Ext.MessageBox.alert("Zug anlegen","Ein unbekannter Fehler ist aufgetreten!");},this);this.addTrainWindow.getEl().mask("Zug anlegen...");createTrainExecutor.execute("schedulemanager","createTrain",params);}},copyTrain:function()
{var selectedTrainRecord=this.getSelectionModel().getSelected();if(selectedTrainRecord)
{var newTrainNumber=selectedTrainRecord.get('number')*1+2;var window=new Ext.Window({width:300,height:165,layout:'form',bodyStyle:'padding:10px;',title:'Zug '+selectedTrainRecord.get('number')+' kopieren',labelWidth:130,resizable:false,items:[{html:'Geben Sie die Zugnummer für den neuen Zug und eine geänderte Abfahrtzszeit ein.',border:false,unstyled:true,bodyStyle:'padding-bottom:8px;'},{fieldLabel:'Neue Zugnummer',xtype:'textfield',value:newTrainNumber,width:70,itemId:'trainnumber'},new diloc.rail.formfields.TrainGridTimeField({fieldLabel:'Abfahrtszeit',value:selectedTrainRecord.get('departureTime'),width:70,itemId:'departuretime'})],buttons:[{text:'Kopie anlegen',handler:function(){this.copyTrainDo(window,selectedTrainRecord);},scope:this},{text:'Abbrechen',handler:function(){window.close();}}]});window.show();}},copyTrainDo:function(_window,_record,_index)
{var trainNumberField=_window.getComponent('trainnumber');var departureTimeField=_window.getComponent('departuretime');var trainCopier=new gwf.helpers.ActionExecutor({silent:true});trainCopier.on('success',function(_result){var TrainRecord=Ext.data.Record.create(this.store.reader.meta);this.store.insert(this.store.indexOf(_record)+1,[new TrainRecord(_result.data)]);},this);trainCopier.on('failure',function(_error){if(_error.number)
{Ext.MessageBox.show({title:'Zug anlegen',msg:"Es existiert bereits ein Zug mit dieser Zugnummer!",icon:Ext.MessageBox.WARNING,buttons:Ext.MessageBox.OK});}
else Ext.MessageBox.alert("Zug anlegen","Ein unbekannter Fehler ist aufgetreten!");},this);var params={id:_record.get('id'),number:trainNumberField.getValue(),departureTime:departureTimeField.getValue()};trainCopier.execute("train","clone",params);_window.close();},copyExceptions:function(_this,_targetDate)
{var selectedItems=this.getSelectionModel().getSelections();var actionOptions=[];Ext.each(selectedItems,function(_item,_i,_allItems){var actionParams={};actionParams.id=_item.data.id;if(this.currentBeginDate!==0)
{Ext.apply(actionParams,{sourceDate:this.currentBeginDate,targetDate:_targetDate.format("Y-m-d")});}
actionOptions.push({text:'Kopiere Ausnahme '+_item.get("number")+" ...",params:actionParams,record:_item});},this);this.copyExceptionMultiActionExecutor=new gwf.helpers.MultiActionExecutor({silent:true,continueOnFailure:true});this.copyExceptionActionResultErrors={exceptionAlreadyExists:[],failure:[]};this.copyExceptionMultiActionExecutor.on("actionSuccess",function(options,_result){switch(_result.data){case'NoExceptionToCopy':break;case'ExceptionAlreadyExists':this.copyExceptionActionResultErrors.exceptionAlreadyExists.push({id:options.params.id,number:options.record.data.number,actionOptions:options,errortype:'ExceptionAlreadyExists',text:'Für diesen Zug existiert bereits eine Ausnahme an diesem Tag.'});break;default:}},this);this.copyExceptionMultiActionExecutor.on("failure",function(options,_result){console.info("Action Failure",this,arguments);this.copyExceptionActionResultErrors.failure.push({id:options.params.id,number:options.record.data.number,actionOptions:options,errortype:'Failure',text:'Backend Fehler'});},this);this.copyExceptionMultiActionExecutor.on("success",function(){console.log('Finisch copyExceptionMultiActionExecutor - errorResult',this.copyExceptionActionResultErrors);if(this.copyExceptionActionResultErrors.exceptionAlreadyExists.length>0||this.copyExceptionActionResultErrors.failure.length>0)
{var tplFailure=new Ext.XTemplate('<p>Die Ausnahmen folgender Züge konnten wegen Fehlern nicht kopiert werden:</p>','<p><tpl for=".">','<span class="trainnumber">{number}</span>','</tpl></p>');var tplExists=new Ext.XTemplate('<p>Für folgende Züge existieren bereits Ausnahmen für den zu kopierenden Tag:</p>','<form id="exceptionCopyErrorForm"><table cellspacing="0" cellpadding="0">','<tr>','<th>Zugnummer</th><th class="center" ext:qtip="Wählen Sie <b>Nicht kopieren</b>, wenn Sie erst überprüfen möchten welche Ausnahmen schon existieren.">Nicht kopieren<img src="images/icons/silk/information.png" alt=""/></th><th class="center" ext:qtip="Wählen Sie <b>Ersetzen</b>, wenn Sie die schon existierende Ausnahme durch die neue Ausnahme ersetzen wollen.">Ersetzen<img src="images/icons/silk/information.png" alt=""/></th><th class="center" ext:qtip="Wählen Sie <b>Kombinieren</b>, wenn Sie die existierende Ausnahme mit der neuen Ausnahme kombinieren wollen.<br/><b>Hinweis:</b> Existieren für ein Feld in beiden Ausnahmen Werte, überschreibt die neue Ausnahme den Wert der schon existierenden Ausnahme.">Kombinieren<img src="images/icons/silk/information.png" alt=""/></th>','</tr>','<tpl for=".">','<tr class="{[xindex % 2 === 0 ? "even" : "odd"]}">','<td style="border-left:1px solid #D0D0D0">{number}</td><td class="center"><input type="radio" name="{id}" value="ignore" checked="checked" /></td><td class="center"><input type="radio" name="{id}" value="overwrite" /></td><td class="center" style="border-right:1px solid #D0D0D0"><input type="radio" name="{id}" value="merge" /></td>','</tr>','</tpl>','</table></form>');var windowItems=[];if(this.copyExceptionActionResultErrors.failure.length>0)
{windowItems.push({ref:'failurePanel',xtype:'box',cls:'copyExceptionDialogFailure',autoScroll:true,tpl:tplFailure,data:this.copyExceptionActionResultErrors.failure,border:false,flex:1});}
if(this.copyExceptionActionResultErrors.exceptionAlreadyExists.length>0)
{windowItems.push({ref:'existsPanel',xtype:'panel',cls:'copyExceptionDialogAlreadyExists',autoScroll:true,margins:'8',tpl:tplExists,data:this.copyExceptionActionResultErrors.exceptionAlreadyExists,border:false,flex:2});}
this.errorWindow=new Ext.Window({title:'Fehler',buttonAlign:'right',height:300,width:460,plain:true,layout:'vbox',layoutConfig:{align:'stretch'},items:windowItems,fbar:[]});this.errorWindow.getFooterToolbar().add({text:'OK',scope:this,handler:this.copyExceptionsForce},{text:'Abbrechen',scope:this.errorWindow,handler:this.errorWindow.close});this.errorWindow.show();}},this);console.log("actionOptions",actionOptions);this.copyExceptionMultiActionExecutor.execute("Kopiere Ausnahme","schedulemanager","copyDayException",actionOptions);},copyExceptionsForce:function()
{var actionOptions=[];if(this.copyExceptionActionResultErrors.exceptionAlreadyExists.length>0)
{var errorForm=Ext.get('exceptionCopyErrorForm').dom.elements;Ext.each(errorForm,function(_item,_itemI,_allItems){if(_item.checked==true)
{console.log("id",_item.name," => ",_item.value);Ext.each(this.copyExceptionActionResultErrors.exceptionAlreadyExists,function(_action,_actionI,_allActions){if(_action.id==_item.name&&_item.value!='ignore')
{if(_item.value=='overwrite')
{_action.actionOptions.params.forceOverwrite=true;if(_action.actionOptions.params.forceMerge)delete _action.actionOptions.params.forceMerge;}
if(_item.value=='merge')
{_action.actionOptions.params.forceMerge=true;if(_action.actionOptions.params.forceOverwrite)delete _action.actionOptions.params.forceOverwrite;}
actionOptions.push(_action.actionOptions);}},this);}},this);}
this.errorWindow.close();delete this.copyExceptionActionResultErrors;this.copyExceptionActionResultErrors={exceptionAlreadyExists:[],failure:[]};console.log("actionOptions",actionOptions);if(actionOptions.length>0)this.copyExceptionMultiActionExecutor.execute("Kopiere Ausnahme","schedulemanager","copyDayException",actionOptions);},rejectChanges:function()
{var fireUpdateEvent=false;if(this.currentTrainRecord.modified)fireUpdateEvent=true;this.store.rejectChanges();if(fireUpdateEvent)
{this.fireEvent("currenttrainupdated",null,this.currentTrainRecord);}
this.rejectButton.disable();this.saveButton.disable();},saveChanges:function()
{var modifiedRecords=this.store.getModifiedRecords();if(modifiedRecords.length==0)return;var record=null;this.actionOptions=[];var trainNumbers='an den Zügen ';if(modifiedRecords.length==1)trainNumbers='am Zug ';var addonText="<b>Die Änderungen wirken sich auf die gesamte Fahrplanperiode aus!</b>";if(this.store.baseParams.beginDate)
{if(this.store.baseParams.beginDate==this.store.baseParams.endDate)
{if(modifiedRecords.length==1)addonText="<b>Es wird eine Ausnahme für "+Date.parseDate(this.store.baseParams.beginDate,"Y-m-d").format("l, \\d\\e\\n d.m.Y")+" angelegt!";else addonText="<b>Es werden Ausnahmen für "+Date.parseDate(this.store.baseParams.beginDate,"Y-m-d").format("l, \\d\\e\\n d.m.Y")+" angelegt!";}
else
{if(modifiedRecords.length==1)addonText="<b>Es wird eine Ausnahme für die Zeit zwischen dem "+Date.parseDate(this.store.baseParams.beginDate,"Y-m-d").format("d.m.Y")+" und "+Date.parseDate(this.store.baseParams.endDate,"Y-m-d").format("d.m.Y")+" angelegt!";else addonText="<b>Es werden Ausnahmen für die Zeit zwischen dem "+Date.parseDate(this.store.baseParams.beginDate,"Y-m-d").format("d.m.Y")+" und "+Date.parseDate(this.store.baseParams.endDate,"Y-m-d").format("d.m.Y")+" angelegt!";}}
var remarksText="";for(var i=0;i<modifiedRecords.length;i++)
{record=modifiedRecords[i];if((typeof record.get('departureStation')=="string"&&record.get('departureStation').indexOf("error")>0)||(typeof record.get('arrivalStation')=="string"&&record.get('arrivalStation').indexOf("error")>0))
{errorFound=true;Ext.MessageBox.show({title:'Fehler gefunden',msg:'Der Zug '+record.get("number")+" hat einen Eingabefehler. Bitte korrigieren Sie den Fehler bevor Sie speichern.",buttons:Ext.MessageBox.OK,icon:Ext.MessageBox.WARNING});return false;}
record.data.departureStationId=record.data.departureStation.split("|")[0];record.data.arrivalStationId=record.data.arrivalStation.split("|")[0];if(record.modified.departureTime&&!record.modified.travelTime)
{if(remarksText=="")remarksText="<br/><br/><b>Hinweise:</b>";remarksText+="<br/>Bei Zug "+record.data.number+" haben Sie die Abfahrtszeit geändert. Dadurch ändert sich auch automatisch die Ankunftszeit(en).";}
if(record.modified.ttDepartureTime&&!record.modified.ttTravelTime)
{if(remarksText=="")remarksText="<br/><br/><b>Hinweise:</b>";remarksText+="<br/>Bei Zug "+record.data.number+" haben Sie die Kursbuch-Abfahrtszeit geändert. Dadurch ändern sich auch automatisch die Kursbuch-Abfahrtszeiten von Unterwegsbahnhöfen!";}
var actionParams=record.getChanges();actionParams.id=record.data.id;if(actionParams.departureStation)actionParams.departureStationId=record.data.departureStationId;if(actionParams.arrivalStation)actionParams.arrivalStationId=record.data.arrivalStationId;if(this.currentBeginDate!==0)
{Ext.apply(actionParams,{beginDate:this.currentBeginDate,endDate:this.currentEndDate});}
this.actionOptions.push({text:'Speichere Zug '+record.get("number")+" ...",params:actionParams,record:record});if(i==0)trainNumbers+=record.get("number");else if(i==modifiedRecords.length-1)trainNumbers+=" und "+record.get("number");else trainNumbers+=", "+record.get("number");}
Ext.MessageBox.show({title:'Änderungen speichern?',msg:'Möchten Sie die Änderungen '+trainNumbers+" wirklich speichern?"+remarksText+"<br/><br/>"+addonText,buttons:{ok:'Änderungen speichern',cancel:'Abbrechen'},fn:this.saveChangesConfirmed,scope:this});},saveChangesConfirmed:function(_buttonId)
{if(_buttonId=='ok')
{var multiActionExecutor=new gwf.helpers.MultiActionExecutor({silent:true});multiActionExecutor.on("actionSuccess",function(options,_result){console.info(arguments);options.record.commit();options.record.data=_result.data;this.getView().refreshRow(options.record);if(this.currentTrainRecord==options.record)
{console.info("Firing event currenttrainupdated!!!!");this.fireEvent("currenttrainupdated",this.currentTrainRecord);}},this);multiActionExecutor.on("failure",function(options,_result){console.info(arguments);if(_result.number)
{Ext.MessageBox.show({title:'Fehler beim Speichern',msg:'Es trat ein Fehler beim Speichern des Zuges auf: Es existiert bereits ein Zug mit der Zugnummer <b>'+options.record.data.number+'</b>!<br/><br/>Die Änderungen dieses Zuges wurden nicht gespeichert.',icon:Ext.MessageBox.WARNING,buttons:Ext.MessageBox.OK});}
else if(_result.locked)
{Ext.MessageBox.show({title:'Fehler beim Speichern',msg:'Es trat ein Fehler beim Speichern des Zuges auf: Zug <b>'+options.record.data.number+'</b> ist bereits geschlossen, und kann daher nicht mehr verändert werden!<br/><br/>Die Änderungen dieses Zuges wurden nicht gespeichert.',icon:Ext.MessageBox.WARNING,buttons:Ext.MessageBox.OK});}});multiActionExecutor.execute("Speichere Züge","schedulemanager","saveTrain",this.actionOptions);}},afterRender:function()
{return diloc.rail.TrainGrid.superclass.afterRender.call(this);},onStoreUpdate:function(_store,_record,_operation)
{if(_operation==Ext.data.Record.EDIT)
{this.saveButton.enable();this.rejectButton.enable();}
else if(_operation==Ext.data.Record.COMMIT)
{if(_store.getModifiedRecords().length==0)
{this.saveButton.disable();this.rejectButton.disable();}}
else if(_operation==Ext.data.Record.REJECT)
{console.info("modified records:",_store.getModifiedRecords());if(_store.getModifiedRecords().length==0)
{this.saveButton.disable();this.rejectButton.disable();}}
else console.log("store update: "+_operation);if(this.filterInputfield.getValue())
this.updateBottomToolbarStatus(_store,true);else
this.updateBottomToolbarStatus(_store,false);},storeAdd:function(_store,_records,_index)
{},storeLoad:function(_store,_records,_options)
{if(this.filterInputfield.getValue())
{this.filterTrainStore(this.filterInputfield);this.updateBottomToolbarStatus(_store,true);}
else
{this.updateBottomToolbarStatus(_store,false);}
if(this.lastSelectedTrainRecord)
{var currentRecord=this.store.getById(this.lastSelectedTrainRecord.data.id);if(currentRecord)
{this.getSelectionModel().selectRecords([currentRecord],false);this.getView().focusRow(this.store.indexOfId(currentRecord.data.id));this.fireEvent("trainchanged",currentRecord);}
delete this.lastSelectedTrainRecord;}},updateBottomToolbarStatus:function(_store,_filter)
{console.log("UPDATE STATUS",arguments);if(_filter)
{this.gridStatusText.setText(_store.getCount()+' von '+_store.getTotalCount()+" Zügen");}
else this.gridStatusText.setText(_store.getTotalCount()+" Züge");},filterTrainStore:function(_textField,_event)
{if(_textField.getValue().length>=1)this.filterInputfield.setHideTrigger(false);else if(_textField.getValue().length==0)this.filterInputfield.setHideTrigger(true);if(_textField.getValue().length>=2)
{if(this.getSelectionModel().getSelected())var trainSelected=true;this.store.filter('number',_textField.getValue());if(!this.getSelectionModel().getSelected()&&trainSelected==true)
{console.log("Train deselected");this.fireEvent("traindeselected");}
this.updateBottomToolbarStatus(this.store,true);}
else if(_textField.getValue().length<2)
{this.store.clearFilter();this.updateBottomToolbarStatus(this.store);}},gridPanelBeforeEdit:function(_event)
{if(!this.rights.write)
{_event.cancel=true;return;}
if(this.currentBeginDate==0&&this.currentEndDate==0&&_event.record.data.locked==true)
{_event.cancel=true;return;}
if(this.editMode===-1)
{_event.cancel=true;return;}
if(_event.field=="number")
{if(this.currentBeginDate!==0&&this.currentEndDate!==0)
{_event.cancel=true;}}
if(_event.field=="vp"&&((this.currentBeginDate!==0&&this.currentBeginDate==this.currentEndDate)||(this.dayChecksDisabled==true)))
{_event.cancel=true;}
if(this.stationInEdit==true)
{if(_event.field!="station.idCode"||_event.record!=this.currentEditorRecord)
{_event.cancel=true;}}
else
{if(_event.field=="station.idCode")
{}
this.currentEditorRecord=_event.record;}},gridPanelAfterEdit:function(_info)
{if(_info.field=="departureTime"||_info.field=="travelTime"||_info.field=="ttDepartureTime")
{this.fireEvent("currenttrainupdated",_info.fieldName,_info.record);}
if(_info.field=="departureTime")
{if(_info.record.get('ttDepartureTime')==null||_info.record.get('ttDepartureTime')=='')
{_info.record.set('ttDepartureTime',_info.value);}}},gridPanelValidateEdit:function(_info)
{if(_info.field=="departureTrack"||_info.field=="arrivalTrack")
{if(_info.value==""&&_info.originalValue==null)return false;}},setTrainRouteGrid:function(_trainRouteGrid)
{this.trainRouteGrid=_trainRouteGrid;},onStationUpdated:function(_stationId,_stationIdCode,_stationType)
{console.info(_stationType+" station updated:",_stationId,_stationIdCode,this.editMode,this.currentBeginDate,this.currentEndDate);if(this.currentTrainRecord.get('trainRouteId')!==null)
{if(this.editMode==1&&this.currentBeginDate!==0&&this.currentEndDate!==0)
{if(this.trainRouteGrid.containsStationId(_stationId))
{this.currentCutStationId=_stationId;this.haveToCreateTrainRouteException=false;console.log("Checking conditions:",this.currentTrainRecord.data.trainRouteIdColor,this.currentBeginDate,this.currentEndDate);if(this.currentTrainRecord.data.trainRouteIdColor=="week"||this.currentTrainRecord.data.trainRouteIdColor=="weeksubday")
{if(this.currentBeginDate==this.currentEndDate)
{console.warn("we have to create a train-route exception! 1");this.haveToCreateTrainRouteException=true;}}
else if(this.currentTrainRecord.data.trainRouteIdColor=="day"||this.currentTrainRecord.data.trainRouteIdColor=="parentweekday")
{if(this.currentBeginDate!=this.currentEndDate)
{console.warn("we have to create a train-route exception! 2");this.haveToCreateTrainRouteException=true;}}
else
{console.warn("we have to create a train-route exception! 3");this.haveToCreateTrainRouteException=true;}
this.cutMode=_stationType;var message="";if(this.haveToCreateTrainRouteException)
{if(_stationType=="arrival")message='Sie haben bei Zug <b>'+this.currentTrainRecord.data.number+"</b> den Zielbahnhof geändert. Möchten Sie eine Ausnahme für den Fahrplan anlegen und den Fahrplan entsprechend anpassen, so dass der Zug nur noch bis <b>"+_stationIdCode+"</b> fährt?";else message='Sie haben bei Zug <b>'+this.currentTrainRecord.data.number+"</b> den Startbahnhof geändert. Möchten Sie eine Ausnahme für den Fahrplan anlegen und den Fahrplan entsprechend anpassen, so dass der Zug in <b>"+_stationIdCode+"</b> losfährt?";}
else
{if(_stationType=="arrival")message='Sie haben bei Zug <b>'+this.currentTrainRecord.data.number+"</b> den Zielbahnhof geändert. Möchten Sie die vorhandene Fahrplan-Ausnahme entsprechend anpassen, so dass der Zug nur noch bis <b>"+_stationIdCode+"</b> fährt?";else message='Sie haben bei Zug <b>'+this.currentTrainRecord.data.number+"</b> den Startbahnhof geändert. Möchten Sie die vorhandene Fahrplan-Ausnahme entsprechend anpassen, so dass der Zug in <b>"+_stationIdCode+"</b> losfährt?";}
Ext.MessageBox.show({title:'Fahrplan anpassen?',msg:message,buttons:Ext.MessageBox.YESNO,fn:this.cutTrainRoute,scope:this});}}}},cutTrainRoute:function(_buttonId)
{if(_buttonId=='yes')
{this.disable();if(this.haveToCreateTrainRouteException)
{this.trainRouteGrid.editCopy(true);this.trainRouteGrid.getStore().on('load',this.doCutTrainRoute,this);}
else
{this.doCutTrainRoute();}}},doCutTrainRoute:function()
{this.trainRouteGrid.getStore().un('load',this.doCutTrainRoute,this);if(this.cutMode=='arrival')
{var changesToLastStation=this.trainRouteGrid.cutFromStationId(this.currentCutStationId);if(changesToLastStation.travelTime>0)
{this.currentTrainRecord.set('travelTime',changesToLastStation.travelTime);this.currentTrainRecord.set('arrivalTrack',changesToLastStation.arrivalTrack);var newArrivalStation=this.currentTrainRecord.get('arrivalStation').split("|")[1];var oldArrivalStation=this.currentTrainRecord.modified.arrivalStation.split("|")[1];var oldComment=this.currentTrainRecord.get('comment');if(oldComment==null)oldComment='';this.currentTrainRecord.set('comment','<b>AUSFALL</b> von '+newArrivalStation+' bis '+oldArrivalStation+'<br>'+oldComment);this.fireEvent('currenttrainupdated',null,this.currentTrainRecord);}}
if(this.cutMode=='departure')
{var changesToFirstStation=this.trainRouteGrid.cutToStationId(this.currentCutStationId);if(changesToFirstStation.travelTime>0)
{this.currentTrainRecord.set('travelTime',this.currentTrainRecord.get('travelTime')-changesToFirstStation.travelTime);var departureDate=Date.parseDate(this.currentTrainRecord.data.departureTime,"H:i:s");this.currentTrainRecord.set('departureTime',departureDate.add(Date.SECOND,changesToFirstStation.travelTime).format("H:i:s"));var ttDepartureDate=Date.parseDate(this.currentTrainRecord.data.ttDepartureTime,"H:i:s");this.currentTrainRecord.set('ttDepartureTime',ttDepartureDate.add(Date.SECOND,changesToFirstStation.ttTravelTime).format("H:i:s"));this.currentTrainRecord.set('departureTrack',changesToFirstStation.departureTrack);var newDepartureStation=this.currentTrainRecord.get('departureStation').split("|")[1];var oldDepartureStation=this.currentTrainRecord.modified.departureStation.split("|")[1];var oldComment=this.currentTrainRecord.get('comment');if(oldComment==null)oldComment='';this.currentTrainRecord.set('comment','<b>AUSFALL</b> von '+oldDepartureStation+' bis '+newDepartureStation+'<br>'+oldComment);this.fireEvent('currenttrainupdated',null,this.currentTrainRecord);}}
this.enable();},statusRenderer:function(_value,_meta,_record,_rowIndex,_colIndex,_store,_fieldName)
{if(_record.modified)_meta.css="x-grid3-dirty-cell";if(_value=="exceptionweek")_meta.css+=" week";if(_value=="exceptionday")_meta.css+=" day";if(_value=="exceptionweeksubday")_meta.css+=" weeksubday";if(_value=="subday")_meta.css+=" subday";if(_value=="exceptionparentweek")_meta.css+=" parentweek";if(_value=="exceptiondayparentweek")_meta.css+=" parentweekday";if(this.currentBeginDate==0&&this.currentEndDate==0)
{if(_record.data.locked==true)
_meta.css+=" locked";else
_meta.css+=" unlocked";}},stationCodeRenderer:function(value,metaData,record,_rowIndex,_colIndex,_store,_fieldName)
{if(record.data[_fieldName+'Color'])metaData.css=record.data[_fieldName+'Color'];if(value===null)return'';var values=value.split("|");if(values.length>0)
{if(values[1]=="_E_")return"";else return values[1];}
else
return value;},stationNameRenderer:function(_value,_meta,_record,_rowIndex,_colIndex,_store,_fieldName)
{if(_value===null)return'';var value=_value.split("|")[2];_meta.css="station-name";if(value=="__error")
{_meta.attr='style="background-image:url(images/icons/silk/cancel.png);"';return _value.split("|")[1]+" nicht gefunden.";}
else if(value=="__loading")
{_meta.attr='style="background-image:url(images/icons/custom/black-load.gif);"';return"Lade...";}
else
{if(_record.modified&&_record.modified[_fieldName])
_meta.attr='style="background-image:url(images/icons/silk/accept.png);"';else
_meta.attr='style="background-image:url(images/icons/silk_disabled/accept.png);"';return value;}
return value;},categoryRenderer:function(value,metaData,record)
{if(record.data.categoryIdColor)metaData.css=record.data.categoryIdColor;else metaData.css="";if(value==null)return"-";var categoryRecord=this.trainCategoryStore.getById(value);if(categoryRecord)return categoryRecord.get('idCode');else return"-";},trainAttributeRenderer:function(_value,_meta,_record,_rowIndex,_colIndex,_store,_fieldName)
{if(_record.data[_fieldName+'Color'])_meta.css=_record.data[_fieldName+'Color'];if(_value==null)return"-";var attributeRecord=this.trainAttributeStore.getById(_value);if(attributeRecord)return attributeRecord.get('idCode');else return"-";},lineRenderer:function(_value,_meta,_record,_rowIndex,_colIndex,_store)
{if(_record.data['lineIdColor'])_meta.css=_record.data['lineIdColor'];if(_value==null)return"-";var lineRecord=this.lineStore.getById(_value);if(lineRecord)return lineRecord.get('idCode');else return"-";},passthroughRenderer:function(_value,_meta,_record,_rowIndex,_colIndex,_store,_fieldName)
{if(_record.data[_fieldName+'Color'])_meta.css=_record.data[_fieldName+'Color'];return _value;},ttDepartureTimeRenderer:function(_value,_meta,_record)
{if(_record.data.ttDepartureTimeColor)_meta.css=_record.data.ttDepartureTimeColor;if(_value&&_value!=_record.data.departureTime)return _value.substr(0,5);else return'';},arrivalTimeRenderer:function(_value,_meta,_record)
{if(_record.data.travelTimeColor)_meta.css=_record.data.travelTimeColor;return Date.parseDate(_record.get("departureTime"),"H:i:s").add(Date.SECOND,_value).format("H:i:s");},ttArrivalTimeRenderer:function(_value,_meta,_record)
{if(_record.data.ttTravelTimeColor)_meta.css=_record.data.ttTravelTimeColor;var departureDate=Date.parseDate(_record.get("ttDepartureTime"),"H:i:s");var value=_value;if(_value==""||!_value)return'';if(departureDate)return departureDate.add(Date.SECOND,value).format("H:i");else return'';},codeRenderer:function(value,metaData,record)
{var started=false;var valid=true;var start=0;var end=0;var fieldNames=['travelsMonday','travelsTuesday','travelsWednesday','travelsThursday','travelsFriday','travelsSaturday','travelsSunday'];for(var i=0;i<8;i++)
{if(record.get(fieldNames[i])==true)
{if(!started)
{if(end==0)
{started=true;start=i+1;}
else valid=false;}}
else if(started)
{end=i;started=false;}}
var rt=null;if(start==0&&end==0)rt="";else if(valid)rt=start+""+end;else rt="-";if(rt=="-")record.data.vp="";else record.data.vp=rt;return rt;},trainRouteIdRenderer:function(_value,_meta,_record,_rowIndex,_colIndex,_store,_fieldName)
{if(_value&&_value!==null)_meta.css="tr-available";if(_record.data.trainRouteIdColor)_meta.css+=" "+_record.data.trainRouteIdColor;return'';}});Ext.reg('diloc-traingrid',diloc.rail.TrainGrid);diloc.rail.TrainGridCheckColumn=function(config){Ext.apply(this,config);if(!this.renderId){this.renderId=Ext.id();}
this.renderer=this.renderer.createDelegate(this);};diloc.rail.TrainGridCheckColumn.prototype={init:function(grid){this.grid=grid;this.grid.on('render',function(){var view=this.grid.getView();view.mainBody.on('mousedown',this.onMouseDown,this);},this);},onMouseDown:function(e,t){if(t.className&&t.className.indexOf('x-grid3-cc-'+this.renderId)!=-1){if(this.grid.editMode<0||this.grid.dayChecksDisabled==true||t.className.indexOf('disabled')>0)
{e.stopEvent();return;}
else
{e.stopEvent();var index=this.grid.getView().findRowIndex(t);var record=this.grid.store.getAt(index);record.set(this.dataIndex,!record.data[this.dataIndex]);}}},renderer:function(v,p,record){p.css+=' x-grid3-check-col-td';if(record.data[this.dataIndex+'Color'])p.css+=" "+record.data[this.dataIndex+'Color'];var tooltip='';var classAdd='';if(this.grid.editMode<0||this.grid.dayChecksDisabled==true||(record.data.locked==true&&this.grid.currentBeginDate==0&&this.grid.currentEndDate==0))classAdd=' disabled';return'<div '+tooltip+' class="diloc-check-grid '+
(v?'on':'')+classAdd+' x-grid3-cc-'+
this.renderId+'"> </div>';}};

Ext.namespace("diloc","diloc.rail","diloc.rail.util");Ext.ux.menu.RangeMenu.prototype.icons={gt:'images/icons/mixed/greater_then.png',lt:'images/icons/mixed/less_then.png',eq:'images/icons/mixed/equals.png'};Ext.ux.grid.filter.StringFilter.prototype.icon='images/icons/mixed/find.png';Ext.ux.grid.GridFilters.prototype.menuFilterText='Filter';Ext.ux.grid.filter.BooleanFilter.prototype.yesText='Ja';Ext.ux.grid.filter.BooleanFilter.prototype.noText='Nein';Ext.ux.grid.filter.DateFilter.prototype.beforeText='vor dem';Ext.ux.grid.filter.DateFilter.prototype.afterText='nach dem';Ext.ux.grid.filter.DateFilter.prototype.onText='am';Ext.ux.grid.filter.DateFilter.prototype.dateFormat='Y-m-d';diloc.rail.FileGrid=Ext.extend(Ext.grid.GridPanel,{rights:{read:true,write:false,create:false},cls:"filegrid",initComponent:function()
{console.log("initComponent is called!");this.addEvents({"foldercreated":true});this.store=null;this.reader=null;this.doSort=false;this.filters=null;this.setup();diloc.rail.FileGrid.superclass.initComponent.call(this);},storeLoad:function(_store,_records,_options)
{},setup:function()
{this.reader=new Ext.data.JsonReader({fields:[{name:'name'},{name:'type'},{name:'size',type:'int'},{name:'mtime',type:'date',dateFormat:'U'}],root:'data',id:'id',totalProperty:'totalCount'});this.store=new Ext.data.Store({reader:this.reader,url:gwf.App.backendUrl("syncmanager","listFiles"),remoteSort:false,plugins:[new gwf.plugins.StoreBackgroundJobs("Dateien")]});this.store.on("load",this.storeLoad,this);this.cm=new Ext.grid.ColumnModel([{header:'Name',dataIndex:'name',renderer:this.fileNameRenderer},{header:'Größe',dataIndex:'size',renderer:this.fileSizeRenderer,width:100},{header:'Typ',dataIndex:'type',renderer:this.fileTypeRenderer,width:200},{header:'Geändert',dataIndex:'mtime',renderer:this.fileTimeRenderer,width:180}]);this.cm.defaultSortable=true;this.sm=new Ext.grid.RowSelectionModel({singeleSelect:true});var tbarItems=[];if(this.rights.create)
{tbarItems.push({text:'Hochladen',iconCls:'filegrid-upload',handler:this.uploadFiles,scope:this});tbarItems.push({text:'Datei löschen',iconCls:'filegrid-delete',handler:this.deleteFiles,scope:this});}
if(this.rights.write)
{tbarItems.push("-");tbarItems.push({text:'Datei bearbeiten',iconCls:'filegrid-edit',ref:'../editButton',disabled:true,handler:this.editFile,scope:this});}
var gridPanelOptions={layout:'fit',frame:false,border:false,plugins:this.filters,tbar:tbarItems,view:new Ext.grid.GridView({scrollToTop:Ext.emptyFn,forceFit:true,emptyText:'Dieser Ordner enthält keine Dateien'})};Ext.apply(this,gridPanelOptions);this.on("cellcontextmenu",this.onCellContextMenu,this);this.on("rowclick",this.onRowClick,this);},uploadFiles:function()
{var dialog=new UploadDialog({uploadUrl:'backend/upload.php',filePostName:'syncmanager',flashUrl:'lib/ext.ux/swfupload.swf',fileSize:'150 MB',fileTypes:'*.*',fileTypesDescription:'Alle Dateien',scope:this,currentPath:this.currentPath});dialog.on("uploadComplete",this.uploadComplete,this);dialog.show();},deleteFiles:function()
{var selectedRecords=this.getSelectionModel().getSelections();var deleteJobs=[];for(var i=0;i<selectedRecords.length;i++)
{deleteJobs.push({text:'Lösche '+selectedRecords[i].data.name+"...",params:{path:this.currentPath+"/"+selectedRecords[i].data.name}});}
var deleteFile=new gwf.helpers.MultiActionExecutor({successSilent:true});deleteFile.on("success",function(){this.refresh();},this);deleteFile.execute("Lösche Dateien","syncmanager","deleteFile",deleteJobs);},createFolder:function()
{Ext.MessageBox.prompt("Ordner anlegen","Bitte geben Sie einen Ordnernamen ein:",function(_button,_foldername)
{console.log("Arguments:",arguments);var createFolder=new gwf.helpers.ActionExecutor({successSilent:true});createFolder.on("success",function(){this.fireEvent("foldercreated");},this);createFolder.execute("syncmanager","createFolder",{path:this.currentPath+"/"+_foldername});},this);},editFile:function()
{var selectedRecord=this.getSelectionModel().getSelected();var loader=new gwf.helpers.ActionExecutor({silent:true});loader.on("success",function(_result){if(_result.data.encodingError==true)
{Ext.MessageBox.show({title:"Fehler",msg:"Die Datei kann nicht bearbeitet werden, da sie nicht im Zeichensatz UTF-8 vorliegt. Bitte konvertieren Sie die Datei in UTF-8, damit Sie über den DiLoc|Sync Manager bearbeitet werden kann.",buttons:Ext.MessageBox.OK,icon:Ext.MessageBox.WARNING});}
else
{var dialog=new diloc.rail.dialogs.HtmlEditor();var html=_result.data.fileContent;var bodyTagBegin=html.indexOf("<body");var bodyBegin=html.indexOf(">",bodyTagBegin)+1;var bodyEnd=html.indexOf("</body>");var headerContent=html.substring(0,bodyBegin);var content=html.substring(bodyBegin,bodyEnd);var footerContent=html.substring(bodyEnd);console.log("HTML-Extraction:",bodyBegin,bodyEnd,content,headerContent,footerContent);dialog.on("textUpdated",function(_data,_filename){var saver=new gwf.helpers.ActionExecutor();var fileContent=headerContent+_data+footerContent;saver.on("success",function(_result){selectedRecord.set("size",fileContent.length);selectedRecord.commit();},dialog);console.log("HTML is:",_data);saver.execute("syncmanager","updateFile",{path:_filename,content:fileContent});},this);dialog.show(content,_result.data.filePath);}},this);loader.on("failure",function(_error)
{console.log("Failed with:",_result);},this);loader.execute("syncmanager","loadFile",{path:this.currentPath+"/"+selectedRecord.data.name},'Lade Datei '+selectedRecord.data.name+' ...');},uploadComplete:function()
{this.refresh();},onCellContextMenu:function(_grid,_rowIndex,_cellIndex,_event)
{var fieldName=_grid.getColumnModel().getDataIndex(_cellIndex);var record=_grid.getStore().getAt(_rowIndex);var items=[];_event.preventDefault();},onRowClick:function(_grid,_rowIndex,_event)
{var record=_grid.getStore().getAt(_rowIndex);if(record.data.type=="html"||record.data.type=="htm")
{this.editButton.enable();}
else this.editButton.disable();},fileNameRenderer:function(_value,_meta,_record)
{_meta.css=_record.data.type;return _value;},fileSizeRenderer:function(_value,_meta)
{if(_value<1024)
{return _value+" Byte";}
if(_value<1024*1204)
{return Math.round(_value/1024)+" KiB";}
if(_value<1024*1204*20)
{return Math.round(_value/1024/1024*10)/10+" MiB";}
if(_value<1024*1204*1024)
{return Math.round(_value/1024/1024)+" MiB";}
if(_value<1024*1204*1024*1024)
{return Math.round(_value/1024/1024/1024*10)/10+" GiB";}
else return _value;},fileTypeRenderer:function(_value,_meta)
{if(_value=="pdf")return"PDF-Datei";else if(_value=="txt")return"Text-Datei";else if(_value=="doc"||_value=="docx")return"Word-Dokument";else if(_value=="xls"||_value=="xlsx")return"Excel-Dokument";else if(_value=="ppt"||_value=="pptx")return"Powerpoint-Präsentation";else if(_value=="ods")return"OpenDocument Tabellen-Dokument";else if(_value=="odp")return"OpenDocument Text-Dokument";else if(_value=="png"||_value=="jpg"||_value=="bmp"||_value=="tif"||_value=="jpeg")return"Bild";else if(_value=="html"||_value=="htm")return"HTML-Dokument";else return _value.toUpperCase()+"-Datei";},fileTimeRenderer:function(_value,_meta)
{return _value.format(gwf.format.dateFormat);},refresh:function()
{this.store.load({params:{path:this.currentPath}});},suspend:function()
{clearTimeout(this.currentRefreshTimeout);},setRights:function(rights)
{this.rights=rights;},loadDirectory:function(_directory)
{this.currentPath=_directory;this.store.load({params:{path:_directory}});}});Ext.reg('diloc-filegrid',diloc.rail.FileGrid);diloc.rail.util.departureStationRenderer=function(_value)
{var parts=_value.split("|");return parts[1]+" - "+parts[2];};

Ext.ns('diloc.rail');diloc.rail.Train=function(_data,_date)
{this.data=_data;this.date=_date;this.addEvents('trainrunmessagesadded','forecastupdated','updated','trainstarted','trainarrived','canceled','completeupdate');this.updater=null;diloc.rail.Train.superclass.constructor.apply(this,arguments);this.addTrainRunMessage=function(_message)
{var alreadyIn=false;for(var i=0;i<this.data.trainRun.trainRunMessages.length;i++)
{if(this.data.trainRun.trainRunMessages[i].id==_message.id)alreadyIn=true;}
if(!alreadyIn)
{this.data.trainRun.trainRunMessages.push(_message);this.fireEvent('trainrunmessagesadded',this,[_message]);}
this.fireEvent('updated',this);};this.updateTrainRunMessage=function(_message)
{for(var i=0;i<this.data.trainRun.trainRunMessages.length;i++)
{if(this.data.trainRun.trainRunMessages[i].id==_message.id)
{this.data.trainRun.trainRunMessages[i]=_message;this.fireEvent('updated',this);}}};this.updateTrainRun=function(_trainRun)
{this.data.trainRun.trainComment=_trainRun.trainComment;this.data.trainRun.trainLining=_trainRun.trainLining;this.data.trainRun.departureTime=_trainRun.departureTime;this.data.trainRun.arrivalTime=_trainRun.arrivalTime;if(!this.data.trainRun.trainRunMessages)
{this.data.trainRun.trainRunMessages=[];}
if(this.data.trainRun.status==0&&_trainRun.status==1)
{this.data.trainRun.status=_trainRun.status;this.fireEvent('trainstarted');}
else if(this.data.trainRun.status==1&&_trainRun.status==2)
{this.data.trainRun.status=_trainRun.status;this.data.forecast=[];this.fireEvent('trainarrived');}
else
{this.data.trainRun.status=_trainRun.status;}
this.fireEvent('updated',this);};this.getStationIdCodeForStationId=function(_stationId)
{if(_stationId==this.data.departureStationId)
{return this.data.departureStation.split("|")[1];}
if(_stationId==this.data.arrivalStationId)
{return this.data.arrivalStation.split("|")[1];}
for(var i=0;i<this.data.trainRoute.stations.length;i++)
{if(this.data.trainRoute.stations[i].stationId==_stationId)
{return this.data.trainRoute.stations[i].stationIdCode;}}
return"??";};this.updateForecast=function(forecast)
{this.data.forecast=forecast;this.fireEvent('forecastupdated',this,forecast);this.fireEvent('updated',this);};this.setTrainRun=function(_trainRun)
{if(!this.data.trainRun)
{this.data.trainRun=_trainRun;if(!this.data.trainRun.trainRunMessages)
{this.data.trainRun.trainRunMessages=[];}
this.fireEvent("trainstarted",this);this.fireEvent("updated");}};this.isRunning=function()
{if(this.data.trainRun)
{if(this.data.trainRun.arrivalTime==null)return true;var now=new Date();var arrivalTime=Date.parseDate(this.data.trainRun.arrivalTime,"Y-m-d H:i:s");if(arrivalTime.getTime()/1000+15*60>now.getTime()/1000)return true;}
return false;};this.updateTrainRunMessageInfoText=function(_messageId,_infoText)
{for(var i=0;i<this.data.trainRun.trainRunMessages.length;i++)
{if(this.data.trainRun.trainRunMessages[i].id==_messageId){this.data.trainRun.trainRunMessages[i].infoText=_infoText;this.fireEvent('updated',this);}}};this.updateTrainRunMessageAttachment=function(_messageId,_attachmentAvailable)
{for(var i=0;i<this.data.trainRun.trainRunMessages.length;i++)
{if(this.data.trainRun.trainRunMessages[i].id==_messageId){this.data.trainRun.trainRunMessages[i].attachmentAvailable=_attachmentAvailable;this.fireEvent('updated',this);}}};this.updatePosition=function(_positionData)
{if(_positionData.latitude)this.data.latitude=_positionData.latitude;if(_positionData.longitude)this.data.longitude=_positionData.longitude;this.fireEvent('updated',this);};this.updateTrainData=function(_trainData)
{Ext.apply(this.data,_trainData);if(!_trainData.doesNotTravelAnymore&&this.data.isCanceled)delete this.data.isCanceled;this.fireEvent('completeupdate',this);this.fireEvent('updated',this);};this.setCanceled=function()
{this.data.isCanceled=true;this.fireEvent('canceled',this);};};Ext.extend(diloc.rail.Train,Ext.util.Observable,{});diloc.rail._TrainManager=function()
{this.addEvents('newTrainAdded');console.info("TrainManager was created!");this.trainsToLoad=[];this.dates={};this.loadTask=null;this.updater=null;this.trainsByTrainRunId={};this.highestTrainRunMessageId=0;this.newestForecastTimestamp=0;this.initialLoadDone=false;this.newestTrainRunTimestamp=0;this.trainRunsStore=null;this.updateLoader=null;this.lastExceptionTimestamp=null;this.loadMissingTrains=function()
{if(Ext.isArray(this.trainsInLoad))
{console.log("TM: Deferring load of missing trains because another load is still running!!");this.loadMissingTrains.defer(200,this);return;}
this.trainsInLoad=[];console.log("TM: Loading missing trains...");var trainLoader=new gwf.helpers.ActionExecutor({successSilent:true});trainLoader.on("success",function(_result){console.log("Data is",_result,_result.data.length);for(var i=0;i<_result.data.length;i++)
{if(!this.dates[_result.data[i].date])this.dates[_result.data[i].date]={};var train=new diloc.rail.Train(_result.data[i],_result.data[i].date);this.dates[_result.data[i].date][_result.data[i].id]=train;if(train.data.trainRun)
{this.trainsByTrainRunId["i"+train.data.trainRun.id]=train;var now=new Date();if(!this.initialLoadDone)
{if(train.data.trainRun.trainRunMessages.length>0)
{for(var k=0;k<train.data.trainRun.trainRunMessages.length;k++)
{if(train.data.trainRun.trainRunMessages[k].id>this.highestTrainRunMessageId)
{this.highestTrainRunMessageId=train.data.trainRun.trainRunMessages[k].id;}}}
if(train.data.forecast)
{if(train.data.forecast.lastUpdated>this.newestForecastTimestamp)
{this.newestForecastTimestamp=train.data.forecast.lastUpdated;}}
if(train.data.trainRun)
{var updatedAt=Date.parseDate(train.data.trainRun.updatedAt,"Y-m-d H:i:s");var updatedAtTimestamp=0;if(updatedAt)updatedAtTimestamp=updatedAt.getTime()/1000;if(updatedAtTimestamp>this.newestTrainRunTimestamp)this.newestTrainRunTimestamp=updatedAtTimestamp;}}}
if(Ext.isArray(this.trainsInLoad))
{for(var k=0;k<this.trainsInLoad.length;k++)
{if(this.trainsInLoad[k].trainId==train.data.id&&this.trainsInLoad[k].date==train.date)
{if(this.trainsInLoad[k].scope)
{this.trainsInLoad[k].callback.apply(this.trainsInLoad[k].scope,[train.data.id,train]);}
else
{this.trainsInLoad[k].callback(train.data.id,train);}}}}}
this.trainsInLoad=null;this.loadTask=null;if(this.highestTrainRunMessageId>0)this.initialLoadDone=true;if(!this.updater&&this.initialLoadDone==true)
{this.updater=true;this.lastExceptionTimestamp=Math.round(new Date().getTime()/1000);this.startRegularUpdates.defer(1000*10,this);}},this);trainLoader.on("failure",function(){console.warn("Error loading Trains from backend!!!");this.loadTask=null;this.trainsInLoad=null;},this);this.trainsInLoad=[];console.log("TM: Copying actual set of trains to be loaded...");for(var i=0;i<this.trainsToLoad.length;i++)
{this.trainsInLoad.push(this.trainsToLoad[i]);}
this.trainsToLoad=[];var trainsParam=[];console.log("TM: Checking for Trains which may already be loaded...");for(var i=0;i<this.trainsInLoad.length;i++)
{if(this.dates[this.trainsInLoad[i].date]&&this.dates[this.trainsInLoad[i].date][this.trainsInLoad[i].trainId])
{var train=this.dates[this.trainsInLoad[i].date][this.trainsInLoad[i].trainId];this.trainsInLoad[i].callback.apply(this.trainsInLoad[i].scope,[train.data.id,train]);}
else
{trainsParam.push(this.trainsInLoad[i].trainId+":"+this.trainsInLoad[i].date);}}
var trainsParamStr=trainsParam.join('|');if(trainsParamStr!=="")
{console.log("TM: executing load...",trainsParamStr);trainLoader.execute("trainmanager","loadTrains",{trains:trainsParamStr});}
else
{console.log("TM: not loading as nothing to load was left!?");}};this.startRegularUpdates=function()
{if(Ext.isBoolean(this.updater))
{this.updater=Ext.TaskMgr.start({run:this.updateFromBackend,interval:10*1000,scope:this});}};this.updateFromBackend=function()
{if(this.updateLoader)return;this.updateLoader=new gwf.helpers.ActionExecutor({silent:true});this.updateLoader.on("success",function(_result){this.updateLoader=null;var trainRunsStoreShouldBeUpdated=false;var lastNewestTrainRunTimestamp=this.newestTrainRunTimestamp;var i=0;if(_result.data.changedTrainRuns&&Ext.isArray(_result.data.changedTrainRuns))
{if(_result.data.changedTrainRuns.length>0)
{trainRunsStoreShouldBeUpdated=true;}
for(i=0;i<_result.data.changedTrainRuns.length;i++)
{var currentTrainRun=_result.data.changedTrainRuns[i];var currentTrainId=currentTrainRun.trainId;var updatedAt=Date.parseDate(currentTrainRun.updatedAt,"Y-m-d H:i:s");var updatedAtTimestamp=0;if(updatedAt)updatedAtTimestamp=updatedAt.getTime()/1000;if(updatedAtTimestamp>this.newestTrainRunTimestamp)this.newestTrainRunTimestamp=updatedAtTimestamp;if(this.trainsByTrainRunId["i"+currentTrainRun.id])
{this.trainsByTrainRunId["i"+currentTrainRun.id].updateTrainRun(currentTrainRun);console.info("Cached trainrun was updated!");}
else
{console.info("New trainrun was loaded...");var date=Date.parseDate(currentTrainRun.date,"m/d/y").format("Y-m-d");if(this.dates[date]&&this.dates[date][currentTrainId])
{if(this.dates[date][currentTrainId].data.trainRun==null)
{this.dates[date][currentTrainId].setTrainRun(currentTrainRun);this.trainsByTrainRunId["i"+currentTrainRun.id]=this.dates[date][currentTrainId];console.info("...into cache.");}
else console.info("...into nirvana.");}
else
{console.log("TM: Loading Train of new TrainRun...");this.loadTrain(currentTrainId,date,function(_trainId,_train){this.updateTrainRunsStore();},this);}}}}
if(_result.data.forecasts&&Ext.isArray(_result.data.forecasts))
{for(i=0;i<_result.data.forecasts.length;i++)
{if(_result.data.forecasts[i].lastUpdated>this.newestForecastTimestamp)this.newestForecastTimestamp=_result.data.forecasts[i].lastUpdated;if(this.trainsByTrainRunId["i"+_result.data.forecasts[i].trainRunId])
{this.trainsByTrainRunId["i"+_result.data.forecasts[i].trainRunId].updateForecast(_result.data.forecasts[i]);}}}
if(_result.data.trainRunMessages&&Ext.isArray(_result.data.trainRunMessages))
{if(_result.data.trainRunMessages.length>0)trainRunsStoreShouldBeUpdated=true;for(i=0;i<_result.data.trainRunMessages.length;i++)
{if(_result.data.trainRunMessages[i].id>this.highestTrainRunMessageId)this.highestTrainRunMessageId=_result.data.trainRunMessages[i].id;if(this.trainsByTrainRunId["i"+_result.data.trainRunMessages[i].trainRunId])
{this.trainsByTrainRunId["i"+_result.data.trainRunMessages[i].trainRunId].addTrainRunMessage(_result.data.trainRunMessages[i]);}}}
if(_result.data.changedTrainRunMessages&&Ext.isArray(_result.data.changedTrainRunMessages))
{for(i=0;i<_result.data.changedTrainRunMessages.length;i++)
{if(this.trainsByTrainRunId["i"+_result.data.changedTrainRunMessages[i].trainRunId])
{this.trainsByTrainRunId["i"+_result.data.changedTrainRunMessages[i].trainRunId].updateTrainRunMessage(_result.data.changedTrainRunMessages[i]);}}}
if(_result.data.updatedPositions&&Ext.isArray(_result.data.updatedPositions))
{for(i=0;i<_result.data.updatedPositions.length;i++)
{if(this.trainsByTrainRunId["i"+_result.data.updatedPositions[i].trainRunId])
{this.trainsByTrainRunId["i"+_result.data.updatedPositions[i].trainRunId].updatePosition(_result.data.updatedPositions[i]);}}}
if(_result.data.changedTrains&&Ext.isArray(_result.data.changedTrains))
{for(i=0;i<_result.data.changedTrains.length;i++)
{var changedTrain=_result.data.changedTrains[i];if(this.dates[changedTrain.date][changedTrain.id])
{console.log("Updating already loaded train because of changes!");if(changedTrain.doesNotTravelAnymore==true)
{console.log(" - The train was canceled!");this.dates[changedTrain.date][changedTrain.id].setCanceled();}
else
{this.dates[changedTrain.date][changedTrain.id].updateTrainData(changedTrain);}}
else
{if(!changedTrain.doesNotTravelAnymore)
{var train=new diloc.rail.Train(changedTrain,changedTrain.date);this.dates[changedTrain.date][changedTrain.id]=train;if(train.data.trainRun)
{this.trainsByTrainRunId["i"+train.data.trainRun.id]=train;}
console.log("Adding completely new train!");this.fireEvent('newTrainAdded',train);}}}
if(_result.data.lastExceptionTimestamp)this.lastExceptionTimestamp=_result.data.lastExceptionTimestamp;}
if(this.trainRunsStore!==null&&trainRunsStoreShouldBeUpdated)this.updateTrainRunsStore();var now=new Date();if(lastNewestTrainRunTimestamp==this.newestTrainRunTimestamp&&trainRunsStoreShouldBeUpdated==true)
{this.newestTrainRunTimestamp+=1;var tmp=new Date(this.newestTrainRunTimestamp*1000);console.info("Increasing timestamp!!",tmp);}},this);this.updateLoader.on("failure",function(_result,_eventId){this.updateLoader=null;},this);var loadOptions={lastTrainRunMessageId:this.highestTrainRunMessageId,lastForecastUpdate:this.newestForecastTimestamp,lastTrainRunTimestamp:this.newestTrainRunTimestamp,lastExceptionUpdate:this.lastExceptionTimestamp};if(this.highestTrainRunMessageId>0)
{this.updateLoader.execute("trainmanager","whatHappened",loadOptions);}};this.updateTrainRunsStore=function()
{console.log("Updating trainruns-store!");var runningTrains=[];for(var i in this.trainsByTrainRunId)
{var train=this.trainsByTrainRunId[i];if(train.isRunning())
{var trainData=[train.data.trainRun.id,train.data.trainRun.status,train.data.trainRun.trainComment,train.data.trainRun.trainLining,train.data.number,train.data.departureStation,train.data.arrivalStation];if(train.data.trainRun)trainData.push(train.data.trainRun.date);else trainData.push(null);var lastTrainRunMessage=train.data.trainRun.trainRunMessages[train.data.trainRun.trainRunMessages.length-1];if(lastTrainRunMessage)
{trainData=trainData.concat([lastTrainRunMessage.stationIdCode,lastTrainRunMessage.stationName,lastTrainRunMessage.timestamp,lastTrainRunMessage.latenessType,lastTrainRunMessage.latenessAmount,lastTrainRunMessage.latenessCode,lastTrainRunMessage.infoText,lastTrainRunMessage.attachmentAvailable,lastTrainRunMessage.type]);}
else trainData=trainData.concat(["","",null,null,null,null,null,null,null]);trainData.push(train.data.latitude,train.data.longitude);runningTrains.push(trainData);}}
this.trainRunsStore.loadData({data:runningTrains});};this.supplyTrainRunsStore=function(_store)
{this.trainRunsStore=_store;var runningTrainsLoader=new gwf.helpers.ActionExecutor({silent:true});runningTrainsLoader.on("success",function(_result){this.numberOfTrainRunsTrainsToLoad=_result.data.length;this.numberOfTrainRunsTrainsLoaded=0;console.log("Loading ",this.numberOfTrainRunsTrainsToLoad," trains");for(var i=0;i<_result.data.length;i++)
{this.loadTrain(_result.data[i].trainId,_result.data[i].date,function(_trainId,_train){this.numberOfTrainRunsTrainsLoaded++;if(this.numberOfTrainRunsTrainsLoaded>=this.numberOfTrainRunsTrainsToLoad)
{console.log("Loading of running trains finished, updating store.");this.updateTrainRunsStore();}},this);}},this);runningTrainsLoader.execute("trainmanager","loadRunningTrainIds");};this.receiveForecasts=function(_forecasts)
{for(var i=0;i<_forecasts.length;i++)
{if(this.trainsByTrainRunId["i"+_forecasts[i].trainRunId])
{this.trainsByTrainRunId["i"+_forecasts[i].trainRunId].updateForecast(_forecasts[i]);}}};this.getTrainByExistingTrainRunId=function(_trainRunId)
{if(this.trainsByTrainRunId["i"+_trainRunId])return this.trainsByTrainRunId["i"+_trainRunId];else return null;};this.deleteTrainByTrainRunId=function(_trainRunId)
{if(this.trainsByTrainRunId["i"+_trainRunId])
{console.log("Trying to delete train by train-run-id!");var train=this.trainsByTrainRunId["i"+_trainRunId];delete this.dates[train.date][train.data.id];delete this.trainsByTrainRunId["i"+_trainRunId];delete train;}};this.stopUpdates=function()
{if(this.updater)Ext.TaskMgr.stop(this.updater);};};Ext.extend(diloc.rail._TrainManager,Ext.util.Observable,{loadTrain:function(_trainId,_dateStr,_callback,_scope)
{var dateStr=_dateStr;if(!_dateStr){var date=new Date();dateStr=date.format("Y-m-d");}
if(this.dates[dateStr]&&this.dates[dateStr][_trainId])
{_callback.apply(_scope,[_trainId,this.dates[dateStr][_trainId]]);}
else
{this.trainsToLoad.push({trainId:_trainId,date:_dateStr,callback:_callback,scope:_scope});if(!this.loadTask)
{this.loadTask=new Ext.util.DelayedTask();}
this.loadTask.delay(200,this.loadMissingTrains,this);}}});function testFireBug()
{console.log("testFireBug() >");test.notexisting.doIt(_juhuu);console.log("testFireBug() <");}
function testTrainManager(trainId)
{var callback=function(_trainId,train)
{console.info("Train #"+_trainId+" got loaded: ",train);train.on("trainrunmessagesadded",function(_train,_messages)
{console.info("Train #"+_train.data.id+" got new messages: ",_messages);});train.on("forecastupdated",function(_train,_forecast){console.info("Train #"+_train.data.id+" got new forecast: ",_forecast);});train.on("trainstarted",function(_train){console.info("Train #"+_train.data.id+" has started! ("+_train.data.trainRun.departureTime+")");});train.on("trainarrived",function(_train){console.info("Train #"+_train.data.id+" has arrived! ("+_train.data.trainRun.arrivalTime+")");});};var now=new Date();var dateStr=now.format("Y-m-d");if(Ext.isArray(trainId))
{for(var i=0;i<trainId.length;i++)
{diloc.rail.TrainManager.loadTrain(trainId[i],dateStr,callback);}}
else diloc.rail.TrainManager.loadTrain(trainId,dateStr,callback);}
diloc.rail.TrainManager=new diloc.rail._TrainManager();

Ext.ns("diloc.rail");diloc.rail._DispositionChangeDataContainer=function()
{this.dispositionChangesetId=null;this.dispositionChanges=[];this.loadedTrains={};this.addEvents("enableactions","disableactions");};Ext.extend(diloc.rail._DispositionChangeDataContainer,Ext.util.Observable);diloc.rail._DispositionChangeManager=function()
{this.dispositionChangeData=new diloc.rail._DispositionChangeDataContainer();this.saveChangesAction=null;this.discardChangesAction=null;this.initialized=false;this.init=function()
{if(!this.initialized)
{console.info("Initializing DispositionChangeManager");this.initialized=true;if(diloc.User.hasDispositionChangeset())
{this.dispositionChangeData.dispositionChangesetId=diloc.User.dispositionChangesetId();this.dispositionChangeData.dispositionChanges=diloc.User.dispositionChanges();for(var i=0;i<this.dispositionChangeData.dispositionChanges.length;i++)
{if(this.dispositionChangeData.dispositionChanges[i].trainId)
{diloc.rail.TrainManager.loadTrain(this.dispositionChangeData.dispositionChanges[i].trainId,this.dispositionChangeData.dispositionChanges[i].trainDate,this.trainLoaded,this);}}}
this.saveChangesAction=new Ext.Action({text:'Dispositions-Änderung speichern',iconCls:'save-dispositionset',handler:this.saveDispoChanges,scope:this,disabled:!diloc.User.hasDispositionChangeset()});this.discardChangesAction=new Ext.Action({text:'Dispositions-Änderung verwerfen',iconCls:'discard-dispositionset',handler:this.discardDispoChanges,scope:this,disabled:!diloc.User.hasDispositionChangeset()});this.dispositionChangeData.on("enableactions",this.enableActions,this);this.dispositionChangeData.on("disableactions",this.disableActions,this);}};this.enableActions=function()
{this.saveChangesAction.enable();this.discardChangesAction.enable();};this.disableActions=function()
{this.saveChangesAction.disable();this.discardChangesAction.disable();};this.trainLoaded=function(_trainId,_trainProxy)
{console.info("A TRAIN GOT LOADED!",_trainId);this.dispositionChangeData.loadedTrains["t"+_trainId]=_trainProxy;};this.saveDispoChanges=function()
{this.confirmWindow=new Ext.Window({title:'Dispositions-Änderungen speichern',layout:'fit',autoHeight:true,items:[{xtype:'form',labelAlign:'top',labelWidth:300,bodyStyle:'padding:10px',autoHeight:true,items:[{html:"<h2>Folgende Änderungen werden gespeichert:</h2>"+this.getPendingChanges(),border:false,bodyStyle:'margin-bottom:20px;',autoHeight:true,ref:'../changeSummary'},{xtype:'textarea',fieldLabel:'Kommentar zu Ihren Änderungen',maxLength:250,maxLenghtText:'Der Kommentar kann maximal 250 Zeichen lang sein',width:360,grow:true,itemId:'comment',id:'dc_comment',tabIndex:0}]}],width:400,buttons:[{text:'Speichern',tabIndex:1,handler:this.reallySave,scope:this},{text:'Abbrechen',tabIndex:2,handler:this.abortSave,scope:this}],defaultButton:'dc_comment'});this.saveChangesAction.disable();this.confirmWindow.show();};this.reallySave=function()
{var saver=new gwf.helpers.ActionExecutor({successSilent:true});saver.on("success",function(_result){this.dispositionChangeData.fireEvent("disableactions");this.dispositionChangeData.dispositionChanges=[];this.dispositionChangeData.dispositionChangesetId=null;this.confirmWindow.close();delete this.confirmWindow;},this);var params={id:this.dispositionChangeData.dispositionChangesetId};var textarea=this.confirmWindow.findByItemId('comment');if(textarea&&textarea.getValue()!=="")
{params.comment=textarea.getValue();}
saver.execute("dispositionchangeset","commit",params);};this.directlySaveDispoChanges=function(_callback,_scope)
{if(this.dispositionChangeData.dispositionChanges.length>1)
{if(_scope)_callback.apply(_scope);else _callback();this.saveDispoChanges();}
else
{var saver=new gwf.helpers.ActionExecutor({successSilent:true});saver.on("success",function(_result){this.dispositionChangeData.fireEvent("disableactions");this.dispositionChangeData.dispositionChanges=[];this.dispositionChangeData.dispositionChangesetId=null;if(_scope)_callback.apply(_scope);else _callback();},this);var params={id:this.dispositionChangeData.dispositionChangesetId};saver.execute("dispositionchangeset","commit",params);}};this.abortSave=function()
{this.saveChangesAction.enable();this.confirmWindow.close();delete this.confirmWindow;};this.discardDispoChanges=function()
{var discarder=new gwf.helpers.ActionExecutor({successSilent:true});discarder.on("success",function(_result){this.dispositionChangeData.fireEvent("disableactions");diloc.rail.TrainManager.receiveForecasts(_result.data.forecasts);this.dispositionChangeData.dispositionChanges=[];this.dispositionChangeData.dispositionChangesetId=null;},this);discarder.execute("dispositionchangeset","delete",{id:this.dispositionChangeData.dispositionChangesetId});};this.showDispositionChangeDialog=function(_trainInfo)
{var dcDialog=new diloc.rail.dialogs.DispoChange(_trainInfo);dcDialog.on("dispositionchangeadded",function(_dispositionChange){this.dispositionChangeData.dispositionChanges.push(_dispositionChange);if(this.dispositionChangeData.dispositionChangesetId==null)
{this.dispositionChangeData.dispositionChangesetId=_dispositionChange.dispositionChangesetId;}
diloc.rail.TrainManager.loadTrain(_dispositionChange.trainId,_dispositionChange.trainDate,this.trainLoaded,this);this.dispositionChangeData.fireEvent("enableactions");if(this.confirmWindow)
{console.log("Updating confirm-window!");this.confirmWindow.changeSummary.update("<h2>Folgende Änderungen werden gespeichert:</h2>"+this.getPendingChanges());}},this);dcDialog.on("dispositionchangedeleted",function(_dispositionChange){for(var i=0;i<this.dispositionChangeData.dispositionChanges.length;i++)
{if(this.dispositionChangeData.dispositionChanges[i].id==_dispositionChange.id)
{this.dispositionChangeData.dispositionChanges.remove(this.dispositionChanges[i]);break;}}
if(this.dispositionChangeData.dispositionChanges.length==0)
{this.dispositionChangeData.fireEvent("disableactions");this.dispositionChangeData.dispositionChangesetId=null;if(this.confirmWindow)
{this.confirmWindow.close();delete this.confirmWindow;}}
else if(this.confirmWindow)
{console.log("Updating confirm-window!");this.confirmWindow.changeSummary.update("<h2>Folgende Änderungen werden gespeichert:</h2>"+this.getPendingChanges());}},this);dcDialog.on("dispositionchangesaved",function(_dispositionChange){console.log("Got saved event!");for(var i=0;i<this.dispositionChangeData.dispositionChanges.length;i++)
{if(this.dispositionChangeData.dispositionChanges[i].id==_dispositionChange.id)
{this.dispositionChangeData.dispositionChanges[i]=_dispositionChange;}}
if(this.confirmWindow)
{console.log("Updating confirm-window!");this.confirmWindow.changeSummary.update("<h2>Folgende Änderungen werden gespeichert:</h2>"+this.getPendingChanges());}},this);dcDialog.show();};this.getSaveChangesAction=function()
{return this.saveChangesAction;};this.getDiscardChangesAction=function()
{return this.discardChangesAction;};this.getPendingChanges=function()
{var html="<br/>";var additional=false;var outputData={};console.log("All changes are: ",this.dispositionChangeData.dispositionChanges);for(var i=0;i<this.dispositionChangeData.dispositionChanges.length;i++)
{var trainIdentifier="t"+this.dispositionChangeData.dispositionChanges[i].trainId;var trainProxy=this.dispositionChangeData.loadedTrains[trainIdentifier];if(trainProxy)
{if(outputData[trainIdentifier])
{outputData[trainIdentifier].dispositionChanges.push(this.dispositionChangeData.dispositionChanges[i]);}
else
{outputData[trainIdentifier]={train:trainProxy,dispositionChanges:[this.dispositionChangeData.dispositionChanges[i]]};}}
else{additional=true;}}
this.pendingChangesTrainInfo=[];for(var index in outputData)
{html+="<b>Zug "+outputData[index].train.data.number+":</b><br/>";html+='<ul class="list">';for(var i=0;i<outputData[index].dispositionChanges.length;i++)
{var dispoChange=outputData[index].dispositionChanges[i];console.log("DispoChange is:",dispoChange);if(dispoChange._trainInfo)
{var pendingChangeId=this.pendingChangesTrainInfo.length;html+='<li><a href="javascript:diloc.rail.DispositionChangeManager.showPendingChangeDialog('+pendingChangeId+');">'+outputData[index].train.getStationIdCodeForStationId(dispoChange.stationId)+"</a>:";this.pendingChangesTrainInfo.push(dispoChange._trainInfo);}
else html+='<li>'+outputData[index].train.getStationIdCodeForStationId(dispoChange.stationId)+":";var lis=[];if(dispoChange.arrivalLatenessDiff!=null||(dispoChange.arrivalTrack!=null&&dispoChange.arrivalTrack!==''))
{var li="Ankunft: ";var arrivalChanges=[];if(dispoChange.arrivalLatenessDiff!=null)arrivalChanges.push(diloc.rail.util.latenessToString(dispoChange.arrivalLatenessDiff,"mm:ss"));if(dispoChange.arrivalTrack!=null&&dispoChange.arrivalTrack!=='')arrivalChanges.push("Gleis "+dispoChange.arrivalTrack);li+=arrivalChanges.join(", ");lis.push(li);}
if(dispoChange.departureLatenessDiff!=null||(dispoChange.departureTrack!=null&&dispoChange.departureTrack!==''))
{var li="Abfahrt: ";var departureChanges=[];if(dispoChange.departureLatenessDiff!=null)departureChanges.push(diloc.rail.util.latenessToString(dispoChange.departureLatenessDiff,"mm:ss"));if(dispoChange.departureTrack!=null&&dispoChange.departureTrack!=='')departureChanges.push("Gleis "+dispoChange.departureTrack);li+=departureChanges.join(", ");lis.push(li);}
var stayTypes=['Durchfahrt','Halt','Bedingter Halt','Außerordentlicher Halt'];if(dispoChange.stayType!=null)
{console.log("Original stay-type:",dispoChange.originalStayType);if(typeof dispoChange.originalStayType!='undefined')lis.push("Halt-Typ von "+stayTypes[dispoChange.originalStayType]+' auf '+stayTypes[dispoChange.stayType]+' geändert');else lis.push("Halt-Typ: "+stayTypes[dispoChange.stayType]);}
if(dispoChange.dontBoard==true)
{lis.push('<b>Nicht einsteigen!</b>');}
if(dispoChange.trainEndsHere==true)
{lis.push('<b style="color:red">Zug endet hier!</b>');}
if(dispoChange.adviceText!==''&&dispoChange.adviceText!=null)
{lis.push('Hinweis-Text: '+dispoChange.adviceText);}
if(lis.length>1)
{html+='<ul class="list"><li>'+lis.join('</li><li>')+'</li></ul>';}
else if(lis.length==1)
{html+=' '+lis[0];}
html+="</li>";}
html+="</ul>";}
if(additional)
{html+="<br/>Und weitere unbekannte Änderungen.";}
return html;};this.showPendingChangeDialog=function(_pendingChangeId)
{console.log("showPendingChangeDialog:",_pendingChangeId,this.pendingChangesTrainInfo);if(this.pendingChangesTrainInfo[_pendingChangeId])
{this.showDispositionChangeDialog(this.pendingChangesTrainInfo[_pendingChangeId]);}
else console.warn("Could not find traininfo!");};};diloc.rail.DispositionChangeManager=new diloc.rail._DispositionChangeManager();

Ext.namespace("diloc","diloc.rail");diloc.rail.OpenLayersPanel=Ext.extend(Ext.Panel,{layers:[],initialZoom:5,initialCenter:null,allowUnpinning:true,controls:[],imagePath:'',mapTheme:'default',followSelectedMarker:false,map:null,markers:{},markerStores:[],mapReady:false,manualMarkerId:0,unaddedMarkers:{},popupIsPinned:true,nextMoveEventIsFromFollow:false,nextMoveEventNeedsSelect:null,selectRecordOnStoreAdd:null,initComponent:function()
{this.addEvents('markerselected');if(this.initialCenter===null)this.initialCenter=new OpenLayers.LonLat(10.151,50.655);this.on('render',this.initMap,this);this.on('beforehide',this.onBeforeHide,this);diloc.rail.OpenLayersPanel.superclass.initComponent.call(this);},initMap:function()
{if(this.imagePath!=='')OpenLayers.ImgPath=this.imagePath;this.map=new OpenLayers.Map(this.body.dom.id,{projection:new OpenLayers.Projection("EPSG:900913"),displayProjection:new OpenLayers.Projection("EPSG:4326"),numZoomLevels:18,maxResolution:156543.0339,maxExtent:new OpenLayers.Bounds(-20037508,-20037508,20037508,20037508.34),theme:this.mapTheme,controls:[]});this.map.addLayers(this.layers);this.markerLayer=new OpenLayers.Layer.Markers("Markers");this.map.addLayer(this.markerLayer);for(var i=0;i<this.controls.length;i++)
{var control=this.controls[i];if(typeof control==='string')
{var newControl=null;eval('newControl=new OpenLayers.Control.'+control+'();');if(newControl!==null)
{this.map.addControl(newControl);}
else
{alert("Could not find control "+control+"!");}}
else if(typeof control==='object')
{this.map.addControl(control);}
else
{alert('Unknown control type!');}}
this.map.addControl(new OpenLayers.Control.Attribution());this.initMapPart2.defer(10,this);},initMapPart2:function()
{this.initialCenter.transform(new OpenLayers.Projection("EPSG:4326"),new OpenLayers.Projection("EPSG:900913"));this.map.setCenter(this.initialCenter,this.initialZoom);for(var inUnaddedMarkers in this.unaddedMarkers)
{this.markerLayer.addMarker(this.unaddedMarkers[inUnaddedMarkers]);this.markers[inUnaddedMarkers]=this.unaddedMarkers[inUnaddedMarkers];this.unaddedMarkers[inUnaddedMarkers]=null;}
this.unaddedMarkers=null;this.map.events.register("moveend",this,this.onMapMoveEnd);this.map.events.register("movestart",this,this.onMapMoveStart);this.mapReady=true;if(this.markerStores.length>0)
{for(var i=0;i<this.markerStores.length;i++)
{this.markerStoreUpdated(this.markerStores[i]);}}},onBeforeHide:function()
{if(this.popupWindow)
{this.popupWindow.hide();}},markerStoreUpdated:function(_store)
{if(!this.mapReady)return;var count=_store.getCount();for(var inMarkers in this.markers)
{if(!inMarkers.startsWith("_m_"))
{if(this.markers[inMarkers].parentStore==_store)
{this.markers[inMarkers].stillActive=false;}}}
for(var i=0;i<count;i++)
{var record=_store.getAt(i);var markerOptions=_store.generateMarkerOptions(_store.getAt(i));if(markerOptions.id&&markerOptions.lat&&markerOptions.lng&&markerOptions.iconSize&&markerOptions.iconOffset&&markerOptions.iconImage)
{if(this.markers[markerOptions.id])
{var marker=this.markers[markerOptions.id];marker.stillActive=true;if(markerOptions.selectedIconImage!=marker.selectedIconImage)
{if(marker.isSelected)marker.setUrl(markerOptions.selectedIconImage);marker.selectedIconImage=markerOptions.selectedIconImage;}
if(markerOptions.iconImage!=marker.iconImage)
{if(!marker.isSelected)marker.setUrl(markerOptions.iconImage);marker.iconImage=markerOptions.iconImage;}
var markerPos=new OpenLayers.LonLat(markerOptions.lng,markerOptions.lat);markerPos.transform(new OpenLayers.Projection("EPSG:4326"),new OpenLayers.Projection("EPSG:900913"));var px=this.map.getLayerPxFromLonLat(markerPos);if(px==null)
{marker.display(false);}
else
{marker.moveTo(px);}
if(this.popupWindow&&this.popupWindow.marker==marker&&this.popupIsPinned==true&&this.popupWindow.isVisible()&&this.isVisible()&&!this.followSelectedMarker)
{this.popupWindow.anchorTo(Ext.get(marker.icon.imageDiv),"tl-br?");}
if(this.popupWindow&&this.popupWindow.marker==marker&&this.followSelectedMarker)
{this.nextMoveEventIsFromFollow=true;this.map.panTo(marker.lonlat);}
marker.parentRecord=record;marker.parentStore=_store;}
else
{var markerPos=new OpenLayers.LonLat(markerOptions.lng,markerOptions.lat);markerPos.transform(new OpenLayers.Projection("EPSG:4326"),new OpenLayers.Projection("EPSG:900913"));var markerIcon=new OpenLayers.Icon(markerOptions.iconImage,new OpenLayers.Size(markerOptions.iconSize[0],markerOptions.iconSize[1]),new OpenLayers.Pixel(markerOptions.iconOffset[0],markerOptions.iconOffset[1]));var newMarker=new OpenLayers.Marker(markerPos,markerIcon);newMarker.events.register("click",this,this.onMarkerClicked);newMarker.stillActive=true;newMarker.parentRecord=record;newMarker.parentStore=_store;newMarker.iconImage=markerOptions.iconImage;if(markerOptions.selectedIconImage)
newMarker.selectedIconImage=markerOptions.selectedIconImage;this.markerLayer.addMarker(newMarker);if(record==this.selectRecordOnStoreAdd)
{this.selectMarker(newMarker);this.selectRecordOnStoreAdd=null;}
this.markers[markerOptions.id]=newMarker;}}
else
{if(markerOptions.id&&markerOptions.lat===null&&markerOptions.lng===null)
{}
else
{alert("Bad implementation of _markerOptionsFunction! Missing one of members id, iconSize, iconOffset,iconImage, lat or lng");console.log("Generated Marker-Options were:",markerOptions);}}}
for(inMarkers in this.markers)
{if(this.markers[inMarkers].parentStore==_store&&this.markers[inMarkers].stillActive==false)
{console.log("Removing inactive icon "+inMarkers+"...");if(this.popupWindow&&this.popupWindow.marker==this.markers[inMarkers])
{console.log("Also removing popup-window");this.popupWindow.hide();this.popupWindow.marker=null;}
this.markerLayer.removeMarker(this.markers[inMarkers]);this.markers[inMarkers].destroy();eval("delete this.markers."+inMarkers+";");}}},onMarkerClicked:function(event)
{var marker=event.object;var popupOptions={};if(marker.parentRecord)
{popupOptions=marker.parentStore.generatePopupOptions.call(marker.parentStore.generateFunctionScope,marker.parentRecord);}
else
{if(marker.popupHtml==null)return;if(marker.popupTitle)popupOptions.title=marker.popupTitle;if(marker.popupHtml)popupOptions.html=marker.popupHtml;}
if(popupOptions.windowConfig||(this.popupWindow&&this.popupWindow.marker!=marker))
{if(this.popupWindow.marker)
{this.popupWindow.marker.setUrl(this.popupWindow.marker.iconImage);this.popupWindow.marker.isSelected=false;}
this.popupWindow.destroy();this.popupWindow=null;}
if(!this.popupWindow)
{var windowConfig={constrain:true,closeAction:'hide',stateId:'openlayers-popupwindow',autoScroll:true};if(popupOptions.html)windowConfig.html=popupOptions.html;if(popupOptions.title)windowConfig.title=popupOptions.title;if(this.allowUnpinning&&!(popupOptions.disableUnpinning&&popupOptions.disableUnpinning==true))
{windowConfig.tools=[{id:'pin',handler:this.onMarkerPinClicked,hidden:this.popupIsPinned,qtip:'An Marker kleben',scope:this},{id:'unpin',qtip:'Von Marker ablösen',hidden:!this.popupIsPinned,handler:this.onMarkerUnPinClicked,scope:this}];}
if(popupOptions.windowConfig)
{Ext.apply(windowConfig,popupOptions.windowConfig);}
this.popupWindow=new Ext.Window(windowConfig);}
if(this.followSelectedMarker===true&&event.emulatedClick!==true)
{this.nextMoveEventIsFromFollow=true;this.map.setCenter(marker.lonlat,this.map.getZoom(),false);}
if(popupOptions!==false)
{if(this.isVisible())this.popupWindow.show();if(this.popupIsPinned==true)
{this.popupWindow.anchorTo(Ext.get(marker.icon.imageDiv),"tl-br?");}
else
{this.popupWindow.anchorTo(Ext.get(this.body),"br-br?");}}
if(marker.selectedIconImage&&this.popupWindow.marker!=marker)
{marker.setUrl(marker.selectedIconImage);}
marker.isSelected=true;this.popupWindow.marker=marker;if(marker.parentRecord&&event.emulatedClick!==true)
{this.fireEvent('markerselected',marker,marker.parentRecord);}},onMarkerPinClicked:function(_event,_toolEl,_panel)
{this.popupIsPinned=true;_panel.tools.pin.hide();_panel.tools.unpin.show();this.onMapMoveEnd();},onMarkerUnPinClicked:function(_event,_toolEl,_panel)
{this.popupIsPinned=false;_panel.tools.pin.show();_panel.tools.unpin.hide();this.popupWindow.anchorTo(Ext.get(this.body),"br-br?");},onMapMoveStart:function(event)
{if(this.popupWindow&&!this.popupWindow.isVisible())this.popupWindowWasHiddenOnMoveStart=true;else this.popupWindowWasHiddenOnMoveStart=false;if(this.popupWindow&&this.popupIsPinned&&!this.nextMoveEventIsFromFollow&&this.popupWindow.isVisible())this.popupWindow.hide();},onMapMoveEnd:function(event)
{if(this.nextMoveEventNeedsSelect!==null)
{this.selectMarker(this.nextMoveEventNeedsSelect);this.nextMoveEventNeedsSelect=null;}
else
{if(this.popupWindow&&this.popupIsPinned&&!this.popupWindowWasHiddenOnMoveStart&&this.popupWindow.marker)
{this.popupWindow.anchorTo(Ext.get(this.popupWindow.marker.icon.imageDiv),"tl-br?");this.popupWindow.show();}}
this.nextMoveEventIsFromFollow=false;},destroy:function()
{if(this.popupWindow)
{this.popupWindow.destroy();delete this.popupWindow;}
var numStores=this.markerStores.length;for(var i=0;i<numStores;i++)
{this.removeStore(this.markerStores[0]);}
if(this.map)
{this.map.destroy();}
diloc.rail.OpenLayersPanel.superclass.destroy.call(this);},addStore:function(_store,_markerOptionsFunction,_popupOptionsFunction,_scope)
{_store.generateMarkerOptions=_markerOptionsFunction;_store.generatePopupOptions=_popupOptionsFunction;_store.generateFunctionScope=_scope;_store.on("load",this.markerStoreUpdated,this);this.markerStores.push(_store);this.markerStoreUpdated(_store);},removeStore:function(_store)
{for(markerId in this.markers)
{if(this.markers[markerId].parentStore==_store)
{this.markerLayer.removeMarker(this.markers[markerId]);this.markers[markerId].destroy();delete this.markers[markerId];}}
_store.un("load",this.markerStoreUpdated,this);_store.generateMarkerOptions=null;_store.generatePopupOptions=null;this.markerStores.remove(_store);},addControl:function(_control)
{if(typeof _control==='function')
{this.map.addControl(new _control());}
else if(typeof _control==='object')
{this.map.addControl(_control);}
else
{alert('Unknown control type!');}},addLayer:function(_layer)
{this.map.addLayer(_layer);},addMarker:function(_lat,_lng,_icon,_popupTitle,_popupHtml,_selectedIcon)
{var id='_m_'+this.manualMarkerId;if(typeof _lat==="object")
{var marker=_lat;this.markerLayer.addMarker(marker);this.markers[id]=marker;}
else
{var markerPos=new OpenLayers.LonLat(_lng,_lat);markerPos.transform(new OpenLayers.Projection("EPSG:4326"),new OpenLayers.Projection("EPSG:900913"));var newMarker=new OpenLayers.Marker(markerPos,_icon.clone());newMarker.events.register("click",this,this.onMarkerClicked);newMarker.popupTitle=_popupTitle;newMarker.popupHtml=_popupHtml;if(_selectedIcon)
newMarker.selectedIcon=_selectedIcon;if(this.markerLayer)
{this.markerLayer.addMarker(newMarker);this.markers[id]=newMarker;}
else
{this.unaddedMarkers[id]=newMarker;}}
this.manualMarkerId++;},addMarkers:function(_markers)
{for(var i=0;i<_markers.length;i++)
{this.addMarker(_markers[i].lat,_markers[i].lng,_markers[i].icon,_markers[i].popupTitle,_markers[i].popupHtml,_markers[i].selectedIcon);}},hideMarkers:function()
{this.markerLayer.display(false);},showMarkers:function()
{this.markerLayer.display(true);},zoomToAllMarkers:function()
{var bounds=this.markerLayer.getDataExtent();this.map.zoomToExtent(bounds);},removeMarker:function(_marker)
{this.markerLayer.removeMarker(_marker);for(markerId in this.markers)
{if(!this.markers[markerId]==_marker)
{this.markers[markerId].destroy();delete this.markers[markerId];}}},removeMarkers:function()
{for(markerId in this.markers)
{if(!this.markers[markerId].parentRecord)
{this.markerLayer.removeMarker(this.markers[markerId]);this.markers[markerId].destroy();this.markers[markerId]=null;delete this.markers[markerId];}}},selectMarker:function(_marker)
{this.onMarkerClicked({object:_marker,emulatedClick:true});},selectMarkerByRecord:function(_record)
{var recordFound=false;for(key in this.markers)
{if(this.markers[key].parentRecord==_record)
{recordFound=true;if(this.followSelectedMarker==true||!this.markers[key].onScreen())
{this.nextMoveEventIsFromFollow=true;this.nextMoveEventNeedsSelect=this.markers[key];this.map.setCenter(this.markers[key].lonlat,this.map.getZoom(),false);}
else
{this.selectMarker(this.markers[key]);}}}
if(!recordFound)
{this.selectRecordOnStoreAdd=_record;}},setCenter:function(_lat,_lng)
{if(typeof _lat==="object")
{this.map.panTo(_lat);}
else
{var newCenter=new OpenLayers.LonLat(_lng,_lat);newCenter.transform(new OpenLayers.Projection("EPSG:4326"),new OpenLayers.Projection("EPSG:900913"));this.map.panTo(newCenter);}},getCenter:function(_returnLonLat)
{var center=this.map.getCenter();center.transform(new OpenLayers.Projection("EPSG:900913"),new OpenLayers.Projection("EPSG:4326"));if(_returnLonLat&&_returnLonLat===true)
{return center;}
else return{lat:center.lat,lng:center.lon};},getMap:function()
{return this.map;},setFollowSelectedMarker:function(_followMarker)
{this.followSelectedMarker=_followMarker;}});Ext.reg('diloc-openlayerspanel',diloc.rail.OpenLayersPanel);

Ext.namespace("diloc","diloc.rail");if(Ext.isIE)
{(function()
{var scriptTag=document.createElement("script");scriptTag.src='lib/canvas/excanvas.js';scriptTag.type='text/javascript';Ext.getBody().dom.appendChild(scriptTag);})();}
diloc.rail.CanvasPanel=Ext.extend(Ext.Panel,{html:{tag:'canvas'},initComponent:function()
{this.addEvents("canvasrightclick","canvasleftclick","canvasresized");this.on('resize',this._onResize,this);diloc.rail.CanvasPanel.superclass.initComponent.call(this);},afterRender:function()
{diloc.rail.CanvasPanel.superclass.afterRender.call(this);this.body.addListener("contextmenu",this._onContextMenu,this);this.body.addListener("click",this._onClick,this);},_onClick:function(_event)
{this.fireEvent("canvasleftclick",_event);},_onResize:function(_component,_width,_height)
{console.warn("Body reisze!",arguments);var canvas=this.getCanvasElement();var changedSomething=false;if(this.body.getWidth()!=0)
{if(canvas.width!=this.body.getWidth())
{canvas.width=this.body.getWidth();changedSomething=true;}
if(canvas.height!=this.body.getHeight())
{canvas.height=this.body.getHeight();changedSomething=true;}
if(changedSomething==true)this.fireEvent("canvasresized",this.body.getWidth(),this.body.getHeight());}},_onContextMenu:function(_event,_canvas)
{console.log("context-menu event being forwarded!");this.fireEvent("canvasrightclick",_event);},getCanvasContext:function()
{var canvas=this.getCanvasElement();console.log("panel is:",this);if(Ext.isGecko||Ext.isSafari||Ext.isOpera||Ext.isChrome)
{if(typeof canvas.getContext=="function")
{return canvas.getContext('2d');}
else
{alert("Your browser is outdated, try a newer version to get canvas-support!");}}
else if(Ext.isIE)
{if(typeof canvas.getContext=="function")
{return canvas.getContext('2d');}
else
{if(typeof G_vmlCanvasManager=="object")
{G_vmlCanvasManager.initElement(canvas);return canvas.getContext('2d');}
else
{alert("Could not find G_vmlCanvasManager, perhaps excanvas did not load correctly?");}}}
else
{alert("Your browser does not support canvas!");}},getCanvasElement:function()
{return this.body.down("canvas",true);}});

Ext.namespace("diloc","diloc.rail");(function(){if(typeof window.Canvas!='object')
{var scriptTag=document.createElement("script");scriptTag.src='lib/canvas/canvas.text.js?dontUseMoz=true&reimplement=true';scriptTag.type='text/javascript';document.getElementsByTagName("head")[0].appendChild(scriptTag);delete scriptTag;}})();diloc.rail.ZwlPanel=function(config)
{this.hoursFetched=[];this.zwlDiagramData=null;this.zwlDiagramId=null;this.width=0;this.height=0;this.painter=null;this.renderer=null;this.allDataReady=false;this.highestTrainRunMessageId=0;this.renderOptions={renderStartedTrainRoutes:false,renderUnstartedTrainRoutes:true};this.loadingAnimationRunning=false;this.hoursFetched=[];diloc.rail.ZwlPanel.superclass.constructor.apply(this,arguments);};Ext.extend(diloc.rail.ZwlPanel,diloc.rail.CanvasPanel,{bodyBorder:false,border:false,initComponent:function()
{this.tbar=new Ext.Toolbar({items:[{tooltip:'Weniger Zeit in der Vergangenheit anzeigen',iconCls:'increaseStartTime',handler:this.increaseStartTime,scope:this},{tooltip:'Mehr Zeit aus der Vergangenheit anzeigen',iconCls:'decreaseStartTime',handler:this.decreaseStartTime,scope:this},{tooltip:'Eine Stunde mehr in der Zukunft anzeigen',iconCls:'increaseEndTime',handler:this.increaseEndTime,scope:this},{tooltip:'Eine Stunde weniger in der Zukunft anzeigen',iconCls:'decreaseEndTime',handler:this.decreaseEndTime,scope:this},'-',{tooltip:'Fahrplan von noch nicht gestarteten Zügen anzeigen',iconCls:'showUnstartedTrainRoutes',toggleHandler:this.toggleShowUnstarted,scope:this,enableToggle:true,pressed:this.renderOptions.renderUnstartedTrainRoutes},{tooltip:'Fahrplan von schon gestarteten Zügen anzeigen',iconCls:'showStartedTrainRoutes',toggleHandler:this.toggleShowStarted,scope:this,enableToggle:true,pressed:this.renderOptions.renderStartedTrainRoutes}],disabled:true});console.log("initComponent:",this.hoursFetched,this.zwlDiagramData);diloc.rail.ZwlPanel.superclass.initComponent.call(this);this.renderer=new diloc.rail.ZwlRenderer();console.log("initComponent:",this.hoursFetched);var zwlDataFetcher=new gwf.helpers.ActionExecutor({silent:true});zwlDataFetcher.on("success",function(_result){this.zwlDiagramData=_result.data;this.zwlDiagramData.backgroundColor=new JPaint.Color(this.zwlDiagramData.backgroundColor);this.zwlDiagramData.foregroundColor=new JPaint.Color(this.zwlDiagramData.foregroundColor);this.renderer.setZwlDiagramData(this.zwlDiagramData);this.loadAnimPartStart=30;console.log("Got Train-Data, fetching missing hours...",this.hoursFetched);this.calculateTimespan();this.fetchMissingHours.call(this);},this);zwlDataFetcher.on("failure",this.showLoadError,this);zwlDataFetcher.execute("zwldiagram","get",{id:this.zwlDiagramId});this.on('bodyresize',this.onBodyResize,this);},showLoadError:function(_error)
{this.abortLoadingAnimation=true;var ctx=this.getCanvasContext();ctx.fillStyle="rgb(255,255,255)";ctx.clearRect(0,0,this.width,this.height);ctx.font="14px Arial";ctx.fillStyle="rgb(150,150,150)";ctx.fillText("Beim Laden des ZWL-Diagramms ist ein Fehler aufgetreten:",10,30);ctx.fillText("Bitte schließen Sie das Diagramm und versuchen Sie es erneut.",10,80);ctx.font="14px Arial";ctx.fillStyle="rgb(100,100,100)";ctx.fillText("'"+_error+"'",10,50);},fetchMissingHours:function(_additional)
{console.info("Fetching missing hours...",this.hoursFetched);this.hoursToFetch=[];this.nextHourToFetch=0;if(_additional)this.hourFetchIsAdditional=true;else this.hourFetchIsAdditional=false;var finished=false;var currentDate=this.timespanBeginDate;var endDate=this.timespanEndDate;while(!finished)
{var hour=currentDate.format("H");var date=currentDate.format("Y-m-d");var found=false;for(var i=0;i<this.hoursFetched.length;i++)
{if(this.hoursFetched[i].date==date&&this.hoursFetched[i].hour==hour)
{found=true;}}
if(!found)
{this.hoursToFetch.push({date:date,hour:hour});}
currentDate=currentDate.add(Date.HOUR,1);if(currentDate>endDate.add(Date.HOUR,1))
{finished=true;}}
console.info(this.hoursToFetch,this.hoursFetched,this.timespanBeginDate,this.timespanEndDate);this.loadAnimPartIncrease=(70/this.hoursToFetch.length);if(this.hoursToFetch.length>0)this.fetchHour();else if(this.hourFetchIsAdditional)
{this.renderer.setTimespan(this.timespanBeginDate,this.timespanEndDate);this.renderer.updateGeometry(this.width,this.height);}},fetchHour:function()
{var fetchInfo=this.hoursToFetch[this.nextHourToFetch];console.log("Fetching Hour...",fetchInfo);var fetcher=new gwf.helpers.ActionExecutor({silent:true});fetcher.on("success",function(_result,_hourFetched)
{this.hoursFetched.push(_hourFetched);if(!this.allDataReady)
{for(var i=0;i<_result.data.trains.length;i++)
{var train=_result.data.trains[i];if(train.trainRun)
{for(var k=0;k<train.trainRun.trainRunMessages.length;k++)
{if(train.trainRun.trainRunMessages[k].id>this.highestTrainRunMessageId)
this.highestTrainRunMessageId=train.trainRun.trainRunMessages[k].id;}}}}
this.renderer.addTrains(_result.data.trains,_hourFetched.date);this.loadAnimPartStart+=this.loadAnimPartIncrease;this.nextHourToFetch++;if(this.nextHourToFetch!=this.hoursToFetch.length)
{this.fetchHour();}
else
{this.allDataReady=true;this.finishLoadAnimation=true;if(this.hourFetchIsAdditional)
{this.renderer.setTimespan(this.timespanBeginDate,this.timespanEndDate);this.renderer.updateGeometry(this.width,this.height);}}},this);fetcher.on("failure",this.showLoadError,this);var loadMessage="Lade fahrende Züge";if(this.hourFetchIsAdditional)loadMessage="!Lade zusätzliche Züge";fetcher.execute("zwldiagram","getTrains",{id:this.zwlDiagramId,date:fetchInfo.date,hour:fetchInfo.hour},loadMessage,this.hoursToFetch[this.nextHourToFetch]);},onBodyResize:function(_panel,_width,_height)
{this.width=_width;this.height=_height;if(!this.painter)
{var ctx=this.getCanvasContext();this.painter=new JPaint.CanvasPainter(this.body.down('canvas',true));this.renderer.setPainter(this.painter);}
if(!this.allDataReady)
{if(!this.loadingAnimationRunning)
{this.animStep=0;this.loadingAnimationRunning=true;this.loadAnimPartStart=20;this.loadingAnimation();}
else
{}}
else
{var beginTime=new Date();this.renderer.updateGeometry(_width,_height);console.info("Updating Geometry took "+beginTime.getElapsed()+"ms!");}},initLoadingAnimation:function()
{var ctx=this.getCanvasContext();},loadingAnimation:function()
{if(this.abortLoadingAnimation)return;var ctx=this.getCanvasContext();ctx.fillStyle="rgb(255,255,255)";ctx.clearRect(0,0,this.width,this.height);if(this.finishLoadAnimation)
{console.log("Finishing loading animation and drawing ZWL...");var beginTime=new Date();this.renderer.setRenderOptions(this.renderOptions);this.renderer.setTimespan(this.timespanBeginDate,this.timespanEndDate);this.renderer.updateGeometry(this.width,this.height);console.info("Calculating Geometry took "+beginTime.getElapsed()+"ms!");this.getTopToolbar().enable();diloc.rail.TrainRunMessageLoader.registerNewConsumer(this.newTrainRunMessagesAvailable,this,this.highestTrainRunMessageId);this.updateTimespanTask={run:this.updateTimespan,scope:this,args:[true],interval:1000*60*5};Ext.TaskMgr.start(this.updateTimespanTask);return;}
ctx.font="20px Arial";ctx.fillStyle="rgb(50,130,200)";textWidth=ctx.measureText("Lade...");ctx.fillText("Lade...",this.width/2-(textWidth.width/2),this.height/2+10);ctx.save();ctx.translate(this.width/2+40,this.height/2-10);var i=this.animStep;var sin=Math.sin(-Math.PI/12);var cos=Math.cos(-Math.PI/12);var c=0;var finished=false;var numDrawn=0;var g=0;var b=0;while(!finished)
{c=Math.floor(50/22*i)+205;g=Math.round(c+c*0.1);if(g>255)g=255;b=Math.round(c+c*0.8);if(b>255)b=255;if(c>255)c=255;var color="rgb("+c+","+g+","+b+")";ctx.fillStyle=color;ctx.fillRect(10,0,100-this.loadAnimPartStart,10);ctx.transform(cos,sin,-sin,cos,-5,-10);i++;if(i>24)i=0;numDrawn++;if(numDrawn==24)finished=true;}
this.animStep++;if(this.animStep>24)this.animStep=0;ctx.restore();this.loadingAnimation.defer(50,this);},newTrainRunMessagesAvailable:function(_newMessages)
{console.log("Got new messages!");var messagesMatched=this.renderer.addTrainRunMessages(_newMessages);if(messagesMatched)
{this.redraw();}},redraw:function()
{console.log("Redrawing ZwlPanel!");var beginTime=new Date();this.renderer.render();var millis=beginTime.getElapsed();console.info("Drawing took "+millis+"ms!");},cleanup:function()
{diloc.rail.TrainRunMessageLoader.unregisterConsumer(this.newTrainRunMessagesAvailable,this);},calculateTimespan:function()
{var beginDate=null;var endDate=null;var now=new Date();console.log("calculateTimespan: ZWL-Data is:",this.zwlDiagramData);if(this.zwlDiagramData.timespanBegin.startsWith('-')||this.zwlDiagramData.timespanBegin.startsWith('+'))
{beginDate=now.add(Date.MINUTE,parseInt(this.zwlDiagramData.timespanBegin,10));}
else
{beginDate=Date.parseDate(this.zwlDiagramData.timespanBegin,"H:i");}
if(this.zwlDiagramData.timespanEnd.startsWith('-')||this.zwlDiagramData.timespanEnd.startsWith('+'))
{endDate=now.add(Date.MINUTE,parseInt(this.zwlDiagramData.timespanEnd,10));}
else
{endDate=Date.parseDate(this.zwlDiagramData.timespanEnd,"H:i");if(endDate<=beginDate)endDate=endDate.add(Date.DAY,1);}
this.timespanBeginDate=beginDate;this.timespanEndDate=endDate;},updateTimespan:function(_additionalUpdate)
{var beginTime=new Date();this.calculateTimespan();this.fetchMissingHours(_additionalUpdate);},increaseEndTime:function()
{if(this.zwlDiagramData.timespanEnd.startsWith('+'))
{var minutesEnd=parseInt(this.zwlDiagramData.timespanEnd,10);minutesEnd+=60;this.zwlDiagramData.timespanEnd="+"+minutesEnd;this.updateTimespan(true);}
else
{}},decreaseEndTime:function()
{if(this.zwlDiagramData.timespanEnd.startsWith('+'))
{var minutesEnd=parseInt(this.zwlDiagramData.timespanEnd,10);minutesEnd-=60;if(minutesEnd>0)
{this.zwlDiagramData.timespanEnd="+"+minutesEnd;this.updateTimespan(true);}}
else
{}},increaseStartTime:function()
{if(this.zwlDiagramData.timespanBegin.startsWith('-'))
{var minutesBegin=parseInt(this.zwlDiagramData.timespanBegin,10);minutesBegin+=60;if(minutesBegin<0)
{this.zwlDiagramData.timespanBegin=minutesBegin+"";this.updateTimespan(true);}}
else
{}},decreaseStartTime:function()
{if(this.zwlDiagramData.timespanBegin.startsWith('-'))
{var minutesBegin=parseInt(this.zwlDiagramData.timespanBegin,10);minutesBegin-=60;if(minutesBegin<0)
{this.zwlDiagramData.timespanBegin=minutesBegin+"";this.updateTimespan(true);}}
else
{}},toggleShowUnstarted:function(_button,_state)
{if(this.renderOptions.renderUnstartedTrainRoutes!==_state)
{this.renderOptions.renderUnstartedTrainRoutes=_state;this.renderer.setRenderOptions(this.renderOptions);this.redraw();}},toggleShowStarted:function(_button,_state)
{if(this.renderOptions.renderStartedTrainRoutes!==_state)
{this.renderOptions.renderStartedTrainRoutes=_state;this.renderer.setRenderOptions(this.renderOptions);this.redraw();}}});

Ext.namespace("diloc","diloc.rail");(function(){if(typeof window.Canvas!='object')
{var scriptTag=document.createElement("script");scriptTag.src='lib/canvas/canvas.text.js?dontUseMoz=true&reimplement=true';scriptTag.type='text/javascript';document.getElementsByTagName("head")[0].appendChild(scriptTag);delete scriptTag;}})();diloc.rail.ZwlPanel2=function(config)
{this.zwlDiagramData=null;this.zwlDiagramId=null;this.width=0;this.height=0;this.painter=null;this.renderer=null;this.allDataReady=false;this.highestTrainRunMessageId=0;this.renderOptions={renderStartedTrainRoutes:false,renderUnstartedTrainRoutes:true};this.lastLoadMessage="";this.tooltips=[];this.zwlPrintView=false;this.zwlPrintConfig={};this.loadingAnimationRunning=false;this.hoursFetched=[];diloc.rail.ZwlPanel2.superclass.constructor.apply(this,arguments);};Ext.extend(diloc.rail.ZwlPanel2,diloc.rail.CanvasPanel,{bodyBorder:false,border:false,initComponent:function()
{this.addEvents({"zwlinitialized":true});if(!this.zwlPrintView){this.tbar=new Ext.Toolbar({items:[{tooltip:'Schulungsvideo für das ZWL-Diagramm',iconCls:'eduvideo',handler:this.showNewInfo,scope:this,disabled:true},{tooltip:'Weniger Zeit in der Vergangenheit anzeigen',iconCls:'increaseStartTime',handler:this.increaseStartTime,scope:this,disabled:true},{tooltip:'Mehr Zeit aus der Vergangenheit anzeigen',iconCls:'decreaseStartTime',handler:this.decreaseStartTime,scope:this,disabled:true},{tooltip:'Eine Stunde mehr in der Zukunft anzeigen',iconCls:'increaseEndTime',handler:this.increaseEndTime,scope:this,disabled:true},{tooltip:'Eine Stunde weniger in der Zukunft anzeigen',iconCls:'decreaseEndTime',handler:this.decreaseEndTime,scope:this,disabled:true},'-',{tooltip:'Fahrplan von noch nicht gestarteten Zügen anzeigen',iconCls:'showUnstartedTrainRoutes',toggleHandler:this.toggleShowUnstarted,scope:this,enableToggle:true,pressed:this.renderOptions.renderUnstartedTrainRoutes,disabled:true},{tooltip:'Fahrplan von schon gestarteten Zügen anzeigen',iconCls:'showStartedTrainRoutes',toggleHandler:this.toggleShowStarted,scope:this,enableToggle:true,pressed:this.renderOptions.renderStartedTrainRoutes,disabled:true},'-',diloc.rail.DispositionChangeManager.getSaveChangesAction(),diloc.rail.DispositionChangeManager.getDiscardChangesAction()]});if(Ext.isGecko||Ext.isChrome||Ext.isSafari||(navigator.userAgent.indexOf("DiLoc|Sync")>0))
{var printButton={tooltip:'ZWL-Diagram drucken...',text:'Drucken...',iconCls:'print',handler:this.showZwlPrintDialog,scope:this};this.tbar.add('->');this.tbar.add(printButton);}}
console.log("initComponent:",this.hoursFetched,this.zwlDiagramData);diloc.rail.ZwlPanel.superclass.initComponent.call(this);this.renderer=new diloc.rail.ZwlRenderer2();console.log("initComponent:",this.hoursFetched);var zwlDataFetcher=new gwf.helpers.ActionExecutor({silent:true});zwlDataFetcher.on("success",function(_result){this.zwlDiagramData=_result.data;if(this.zwlPrintView)
{this.zwlDiagramData.timespanBegin=this.zwlPrintConfig.timespanBegin;this.zwlDiagramData.timespanEnd=this.zwlPrintConfig.timespanEnd;this.zwlDiagramData.backgroundColor=new JPaint.Color('#ffffff');this.zwlDiagramData.foregroundColor=new JPaint.Color('#333333');}
else
{this.zwlDiagramData.backgroundColor=new JPaint.Color(this.zwlDiagramData.backgroundColor);this.zwlDiagramData.foregroundColor=new JPaint.Color(this.zwlDiagramData.foregroundColor);}
this.renderer.setZwlDiagramData(this.zwlDiagramData);this.loadAnimPartStart=30;console.log("Got Train-Data, fetching missing hours...",this.hoursFetched);this.calculateTimespan();this.fetchMissingHours.call(this);},this);zwlDataFetcher.on("failure",this.showLoadError,this);zwlDataFetcher.execute("zwldiagram","get",{id:this.zwlDiagramId});this.on('canvasresized',this.onBodyResize,this);this.on('canvasrightclick',this.onCanvasRightClick,this);this.on('canvasleftclick',this.onClick,this);diloc.rail.TrainManager.on('newTrainAdded',this.onNewTrainAdded,this);},showZwlPrintDialog:function()
{var thiz=this;this.printDialog=new Ext.Window({title:this.title+' - ZWL-Diagram drucken',width:370,autoHeight:true,plain:false,bodyBorder:false,resizable:false,stateId:'zwlPrintWindow',buttonAlign:'right',cls:'zwlprint-window',layout:'fit',items:{xtype:'form',padding:10,labelWidth:125,border:false,autoHeight:true,ref:'formPanel',items:[{xtype:'compositefield',fieldLabel:'Startzeit',autoHeight:true,items:[{name:'startday',xtype:'datefield',value:new Date().format("d.m.Y"),width:100},{name:'starttime',xtype:'timefield',format:'H:i',increment:60,value:'04:00',width:100}]},{xtype:'sliderfield',fieldLabel:'Ausgabelänge',name:'period',minValue:1,maxValue:168,value:21,tipText:function(thumb){if(Math.floor(thumb.value/24)==1)
{var tip='1 Tag ';if(thumb.value%24!=0)tip+=String(thumb.value%24)+' Stunden';}
else if(thumb.value/24>1)
{var tip=String(Math.floor(thumb.value/24))+' Tage ';if(thumb.value%24!=0)tip+=String(thumb.value%24)+' Stunden';}
else
{var tip=String(thumb.value%24)+' Stunden';}
thiz.printDialog.periodTip.setText(tip);return tip;}},{xtype:'label',fieldLabel:'&nbsp;',labelSeparator:'',style:'color: #888888; font-size: 10px; text-align: center; display: block;',text:'21 Stunden',ref:'../periodTip'},{xtype:'uxspinner',fieldLabel:'Seitenanzahl',name:'pages',strategy:new Ext.ux.form.Spinner.NumberStrategy({minValue:1,maxValue:28}),value:3}],defaults:{width:205}},buttons:[{text:'Druckvorschau',handler:this.printZwl,scope:this},{text:'Abbrechen',handler:this.closeZwlPrintDialog,scope:this}]});this.printDialog.show();},closeZwlPrintDialog:function()
{if(this.printDialog)this.printDialog.close();delete this.printDialog;},printZwl:function()
{var windowNumber=this.numChildWindows++;var newWindow={name:"diloc_window"+windowNumber};this.zwlPrintConfig=this.printDialog.formPanel.getForm().getValues();this.zwlPrintConfig.zwlname=this.title;this.zwlPrintConfig.customername=diloc.User.customerName();console.log('Print-Config: ',this.zwlPrintConfig);var windowHref='zwlprint.php?zwlid='+this.zwlDiagramId+'&pages='+this.zwlPrintConfig.pages+'&startday='+this.zwlPrintConfig.startday+'&starttime='+this.zwlPrintConfig.starttime+'&period='+this.zwlPrintConfig.period+'&zwlname='+this.zwlPrintConfig.zwlname+'&customername='+this.zwlPrintConfig.customername;newWindow.window=window.open(windowHref,newWindow.name,"resizable=yes,dependant=yes,status=no,toolbar=no,menubar=yes,directories=no");if(newWindow.window)
{this.closeZwlPrintDialog();}
else
{this.errorMsg("Neues Fenster","Fehler beim Erzeugen des neuen Fensters.");}},onNewTrainAdded:function(_train)
{console.log("We got a completely new train!");if(this.renderer)
{if(this.renderer.couldTrainBeDrawed(_train))
{this.renderer.addTrain(_train);this.renderer.refreshLayout();this.renderer.requestRedraw();}}},showNewInfo:function()
{Ext.MessageBox.alert("Schulungsvideo für das ZWL-Diagramm","Mit dem ZWL-Diagramm können Sie Dispositions-Änderungen simulieren und speichern. Für eine Einführung in die Funktionen gibt es ein Schulungsvideo, dieses können Sie direkt in Ihrem Browser sehen.<br/><a href=\"http://www.diloc.de/schulungs-videos/zwl/zwl-dispo/\" target=\"_blank\">Schulungs-Video aufrufen</a> (Öffnet in einem neuen Fenster)");},showLoadError:function(_error)
{this.abortLoadingAnimation=true;var ctx=this.getCanvasContext();ctx.fillStyle="rgb(255,255,255)";ctx.clearRect(0,0,this.width,this.height);ctx.font="14px Arial";ctx.fillStyle="rgb(150,150,150)";ctx.fillText("Beim Laden des ZWL-Diagramms ist ein Fehler aufgetreten:",10,30);ctx.fillText("Bitte schließen Sie das Diagramm und versuchen Sie es erneut.",10,80);ctx.font="14px Arial";ctx.fillStyle="rgb(100,100,100)";ctx.fillText("'"+_error+"'",10,50);},fetchMissingHours:function(_additional)
{console.info("Fetching missing hours...",this.hoursFetched);if(!this.allDataReady)this.updateLoadingMessage("Suche Züge...");this.hoursToFetch=[];if(_additional)this.hourFetchIsAdditional=true;else this.hourFetchIsAdditional=false;var finished=false;var currentDate=this.timespanBeginDate;var endDate=this.timespanEndDate;while(!finished)
{var hour=currentDate.format("H");var date=currentDate.format("Y-m-d");var found=false;for(var i=0;i<this.hoursFetched.length;i++)
{if(this.hoursFetched[i].date==date&&this.hoursFetched[i].hour==hour)
{found=true;}}
if(!found)
{this.hoursToFetch.push({date:date,hour:hour});}
currentDate=currentDate.add(Date.HOUR,1);if(currentDate>endDate.add(Date.HOUR,1))
{finished=true;}}
console.info(this.hoursToFetch,this.hoursFetched,this.timespanBeginDate,this.timespanEndDate);if(this.hoursToFetch.length>0)
{var idFetcher=new gwf.helpers.ActionExecutor({successSilent:true});idFetcher.on("success",function(_result)
{this.hoursFetched=this.hoursFetched.concat(this.hoursToFetch);this.hoursToFetch=[];this.numberOfTrainsToLoad=0;this.numberOfTrainsLoaded=0;for(day in _result.data)
{this.numberOfTrainsToLoad+=_result.data[day].length;}
this.updateLoadingMessage("Lade "+this.numberOfTrainsToLoad+" Züge...",this.numberOfTrainsLoaded);for(day in _result.data)
{for(var i=0;i<_result.data[day].length;i++)
{var dateStr=day.substr(1);var date=Date.parseDate(day.substr(1),"Ymd");diloc.rail.TrainManager.loadTrain(_result.data[day][i],date.format("Y-m-d"),this.trainLoaded,this);}}},this);var whats=[];for(var i=0;i<this.hoursToFetch.length;i++)
{whats.push(this.hoursToFetch[i].date+":"+this.hoursToFetch[i].hour);}
idFetcher.execute("zwldiagram","getTrainIds",{id:this.zwlDiagramId,what:whats.join("|")});}
else
{this.renderer.setTimespan(this.timespanBeginDate,this.timespanEndDate);this.renderer.updateGeometry(this.width,this.height);}},trainLoaded:function(_trainId,_train)
{console.log("Train #"+_trainId+" was loaded!",this.numberOfTrainsLoaded);this.numberOfTrainsLoaded++;this.renderer.addTrain(_train);this.updateLoadingMessage("Lade "+this.numberOfTrainsToLoad+" Züge...",this.numberOfTrainsLoaded);if(this.numberOfTrainsLoaded==this.numberOfTrainsToLoad)
{this.initializeZwl.defer(100,this);}},initializeZwl:function()
{this.renderer.setRenderOptions(this.renderOptions);this.renderer.setTimespan(this.timespanBeginDate,this.timespanEndDate);this.renderer.updateGeometry(this.width,this.height);if(!this.zwlPrintView)
{var items=this.getTopToolbar().items;for(i=0;i<8;i++){items.itemAt(i).enable();}}
this.allDataReady=true;this.updateTimespanTask={run:this.updateTimespan,scope:this,args:[true],interval:1000*60*5};if(!this.zwlPrintView)Ext.TaskMgr.start(this.updateTimespanTask);this.fireEvent('zwlinitialized');},onBodyResize:function(_width,_height)
{console.log("Body resize!");this.width=_width;this.height=_height;if(!this.painter)
{var ctx=this.getCanvasContext();this.painter=new JPaint.CanvasPainter(this.getCanvasElement());this.renderer.setPainter(this.painter);}
if(!this.allDataReady)
{this.updateLoadingMessage();}
else
{var beginTime=new Date();this.renderer.updateGeometry(_width,_height);console.info("Updating Geometry took "+beginTime.getElapsed()+"ms!");}},updateLoadingMessage:function(_newMessage,_newNumLoaded)
{var newMessage=this.lastLoadMessage;if(_newMessage)
{newMessage=_newMessage;this.lastLoadMessage=newMessage;}
var ctx=this.getCanvasContext();ctx.fillStyle="rgb(255,255,255)";ctx.clearRect(0,0,this.width,this.height);ctx.font="14px Arial";ctx.fillStyle="rgb(100,100,100)";ctx.strokeStyle="rgb(100,100,100)";textWidth=ctx.measureText(newMessage);ctx.fillText(newMessage,70,70);if(typeof _newNumLoaded!="undefined")
{ctx.lineWidth=1;ctx.strokeRect(70.5,80.5,this.numberOfTrainsToLoad*4,10);ctx.fillStyle="rgb(210,220,255)";var width=_newNumLoaded*4-1.8;if(width>0)ctx.fillRect(71,81,width,8.5);}},onCanvasRightClick:function(_event)
{console.info(arguments);console.log(_event.xy);var eventXY=_event.getXY();var target=_event.getTarget(null,null,true);var canvasXY=target.getXY();var x=eventXY[0]-canvasXY[0];var y=eventXY[1]-canvasXY[1];console.log(x,y);if(y<25)
{var stationId=this.renderer.getStationIdForLooseX(x);if(stationId)
{console.info("Got Station ID:",stationId);var contextMenu=new Ext.menu.Menu();contextMenu.add({text:'Lade...',iconCls:'loading-indicator'});contextMenu.showAt(eventXY);var contextLoader=new gwf.helpers.ActionExecutor({silent:true});contextLoader.on('failure',function(){contextMenu.hide();contextMenu.destroy();});contextLoader.on('success',function(_result){console.log("context-data is:",_result.data);contextMenu.removeAll();contextMenu.add({text:'Informationen...',handler:function()
{var customerStationWindow=new diloc.rail.dialogs.CustomerStation({data:_result.data,title:_result.data.stationName});customerStationWindow.show();}});var documents=_result.data.documents;if(documents.length>0)
{contextMenu.addSeparator();var numImportantDocuments=0;var docShowHandler=function(_button)
{var documentWindow=new diloc.rail.dialogs.FileViewer({src:gwf.App.backendUrl('customerstationdocument','view',{id:_button.docInfo.id}),mimeType:_button.docInfo.mimeType,title:_button.docInfo.name,width:_button.docInfo.imageWidth,height:_button.docInfo.imageHeight});documentWindow.show();};for(var i=0;i<documents.length;i++)
{var document=documents[i];if(document.important)
{contextMenu.add({text:document.name,docInfo:document,handler:docShowHandler});numImportantDocuments++;}}
if(numImportantDocuments<documents.length)
{contextMenu.addSeparator();var subMenu=new Ext.menu.Menu();for(var i=0;i<documents.length;i++)
{var document=documents[i];if(!document.important)
{subMenu.add({text:document.name,docInfo:document,handler:docShowHandler});}}
contextMenu.add({text:'Weitere Dokumente',menu:subMenu});}}},this);contextLoader.execute("station","getCustomerStation",{id:stationId});}}
else
{var matchingTrains=this.renderer.findMatchingTrains(x,y);if(matchingTrains&&matchingTrains.length>0)
{var contextMenu=new Ext.menu.Menu();for(var i=0;i<matchingTrains.length;i++)
{contextMenu.add({text:'Zug <span style="color:'+matchingTrains[i].trainColor+'">'+matchingTrains[i].number+"</span> in "+matchingTrains[i].stationIdCode+" Anpassen",iconCls:'trg-trainrun',handler:this.showDispoChangeDialog.createDelegate(this,[matchingTrains[i]])});if(matchingTrains[i].isDeparture==true)
{contextMenu.add({text:'Zug <span style="color:'+matchingTrains[i].trainColor+'">'+matchingTrains[i].number+"</span> als Ausfall deklarieren",iconCls:'trg-trainrun',handler:this.cancelTrain.createDelegate(this,[matchingTrains[i]])});}}
contextMenu.showAt(eventXY);}}
_event.preventDefault();},onClick:function(_event)
{console.info(arguments);console.log(_event.xy);var eventXY=_event.getXY();var target=_event.getTarget(null,null,true);var canvasXY=target.getXY();var x=eventXY[0]-canvasXY[0];var y=eventXY[1]-canvasXY[1];console.log(x,y);var matchingTrains=this.renderer.findMatchingTrains(x,y);if(matchingTrains.length>0)
{var text="";for(var i=0;i<matchingTrains.length;i++)
{var trainInfo=matchingTrains[i];console.info(trainInfo);if(i>0)text+="<br/>";text+='<span style="color:'+trainInfo.trainColor+'">Zug '+trainInfo.number+' in '+trainInfo.stationIdCode+':</span><br/>';if(trainInfo.forecastStation.arrivalTimestamp)
{var arrivalDate=new Date(trainInfo.forecastStation.arrivalTimestamp*1000);var what="Ankunft";if(trainInfo.trainRouteStation&&trainInfo.trainRouteStation.stayType===0)what="Durchfahrt";text+=what+": "+arrivalDate.format("H:i:s");text+=" ("+diloc.rail.util.latenessToString(trainInfo.forecastStation.arrivalDiff,'intelli')+")";text+="<br/>";}
if(trainInfo.forecastStation.departureTimestamp)
{var departureDate=new Date(trainInfo.forecastStation.departureTimestamp*1000);text+="Abfahrt: "+departureDate.format("H:i:s");text+=" ("+diloc.rail.util.latenessToString(trainInfo.forecastStation.departureDiff,'intelli')+")";text+="<br/>";}
if(trainInfo.trainRunId===null)
{var arrivalDate=trainInfo.plannedDeparture.add(Date.SECOND,trainInfo.trainRouteStation.time);var what="Ankunft";if(trainInfo.trainRouteStation&&trainInfo.trainRouteStation.stayType===0)what="Durchfahrt";if(!trainInfo.isDeparture)text+=what+": "+arrivalDate.format("H:i:s")+"<br/>";if(trainInfo.trainRouteStation&&trainInfo.trainRouteStation.stayType!==0)
{var departureDate=trainInfo.plannedDeparture.add(Date.SECOND,trainInfo.trainRouteStation.time+trainInfo.trainRouteStation.stayDuration);text+="Abfahrt: "+departureDate.format("H:i:s")+"<br/>";}}}
var tooltip=new Ext.Tip({shadow:'drop',closable:true,html:text});tooltip.showAt(eventXY);this.tooltips.push(tooltip);}
else
{for(var i=0;i<this.tooltips.length;i++)
{this.tooltips[i].destroy();}
this.tooltips=[];}},showDispoChangeDialog:function(_trainInfo)
{diloc.rail.DispositionChangeManager.showDispositionChangeDialog(_trainInfo);},cancelTrain:function(_trainInfo)
{console.log(_trainInfo);Ext.MessageBox.show({msg:'<b>Wollen Sie den Zug '+_trainInfo.number+' wirklich als Ausfall deklarieren?</b> Diese Aktion kann nur über den Fahrplanmanager rückgängig gemacht werden!',title:'Wirklich als Ausfall deklarieren?',buttons:Ext.MessageBox.OKCANCEL,icon:Ext.MessageBox.QUESTION,fn:function(_buttonId,_text,_opt){if(_buttonId=='ok')
{var trainCanceler=new gwf.helpers.ActionExecutor({successSilent:true});trainCanceler.on("success",function(_result){},this);trainCanceler.execute("train","markCanceled",{id:_trainInfo.trainId,date:_trainInfo.plannedDepartureDate});}},scope:this});},redraw:function()
{console.log("Redrawing ZwlPanel!");var beginTime=new Date();this.renderer.render();var millis=beginTime.getElapsed();console.info("Drawing took "+millis+"ms!");},cleanup:function()
{diloc.rail.TrainManager.un('newTrainAdded',this.onNewTrainAdded,this);this.closeZwlPrintDialog();this.renderer.destroy();},calculateTimespan:function()
{var beginDate=null;var endDate=null;var now=new Date();console.log("calculateTimespan: ZWL-Data is:",this.zwlDiagramData);if(this.zwlDiagramData.timespanBegin.startsWith('-')||this.zwlDiagramData.timespanBegin.startsWith('+'))
{beginDate=now.add(Date.MINUTE,parseInt(this.zwlDiagramData.timespanBegin,10));}
else
{if(this.zwlDiagramData.timespanBegin.length==16)
{beginDate=Date.parseDate(this.zwlDiagramData.timespanBegin,"Y-m-d H:i");}
else
{beginDate=Date.parseDate(this.zwlDiagramData.timespanBegin,"H:i");}}
if(this.zwlDiagramData.timespanEnd.startsWith('-')||this.zwlDiagramData.timespanEnd.startsWith('+'))
{endDate=now.add(Date.MINUTE,parseInt(this.zwlDiagramData.timespanEnd,10));}
else
{if(this.zwlDiagramData.timespanBegin.length==16)
{endDate=Date.parseDate(this.zwlDiagramData.timespanEnd,"Y-m-d H:i");}
else
{endDate=Date.parseDate(this.zwlDiagramData.timespanEnd,"H:i");}
if(endDate<=beginDate)endDate=endDate.add(Date.DAY,1);}
this.timespanBeginDate=beginDate;this.timespanEndDate=endDate;},updateTimespan:function(_additionalUpdate)
{var beginTime=new Date();this.calculateTimespan();this.fetchMissingHours(_additionalUpdate);},increaseEndTime:function()
{if(this.zwlDiagramData.timespanEnd.startsWith('+'))
{var minutesEnd=parseInt(this.zwlDiagramData.timespanEnd,10);minutesEnd+=60;this.zwlDiagramData.timespanEnd="+"+minutesEnd;this.updateTimespan(true);}
else
{}},decreaseEndTime:function()
{if(this.zwlDiagramData.timespanEnd.startsWith('+'))
{var minutesEnd=parseInt(this.zwlDiagramData.timespanEnd,10);minutesEnd-=60;if(minutesEnd>0)
{this.zwlDiagramData.timespanEnd="+"+minutesEnd;this.updateTimespan(true);}}
else
{}},increaseStartTime:function()
{if(this.zwlDiagramData.timespanBegin.startsWith('-'))
{var minutesBegin=parseInt(this.zwlDiagramData.timespanBegin,10);minutesBegin+=60;if(minutesBegin<0)
{this.zwlDiagramData.timespanBegin=minutesBegin+"";this.updateTimespan(true);}}
else
{}},decreaseStartTime:function()
{if(this.zwlDiagramData.timespanBegin.startsWith('-'))
{var minutesBegin=parseInt(this.zwlDiagramData.timespanBegin,10);minutesBegin-=60;if(minutesBegin<0)
{this.zwlDiagramData.timespanBegin=minutesBegin+"";this.updateTimespan(true);}}
else
{}},toggleShowUnstarted:function(_button,_state)
{if(this.renderOptions.renderUnstartedTrainRoutes!==_state)
{this.renderOptions.renderUnstartedTrainRoutes=_state;this.renderer.setRenderOptions(this.renderOptions);this.redraw();}},toggleShowStarted:function(_button,_state)
{if(this.renderOptions.renderStartedTrainRoutes!==_state)
{this.renderOptions.renderStartedTrainRoutes=_state;this.renderer.setRenderOptions(this.renderOptions);this.redraw();}}});

Ext.ns("diloc.rail");diloc.rail.ZwlTrain=function(_renderer,_train,_date,_debug)
{this.renderer=_renderer;this.train=_train;this.trainRoute=null;this.trainNumber=null;this.directionStationOffset=null;this.trainRun=null;this.lineColor=null;this.forecast=null;this.highestTrmId=0;this.circles=[];this.lastRenderOptions={};this.labelAttachment="";if(_debug==true)
{this.console={log:function()
{console.log.apply(console,this.patchArguments(arguments));},info:function()
{console.info.apply(console,this.patchArguments(arguments));},warn:function()
{console.warn.apply(console,this.patchArguments(arguments));},patchArguments:function(_arguments)
{if(typeof _arguments[0]=="string")
{_arguments[0]=this.prefix+_arguments[0];}
else
_arguments.unshift(this.prefix);return _arguments;},prefix:this.train.number+": "};}
else
{this.console={log:function(){},warn:function(){},info:function(){}};}
this.trainDepartureTime=Date.parseDate(_date+" "+this.train.departureTime,"Y-m-d H:i:s");if(_train.trainRun&&_train.trainRun.trainRunMessages.length>0)
{this.highestTrmId=_train.trainRun.trainRunMessages[_train.trainRun.trainRunMessages.length-1].id;}
this.console.info("Creating new ZwlTrain with the following data:",_train);this.getTrainRouteStationForStationId=function(_stationId)
{for(var i=0;i<this.train.trainRoute.stations.length;i++)
{if(this.train.trainRoute.stations[i].stationId==_stationId)return this.train.trainRoute.stations[i];}
return null;};this.createRenderables=function()
{this.console.log("Creating renderables...");this.circles=[];var trainRoutePoints=[];var i;if(this.directionStationOffset===null)
{this.console.log("Trying to guess direction of train:",this.train);var x1=null;var x2=null;if(!this.train.trainRoute||!this.train.trainRoute.stations||this.train.trainRoute.stations.length==0)
{x1=this.renderer.getXForStationId(this.train.departureStationId);x2=this.renderer.getXForStationId(this.train.arrivalStationId);if(x1===null||x2===null)
{this.console.warn("Could not properly detect direction of train without trainroute, using an offset of 0!");this.directionStationOffset=0;}
else
{if(x2>x1)
this.directionStationOffset=2;else
this.directionStationOffset=-2;}}
else
{var found=false;var inStations=0;while(!found)
{x1=this.renderer.getXForStationId(this.train.trainRoute.stations[inStations].stationId);if(x1!==null)
found=true;inStations++;if(this.train.trainRoute.stations.length<=inStations)
found=true;}
found=false;while(!found)
{if(this.train.trainRoute.stations.length<=inStations)
{found=true;}
else
{x2=this.renderer.getXForStationId(this.train.trainRoute.stations[inStations].stationId);if(x2!==null)
found=true;inStations++;}}
if(x2==null)
{x2=this.renderer.getXForStationId(this.train.arrivalStationId);}
if(x1===null||x2===null)
{this.console.warn("Could not properly detect direction of train, using an offset of 0!");this.directionStationOffset=0;}
else
{if(x2>x1)
this.directionStationOffset=2;else
this.directionStationOffset=-2;}}}
if(!this.lineColor)
{for(i=0;i<this.renderer.diagramData.trainCategories.length;i++)
{if(this.renderer.diagramData.trainCategories[i].id==this.train.categoryId)
{if(this.renderer.diagramData.trainCategories[i].color!==null)
{this.lineColor=new JPaint.Color(this.renderer.diagramData.trainCategories[i].color);}}}
if(!this.lineColor)this.lineColor=new JPaint.Color('black');}
var trainRunPoints=[];var lastTrainRunMessageStationId=this.train.departureStationId;var departureX=this.renderer.getXForStationId(this.train.departureStationId);var departureY=this.renderer.getYForTime(this.trainDepartureTime);if(departureX!==null)
{trainRunPoints.push(new JPaint.Point(departureX+this.directionStationOffset,departureY));}
if(this.train.trainRun)
{for(i=0;i<this.train.trainRun.trainRunMessages.length;i++)
{lastTrainRunMessageStationId=this.train.trainRun.trainRunMessages[i].stationId;var tx=this.renderer.getXForStationId(this.train.trainRun.trainRunMessages[i].stationId);var ty=this.renderer.getYForTime(Date.parseDate(this.train.trainRun.trainRunMessages[i].timestamp,"Y-m-d H:i:s"));if(i==0&&this.trainDepartureTime.getTime()>Date.parseDate(this.train.trainRun.trainRunMessages[i].timestamp,"Y-m-d H:i:s"))
{trainRunPoints.pop();}
if(tx!==null)
{trainRunPoints.push(new JPaint.Point(tx+this.directionStationOffset,ty));}}
if(trainRunPoints.length>0)
{this.trainRun=this.renderer.createPolyline(trainRunPoints);this.trainRun.setLineColor(this.lineColor);}}
this.updateForecast();if(departureX!==null)trainRoutePoints.push(new JPaint.Point(departureX,departureY));if(this.train.trainRoute&&this.train.trainRoute.stations&&this.train.trainRoute.stations.length)
{for(i=0;i<this.train.trainRoute.stations.length;i++)
{x=this.renderer.getXForStationId(this.train.trainRoute.stations[i].stationId);var y1=this.renderer.getYForTime(this.trainDepartureTime.add(Date.SECOND,this.train.trainRoute.stations[i].time));var y2=this.renderer.getYForTime(this.trainDepartureTime.add(Date.SECOND,this.train.trainRoute.stations[i].time+this.train.trainRoute.stations[i].stayDuration));if(x!==null&&this.train.trainRoute.stations[i].stayType==2)
{var circle=this.renderer.createCircle(new JPaint.Point(x+this.directionStationOffset,y1),5);circle.setLineColor(this.lineColor);this.circles.push(circle);var circle1=this.renderer.createCircle(new JPaint.Point(x+this.directionStationOffset,y1),1);circle1.setFillColor(this.lineColor);}
if(x==null)
{}
if(x!==null&&y1!==null)
{trainRoutePoints.push(new JPaint.Point(x+this.directionStationOffset,y1));}
if(x!==null&&y2!==null)
{trainRoutePoints.push(new JPaint.Point(x+this.directionStationOffset,y2));}}}
x=this.renderer.getXForStationId(this.train.arrivalStationId);y=this.renderer.getYForTime(this.trainDepartureTime.add(Date.SECOND,this.train.travelTime));if(x!==null&&y!==null)trainRoutePoints.push(new JPaint.Point(x,y));if(trainRoutePoints.length>1)
{this.trainRoute=this.renderer.createPolyline(trainRoutePoints);this.trainRoute.setLineColor(this.lineColor);this.trainRoute.setLineWidth(0.5);}
else
{this.trainRoute=true;}
this.updateTextLabel();};this.updateTextLabel=function()
{this.trainNumber=null;this.trainNumberRect=null;this.console.log("updateTextLabel: ");if(this.trainRun)
{this.console.info(" We have a trainRUN!");if(this.trainRun.points.length>2)
{if(this.forecast)this.createLabel("trainRun",-4);else this.createLabel("trainRun",-3);}
else
if(this.trainRun.points.length>0&&this.forecast)this.createLabel("forecast",0);else this.createLabel("trainRoute",0);}
else
{if(this.forecast)this.createLabel("forecast",0);else if(typeof this.trainRoute=="object")
{this.console.info(" We have a trainROUTE!");this.createLabel("trainRoute",0);}
else this.console.warn("Could not find a place to attach the text-label on train "+this.train.number);}};this.createLabel=function(_where,_offset)
{var _points=this.trainRoute.points;if(_where=="trainRun")_points=this.trainRun.points;if(_where=="forecast")_points=this.forecast.points;if(_where=="trainRoute")_points=this.trainRoute.points;this.labelAttachment=_where;this.console.info("Creating label on "+_where+"@"+_offset);if(_points.length>1)
{var p1;var p2;if(_offset>=0)
{var firstPoint=0;for(i=0;i<_points.length-1;i++)
{if(_points[i].y>25)
{firstPoint=i;break;}}
firstPoint+=_offset;}
else
{firstPoint=_points.length+_offset;if(firstPoint<0)firstPoint=0;if(firstPoint>_points.length-1)firstPoint=_points.length-2;if(_points[firstPoint].y<25)firstPoint++;}
p1=_points[firstPoint];p2=_points[firstPoint+1];if(p1.y>25)
{var lateness="";var latenessAmount=0;if(this.train.trainRun&&this.train.trainRun.trainRunMessages.length>0)
{latenessAmount=Math.absfloor(this.train.trainRun.trainRunMessages[this.train.trainRun.trainRunMessages.length-1].latenessAmount/60);if(latenessAmount>0)lateness=" +"+latenessAmount;else if(latenessAmount<0)lateness=" "+latenessAmount;}
this.trainNumber=this.renderer.createText(p1.x,p1.y-5,"10px","Arial",this.train.number+lateness,"center");if(latenessAmount<=2)this.trainNumber.setFillColor('black');else this.trainNumber.setFillColor('red');this.trainNumberRect=this.renderer.createRect(this.trainNumber.x-this.trainNumber.getWidth()/2-2,this.trainNumber.y-3,this.trainNumber.getWidth()+4,14,3);this.trainNumberRect.setFillColor('white');this.trainNumberRect.setLineColor(this.lineColor);if(p1&&p2&&p1.x==p2.x)
{p1=_points[firstPoint+1];if(_points[firstPoint+2])
{p2=_points[firstPoint+2];this.trainNumber.move(0,p1.y-_points[firstPoint].y);this.trainNumberRect.move(0,p1.y-_points[firstPoint].y);}
else
p2=null;}
if(p2)
{var a=p2.y-p1.y;var b=p2.x-p1.x;var c=Math.sqrt(a*a+b*b);var alpha=Math.acos((b*b+c*c-a*a)/(2*b*c));if(alpha==NaN)return;if(this.directionStationOffset<0)
alpha=alpha+(Math.PI/180)*180;this.trainNumber.move(b/2,a/2);this.trainNumberRect.move(b/2,a/2);this.trainNumber.move(0,8);this.console.log("Calculated alpha for text is:",alpha);this.trainNumber.setRotation(alpha);this.trainNumberRect.setRotation(alpha);}
else
{this.trainNumber.move(0,8);}}}
else
{this.console.info("Could not create label, because not enough points are available! Offset was:",_offset);}};this.updateForecast=function()
{this.console.log("Updating forecast: ");var forecastPoints=[];var currentLateness=0;var now=new Date();var diff=0;var add=false;if(!this.train.trainRun||this.train.trainRun.trainRunMessages.length==0)
{if(this.trainDepartureTime.getTime()<now.getTime())
{var departureX=this.renderer.getXForStationId(this.train.departureStationId);var departureY=this.renderer.getYForTime(this.trainDepartureTime);if(departureX!==null)
{forecastPoints=[];forecastPoints.push(new JPaint.Point(departureX+this.directionStationOffset,departureY));forecastPoints.push(new JPaint.Point(departureX+this.directionStationOffset,this.renderer.getYForTime(now)));diff=Math.round(this.trainDepartureTime.getElapsed(now)/1000);this.console.info("  We have a train that should already have departed, but is not, so we assume extra lateness ",diff);currentLateness+=diff;add=true;}}
else
return;}
else
{var lastMessage=this.train.trainRun.trainRunMessages[this.train.trainRun.trainRunMessages.length-1];if(lastMessage)
{this.console.log("  Last message is from: "+lastMessage.stationIdCode+", "+lastMessage.latenessAmount+" to late",this.train.trainRun.trainRunMessages);currentLateness+=lastMessage.latenessAmount;if(lastMessage.type==3)
{if(currentLateness<0)currentLateness=0;this.console.log("  Last message was an arrival message");var trainRouteStation=this.getTrainRouteStationForStationId(lastMessage.stationId);if(trainRouteStation)
{var arrival=Date.parseDate(lastMessage.timestamp,"Y-m-d H:i:s");var milliSecondsSinceArrival=arrival.getElapsed();var stayDuration=0;if(trainRouteStation.stayDuration!=null)stayDuration=trainRouteStation.stayDuration;if(milliSecondsSinceArrival>stayDuration*1000)
{this.console.log("  We should already have been departured, but departure message has not yet arrived!");currentLateness+=(Math.round(milliSecondsSinceArrival/1000)-stayDuration);}}
else this.console.warn("Could not get train-route information on train"+this.train.number+"!!");}
if(lastMessage.stationId==this.train.departureStationId)
{if(this.trainRun)forecastPoints.push(this.trainRun.points[this.trainRun.points.length-1]);add=true;}}
else
{this.console.log("  We have no last message, so we just print the plan with the current lateness...");}}
if(add==false&&!lastMessage)return;if(this.train.trainRoute&&this.train.trainRoute.stations&&this.train.trainRoute.stations.length)
{for(var i=0;i<this.train.trainRoute.stations.length;i++)
{if(add)
{this.console.log("Adding points for station",this.train.trainRoute.stations[i].station);x=this.renderer.getXForStationId(this.train.trainRoute.stations[i].stationId);if(x!==null)
{this.console.log("Base lateness (sec) is:",currentLateness);var arrivalTime=this.trainDepartureTime.add(Date.SECOND,this.train.trainRoute.stations[i].time+currentLateness);if(arrivalTime.getTime()<now.getTime())
{diff=Math.round((now.getTime()-arrivalTime.getTime())/1000);this.console.info("  We would add a point that arrived in the past! Diff is: ",diff);currentLateness+=diff;arrivalTime=arrivalTime.add(Date.SECOND,diff);this.console.info("Adjusted lateness (sec) is:",currentLateness);}
var y1=this.renderer.getYForTime(arrivalTime);if(x!==null&&y1!==null)
{forecastPoints.push(new JPaint.Point(x+this.directionStationOffset,y1));}
if(this.train.trainRoute.stations[i].stayDuration>0)
{if(currentLateness<0)
currentLateness=0;var departureTime=this.trainDepartureTime.add(Date.SECOND,this.train.trainRoute.stations[i].time+this.train.trainRoute.stations[i].stayDuration+currentLateness);var y2=this.renderer.getYForTime(departureTime);if(x!==null&&y2!==null)
{forecastPoints.push(new JPaint.Point(x+this.directionStationOffset,y2));}}}
else
{}}
else
{if(this.train.trainRoute.stations[i].stationId==lastMessage.stationId)
{add=true;if(this.trainRun)
forecastPoints.push(gwf.util.clone(this.trainRun.points[this.trainRun.points.length-1]));if(lastMessage.type==3)
{x=this.renderer.getXForStationId(this.train.trainRoute.stations[i].stationId);var departureTime=this.trainDepartureTime.add(Date.SECOND,this.train.trainRoute.stations[i].time+this.train.trainRoute.stations[i].stayDuration+currentLateness);if(departureTime.getTime()<now.getTime())
{this.console.log("  Forecast starts on a departure that departures in the past, pre-adjusting time");var diff=Math.round(departureTime.getElapsed(now)/1000);this.console.info("  Diff is: ",diff);currentLateness+=diff;departureTime=departureTime.add(Date.SECOND,diff);}
var y2=this.renderer.getYForTime(departureTime);if(x!==null)
{forecastPoints.push(new JPaint.Point(x+this.directionStationOffset,y2));}}}}}}
else this.console.log("Cannot add points from a trainroute, as we have none!");x=this.renderer.getXForStationId(this.train.arrivalStationId);y=this.renderer.getYForTime(this.trainDepartureTime.add(Date.SECOND,this.train.travelTime+currentLateness));if(x!==null&&y!==null)forecastPoints.push(new JPaint.Point(x,y));if(forecastPoints.length>1)
{this.forecast=this.renderer.createPolyline(forecastPoints);this.forecast.setLineColor(this.lineColor);this.forecast.setLineWidth(2);}
else
{this.forecast=null;}
if(this.labelAttachment=="forecast")this.updateTextLabel();};this.renderLines=function(_options)
{if(_options.renderStartedTrainRoutes!=this.lastRenderOptions.renderStartedTrainRoutes&&_options.renderUnstartedTrainRoutes!=this.lastRenderOptions.renderUnstartedTrainRoutes)
{this.lastRenderOptions=_options;this.updateTextLabel();}
this.console.log("Rendering Train: ",this.train.number,this.trainRun);if(!this.trainRoute)this.createRenderables();if((_options.renderStartedTrainRoutes==true&&(this.train.trainRun&&this.train.trainRun.trainRunMessages.length>0))||(_options.renderUnstartedTrainRoutes==true&&!this.trainRun&&!this.forecast)||(_options.renderUnstartedTrainRoutes==true&&this.trainRun&&this.trainRun.points.length<2&&!this.forecast))
{if(this.trainRoute!==true)
{this.trainRoute.render();for(var i=0;i<this.circles.length;i++)
{this.circles[i].render();}
this.trainRouteRendered=true;}}
else this.trainRouteRendered=false;if(this.trainRun)this.trainRun.render();if(this.forecast)
{this.updateForecast();this.forecast.render();}};this.renderLabels=function()
{if(this.lastRenderOptions.renderUnstartedTrainRoutes==false&&this.labelAttachment=="trainRoute")return;if(this.trainNumberRect)
this.trainNumberRect.render();if(this.trainNumber)
this.trainNumber.render();};this.addTrainRunMessages=function(_trainRunMessages)
{var trainRunMessages=_trainRunMessages;if(Ext.type(_trainRunMessages)!="array")
{trainRunMessages=[_trainRunMessages];}
if(!this.train.trainRun)
{this.train.trainRun={};this.train.trainRun.trainRunMessages=[];for(var i=0;i<trainRunMessages.length;i++)
{if(trainRunMessages[i].id>this.highestTrmId)
{this.train.trainRun.trainRunMessages.push(trainRunMessages[i]);this.highestTrmId=trainRunMessages[i].id;}}
this.createRenderables();}
else
{var startI=this.train.trainRun.trainRunMessages.length;for(var i=0;i<trainRunMessages.length;i++)
{if(trainRunMessages[i].id>this.highestTrmId)
{this.train.trainRun.trainRunMessages.push(trainRunMessages[i]);this.highestTrmId=trainRunMessages[i].id;}}
if(this.trainRun)
{for(var i=startI;i<this.train.trainRun.trainRunMessages.length;i++)
{var x=this.renderer.getXForStationId(this.train.trainRun.trainRunMessages[i].stationId);var y=this.renderer.getYForTime(Date.parseDate(this.train.trainRun.trainRunMessages[i].timestamp,"Y-m-d H:i:s"));if(x!==null)
{this.trainRun.addPoint(new JPaint.Point(x+this.directionStationOffset,y));}}
this.updateForecast();this.updateTextLabel();}
else
{this.createRenderables();}}};};diloc.rail.ZwlRenderer=function()
{this.painter=null;this.width=0;this.height=0;this.diagramData={};this.trains=[];this.layoutRenderables=[];this.beginDate=null;this.endDate=null;this.renderOptions={renderStartedTrainRoutes:false,renderUnstartedTrainRoutes:false};this.setPainter=function(_painter)
{this.painter=_painter;};this.createPolyline=function(_points)
{var polyline=new JPaint.Polyline(_points);polyline.setPainter(this.painter);return polyline;};this.createText=function(_x,_y,_fontSize,_fontFamily,_text,_alignment)
{var text=new JPaint.Text(_x,_y,_fontSize,_fontFamily,_text,_alignment);text.setPainter(this.painter);return text;};this.createRect=function(_x,_y,_width,_height,_radius)
{var rect=new JPaint.Rect(_x,_y,_width,_height,_radius);rect.setPainter(this.painter);return rect;};this.createCircle=function(_center,_radius)
{var circle=new JPaint.Circle(_center,_radius);circle.setPainter(this.painter);return circle;};this.updateGeometry=function(_newWidth,_newHeight)
{this.width=_newWidth;this.height=_newHeight;this.refreshLayout();this.render();};this.setTimespan=function(_beginDate,_endDate)
{console.log("New Timespan is:",_beginDate,_endDate);this.beginDate=_beginDate;this.endDate=_endDate;};this.setZwlDiagramData=function(_data)
{this.diagramData=_data;};this.setRenderOptions=function(_renderOptions)
{this.renderOptions=_renderOptions;};this.addTrains=function(_trains,_date)
{var trainsAlreadyIn={};var i=0;for(i=0;i<this.trains.length;i++)
{trainsAlreadyIn[this.trains[i].train.number]=true;}
console.log("Adding new trains to already available trains:",trainsAlreadyIn);for(i=0;i<_trains.length;i++)
{if(!trainsAlreadyIn[_trains[i].number])
{this.trains.push(new diloc.rail.ZwlTrain(this,_trains[i],_date,false));}
else
{console.warn("Got already known train "+_trains[i].number+"!");}}};this.addTrainRunMessages=function(_newMessages)
{var messagesMatched=false;for(var k=0;k<this.trains.length;k++)
{var trainId=this.trains[k].train.id;var trainMessages=[];for(var i=0;i<_newMessages.length;i++)
{if(_newMessages[i].trainId==trainId)trainMessages.push(_newMessages[i]);}
if(trainMessages.length>0)
{messagesMatched=true;console.log("We have new messages for train ",this.trains[k].train.number);this.trains[k].addTrainRunMessages(trainMessages);}}
return messagesMatched;};this.getXForStationId=function(_stationId)
{if(this.stationX['S'+_stationId])return this.stationX['S'+_stationId];else return null;};this.getYForTime=function(_date)
{var timediff=this.beginDate.getElapsed(this.endDate)/1000;var heightAvailable=this.height-50;var heightPerSecond=heightAvailable/timediff;var seconds=(_date.getTime()-this.beginDate.getTime())/1000;return 25+seconds*heightPerSecond;};this.refreshLayout=function()
{var i=0;var foregroundHex=this.diagramData.foregroundColor.asHexString();var foregroundLightHex=this.diagramData.foregroundColor.createLighterColor(300).asHexString();var backgroundHex=this.diagramData.backgroundColor.asHexString();this.layoutRenderablesPhase1=[];this.layoutRenderablesPhase2=[];var topRect=this.createRect(0,-1,this.width,26);topRect.setFillColor(backgroundHex);topRect.setLineColor(null);this.layoutRenderablesPhase2.push(topRect);var topAxis=this.createPolyline([new JPaint.Point(50,25.5),new JPaint.Point(this.width-50,25.5)]);topAxis.setLineColor(foregroundHex);var leftAxis=this.createPolyline([new JPaint.Point(50.5,25.5),new JPaint.Point(50.5,this.height-25.5)]);leftAxis.setLineColor(foregroundHex);var rightAxis=this.createPolyline([new JPaint.Point(this.width-50.5,25.5),new JPaint.Point(this.width-50.5,this.height-25.5)]);rightAxis.setLineColor(foregroundHex);this.layoutRenderablesPhase2.push(topAxis);this.layoutRenderablesPhase2.push(leftAxis);this.layoutRenderablesPhase2.push(rightAxis);var topAxisWidth=this.width-100;var widthPerStation=topAxisWidth/(this.diagramData.stations.length-1);this.stationX={};for(i=0;i<this.diagramData.stations.length;i++)
{var stationCode=this.diagramData.stations[i].station.split("|")[1];var stationText=this.createText(50+widthPerStation*i,20,"12px","Arial",stationCode,"center");stationText.setFillColor(foregroundHex);this.layoutRenderablesPhase2.push(stationText);this.stationX['S'+this.diagramData.stations[i].stationId]=50.5+widthPerStation*i;if(i>0&&i<this.diagramData.stations.length-1)
{var stationLine=this.createPolyline([new JPaint.Point(50.5+widthPerStation*i,25.5),new JPaint.Point(50.5+widthPerStation*i,this.height-25.5)]);stationLine.setLineColor(foregroundLightHex);this.layoutRenderablesPhase1.push(stationLine);}}
var timediff=this.beginDate.getElapsed(this.endDate)/1000/60;var heightAvailable=this.height-50;var heightPerTick=heightAvailable/timediff;var heightPerMinute=heightPerTick;var minutesPerTick=1;var bigTickEvery=10;if(heightPerTick<7)
{heightPerTick*=5;minutesPerTick=5;bigTickEvery=3;}
if(heightPerTick<7)
{heightPerTick*=2;minutesPerTick=10;bigTickEvery=3;}
if(heightPerTick<7)
{heightPerTick*=1.5;minutesPerTick=15;bigTickEvery=4;}
if(heightPerTick<7)
{heightPerTick*=4;minutesPerTick=60;bigTickEvery=6;}
var minutesPerBigTick=bigTickEvery*minutesPerTick;var minuteOffset=minutesPerTick-(parseInt(this.beginDate.format("i"),10)%minutesPerTick);var heightOffset=minuteOffset*heightPerMinute;console.log("Timediff: "+timediff+" HeightPerTick is:",heightPerTick,minutesPerTick*bigTickEvery,parseInt(this.beginDate.format("i"),10),minuteOffset,heightOffset);var finished=false;i=0;while(!finished)
{var x1=45;var x2=55;var time=this.beginDate.add(Date.SECOND,minutesPerTick*i*60+minuteOffset*60);var bigTick=false;var hourTick=false;if((parseInt(time.format("i"),10)%minutesPerBigTick)==0)bigTick=true;if(time.format("i")=="00")hourTick=true;if((parseInt(time.format("i"),10)%5)==0)
{x1=42;x2=58;}
if(bigTick)
{x1=40;x2=60;var tickTime=new JPaint.Text(x1-5,25.5+heightPerTick*i+4+heightOffset,"10px","Arial",time.format("H:i"));if(hourTick)
{tickTime=new JPaint.Text(x1-5,25.5+heightPerTick*i+6.5+heightOffset,"16px","Arial",time.format("H")+"");}
tickTime.setPainter(this.painter);tickTime.move(-tickTime.getWidth(),0);tickTime.setFillColor(foregroundHex);var tickTime2=tickTime.clone();tickTime2.move(x2-x1+10+topAxisWidth+tickTime.getWidth(),0);this.layoutRenderablesPhase1.push(tickTime);this.layoutRenderablesPhase1.push(tickTime2);}
if(!hourTick)
{for(var k=0;k<this.diagramData.stations.length;k++)
{var tick=this.createPolyline([new JPaint.Point(x1+k*widthPerStation,25.5+heightPerTick*i+heightOffset),new JPaint.Point(x2+k*widthPerStation,25.5+heightPerTick*i+heightOffset)]);if(k>0&&k<this.diagramData.stations.length-1)tick.setLineColor(foregroundLightHex);else tick.setLineColor(foregroundHex);this.layoutRenderablesPhase1.push(tick);}}
else
{var line=this.createPolyline([new JPaint.Point(x1,25.5+heightPerTick*i+heightOffset),new JPaint.Point(topAxisWidth+(x2-x1)/2+50,25.5+heightPerTick*i+heightOffset)]);line.setLineColor(foregroundLightHex);this.layoutRenderablesPhase1.push(line);var tickLeft=this.createPolyline([new JPaint.Point(x1,25.5+heightPerTick*i+heightOffset),new JPaint.Point(x2,25.5+heightPerTick*i+heightOffset)]);tickLeft.setLineColor(foregroundHex);this.layoutRenderablesPhase1.push(tickLeft);var tickRight=this.createPolyline([new JPaint.Point(x1+topAxisWidth,25.5+heightPerTick*i+heightOffset),new JPaint.Point(x2+topAxisWidth,25.5+heightPerTick*i+heightOffset)]);tickRight.setLineColor(foregroundHex);this.layoutRenderablesPhase1.push(tickRight);}
i++;if(25+heightPerTick*(i)+heightOffset>this.height-25)
finished=true;}
for(i=0;i<this.trains.length;i++)
{this.trains[i].createRenderables();}};this.render=function()
{console.warn("zwlrenderer.render() got called!");var nowY=this.getYForTime(new Date());var upperBackgroundRect=this.createRect(0,0,this.width,nowY);upperBackgroundRect.setFillColor(this.diagramData.backgroundColor.asHexString());upperBackgroundRect.setLineColor(null);var lowerBackgroundRect=this.createRect(0,nowY,this.width,this.height-nowY);lowerBackgroundRect.setFillColor(this.diagramData.backgroundColor.createLighterColor(10).asHexString());lowerBackgroundRect.setLineColor(null);upperBackgroundRect.render();lowerBackgroundRect.render();if(this.layoutRenderablesPhase1.length==0)this.refreshLayout();var i=0;for(i=0;i<this.layoutRenderablesPhase1.length;i++)
{this.layoutRenderablesPhase1[i].render();}
for(i=0;i<this.trains.length;i++)
{this.trains[i].renderLines(this.renderOptions);}
for(i=0;i<this.layoutRenderablesPhase2.length;i++)
{this.layoutRenderablesPhase2[i].render();}
for(i=0;i<this.trains.length;i++)
{this.trains[i].renderLabels();}};};

Ext.ns("diloc.rail");diloc.rail.ZwlTrain2=function(_renderer,_trainProxy,_debug)
{this.renderer=_renderer;this.train=_trainProxy.data;this.trainProxy=_trainProxy;this.trainRoute=null;this.trainNumber=null;this.directionStationOffset=null;this.trainRun=null;this.lineColor=null;this.forecast=null;this.highestTrmId=0;this.circles=[];this.lastRenderOptions={};this.labelAttachment="";if(_debug==true)
{this.console={log:function()
{console.log.apply(console,this.patchArguments(arguments));},info:function()
{console.info.apply(console,this.patchArguments(arguments));},warn:function()
{console.warn.apply(console,this.patchArguments(arguments));},patchArguments:function(_arguments)
{if(typeof _arguments[0]=="string")
{_arguments[0]=this.prefix+_arguments[0];}
else
_arguments.unshift(this.prefix);return _arguments;},prefix:this.train.number+": "};}
else
{this.console={log:function(){},warn:function(){},info:function(){}};}
this.trainDepartureTime=Date.parseDate(this.train.date+" "+this.train.departureTime,"Y-m-d H:i:s");if(this.train.trainRun&&this.train.trainRun.trainRunMessages.length>0)
{this.highestTrmId=this.train.trainRun.trainRunMessages[this.train.trainRun.trainRunMessages.length-1].id;}
this.console.info("Creating new ZwlTrain with the following data:",this.train);this.getTrainRouteStationForStationId=function(_stationId)
{for(var i=0;i<this.train.trainRoute.stations.length;i++)
{if(this.train.trainRoute.stations[i].stationId==_stationId)return this.train.trainRoute.stations[i];}
return null;};this.createRenderables=function()
{this.console.log("Creating renderables...");if(this.train.isCanceled==true)
{this.console.log("Deleting all renderables...");this.trainRoute=null;this.trainRun=null;this.forecast=null;this.trainNumber=null;this.trainNumberRect=null;}
this.circles=[];var trainRoutePoints=[];var i;if(this.directionStationOffset===null)
{this.console.log("Trying to guess direction of train:",this.train);var x1=null;var x2=null;if(!this.train.trainRoute||!this.train.trainRoute.stations||this.train.trainRoute.stations.length==0)
{x1=this.renderer.getXForStationId(this.train.departureStationId);x2=this.renderer.getXForStationId(this.train.arrivalStationId);if(x1===null||x2===null)
{this.console.warn("Could not properly detect direction of train without trainroute, using an offset of 0!");this.directionStationOffset=0;}
else
{if(x2>x1)
this.directionStationOffset=2;else
this.directionStationOffset=-2;}}
else
{var found=false;var inStations=0;x1=this.renderer.getXForStationId(this.train.departureStationId);if(x1!==null)found=true;while(!found)
{x1=this.renderer.getXForStationId(this.train.trainRoute.stations[inStations].stationId);if(x1!==null)
found=true;inStations++;if(this.train.trainRoute.stations.length<=inStations)
found=true;}
found=false;while(!found)
{if(this.train.trainRoute.stations.length<=inStations)
{found=true;}
else
{x2=this.renderer.getXForStationId(this.train.trainRoute.stations[inStations].stationId);if(x2!==null)
found=true;inStations++;}}
if(x2==null)
{x2=this.renderer.getXForStationId(this.train.arrivalStationId);}
if(x1===null||x2===null)
{this.console.warn("Could not properly detect direction of train, using an offset of 0!");this.directionStationOffset=0;}
else
{if(x2>x1)
this.directionStationOffset=2;else
this.directionStationOffset=-2;}}}
if(!this.lineColor)
{for(i=0;i<this.renderer.diagramData.trainCategories.length;i++)
{if(this.renderer.diagramData.trainCategories[i].id==this.train.categoryId)
{if(this.renderer.diagramData.trainCategories[i].color!==null)
{this.lineColor=new JPaint.Color(this.renderer.diagramData.trainCategories[i].color);}}}
if(!this.lineColor)this.lineColor=new JPaint.Color('black');this.transparentLineColor=this.lineColor.clone();this.transparentLineColor.setAlpha(0.1);}
var trainRunPoints=[];var lastTrainRunMessageStationId=this.train.departureStationId;var departureX=this.renderer.getXForStationId(this.train.departureStationId);var departureY=this.renderer.getYForTime(this.trainDepartureTime);if(departureX!==null)
{trainRunPoints.push(new JPaint.Point(departureX+this.directionStationOffset,departureY));}
if(this.train.trainRun)
{for(i=0;i<this.train.trainRun.trainRunMessages.length;i++)
{lastTrainRunMessageStationId=this.train.trainRun.trainRunMessages[i].stationId;var tx=this.renderer.getXForStationId(this.train.trainRun.trainRunMessages[i].stationId);var ty=this.renderer.getYForTime(Date.parseDate(this.train.trainRun.trainRunMessages[i].timestamp,"Y-m-d H:i:s"));if(i==0&&this.trainDepartureTime.getTime()>Date.parseDate(this.train.trainRun.trainRunMessages[i].timestamp,"Y-m-d H:i:s"))
{trainRunPoints.pop();}
if(tx!==null)
{trainRunPoints.push(new JPaint.Point(tx+this.directionStationOffset,ty));}}
if(trainRunPoints.length>0)
{this.trainRun=this.renderer.createPolyline(trainRunPoints);this.trainRun.setLineColor(this.lineColor);}}
this.updateForecast();if(departureX!==null)trainRoutePoints.push(new JPaint.Point(departureX,departureY));if(this.train.trainRoute&&this.train.trainRoute.stations&&this.train.trainRoute.stations.length)
{for(i=0;i<this.train.trainRoute.stations.length;i++)
{x=this.renderer.getXForStationId(this.train.trainRoute.stations[i].stationId);var y1=this.renderer.getYForTime(this.trainDepartureTime.add(Date.SECOND,this.train.trainRoute.stations[i].time));var y2=this.renderer.getYForTime(this.trainDepartureTime.add(Date.SECOND,this.train.trainRoute.stations[i].time+this.train.trainRoute.stations[i].stayDuration));if(this.train.trainRoute.stations[i].stayType==0)y2=y1;if(x!==null&&this.train.trainRoute.stations[i].stayType==2)
{var circle=this.renderer.createCircle(new JPaint.Point(x+this.directionStationOffset,y1),5);circle.setLineColor(this.lineColor);this.circles.push(circle);var circle1=this.renderer.createCircle(new JPaint.Point(x+this.directionStationOffset,y1),1);circle1.setFillColor(this.lineColor);}
if(x==null)
{}
if(x!==null&&y1!==null)
{trainRoutePoints.push(new JPaint.Point(x+this.directionStationOffset,y1));}
if(x!==null&&y2!==null)
{trainRoutePoints.push(new JPaint.Point(x+this.directionStationOffset,y2));}}}
x=this.renderer.getXForStationId(this.train.arrivalStationId);y=this.renderer.getYForTime(this.trainDepartureTime.add(Date.SECOND,this.train.travelTime));if(x!==null&&y!==null)trainRoutePoints.push(new JPaint.Point(x,y));if(trainRoutePoints.length>1)
{this.trainRoute=this.renderer.createPolyline(trainRoutePoints);var color=new JPaint.Color(this.lineColor);color.setAlpha(0.5);this.trainRoute.setLineColor(color);this.trainRoute.setLineWidth(2);}
else
{this.trainRoute=true;}
this.updateTextLabel();};this.updateTextLabel=function()
{this.trainNumber=null;this.trainNumberRect=null;this.console.log("updateTextLabel: ");if(this.trainRun)
{this.console.info(" We have a trainRUN!");if(this.trainRun.points.length>2)
{if(this.forecast)this.createLabel("trainRun",-4);else this.createLabel("trainRun",-3);}
else
if(this.trainRun.points.length>0&&this.forecast)this.createLabel("forecast",0);else this.createLabel("trainRoute",0);}
else
{if(this.forecast)this.createLabel("forecast",0);else if(typeof this.trainRoute=="object")
{this.console.info(" We have a trainROUTE!");this.createLabel("trainRoute",0);}
else this.console.warn("Could not find a place to attach the text-label on train "+this.train.number);}};this.createLabel=function(_where,_offset)
{var _points=this.trainRoute.points;if(_where=="trainRun")_points=this.trainRun.points;if(_where=="forecast")_points=this.forecast.points;if(_where=="trainRoute")_points=this.trainRoute.points;this.labelAttachment=_where;this.console.info("Creating label on "+_where+"@"+_offset);if(_points.length>1)
{var p1;var p2;if(_offset>=0)
{var firstPoint=0;for(i=0;i<_points.length-1;i++)
{if(_points[i].y>25)
{firstPoint=i;break;}}
firstPoint+=_offset;}
else
{firstPoint=_points.length+_offset;if(firstPoint<0)firstPoint=0;if(firstPoint>_points.length-1)firstPoint=_points.length-2;if(_points[firstPoint].y<25)firstPoint++;}
p1=_points[firstPoint];p2=_points[firstPoint+1];if(p1.y>25)
{var lateness="";var latenessAmount=0;if(this.train.trainRun&&this.train.trainRun.trainRunMessages.length>0)
{latenessAmount=Math.absfloor(this.train.trainRun.trainRunMessages[this.train.trainRun.trainRunMessages.length-1].latenessAmount/60);if(latenessAmount>0)lateness=" +"+latenessAmount;else if(latenessAmount<0)lateness=" "+latenessAmount;}
this.trainNumber=this.renderer.createText(p1.x,p1.y-5,"10px","Arial",this.train.number+lateness,"center");if(latenessAmount<=2)this.trainNumber.setFillColor('black');else this.trainNumber.setFillColor('red');this.trainNumberRect=this.renderer.createRect(this.trainNumber.x-this.trainNumber.getWidth()/2-2,this.trainNumber.y-3,this.trainNumber.getWidth()+4,14,3);this.trainNumberRect.setFillColor('white');this.trainNumberRect.setLineColor(this.lineColor);if(p1&&p2&&p1.x==p2.x)
{p1=_points[firstPoint+1];if(_points[firstPoint+2])
{p2=_points[firstPoint+2];this.trainNumber.move(0,p1.y-_points[firstPoint].y);this.trainNumberRect.move(0,p1.y-_points[firstPoint].y);}
else
p2=null;}
if(p2)
{var a=p2.y-p1.y;var b=p2.x-p1.x;var c=Math.sqrt(a*a+b*b);var alpha=Math.acos((b*b+c*c-a*a)/(2*b*c));if(alpha==NaN)return;if(this.directionStationOffset<0)
alpha=alpha+(Math.PI/180)*180;this.trainNumber.move(b/2,a/2);this.trainNumberRect.move(b/2,a/2);this.trainNumber.move(0,8);this.console.log("Calculated alpha for text is:",alpha);this.trainNumber.setRotation(alpha);this.trainNumberRect.setRotation(alpha);}
else
{this.trainNumber.move(0,8);}}}
else
{this.console.info("Could not create label, because not enough points are available! Offset was:",_offset);}};this.forecastUpdated=function(_trainProxy,_forecast)
{var updateLabel=false;if(!this.forecast)updateLabel=true;this.updateForecast();if(updateLabel)this.updateTextLabel();this.renderer.requestRedraw();};this.updateForecast=function()
{if(this.train.forecast&&Ext.isArray(this.train.forecast.stations)&&this.train.forecast.stations.length>0)
{var forecastPoints=[];var stations=this.train.forecast.stations;this.dispoChanges=[];var lastMessage=null;if(this.train.trainRun&&Ext.isArray(this.train.trainRun.trainRunMessages))lastMessage=this.train.trainRun.trainRunMessages[this.train.trainRun.trainRunMessages.length-1];if(lastMessage)
{var startX=this.renderer.getXForStationId(lastMessage.stationId);var startY=this.renderer.getYForTime(Date.parseDate(lastMessage.timestamp,"Y-m-d H:i:s"));if(startX!==null&&startY!==null)forecastPoints.push(new JPaint.Point(startX+this.directionStationOffset,startY));}
for(var i=0;i<stations.length;i++)
{var currentStation=stations[i];this.console.log("CurrentStation:",currentStation);if(currentStation.arrivalTimestamp)
{var x=this.renderer.getXForStationId(currentStation.stationId);var y=this.renderer.getYForTime(new Date(currentStation.arrivalTimestamp*1000));var offset=this.directionStationOffset;if(currentStation.stationId==this.train.arrivalStationId)offset=0;if(x!==null&&y!==null)
{forecastPoints.push(new JPaint.Point(x+offset,y));if(currentStation.arrivalInfluenced==true)
{var rectangle=this.renderer.createRect(x+offset-4,y-4,8,8);rectangle.setLineColor(this.lineColor);rectangle.setFillColor(this.transparentLineColor);this.dispoChanges.push(rectangle);}}}
if(currentStation.departureTimestamp)
{var x=this.renderer.getXForStationId(currentStation.stationId);var y=this.renderer.getYForTime(new Date(currentStation.departureTimestamp*1000));if(x!==null&&y!==null)
{forecastPoints.push(new JPaint.Point(x+this.directionStationOffset,y));if(currentStation.departureInfluenced==true)
{var rectangle=this.renderer.createRect(x+this.directionStationOffset-4,y-4,8,8);rectangle.setLineColor(this.lineColor);rectangle.setFillColor(this.transparentLineColor);this.dispoChanges.push(rectangle);}}}}
if(forecastPoints.length>1)
{this.console.log("Creating Forecast!");this.forecast=this.renderer.createPolyline(forecastPoints);this.forecast.setLineColor(this.lineColor);this.forecast.setLineWidth(2);}
else
{this.forecast=null;}}
else
{this.forecast=null;}
if(this.labelAttachment=="forecast")this.updateTextLabel();};this.trainRunMessagesAdded=function(_trainProxy,_newMessages)
{if(this.trainRun)
{for(var i=0;i<_newMessages.length;i++)
{this.console.log("Adding new message:",_newMessages[i]);var x=this.renderer.getXForStationId(_newMessages[i].stationId);var y=this.renderer.getYForTime(Date.parseDate(_newMessages[i].timestamp,"Y-m-d H:i:s"));if(x!==null)
{this.trainRun.addPoint(new JPaint.Point(x+this.directionStationOffset,y));}}
this.updateForecast();this.updateTextLabel();this.renderer.requestRedraw();}
else
{this.console.log("Got a new message, but had no trainRun!",_newMessages);this.createRenderables();}};this.onTrainArrived=function()
{this.forecast=null;this.dispoChanges=[];};this.onTrainCanceled=function()
{this.console.log("onTrainCanceled was called!");this.renderer.requestRedraw();this.trainWasCanceled=true;};this.onTrainUpdatedComplete=function()
{this.console.log("Got complete train-update from backend!");if(this.trainWasCanceled)
{this.console.log("Canceled train was updated!",this.train);delete this.trainWasCanceled;}
this.createRenderables();this.renderer.requestRedraw();};this.renderLines=function(_options)
{if(this.train.isCanceled==true)return;if(_options.renderStartedTrainRoutes!=this.lastRenderOptions.renderStartedTrainRoutes&&_options.renderUnstartedTrainRoutes!=this.lastRenderOptions.renderUnstartedTrainRoutes)
{this.lastRenderOptions=_options;this.updateTextLabel();}
this.console.log("Rendering Train: ",this.train.number,this.trainRun);if(!this.trainRoute)this.createRenderables();if((_options.renderStartedTrainRoutes==true&&(this.train.trainRun&&(this.train.trainRun.trainRunMessages&&this.train.trainRun.trainRunMessages.length>0)))||(_options.renderUnstartedTrainRoutes==true&&!this.trainRun&&!this.forecast)||(_options.renderUnstartedTrainRoutes==true&&this.trainRun&&this.trainRun.points.length<2&&!this.forecast))
{if(this.trainRoute!==true)
{this.trainRoute.render();for(var i=0;i<this.circles.length;i++)
{this.circles[i].render();}
this.trainRouteRendered=true;}}
else this.trainRouteRendered=false;if(this.trainRun)this.trainRun.render();if(this.forecast)
{this.console.log("Rendering Forecast!!!");this.forecast.render();for(var i=0;i<this.dispoChanges.length;i++)
{this.dispoChanges[i].render();}}};this.renderLabels=function()
{if(this.train.isCanceled==true)return;if(this.lastRenderOptions.renderUnstartedTrainRoutes==false&&this.labelAttachment=="trainRoute")return;if(this.trainNumberRect)
this.trainNumberRect.render();if(this.trainNumber)
this.trainNumber.render();};this.findMatch=function(x,y)
{if(this.train.isCanceled==true)return null;var boundingBoxSize=10;var offset=boundingBoxSize/2;if(this.forecast)
{var start=0;if(this.train.trainRun&&this.train.trainRun.trainRunMessages&&this.train.trainRun.trainRunMessages.length>0)start=1;for(var i=start;i<this.forecast.points.length;i++)
{if(this.forecast.points[i].x+offset>x&&this.forecast.points[i].x-offset<x)
{if(this.forecast.points[i].y+offset>y&&this.forecast.points[i].y-offset<y)
{return this.generateTrainInfo(this.forecast.points[i].x,this.forecast.points[i].y);}}}}
else if(this.trainRoute)
{for(var i=0;i<this.trainRoute.points.length;i++)
{if(this.trainRoute.points[i].x+offset>x&&this.trainRoute.points[i].x-offset<x)
{if(this.trainRoute.points[i].y+offset>y&&this.trainRoute.points[i].y-offset<y)
{return this.generateTrainInfo(this.trainRoute.points[i].x,this.trainRoute.points[i].y);}}}}
return null;};this.generateTrainInfo=function(x,y)
{var trainInfo={};trainInfo.number=this.train.number;trainInfo.isArrival=false;trainInfo.isDeparture=false;var stationId=this.renderer.getStationIdForX(x-this.directionStationOffset);if(!stationId)stationId=this.renderer.getStationIdForX(x);if(stationId)
{console.log("We got a station id!");var trainRouteStation=this.getTrainRouteStationForStationId(stationId);if(trainRouteStation)
{trainInfo.trainRouteStation=trainRouteStation;trainInfo.stationIdCode=trainRouteStation.stationIdCode;}
else
{if(this.train.departureStationId==stationId)
{trainInfo.stationIdCode=this.train.departureStation.split("|")[1];trainInfo.trainRouteStation={time:0,stayDuration:0};trainInfo.isDeparture=true;}
if(this.train.arrivalStationId==stationId)
{trainInfo.stationIdCode=this.train.arrivalStation.split("|")[1];trainInfo.trainRouteStation={time:this.train.travelTime};trainInfo.isArrival=true;}}}
if(this.train.trainRun)
{trainInfo.trainRunId=this.train.trainRun.id;}
else trainInfo.trainRunId=null;trainInfo.plannedDeparture=Date.parseDate(this.train.date+" "+this.train.departureTime,"Y-m-d H:i:s");trainInfo.forecastStation=null;if(this.train.forecast)
{for(var k=0;k<this.train.forecast.stations.length;k++)
{if(this.train.forecast.stations[k].stationId==stationId)
{trainInfo.forecastStation=this.train.forecast.stations[k];}}}
else
{trainInfo.forecastStation={arrivalDiff:null,departurediff:null};}
trainInfo.trainColor=this.lineColor.asRgbString();trainInfo.stationId=stationId;trainInfo.trainId=this.train.id;trainInfo.plannedDepartureDate=this.train.date;trainInfo.proxy=this.trainProxy;console.log("Generated trainInfo:",trainInfo);return trainInfo;};this.destroy=function()
{this.trainProxy.un("trainrunmessagesadded",this.trainRunMessagesAdded,this);this.trainProxy.un("forecastupdated",this.forecastUpdated,this);this.trainProxy.un("trainarrived",this.onTrainArrived,this);this.trainProxy.un('canceled',this.onTrainCanceled,this);this.trainProxy.un('updated',this.onTrainUpdated,this);delete this.trainProxy;};this.trainProxy.on("trainrunmessagesadded",this.trainRunMessagesAdded,this);this.trainProxy.on("forecastupdated",this.forecastUpdated,this);this.trainProxy.on("trainarrived",this.onTrainArrived,this);this.trainProxy.on('canceled',this.onTrainCanceled,this);this.trainProxy.on('completeupdate',this.onTrainUpdatedComplete,this);};diloc.rail.ZwlRenderer2=function()
{this.painter=null;this.width=0;this.height=0;this.diagramData={};this.trains=[];this.layoutRenderables=[];this.beginDate=null;this.endDate=null;this.renderOptions={renderStartedTrainRoutes:false,renderUnstartedTrainRoutes:false};this.setPainter=function(_painter)
{this.painter=_painter;};this.createPolyline=function(_points)
{var polyline=new JPaint.Polyline(_points);polyline.setPainter(this.painter);return polyline;};this.createText=function(_x,_y,_fontSize,_fontFamily,_text,_alignment)
{var text=new JPaint.Text(_x,_y,_fontSize,_fontFamily,_text,_alignment);text.setPainter(this.painter);return text;};this.createRect=function(_x,_y,_width,_height,_radius)
{var rect=new JPaint.Rect(_x,_y,_width,_height,_radius);rect.setPainter(this.painter);return rect;};this.createCircle=function(_center,_radius)
{var circle=new JPaint.Circle(_center,_radius);circle.setPainter(this.painter);return circle;};this.updateGeometry=function(_newWidth,_newHeight)
{this.width=_newWidth;this.height=_newHeight;this.refreshLayout();this.render();};this.setTimespan=function(_beginDate,_endDate)
{console.log("New Timespan is:",_beginDate,_endDate);this.beginDate=_beginDate;this.endDate=_endDate;};this.setZwlDiagramData=function(_data)
{this.diagramData=_data;};this.setRenderOptions=function(_renderOptions)
{this.renderOptions=_renderOptions;};this.addTrain=function(_train)
{var trainsAlreadyIn={};var i=0;for(i=0;i<this.trains.length;i++)
{trainsAlreadyIn[this.trains[i].train.number]=true;}
console.log("Adding new trains to already available trains:",trainsAlreadyIn);if(!trainsAlreadyIn[_train.data.number])
{this.trains.push(new diloc.rail.ZwlTrain2(this,_train,false));}
else
{console.warn("Got already known train "+_train.data.number+"!");}};this.couldTrainBeDrawed=function(_train)
{var numPoints=0;if(this.getXForStationId(_train.data.departureStationId)!==null)numPoints++;if(this.getXForStationId(_train.data.arrivalStationId)!==null)numPoints++;if(numPoints>=2)return true;if(Ext.isArray(_train.data.trainRoute.stations))
{for(var i=0;i<_train.data.trainRoute.stations.length;i++)
{if(this.getXForStationId(_train.data.trainRoute.stations[i].stationId)!==null)numPoints++;if(numPoints>=2)return true;}}
return false;};this.getXForStationId=function(_stationId)
{if(this.stationX['S'+_stationId])return this.stationX['S'+_stationId];else return null;};this.getStationIdForX=function(x)
{for(var i in this.stationX)
{if(this.stationX[i]==x)return i.substr(1);}
return null;};this.getStationIdForLooseX=function(x)
{for(var i in this.stationX)
{if(this.stationX[i]*1+20>x&&this.stationX[i]*1-20<x)return i.substr(1);}
return null;}
this.getYForTime=function(_date)
{var timediff=this.beginDate.getElapsed(this.endDate)/1000;var heightAvailable=this.height-50;var heightPerSecond=heightAvailable/timediff;var seconds=(_date.getTime()-this.beginDate.getTime())/1000;return 25+seconds*heightPerSecond;};this.requestRedraw=function()
{console.log("Redraw requested!");if(!this.redrawTask)
{this.redrawTask=new Ext.util.DelayedTask(this.render,this);}
this.redrawTask.delay(100);};this.refreshLayout=function()
{var i=0;var foregroundHex=this.diagramData.foregroundColor.asHexString();var foregroundLightHex=this.diagramData.foregroundColor.createLighterColor(300).asHexString();var backgroundHex=this.diagramData.backgroundColor.asHexString();this.layoutRenderablesPhase1=[];this.layoutRenderablesPhase2=[];var topRect=this.createRect(0,-1,this.width,26);topRect.setFillColor(backgroundHex);topRect.setLineColor(null);this.layoutRenderablesPhase2.push(topRect);var topAxis=this.createPolyline([new JPaint.Point(50,25.5),new JPaint.Point(this.width-50,25.5)]);topAxis.setLineColor(foregroundHex);var leftAxis=this.createPolyline([new JPaint.Point(50.5,25.5),new JPaint.Point(50.5,this.height)]);leftAxis.setLineColor(foregroundHex);var rightAxis=this.createPolyline([new JPaint.Point(this.width-50.5,25.5),new JPaint.Point(this.width-50.5,this.height)]);rightAxis.setLineColor(foregroundHex);this.layoutRenderablesPhase2.push(topAxis);this.layoutRenderablesPhase2.push(leftAxis);this.layoutRenderablesPhase2.push(rightAxis);var topAxisWidth=this.width-100;var widthPerStation=topAxisWidth/(this.diagramData.stations.length-1);this.stationX={};for(i=0;i<this.diagramData.stations.length;i++)
{var stationCode=this.diagramData.stations[i].station.split("|")[1];var stationText=this.createText(50+widthPerStation*i,20,"12px","Arial",stationCode,"center");stationText.setFillColor(foregroundHex);this.layoutRenderablesPhase2.push(stationText);this.stationX['S'+this.diagramData.stations[i].stationId]=50.5+widthPerStation*i;if(i>0&&i<this.diagramData.stations.length-1)
{var stationLine=this.createPolyline([new JPaint.Point(50.5+widthPerStation*i,25.5),new JPaint.Point(50.5+widthPerStation*i,this.height)]);stationLine.setLineColor(foregroundLightHex);this.layoutRenderablesPhase1.push(stationLine);}}
var timediff=this.beginDate.getElapsed(this.endDate)/1000/60;var heightAvailable=this.height-25;var heightPerTick=heightAvailable/timediff;var heightPerMinute=heightPerTick;var minutesPerTick=1;var bigTickEvery=10;if(heightPerTick<7)
{heightPerTick*=5;minutesPerTick=5;bigTickEvery=3;}
if(heightPerTick<7)
{heightPerTick*=2;minutesPerTick=10;bigTickEvery=3;}
if(heightPerTick<7)
{heightPerTick*=1.5;minutesPerTick=15;bigTickEvery=4;}
if(heightPerTick<7)
{heightPerTick*=4;minutesPerTick=60;bigTickEvery=6;}
var minutesPerBigTick=bigTickEvery*minutesPerTick;var minuteOffset=minutesPerTick-(parseInt(this.beginDate.format("i"),10)%minutesPerTick);var heightOffset=minuteOffset*heightPerMinute;console.warn("Timediff: "+timediff+" HeightPerTick is:",heightPerTick,minutesPerTick*bigTickEvery,parseInt(this.beginDate.format("i"),10),minuteOffset,heightOffset);var finished=false;i=0;while(!finished)
{var x1=45;var x2=55;var time=this.beginDate.add(Date.SECOND,minutesPerTick*i*60+minuteOffset*60);var bigTick=false;var hourTick=false;if((parseInt(time.format("i"),10)%minutesPerBigTick)==0)bigTick=true;if(time.format("i")=="00")hourTick=true;if((parseInt(time.format("i"),10)%5)==0)
{x1=42;x2=58;}
if(bigTick)
{x1=40;x2=60;var tickTime=new JPaint.Text(x1-5,25.5+heightPerTick*i+4+heightOffset,"10px","Arial",time.format("H:i"));if(hourTick)
{tickTime=new JPaint.Text(x1-5,25.5+heightPerTick*i+6.5+heightOffset,"16px","Arial",time.format("H")+"");}
tickTime.setPainter(this.painter);tickTime.move(-tickTime.getWidth(),0);tickTime.setFillColor(foregroundHex);var tickTime2=tickTime.clone();tickTime2.move(x2-x1+10+topAxisWidth+tickTime.getWidth(),0);this.layoutRenderablesPhase1.push(tickTime);this.layoutRenderablesPhase1.push(tickTime2);}
if(!hourTick)
{for(var k=0;k<this.diagramData.stations.length;k++)
{var tick=this.createPolyline([new JPaint.Point(x1+k*widthPerStation,25.5+heightPerTick*i+heightOffset),new JPaint.Point(x2+k*widthPerStation,25.5+heightPerTick*i+heightOffset)]);if(k>0&&k<this.diagramData.stations.length-1)tick.setLineColor(foregroundLightHex);else tick.setLineColor(foregroundHex);this.layoutRenderablesPhase1.push(tick);}}
else
{var line=this.createPolyline([new JPaint.Point(x1,25.5+heightPerTick*i+heightOffset),new JPaint.Point(topAxisWidth+(x2-x1)/2+50,25.5+heightPerTick*i+heightOffset)]);line.setLineColor(foregroundLightHex);this.layoutRenderablesPhase1.push(line);var tickLeft=this.createPolyline([new JPaint.Point(x1,25.5+heightPerTick*i+heightOffset),new JPaint.Point(x2,25.5+heightPerTick*i+heightOffset)]);tickLeft.setLineColor(foregroundHex);this.layoutRenderablesPhase1.push(tickLeft);var tickRight=this.createPolyline([new JPaint.Point(x1+topAxisWidth,25.5+heightPerTick*i+heightOffset),new JPaint.Point(x2+topAxisWidth,25.5+heightPerTick*i+heightOffset)]);tickRight.setLineColor(foregroundHex);this.layoutRenderablesPhase1.push(tickRight);}
i++;if(25+heightPerTick*(i)+heightOffset>this.height)
finished=true;}
for(i=0;i<this.trains.length;i++)
{this.trains[i].createRenderables();}};this.render=function()
{console.warn("zwlrenderer.render() got called!",this.width,this.height);var nowY=this.getYForTime(new Date());var upperBackgroundRect=this.createRect(0,0,this.width,nowY);upperBackgroundRect.setFillColor(this.diagramData.backgroundColor.asHexString());upperBackgroundRect.setLineColor(null);var lowerBackgroundRect=this.createRect(0,nowY,this.width,this.height-nowY);lowerBackgroundRect.setFillColor(this.diagramData.backgroundColor.createLighterColor(10).asHexString());lowerBackgroundRect.setLineColor(null);upperBackgroundRect.render();lowerBackgroundRect.render();if(this.layoutRenderablesPhase1.length==0)this.refreshLayout();var i=0;for(i=0;i<this.layoutRenderablesPhase1.length;i++)
{this.layoutRenderablesPhase1[i].render();}
for(i=0;i<this.trains.length;i++)
{this.trains[i].renderLines(this.renderOptions);}
for(i=0;i<this.layoutRenderablesPhase2.length;i++)
{this.layoutRenderablesPhase2[i].render();}
for(i=0;i<this.trains.length;i++)
{this.trains[i].renderLabels();}};this.findMatchingTrains=function(x,y)
{var matchingTrainInfo=[];for(i=0;i<this.trains.length;i++)
{var trainMatchInfo=this.trains[i].findMatch(x,y);if(trainMatchInfo)
{console.info("Matching Train #"+trainMatchInfo.number+"!!!");matchingTrainInfo.push(trainMatchInfo);}}
return matchingTrainInfo;};this.destroy=function()
{for(i=0;i<this.trains.length;i++)
{this.trains[i].destroy();}};};

diloc.rail._TrainRunMessageLoader=function()
{this.addEvents("newtrainrunmessagesavailable");this.lastMessages=[];this.updatesRunning=false;this.numberFailures=0;this.highestId=0;this.stopLoading=false;this.fetchNewMessages=function()
{if(this.stopLoading==true)return;console.log("Fetching new messages");this.updatesRunning=true;var fetcher=new gwf.helpers.ActionExecutor({silent:true});fetcher.on("success",function(_result){if(_result.data.length>0)
{this.lastMessages=_result.data;for(var i=0;i<this.lastMessages.length;i++)
{if(this.lastMessages[i].id>this.highestId)
this.highestId=this.lastMessages[i].id;}
this.fireEvent("newtrainrunmessagesavailable",this.lastMessages);}
this.numberFailures=0;this.fetchNewMessages.defer(10*1000,this);},this);fetcher.on("failure",function()
{this.numberFailures++;if(this.numberFailures>2)
{gwf.App.errorMsg("Fehler","Fehler beim aktualisieren der Zuglaufmeldungen, die Daten die Sie sehen sind vermutlich veraltet! Nächster Versuch in 60 Sekunden.");this.fetchNewMessages.defer(60*1000,this);}
else
{this.fetchNewMessages.defer(15*1000,this);}},this);if(this.highestId>0)
{fetcher.execute("trainrunmessages","last",{sinceId:this.highestId});}
else
{gwf.App.errorMsg("Fehler","Konnte keine aktuellen Zuglaufmeldungen laden, weil keine Vorhanden sind!");this.updatesRunning=false;}};diloc.rail._TrainRunMessageLoader.superclass.constructor.apply(this,arguments);};Ext.extend(diloc.rail._TrainRunMessageLoader,Ext.util.Observable,{registerNewConsumer:function(_handler,_scope,_sinceId)
{this.stopLoading=false;this.on("newtrainrunmessagesavailable",_handler,_scope);if(!this.updatesRunning)
{this.highestId=_sinceId;this.fetchNewMessages();}
else
{var newMessages=[];for(var i=0;i<this.lastMessages.length;i++)
{if(this.lastMessages[i].id>_sinceId)newMessages.push(this.lastMessages[i]);}
if(newMessages.length>0)
{_handler.apply(_scope,newMessages);}}},unregisterConsumer:function(_handler,_scope)
{this.un("newtrainrunmessagesavailable",_handler,_scope);if(!this.hasListener("newtrainrunmessagesavailable"))
{this.stopUpdates();}},stopUpdates:function()
{this.stopLoading=true;this.updatesRunning=false;}});diloc.rail.TrainRunMessageLoader=new diloc.rail._TrainRunMessageLoader();

Ext.namespace("diloc","diloc.modules");diloc.modules.WelcomeScreen=function()
{diloc.modules.WelcomeScreen.superclass.constructor.call(this,{});this.newsData=null;this.newsLoaded=function(_result)
{this.newsData=_result;if(this.newsPanel)this.displayNews();};this.displayNews=function()
{this.newsTemplate.insertFirst(this.newsPanel.body,this.newsData);};this.enhanceApplication=function()
{this.centerPanel=this.app.prepareContentPanel(this);this.newsPanel=new Ext.ux.Portlet({title:'Neuigkeiten rund um DiLoc!',autoScroll:true,stateId:'portlet-news',height:620});this.portal=new Ext.ux.Portal({bodyStyle:'background-color:transparent',border:false,margins:'35 5 5 5',cls:'welcomescreen',items:[{columnWidth:0.5,style:'padding:10px 0px 10px 10px',items:[{title:'Einführung in DiLoc|Rail',html:'<h2>Besser informiert mit DiLoc|Rail</h2><p>Mit DiLoc|Rail sind sie immer auf dem neusten Stand. Folgende Module helfen Ihnen dabei:</p><div id="modules_info"></div>',xtype:'portlet',stateId:'portlet-intro',height:330},{title:'Neues in dieser Version',autoScroll:true,stateId:'portlet-newversion',height:280,html:'<h2>Änderungen in dieser Version (1.2.4 / 01.09.2011)</h2>'+'<br/><p>'+'<ul class="list">'+'<li><b>Disposition:</b> Halte die im ZWL-Diagramm als Außerordentlicher Halt definiert werden, werden jetzt in der Prognose richtig berücksichtigt und können weiterhin bearbeitet werden</li>'+'<li><b>Tageszirkular:</b> Es ist jetzt möglich Anordnungen & Züge auf Referenz zu filtern, und nur noch gefilterte Einträge im PDF auszugeben</li>'+'<li><b>VDV-Schnittstelle:</b> Wenn im Fahrplan ein K-Ziel eingegeben wird, wird dieses Ziel jetzt auch als RichtungsID übertragen, sofern im K-Ziel ein bekanntes Stations-Kürzel steht.</li>'+'</ul>'+'</p>'+'<h2>Änderungen in Version 1.2.3 vom 09.08.2011</h2>'+'<br/><p>'+'<ul class="list">'+'<li>Fehler beim erneuten Laden von Tabellen welche auf ein Datum gefiltert wurden, behoben</li>'+'<li><b>Disposition:</b> Es ist jetzt möglich über das Kontextmenü des GPS-Geräts dieses auf einen anderen Zug zuzuweisen solange der Zug noch nicht losgefahren ist.</li>'+'<li><b>Disposition:</b> Wird eine Ankunft eines GPS-Zuges nicht richtig erkannt, kann dieser Zuglauf jetzt auch über die Disposition geschlossen werden, und so die Verbindung zum GPS-Gerät zu lösen.</li>'+'<li><b>SyncManager:</b> Die Anzahl angezeigter Sync-Geräte stimmt jetzt mit der reellen Anzahl überein.</li>'+'</ul>'+'</p>'+'<h2>Änderungen in Version 1.2.2 vom 03.06.2011</h2>'+'<br/><p>'+'<ul class="list">'+'<li><b>Tageszirkular:</b> Verbesserungen bei der PDF-Ausgabe mit Zeilenunmbrüchen</li>'+'<li><b>Tageszirkular:</b> Züge mit nur einer Änderung in Kommentar oder Referenz werden jetzt angezeigt</li>'+'<li>Es wurde ein Fehler behoben der zur Nichterreichbarkeit des Servers und Meldungsausfall führen konnte.</li>'+'</ul>'+'</p>'+'<h2>Änderungen in Version 1.2.1 vom 04.05.2011</h2>'+'<br/><p>'+'<ul class="list">'+'<li><b>Tageszirkular:</b> Ein paar kleinere Fehlerbehebungen.</li>'+'<li><b>Tageszirkular:</b> Das Schulungs-Video ist jetzt über einen Knopf aufrufbar.</li>'+'<li><b>ZWL-Diagramme:</b> Der NEU-Button wurde durch ein Video-Symbol ersetzt, verlinkt jedoch weiterhin auf das Video von der Disposition.</li>'+'</ul>'+'</p>'+'<h2>Änderungen in Version 1.2 vom 21.04.2011</h2>'+'<br/><p>'+'<ul class="list">'+'<li><b>Tageszirkular:</b> Ein paar kleinere Fehlerbehebungen.</li>'+'<li><b>Fahrplanmanager:</b> Es ist jetzt möglich Reihungen in einer Ausnahme auf "nichts" zu setzen. Diese werden dann auch korrekt per VDV454 ausgegeben.</li>'+'<li><b>Fahrplanmanager:</b> Eingabefelder von Kommentar und Bespannung funktionieren auch nach dem Einklappen wieder</li>'+'<li><b>VDV-Schnittstelle:</b> Die ausgegebenen Zeiten bei Zügen mit abweichender KB-Abfahrtszeit wurden korrigiert</li>'+'<li><b>VDV-Schnittstelle:</b> Richtungstext wird auch bei in der Disposition verkürzten Zügen nocheinmal übermittelt.</li>'+'<li><b>DiLoc|Sync-Manager:</b> Es ist jetzt möglich die Liste der Sync-Geräte in verschiedene Formate zu exportieren.</li>'+'</ul>'+'</p>'+'<h2>Änderungen in Version 1.2 Beta5 vom 14.04.2011</h2>'+'<br/><p>'+'<ul class="list">'+'<li><b>Tageszirkular:</b> Züge können jetzt bei Bedarf ausgeblendet werden.</li>'+'<li><b>Tageszirkular:</b> Züge die ausfallen werden im Tageszirkular dargestellt.</li>'+'<li><b>Tageszirkular:</b> Weitere Verbesserungen und Fehlerbereinigungen.</li>'+'<li><b>Disposition:</b> Der Fahrplan von Zügen mit Durchfahrten wird jetzt in jedem Fall richtig dargestellt.</li>'+'<li><b>Fahrplanmanager:</b> <b>Experimentell:</b> Es ist jetzt möglich in der Fahrplanperioden-Verwaltung beliebige Feiertage zu definieren.</li>'+'<li><b>Fahrplanmanager:</b> KB-Zeiten beim Verkürzen von Zügen werden korrekt angepasst und ein Kommentar in die Ausnahme geschrieben, damit diese im Tageszirkular auftaucht.</li>'+'<li><b>VDV-Schnittstelle:</b> Reihungsinformationen werden bei Kopfbahnhöfen (z.B. Meiringen) richtig übermittelt.</li>'+'<li><b>VDV-Schnittstelle:</b> Weitere Fehlerbehebungen.</li>'+'</ul>'+'</p>'+'<h2>Änderungen in Version 1.2 Beta4 vom 04.04.2011</h2>'+'<br/><p>'+'<ul class="list">'+'<li><b>Tageszirkular:</b> Viele Verbesserungen beim PDF-Export.</li>'+'<li><b>Tageszirkular:</b> Viele Verbesserungen bei der Darstellung von Ausnahmen (Gleis, Uhrzeiten, geplante Ausnahmen, etc.)</li>'+'<li><b>Tageszirkular:</b> Alle Dialoge wurden überarbeitet damit sie platzsparender und intuitiver sind.</li>'+'<li><b>Disposition:</b> Züge für die vor Abfahrt eine Dispositions-Änderung eingegeben wird, werden jetzt korrekt erfasst.</li>'+'<li><b>Fahrplanmanager:</b> <b>Experimentell:</b> Es ist jetzt möglich Feiertage zu definieren. Momentan noch ohne Oberfläche, es ist nur zum Testen gedacht.<br/>Definierte Feiertage werden im Fahrplanmanager Orange dargestellt. (In der Wochen-Auswahl und in der Tabelle bei Verkehrstagen)</li>'+'<li><b>DiLoc|Sync Manager:</b> Es ist jetzt möglich DiLoc|Sync Geräte zu filtern, gruppieren oder nach bestimmten Geräten/Benutzern zu suchen.</li>'+'<li>Zahlreiche Fehlerbehebungen und Verbesserungen die DiLoc stabiler und besser wartbar machen.</li>'+'</ul>'+'</p>'+'<h2>Änderungen in Version 1.2 Beta3 vom 11.03.2011</h2>'+'<br/><p>'+'<ul class="list">'+'<li><b>Tageszirkular:</b> Es ist jetzt möglich das Tageszirkular als PDF auszugeben</li>'+'<li><b>Tageszirkular:</b> Icons/Symbole verbessert</li>'+'<li><b>Fahrplanmanager:</b> Das Anlegen von Zügen wurde deutlich verbessert. Es ist jetzt direkt möglich die Abfahrtszeit und Start- und Ziel-Bahnhof einzugeben.</li>'+'</ul>'+'</p>'+'<h2>Änderungen in Version 1.2 Beta2 vom 28.02.2011</h2>'+'<br/><p>'+'<ul class="list">'+'<li><b>Tageszirkular:</b> Es ist jetzt möglich Anordnungen einzugeben, zu löschen, und mehrmals darzustellen</li>'+'<li><b>Tageszirkular:</b> Zug-Ausnahmen könne jetzt mehrmals dargestellt werden</li>'+'<li><b>Tageszirkular:</b> Bei Zug-Ausnahmen können jetzt Kommentar und Referenz bearbeitet werden</li>'+'<li><b>Fahrplanmanager:</b> Die Eingabe von Kommentaren unterstützt jetzt TAB-Zeichen für das Tageszirkular</li>'+'<li><b>Fahrplanmanager:</b> Die Eingabe des Referenz-Feldes ist jetzt möglich</li>'+'</ul>'+'</p>'+'<h2>Änderungen in Version 1.2 Beta1 vom 15.02.2011</h2>'+'<br/><p>'+'<ul class="list">'+'<li><b>Fahrplanmanager</b> Beim Abschneiden/Verkürzen eines Zuges wird das Gleis jetzt auch korrekt übernommen.</li>'+'<li><b>Experimentell:</b> Tageszirkular kann mit einigen Funktionalitäten ausprobiert werden.</li>'+'</ul>'+'</p>'+'<h2>Änderungen in Version 1.1.4 vom 18.01.2011</h2>'+'<br/><p>'+'<ul class="list">'+'<li><b>ILTIS-Schnittstelle:</b> Die Zuordnung der Meldungen zu einem Zug wurde verbessert. Dadurch sollten falsche Verspätungen von +1440 oder -1440 Minuten nicht mehr vorkommen.<br/>Auch die Anzeige der fahrenden Züge in Disposition und Zugkarte sollte damit korrekter sein.</li>'+'<li><b>Zugkarte:</b> Es werden jetzt keine Züge mehr dargestellt die älter als 24h sind</li>'+'<li>Die Überwachung des Servers wurde verbessert.</li>'+'</ul>'+'</p>'+'<h2>Änderungen in Version 1.1.3 vom 04.01.2011</h2>'+'<br/><p>'+'<ul class="list">'+'<li><b>DiLoc|Sync:</b> Das registrieren von neuen Geräten ist wieder möglich.</li>'+'</ul>'+'</p>'+'<h2>Änderungen in Version 1.1.2 vom 03.01.2011</h2>'+'<br/><p>'+'<ul class="list">'+'<li><b>Sync-Manager:</b> Die Anzeige von Datums-Spalten funktioniert jetzt in allen Browsern.</li>'+'<li><b>Sync-Manager:</b> Ein seltenes Problem beim deaktivieren von bestimmten Geräten wurde behoben.</li>'+'</ul>'+'</p>'+'<h2>Änderungen in Version 1.1.1 vom 23.12.2010</h2>'+'<br/><p>'+'<ul class="list">'+'<li><b>Disposition:</b> Rechte-Maustaste auf Stationskürzel funktioniert auch wenn man nur Leserechte in der Disposition hat.</li>'+'<li><b>Disposition:</b> Der Fehler das manche fahrende Züge nicht angezeigt werden, wurde behoben</li>'+'<li><b>Disposition:</b> Seltener auftretender Fehler bei der Prognose-Berechnung von vorzeitig endenden Züge wurde behoben.</li>'+'<li><b>Fahrplanmanager:</b> Funktioniert jetzt wieder in Zusatzfenstern</li>'+'</ul>'+'</p>'+'<h2>Änderungen in Version 1.1 vom 21.12.2010</h2>'+'<br/><p>'+'<ul class="list">'+'<li>Jeder Benutzer kann jetzt selbst sein Passwort ändern. (Klick auf Email-Adresse oben rechts)</li>'+'<li><b>Disposition:</b> 21:15-Bug wurde behoben</li>'+'<li><b>Disposition:</b> Das laden von Zug-Updates und das manuelle schließen von Zügen ist jetzt schneller</li>'+'<li><b>Neu:</b> Stationseditor ermöglicht das Hinterlegen von Zusatzinformationen (Telefonnummern, Gleise und Dokumente) </li>'+'<li><b>ZWL-Diagramm:</b> Bei Rechtsklick auf ein Stationskürzel erscheint ein Menü welches die wichtigen Dokumente und Zusatzinformationen anzeigt, welche in der Verwaltung zur Station hinterlegt wurden.</li>'+'<li><b>ZWL-Diagramm:</b> Einige Fehler in der Darstellung behoben</li>'+'<li><b>ZWL-Diagramm:</b> Prognosen von Zügen mit Ausnahmen in Start- und Ziel-Bahnhof werden richtig dargestellt</li>'+'<li><b>ZWL-Diagramm:</b> ZWL-Diagramme können jetzt ausgedruckt werden</li>'+'<li><b>Fahrplanmanager:</b> Es werden jetzt immer alle Züge geladen, dadurch enfällt das Blättern auf Seiten</li>'+'<li><b>Fahrplanmanager:</b> Es kann jetzt nach Zugnummer gefiltert werden, um schnell zu einem bestimmten Zug zu gelangen</li>'+'<li><b>Fahrplanmanager:</b> Es ist jetzt möglich Tagesausnahmen auf einen beliebigen Folge-Tag zu kopieren. Die neue Funktion ist im Kontext-Menü (rechte Maustaste) in der Status-Spalte im Fahrplan-Manager zu finden. Wenn am Ziel-Tag schon eine Ausnahme für einen Zug vorhanden ist, ermöglicht ein Dialog das Überschreiben oder Kombinieren der vorhandenen Ausnahme.</li>'+'<li><b>Neu:</b> DiLoc|Sync-Manager ermöglicht es DiLoc|Sync-Geräte zu verwalten</li>'+'<li>Allgemein sind zahlreiche Fehlerbehebungen in dieser Version enthalten.</li>'+'</ul>'+'</p>'+'<h2>Änderungen in Version 1.0.2</h2>'+'<br/><p>'+'<ul class="list">'+'<li><b>DiLoc|Sync-Manager:</b> Fehler beim Anlegen und umbenennen von Ordnern behoben</li>'+'<li><b>DiLoc|Sync-Manager:</b> Aus Kompatibilitätsgründen ist es jetzt nicht mehr möglich, Ordner anzulegen die mit einem Punkt ändern, oder sich nur in Groß-Klein Schreibung unterschreiden.</li>'+'<li><b>DiLoc|Sync-Manager:</b> Das bearbeiten von HTML-Dateien wurde in einigen Fällen robuster gemacht</li>'+'<li>Die Überwachung des Servers wurde verbessert</li>'+'</ul>'+'</p>'+'<h2>Änderungen in Version 1.0.1</h2>'+'<br/><p>'+'<ul class="list">'+'<li><b>Fahrplan-Manager:</b> Die Tabellarische Darstellung der Züge wurde wesentlich beschleunigt, da Tabellenzeilen nur noch bei bedarf dargestellt werden. Dadurch ist es auch möglich viel mehr Züge auf einmal zu laden, zb. 500 Züge auf einmal.</li>'+'<li>Die Überwachung des Servers wurde verbessert</li>'+'</ul>'+'</p>'+'<h2>Änderungen in Version 1.0</h2>'+'<br/><p>'+'Diese Version enthält alle Änderungen der vergangen 18 (!) Vor-Versionen und folgende Änderung:'+'<ul class="list">'+'<li><b>Fahrplan-Manager:</b> Ein Problem mit vertauschten Verkehrstagen wurde behoben</li>'+'</ul>'+'</p>'+'<h2>Änderungen in Version 1.0rc1</h2>'+'<br/><p>'+'<ul class="list">'+'<li><b>ZWL-Diagramm:</b> Dispositions-Änderungen lassen sich bei gedrückter Umstell-Taste direkt speichern</li>'+'<li><b>ZWL-Diagramm:</b> Kommentare von Dispositions-Änderungen werden jetzt im Dispositions-Änderung-Dialog angezeigt</li>'+'<li><b>ZWL-Diagramm:</b> Der Dispositions-Änderung-Dialog wird jetzt immer in dem Fenster angezeigt von dem er aufgerufen wurde</li>'+'<li><b>ZWL-Diagramm:</b> Kleine Bugfixes</li>'+'</ul>'+'</p>'+'<h2>Änderungen in Version 1.0 Beta17</h2>'+'<br/><p>'+'<ul class="list">'+'<li><b>Disposition:</b> Es ist jetzt möglich mehrere Zugläufe auf einmal zu schließen. Dazu einfach mehrere Zeilen markieren, und mit rechter Maustaste auf Status-Spalte "Zugläufe beenden" auswählen.</li>'+'<li><b>ZWL-Diagramm:</b> Es ist jetzt Dispositiv möglich Fahrpläne während der Fahrt zu beinflussen. Es können Gleise, Reihung, Hinweistext, Nicht-Einsteigen und Halte-Typ pro Station geändert/gesetzt werden. Außerdem ist es möglich eine Zug frühzeitig enden zu lassen.</li>'+'<li><b>ZWL-Diagramm:</b> Schon gespeicherte Dispositions-Änderungen zeigen den beim abspeichern eingegebenen Kommentar an, wenn die Änderung erneut aufgerufen wird.</li>'+'<li><b>ZWL-Diagramm:</b> Spontan eingesetzte Züge (über den Fahrplan-Manager) erscheinen jetzt automatisch im ZWL-Diagramm ohne dass neu geladen werden muss.</li>'+'<li><b>ZWL-Diagramm:</b> Über rechte Maustaste auf dem Startbahnhof eines Zuges ist es jetzt möglich einen Zug als Ausfall zu deklarieren. Dazu wird im Fahrplanmanager eine entsprechende Ausnahme angelegt. Der Zug-Ausfall wird außerdem über die VDV454-Schnittstelle weitergegeben.</li>'+'<li><b>ZWL-Diagramm:</b> Änderungen am Fahrplan eines bald startenden Zuges welche über den Fahrplan-Manager eingegeben wurden, erscheinen jetzt automatisch im ZWL-Diagramm ohne dass neu geladen werden muss</li>'+'<li><b>Statistik:</b> Der Excel-Export ist jetzt wesentlich schneller und funktioniert besser mit großen Datenmengen</li>'+'<li><b>ILTIS-Schnittstelle</b> Treten nach Ankunft eines Zuges noch weitere Meldungen zu diesem Zug auf, wird jetzt kein neuer Zuglauf erzeugt. Dies behebt Probleme mit der Anzeige von Fahrenden Zügen auf der Karte. (Züge-Online)</li>'+'<li><b>DiLoc|Sync Manager:</b> Es ist jetzt möglich HTML-Dateien (News-Dateien) direkt online zu bearbeiten.</li>'+'<li>Die VDV454/AUS-Schnittstelle ist implementiert und ermöglicht die Übermittlung der aktuellen Fahrplanlage, inklusive Prognosen und dispositiven Eingriffen.</li>'+'<li>Eine Status-Anzeige gibt Aufschluss über den Status von DiLoc|Rail.</li>'+'</ul>'+'</p>'+'<h2>Änderungen in Version 1.0 Beta16</h2>'+'<br/><p>'+'<ul class="list">'+'<li><b>Fahrplanmanager:</b> Neuer Wert Nicht-Einsteigen (NE) kann für den Zielbahnhof und jeden Unterwegsbahnhof gesetzt werden</li>'+'<li><b>Fahrplanmanager:</b> Neue Spalte Kundenzielbahnhof (K-Ziel) ermöglicht die Eingabe eines abweichenden Zielbahnhofes (als Kürzel z.B. IO oder als Freitext) für die Ausgabe an Anzeigesystemen</li>'+'<li>Die VDV454/REFAUS-Schnittstelle ist implementiert und ermöglicht die Abfrage von Fahrplänen</li>'+'</ul>'+'</p>'+'<h2>Änderungen in Version 1.0 Beta15</h2>'+'<br/><p>'+'<ul class="list">'+'<li><b>Linien-Verwaltung:</b> Es können für das Linien-Kürzel bis zu 12 Zeichen eingegeben werden.</li>'+'<li><b>Fahrplanmanager:</b> Einige der selten verwendeten Spalten wurden ausgeblendet um die Performance zu verbessern. Bei Bedarf können die Spalten wieder eingeblendet werden</li>'+'<li><b>Fahrplanmanager:</b> Das wechseln von Tagesanzeige zu Wochenanzeige, oder umgekehrt wurde um den Faktor 10 beschleunigt</li>'+'<li><b>Fahrplanmanager:</b> Eine experimentelle Darstellungsmethode erlaubt es auch mit 500 Zügen im Fahrplanmanager zügig zu arbeiten</li>'+'<li><b>Fahrplanmanager:</b> Ein Fehler beim zurücksetzen von Ausnahmen der neuen Felder wurde behoben</li>'+'<li><b>Fahrplanmanager:</b> Die Eingabe von Kursbuchabfahrtzszeiten im Zug-Fahrplan wurde verbessert.</li>'+'<li><b>Fahrplanmanager:</b> Kleinere Bugfixes und Verbesserungen.</li>'+'</ul>'+'</p>'+'<h2>Änderungen in Version 1.0 Beta14</h2>'+'<br/><p>'+'<ul class="list">'+'<li><b>Verwaltung:</b> Neu: Mit der Linien-Verwaltung können Linien angelegt und konfiguriert werden.</li>'+'<li><b>Verwaltung:</b> Neu: Mit der Zugmerkmal-Verwaltung können Zugmerkmale angelegt und konfiguriert werden.</li>'+'<li><b>Fahrplanmanager:</b> Für Züge können folgende Felder neu eingegeben werden: Linie/Gleise/Kursbuch-Zeiten/Reihung</li>'+'<li><b>Fahrplanmanager:</b> Beim Anlegen einer leeren Fahrplanausnahme, wird jetzt nicht mehr der Fahrplan in der Standardwoche überschrieben</li>'+'<li><b>Fahrplanmanager:</b> Beim Wechseln des Anzeigebereichs (Woche/Tag) wird der Fahrplan des markierten Zuges automatisch neu geladen und es werden die Züge der zuvor ausgewählten Seite geladen</li>'+'<li><b>Fahrplanmanager:</b> Beim löschen eines Zuges erfolgt zur Sicherheit noch eine Rückfrage</li>'+'<li><b>ZWL-Diagramm:</b> Prognosen für Züge werden jetzt richtig berechnet, wenn eine Wochenausnahme für den Fahrplan definiert wurde.</li>'+'<li><b>ZWL-Diagramm:</b> Prognosen für bedingte Halte korrigiert.</li>'+'<li><b>Zugkarte:</b> Zeitstempel werden jetzt richtig dargestellt.</li>'+'</ul>'+'</p>'+'<h2>Änderungen in Version 1.0 Beta13</h2>'+'<br/><p>'+'<ul class="list">'+'<li><b>Disposition:</b> Die Anzeige fahrender Züge wurde komplett überarbeitet. Sie ist jetzt wesentlich schneller und immer synchron mit den ZWL-Diagrammen.</li>'+'<li><b>Disposition:</b> Züge in der Übersicht zeigen jetzt (optional) auch den Zielbahnhof an.</li>'+'<li><b>Disposition:</b> Züge in der Übersicht können wahlweise nach Status, Zielbahnhof, Ausgangsbahnhof, Letzter Meldepunkt/Letztes Meldekürzel und Typ gruppiert werden.</li>'+'<li><b>Disposition:</b> Auch Züge ohne GPS-Geräte können auf der Karte angezeigt werden sofern die Stationen mit GPS-Koordinaten hinterlegt sind.</li>'+'<li><b>Disposition:</b> Der Ordner GPS-Geräte wird nicht mehr angezeigt wenn keine GPS-Geräte genutzt werden.</li>'+'<li><b>Disposition:</b> Die Anzeige unter dem Reiter "Zug" wurde komplett überarbeitet: Sie zeigt jetzt auch den Fahrplan bzw. die Prognose eines Zuges, Generelle Zuginformationen werden jetzt links dargestellt, damit mehr Platz für den Fahrplan ist. Änderungen an InfoText oder Anhängen zu Zuglaufmeldungen werden jetzt automatisch bei anderen gleichzeitig angemeldeten Benutzern angezeigt.</li>'+'<li><b>Disposition:</b> Züge die nicht gefahren sind, für die aber schon Dispositions-Änderungen eingegeben wurden, können jetzt gelöscht werden</li>'+'<li><b>Disposition:</b> Ein Doppelklick auf eine Zug in der Baumansicht öffnet jetzt direkt den Zug-Reiter genau wie in der Übersichts-Tabelle</li>'+'<li>Benutzereinstellungen (Angezeigte Spalten in Tabellen, Sortierungen, Anzahl Elemente pro Seite, etc.) können ab sofort in der Datenbank gespeichert werden. Dies bringt einen kleinen Geschwindigkeitszuwachs während der Benutzung von DiLoc|Rail, und bietet den Vorteil dass jeder Benutzer seine Einstellungen überall vorfindet wo er sich mit seinem Benutzernamen anmeldet, egal an welchem Computer.</li>'+'<li><b>Benutzer-Verwaltung:</b> Es kann jetzt für jeden Benutzer festgelegt werden ob Einstellungen im Computer oder in der Datenbank gespeichert werden sollen. Ändert der angemeldete Benutzer die Einstellung von sich selbst, werden alle Einstellungen automatisch vom Computer in die Datenbank übertragen.</li>'+'<li><b>Rechte-Verwaltung:</b> Das Administrator-Häkchen in der Benutzerverwaltung muss jetzt nicht mehr gesetzt werden für Benutzer die die Verwaltung benutzen wollen. Die möglichen Befugnisse hängen allein von den eingestellten Komponenten-Rechten ab. Es wird empfohlen das Administrator-Häkchen für alle Benutzer zu entfernen.</li>'+'<li><b>Fahrplanmanager:</b> Benutzer mit gesetztem Administrator-Häkchen können Züge die schon geschlossen sind, wieder öffnen.</li>'+'<li><b>Fahrplanmanager:</b> Züge können jetzt unter beibehaltung der Zeiten intelligent verkürzt werden. Dazu einfach den Abfahrts- oder Zielbahnhof ändern, und im erscheinenden Dialog mit Ja bestätigen.</li>'+'<li><b>Fahrplanmanager:</b> Züge können jetzt auf einfache Weise kopiert werden</li>'+'<li><b>Fahrplanmanager:</b> Beim zurücksetzen einer Ausnahme gehen ungespeicherte Änderungen am Zug nicht mehr verloren.</li>'+'</ul>'+'</p>'+'<h2>Änderungen in Version 1.0 Beta11</h2>'+'<br/><p>'+'<ul class="list">'+'<li>Veraltete Dispositions-Änderungen die noch nicht gespeichert waren, werden nun automatisch gelöscht</li>'+'<li><b>DiLoc|Sync Manager:</b> Ordner können jetzt umbenannt und gelöscht werden</li>'+'<li><b>ZWL-Diagramm:</b> Dispositions-Änderungen für Abfahrten werden jetzt auch berücksichtigt wenn der Zug in der betreffenden Station schon angekommen ist.</li>'+'<li><b>ZWL-Diagramm:</b> Veränderte Fahrpläne für Züge werden jetzt korrekt berücksichtigt</li>'+'<li><b>ZWL-Diagramm:</b> Züge in der Zukunft die noch nicht losgefahren sind, werden jetzt auch Fett dargestellt, sind aber ein bisschen heller damit sie sich von Zügen für die es schon eine Prognose gibt, unterscheiden lassen.</li>'+'</ul>'+'</p>'+'<h2>Änderungen in Version 1.0 Beta10</h2>'+'<br/><p>'+'<ul class="list">'+'<li>Prognosen: 7% Planungsreserve wird jetzt auch bei Zielbahnhöfen berücksichtigt.</li>'+'<li><b>ILTIS-Schnittstelle:</b> Für die Stationen CHAEP und KAI werden jetzt keine Pseudo-Meldungen mehr erzeugt.</li>'+'</ul>'+'</p>'+'<h2>Änderungen in Version 1.0 Beta9</h2>'+'<br/><p>'+'<ul class="list">'+'<li><b>Excel-Export</b> Verspätungen werden in Minuten ausgegeben, zusätzlich gibt es eine neue Spalte welche die Verspätung sekundengenau enthält.</li>'+'<li><b>ZWL-Diagramm:</b> Dispositions-Änderungen können mit Rechts-Klick simuliert und gespeichert werden.</li>'+'<li><b>ZWL-Diagramm:</b> Links-Klick zeigt Zuginformationen an.</li>'+'<li><b>ZWL-Diagramm:</b> Prognosen berücksichtigen jetzt die 7% Planungsreserve.</li>'+'<li><b>ZWL-Diagramm:</b> Schulungs-Video erklärt die neuen Funktionen. (Über den Neu-Knopf im ZWL-Diagramm erreichbar)</li>'+'<li><b>ILTIS-Schnittstelle:</b> Berechnung Zeiten Luzern nach neuen Vorgaben umgesetzt.</li>'+'</ul>'+'</p>'+'<h2>Änderungen in Version 1.0 Beta8</h2>'+'<br/><p>'+'<ul class="list">'+'<li>Alle Verspätungen werden jetzt sekundengenau berechnet.</li>'+'<li>In der Statistik und in der Disposition kann die Anzeige der Verspätung zwischen "minutengenau" und "sekundengenau" umgestellt werden</li>'+'<li><b>ZWL-Diagramm:</b> Das neue überarbeitete ZWL-Diagramm kann ausprobiert werden und die Berechnung der Prognosen mit dem alten ZWL-Diagramm verglichen werden.</li>'+'<li><b>ZWL-Diagramm:</b> Ladezeiten wurden um bis zu 80% verringert.</li>'+'<li><b>ZWL-Diagramm:</b> Prognosen sind jetzt sekundengenau.</li>'+'<li><b>ILTIS-Schnittstelle:</b> Berechnung Zeiten Luzern nach neuen Vorgaben umgesetzt.</li>'+'<li><b>Fahrplan-Manager:</b> Nicht geschlossene Züge können jetzt gelöscht werden.</li>'+'<li><b>Neu:</b> DiLoc|Sync Manager zum Verwalten von DiLoc|Sync Endgeräten.</li>'+'<li>Jahresfahrpläne können jetzt nach Vereinbarung manuell kopiert werden.</li>'+'<li>Züge werden jetzt automatisch verschlossen, wenn Sie zum ersten Mal verkehren.</li>'+'<li>Verbesserte Fehlerbehandlung mit der Möglichkeit, automatisch Fehlerberichte zu versenden.</li>'+'</ul>'+'</p>'+'<h2>Änderungen in Version 1.0 Beta7</h2>'+'<br/><p>'+'<ul class="list">'+'<li><b>ZWL-Diagramm:</b> Man kann jetzt auch in die Vergangenheit blättern</li>'+'<li><b>ZWL-Diagramm:</b> Fünf-Minuten-Linien werden jetzt hervorgehoben</li>'+'<li><b>ILTIS-Schnittstelle:</b> Abfahrtsmeldungen in IO korrigiert</li>'+'<li>Performance beim Laden von ZWL-Diagrammen verbessert</li>'+'</ul>'+'</p>'+'<h2>Änderungen in Version 1.0 Beta6</h2>'+'<br/><p>'+'<ul class="list">'+'<li><b>Neu:</b> Externe Zugkarte für Intranet integriert</li>'+'<li><b>GPS-Schnittstelle:</b> Ein Fehler bei der Berechnung der Verspätungen wurde behoben.</li>'+'<li>Effizienz beim Berechnen der Zugausnahmen wurde verbessert</li>'+'</ul>'+'</p>'+'<h2>Änderungen in Version 1.0 Beta5</h2>'+'<br/><p>'+'<ul class="list">'+'<li>Wenn beim aktualisieren der Daten Störungen auftreten, wird jetzt trotzdem weiter versucht Daten vom Server abzurufen</li>'+'<li><b>Disposition:</b> Ein Doppelklick auf einen Zug in der Übersichts-Tabelle aktiviert jetzt immer korrekt den Zug-Tab</li>'+'<li><b>ZWL-Diagramm:</b> Wenn alle ZWL-Diagramme geschlossen wurden, werden jetzt keine neuen Zuglaufmeldungen mehr geladen bis wieder mindestens ein ZWL-Diagramm offen ist</li>'+'<li><b>ZWL-Diagramm:</b> Züge nach dem Tageswechsel werden jetzt korrekt dargestellt.</li>'+'</ul>'+'</p>'+'<h2>Änderungen in Version 1.0 Beta4</h2>'+'<br/><p>'+'<ul class="list">'+'<li><b>ZWL-Diagramm:</b> Es werden jetzt auch Züge angezeigt, welche keine oder nur einen Zwischenhalt haben</li>'+'<li><b>ZWL-Diagramm:</b> Züge zwischen 23 und 0 Uhr werden jetzt angezeigt</li>'+'<li><b>ZWL-Diagramm:</b> Werden kurzfristige Änderungen an Zügen und Fahrplänen durchgeführt, werden diese auch im ZWL-Diagramm berücksichtigt. Dazu muss das ZWL-Diagramm manuell neu geladen werden.</li>'+'<li><b>ZWL-Diagramm:</b> Zugnummern werden erst ab 3 Minuten verspätung rot gezeichnet</li>'+'<li><b>Disposition:</b> Das Laden von ZWL-Diagrammen wurde verbessert und gibt im Fehler-Fall eine Meldung aus.</li>'+'<li><b>Disposition:</b> Wenn für einen Zug eine Ausnahme existiert die den Ausgangsbahnhof ändert, wird dieser jetzt in der Übersicht korrekt angezeigt.</li>'+'<li><b>ILTIS-Schnittstelle:</b> DiLoc kann mit ILTIS-Teilausfällen besser umgehen, Zuglaufmeldungen werden nun immer so erzeugt wie sie von ITLIS kommen</li>'+'</ul>'+'</p>'+'<h2>Neue Funktionen in Version 1.0 Beta3</h2>'+'<br/><p>'+'<ul class="list">'+'<li>Ein Fehler der zum Ausfall der ILTIS-Schnittstelle und der ZWL-Diagramm-Anzeige führen konnte, wurde behoben</li>'+'<li>Die Überwachung der DiLoc-Funktion wurde erheblich verbessert und ermöglicht CN-Consult etwaige Fehlfunktionen in Zukunft wesentlich früher zu diagnostizieren.</li>'+'</ul>'+'</p>'+'<h2>>Neue Funktionen in Version 1.0 Beta2</h2>'+'<br/><p>'+'<ul class="list">'+'<li><b>Disposition:</b> ZWL-Diagramme sollten jetzt auch im IE immer angezeigt werden</li>'+'</ul>'+'</p>'+'<h2>Neue Funktionen in Version 1.0 Beta1</h2>'+'<br/><p>'+'<ul class="list">'+'<li>Das Autologout-Symbol wurde in ein Uhr-Symbol geändert. Wenn Autologout deaktiviert ist, ändert sich das Symbol und zeigt ein rotes Quadrat.</li>'+'<li><b>Disposition:</b> Symbole von Zügen werden beim manuellen Schließen von Zugläufen im Baum korrekt dargestellt</li>'+'<li><b>Disposition:</b> Fett-markierte Texte bei Kommentar und Bespannung werden nun auch Fett dargestellt</li>'+'<li><b>Disposition:</b> <span style="color:red">EXPERIMENTELL:</span> ZWL-Diagramme können aufgerufen werden und werden automatisch aktualisiert</li>'+'<li><b>Verwaltung:</b> <span style="color:red">EXPERIMENTELL:</span> ZWL-Diagramme können angelegt werden</li>'+'<li><b>Verwaltung:</b> Für jede Zuggattung kann nun eine Farbe festgelegt werden</li>'+'<li><b>Verwaltung:</b> Bei der Bearbeitung von Benutzern wird das Email-Feld jetzt auf eine korrekte Email-Adresse überprüft</li>'+'<li><b>Statistik:</b> Es ist jetzt möglich nach wichtigen Stationen zu filtern.</li>'+'<li><b>Fahrplan-Manager:</b> Das Laden von vielen Zügen mit vielen Ausnahmen wurde beschleunigt</li>'+'<li><b>ILTIS-Schnittstelle:</b> Pseudo-Meldungen werden jetzt nur noch erzeugt wenn sie im Fahrplan des Zuges hinterlegt sind.</li>'+'</ul>'+'</p>'+'<h2>Neuerungen in Version 0.9.3</h2>'+'<br/><p>'+'<ul class="list">'+'<li><b>Disposition:</b> Es ist jetzt auch möglich Zugläufe von noch nicht abgefahrenen Zügen zu schließen</li>'+'<li><b>Fahrplan-Manager:</b> Beim Verlassen der Spalte VP mit [TAB] werden die Verkehrstage jetzt in der richtigen Zeile gesetzt</li>'+'</ul>'+'</p>'+'<h2>Neuerungen in Version 0.9.2</h2>'+'<br/><p>'+'<ul class="list">'+'<li><b>ILTIS-Schnittstelle:</b> Doppelte Meldungen aus Meiringen (seit Version 0.9.1) kommen nun nicht mehr</li>'+'<li><b>Disposition:</b> Weitere Sortierungs- und Synchronisierungs Probleme wurden beseitigt</li>'+'<li><b>Datei-Export:</b> Es ist nun auch möglich Export-Dateien über SSL-Verschlüsselte Verbindungen herunterzuladen</li>'+'</ul>'+'</p>'+'<h2>Neuerungen in Version 0.9.1</h2>'+'<br/><p>'+'<ul class="list">'+'<li>Die Iltis-Schnittstelle wurde verbessert und funktioniert nun zuverlässiger</li>'+'<li><b>Disposition:</b> Sortierungs- und Synchronisierungs Probleme wurden beseitigt</li>'+'<li><b>Disposition:</b> Es gibt nun eine neue Spalte <i>Letztes Meldungskürzel</i>. Diese ist standard-mäßig versteckt, und muss manuell aktiviert werden.</li>'+'<li><b>Disposition:</b> Es ist jetzt möglich Zugläufe die eigentlich schon angekommen sein müssten, manuell zu beenden. (Kontext-Menü auf Status-Spalte in Übersicht). Für diese Aktion benötigt der Benutzer Schreib-Rechte in der Disposition.</li>'+'<li><b>Disposition:</b> Weitere Fehlerkorrekturen und Verbesserungen</li>'+'<li>Verspätungen werden jetzt ab 3 Minuten rot dargestellt, der Text "Minute(n)" wurde entfernt</li>'+'</ul>'+'</p>'+'<h2>Neuerungen in Version 0.9.0</h2>'+'<br/><p>'+'<ul class="list">'+'<li>Die Iltis-Schnittstelle ist funktionsfähig und aktiviert worden.</li>'+'</ul>'+'</p>'+'<h2>Neuerungen in Version 0.9RC4</h2>'+'<br/><p>'+'<ul class="list">'+'<li><b>Fahrplan-Manager:</b> Es ist jetzt möglich die Ankunfts- und Abfahrtszeiten von Stationen im Fahrplan Sekundengenau einzugeben</li>'+'</ul>'+'</p>'+'<h2>Neuerungen in Version 0.9RC3</h2>'+'<br/><p>'+'<ul class="list">'+'<li>In allen Tabellen mit mehreren Seiten (z.B. Züge in Fahrplan-Manager) ist es jetzt möglich die Anzahl der angezeigten Zeilen einzustellen. Die Auswahl wird gespeichert und bei der nächsten Anzeige wiederverwendet.</li>'+'<li><b>Fahrplan-Manager:</b> Es ist jetzt möglich Züge zu einem schon aktiven Fahrplan hinzuzufügen</li>'+'<li><b>Fahrplan-Manager:</b> Für jede Station eines Fahrplans lässt sich jetzt ein Halte-Typ festlegen</li>'+'<li><b>Fahrplan-Manager:</b> Es ist jetzt möglich den Fahrplan mit einem Doppel-Klick auf das Fahrplan-Symbol aufzurufen</li>'+'<li><b>Fahrplan-Manager:</b> Änderungen an Kommentar und Bespannung werden jetzt direkt bei der Eingabe erkannt und können gespeichert werden.</li>'+'<li><b>Fahrplan-Manager:</b> Ausnahmen sind jetzt besser sichtbar, die neuen Farben sind Hellgrün/Dunkelgrün.</li>'+'<li><b>Fahrplan-Manager:</b> Fix: Es ist jetzt nicht mehr nötig, die Züge-Tabelle zu aktualisieren, nach dem ein Fahrplan angelegt wurde, - das Fahrplan-Symbol erscheint sofort in der Züge-Tabelle.</li>'+'<li><b>Disposition:</b> Die Darstellung fahrender Züge wurde verbessert</li>'+'<li>Weitere Korrekturen und Verbesserungen im Fahrplan-Manager</li>'+'</ul>'+'</p>'}]},{columnWidth:0.5,style:'padding:10px 10px 10px 10px',items:[this.newsPanel]}]});this.moduleInfoTemplate=new Ext.XTemplate('<tpl for="info">','<div class="moduleinfo">','<h2 class="{iconCls}" id="wmi-{moduleIndex}">{name}</h2>','<p>{text}</p>','</div>','</tpl>');this.centerPanel.add(this.portal);this.centerPanel.doLayout();this.moduleInfoTemplate.append(Ext.get("modules_info"),this.getModulesInfo());this.addH2ClickHandlers(Ext.get("modules_info"));this.newsTemplate=new Ext.XTemplate('<tpl for="data">','<div class="newsentry">','<h2>{headline}</h2>','<span class="date">{date:this.formatDate}</span>','<p>{text}</p>','</div>','</tpl>');this.newsTemplate.formatDate=function(_value)
{var date=Date.parseDate(_value,"Y-m-d");if(date)
return date.format("j. F Y");else return"";};if(this.newsData)this.displayNews();};this.h2Click=function(_moduleIndex)
{var box=null;if(typeof this.app.modules[_moduleIndex].highlightElement=="function")
{box=this.app.modules[_moduleIndex].highlightElement().getBox();}
else if(this.app.modules[_moduleIndex].panel)
{box=this.app.modules[_moduleIndex].panel.getBox();}
if(box)
{this.currentHighlighter=Ext.DomHelper.append(Ext.getBody(),{tag:'div',cls:'welcome_highlighter'},true);this.currentHighlighter.setOpacity(0.0);this.currentHighlighter.setBox(box);this.currentHighlighter.fadeIn({endOpacity:0.4,duration:0.3}).fadeOut({duration:0.3,callback:this.removeHighlighter,scope:this});}};this.removeHighlighter=function()
{this.currentHighlighter.remove();delete this.currentHighlighter;};this.addH2ClickHandlers=function(_element)
{h2s=_element.query("h2");for(var i=0;i<h2s.length;i++)
{var h2=Ext.get(h2s[i]);var moduleIndex=h2.dom.id.split("-")[1];h2.on("click",this.h2Click.createDelegate(this,[moduleIndex]),this);h2.addClassOnOver("hover");}};this.getModulesInfo=function()
{var modulesInfo=[];for(var i=0;i<this.app.modules.length;i++)
{if(typeof this.app.modules[i].info=="function")
{var info=this.app.modules[i].info();info.moduleIndex=i;modulesInfo.push(info);}}
return{info:modulesInfo};};this.newsLoader=new gwf.helpers.ActionExecutor({silent:true});this.newsLoader.on("success",this.newsLoaded,this);this.newsLoader.execute("server","news");};Ext.extend(diloc.modules.WelcomeScreen,gwf.modules.Generic,{});

Ext.namespace("diloc.app.plugins");diloc.app.plugins.UserSettings=function()
{this.app=null;this.stateInDb=null;this.init=function(_app)
{console.log("Init UserSettings!");this.app=_app;this.app.showUserSettingsDialog=this.app_showUserSettingsDialog.createDelegate(this);};this.app_showUserSettingsDialog=function()
{console.log('Show User Settings Dialog');if(!this.userSettingsWindow)
{this.userSettingsWindow=new Ext.Window({title:'Benutzereinstellungen für '+diloc.User.email(),width:440,autoHeight:true,closeAction:'hide',plain:false,bodyBorder:false,resizable:false,stateId:'userSettingsWindow',buttonAlign:'right',cls:'usersettings-window',layout:'fit',items:{ref:'userSettingsForm',xtype:'form',plugins:[new gwf.plugins.OOSubmit()],padding:10,labelWidth:200,border:false,autoHeight:true,defaults:{width:200}},buttons:[{text:'Speichern',ref:'../userSettingsSaveButton',handler:this.saveUserSettings,scope:this},{text:'Abbrechen',handler:this.hideUserSettings,scope:this}]});}
else
{this.userSettingsWindow.userSettingsForm.removeAll();}
var userFormItemsGetter=new gwf.helpers.ActionExecutor({successSilent:true});userFormItemsGetter.on("success",this.userFormItemsLoaded,this);userFormItemsGetter.execute("user","userFormItems");this.userSettingsWindow.show();};this.userFormItemsLoaded=function(_result)
{if(diloc.User.email()!="demo@diloc.de")
{this.userSettingsWindow.userSettingsForm.getForm().on("actioncomplete",this.formActionComplete,this);this.userSettingsWindow.userSettingsForm.getForm().on("actionfailed",this.formActionFailed,this);}
this.userSettingsWindow.userSettingsForm.add(_result.data);this.userSettingsWindow.userSettingsForm.doLayout();var passwordField=this.userSettingsWindow.userSettingsForm.getForm().findField("password");if(passwordField)
{passwordField.getSubmitValue=function()
{return gwf.helpers.md5(gwf.helpers.md5(passwordField.getValue())+"$4LZ19");};}
this.userSettingsWindow.userSettingsForm.load({url:gwf.App.backendUrl("user","get",{id:diloc.User.id()}),params:{something:'nothing'}});if(diloc.User.email()=="demo@diloc.de")
{this.userSettingsWindow.userSettingsSaveButton.disable();this.userSettingsWindow.userSettingsForm.getEl().mask("Als Demo-Benutzer können keine Änderungen vorgenommen werden.");}};this.formActionFailed=function(_this,_action)
{this.userSettingsWindow.userSettingsForm.getEl().unmask();};this.formActionComplete=function(_this,_action)
{this.userSettingsWindow.userSettingsForm.getEl().unmask();if(_action.type=="oosubmit")
{var passwdField=_this.findField("password");if(passwdField)passwdField.setValue("");var newPasswdField=_this.findField("newpassword");if(newPasswdField)newPasswdField.setValue("");var newPasswdField2=_this.findField("newpassword2");if(newPasswdField2)newPasswdField2.setValue("");var stateInDbField=_this.findField("stateInDb");if(stateInDbField){if((this.stateInDb==false||this.stateInDB==null)&&stateInDbField.getValue()==true)
{console.log("Transfering from cookie to db!");var newProvider=new diloc.StateProvider({state:Ext.state.Manager.getProvider().state});Ext.state.Manager.setProvider(newProvider);}
if(this.stateInDb==true&&(stateInDbField.getValue()==false||stateInDbField.getValue()==null))
{console.log("Transfering from db to cookie!");var newProvider=new Ext.state.CookieProvider();var oldProvider=Ext.state.Manager.getProvider();for(i in oldProvider.state)
{newProvider.set(i,oldProvider.state[i]);}
Ext.state.Manager.setProvider(newProvider);}}
this.userSettingsWindow.hide();}
if(_action.type=="load")
{var stateInDbField=_this.findField("stateInDb");if(stateInDbField)this.stateInDb=stateInDbField.getValue();var passwdField=_this.findField("password");if(passwdField)passwdField.setValue("");var newPasswdField=_this.findField("newpassword");if(newPasswdField)newPasswdField.setValue("");var newPasswdField2=_this.findField("newpassword2");if(newPasswdField2)newPasswdField2.setValue("");}};this.saveUserSettings=function()
{if(diloc.User.email()!="demo@diloc.de")
{this.userSettingsWindow.userSettingsForm.getEl().mask("Änderungen werden gespeichert...");var url=gwf.App.backendUrl("user","updateUserSettings",{id:diloc.User.id()});this.userSettingsWindow.userSettingsForm.getForm().submit({url:url});}};this.hideUserSettings=function()
{this.userSettingsWindow.hide();};};

Ext.namespace("diloc","diloc.rail","diloc.rail.util");diloc.rail.CustomerStationTrackGrid=Ext.extend(Ext.grid.EditorGridPanel,{customerStationId:null,rights:{read:true,write:false,create:false},cls:"stationtrackgrid",title:"Gleise",height:200,autoWidth:true,clicksToEdit:2,initComponent:function()
{console.log("initComponent CustomerStationTracksGrid is called!");this.doSort=false;this.filters=null;this.selModel=new Ext.grid.RowSelectionModel();this.reader=new Ext.data.JsonReader({fields:[{name:'id'},{name:'customerStationId'},{name:'name'},{name:'lengthIn'},{name:'lengthOut'},{name:'remark'},{name:'position'}],root:'tracks',id:'id',totalProperty:'length'});this.colModel=new Ext.grid.ColumnModel([{header:'Name',dataIndex:'name',sortable:false,resizable:false,width:80,editor:new Ext.form.TextField({maxLength:8})},{header:'Länge -> (m)',dataIndex:'lengthIn',sortable:false,resizable:false,width:80,editor:new Ext.form.NumberField({allowDecimals:false,maxLength:5})},{header:'Länge <- (m)',dataIndex:'lengthOut',sortable:false,resizable:false,width:80,editor:new Ext.form.NumberField({allowDecimals:false,maxLength:5})},{header:'Bemerkung',dataIndex:'remark',sortable:false,width:350,editor:new Ext.form.TextField({maxLength:255})},{header:'Sortierung',dataIndex:'position',hidden:true,sortable:false,resizable:false,width:80}]);this.sortInfo={field:'position',direction:'ASC'};this.store=new Ext.data.Store({reader:this.reader});if(this.rights.write)
{this.tbar=new Ext.Toolbar({items:['<b>'+this.title+'</b>',{tooltip:'Gleis hinzufügen',iconCls:'station-add',handler:this.createRow.createDelegate(this),disabled:!this.rights.write},{tooltip:'Gleis löschen',iconCls:'station-delete',handler:this.deleteRow.createDelegate(this),disabled:!this.rights.write},'-',{tooltip:'Nach oben verschieben',iconCls:'move-up',handler:this.moveUp.createDelegate(this),disabled:!this.rights.write},{tooltip:'Nach unten verschieben',iconCls:'move-down',handler:this.moveDown.createDelegate(this),disabled:!this.rights.write}]});this.title='';}
this.on("afteredit",this.gridPanelAfterEdit,this);this.on("beforeedit",this.gridPanelBeforeEdit,this);diloc.rail.CustomerStationTrackGrid.superclass.initComponent.call(this);},moveUp:function()
{var selectedRecord=this.getSelectionModel().getSelected();var index=this.store.indexOf(selectedRecord);if(selectedRecord.get('position')>1)
{selectedRecord.set('position',selectedRecord.get('position')-1);var upperRecord=this.store.getAt(index-1);upperRecord.set('position',upperRecord.get('position')+1);this.store.sort('position','ASC');this.gridPanelAfterEdit({record:selectedRecord,field:'position',value:selectedRecord.get('position')});this.gridPanelAfterEdit({record:upperRecord,field:'position',value:upperRecord.get('position')});}},moveDown:function()
{var selectedRecord=this.getSelectionModel().getSelected();var index=this.store.indexOf(selectedRecord);if(index<this.store.getCount()-1)
{selectedRecord.set('position',selectedRecord.get('position')+1);var lowerRecord=this.store.getAt(index+1);if(lowerRecord)
{lowerRecord.set('position',lowerRecord.get('position')-1);}
this.store.sort('position','ASC');this.gridPanelAfterEdit({record:selectedRecord,field:'position',value:selectedRecord.get('position')});this.gridPanelAfterEdit({record:lowerRecord,field:'position',value:lowerRecord.get('position')});}},createRow:function()
{var createCustomerStationTrack=new gwf.helpers.ActionExecutor({successSilent:true});createCustomerStationTrack.on("success",function(_result){var CustomerStationTrackRecord=Ext.data.Record.create(this.store.reader.meta);this.store.add([new CustomerStationTrackRecord(_result.data)]);this.startEditing(this.store.getCount()-1,0);},this);var lastRecord=this.store.getAt(this.store.getCount()-1);var pos=1;if(lastRecord)pos=lastRecord.get('position')+1;createCustomerStationTrack.execute("customerstationtrack","create",{customerStationId:this.customerStationId,position:pos},"!Füge Gleis hinzu...");},deleteRow:function()
{var deleteCustomerStationTrack=new gwf.helpers.ActionExecutor({successSilent:true});this.deleteRecord=this.getSelectionModel().getSelected();deleteCustomerStationTrack.on("success",function(_result){var index=this.store.indexOf(this.deleteRecord);for(var i=index+1;i<this.store.getCount();i++)
{this.store.getAt(i).set('position',this.store.getAt(i).get('position')-1);this.gridPanelAfterEdit({record:this.store.getAt(i),field:'position',value:this.store.getAt(i).get('position')});}
this.store.remove(this.deleteRecord);delete this.deleteRecord;},this);if(this.deleteRecord)
{deleteCustomerStationTrack.execute("customerstationtrack","delete",{id:this.deleteRecord.get("id")},"!Lösche Gleis...");}},setCustomerStationId:function(_customerStationId)
{this.customerStationId=_customerStationId;},gridPanelBeforeEdit:function(_event)
{if(this.rights.write==false)_event.cancel=true;this.currentEditorRecord=_event.record;},gridPanelAfterEdit:function(_event)
{var id=_event.record.get('id');var value=_event.value;var field=_event.field;var data={id:id};data[field]=_event.value;var saveExecutor=new gwf.helpers.ActionExecutor({successSilent:true});saveExecutor.on("success",this.onUpdateCustomerStationTrackSuccess,this);saveExecutor.execute("customerstationtrack","update",data,"Speichere Stations-Gleis",_event.record);},onUpdateCustomerStationTrackSuccess:function(_data,_record)
{_record.commit();}});Ext.reg('diloc-customerstationtrackgrid',diloc.rail.CustomerStationTrackGrid);

Ext.namespace("diloc","diloc.rail","diloc.rail.util");diloc.rail.CustomerStationDocumentGrid=Ext.extend(Ext.grid.EditorGridPanel,{customerStationId:null,rights:{read:true,write:false,create:false},cls:"stationdocumentgrid",title:"Dokumente",height:200,autoWidth:true,clicksToEdit:2,initComponent:function()
{console.log("initComponent CustomerStationDocumentsGrid is called!");this.doSort=false;this.filters=null;this.selModel=new Ext.grid.RowSelectionModel();var importantColumn=new diloc.rail.CustomerStationDocumentGridCheckColumn({header:'Wichtig',tooltip:'Dokument soll hervorgehoben werden',resizable:false,dataIndex:'important',width:50});this.reader=new Ext.data.JsonReader({fields:[{name:'id'},{name:'customerStationId'},{name:'name'},{name:'important'},{name:'originalFilename'},{name:'mimeType'}],root:'documents',id:'id',totalProperty:'length'});this.colModel=new Ext.grid.ColumnModel([{header:'Name',dataIndex:'name',sortable:true,width:298,editor:new Ext.form.TextField()},{header:'Dateiname',dataIndex:'originalFilename',sortable:true,hidden:true,width:200},importantColumn,{xtype:'actioncolumn',width:30,sortable:false,items:[{icon:'images/icons/silk/page_white_magnify.png',tooltip:'Datei Anzeigen',handler:function(grid,rowIndex,colIndex){var fileViewer=new diloc.rail.dialogs.FileViewer({autoResize:true,mimeType:grid.store.getAt(rowIndex).get('mimeType'),src:gwf.App.backendUrl("customerstationdocument",grid.store.getAt(rowIndex).id+"/view",{})});fileViewer.show();}}]}]);this.store=new Ext.data.Store({reader:this.reader});this.plugins=[importantColumn];this.documentUploadPanel=new Ext.FormPanel({border:false,height:22,autoWidth:true,hideLabels:true,scope:this,fileUpload:true});this.documentUploadButton=new Ext.ux.form.FileUploadField({name:'customerstationdocument',buttonText:'',buttonCfg:{tooltip:'Neues Dokument hinzufügen',iconCls:'filegrid-add'},buttonOnly:true,parentFormPanel:this.documentUploadPanel,scope:this,listeners:{'fileselected':function(fb,v){console.log("new selected:",v,"fb",fb,"this",this);if(this.parentFormPanel.getForm().isValid()){this.parentFormPanel.getForm().submit({url:'backend/upload.php',params:{customerStationId:this.scope.customerStationId,debug:true},waitMsg:'Dokument wird hochgeladen...',success:function(fb,o){var uploadResponseObject=Ext.util.JSON.decode(o.response.responseText);console.log("UPLOADED",uploadResponseObject,"arguments",arguments);fb.scope.addFileEntryToStore(uploadResponseObject);}});}}}});this.documentUploadPanel.add(this.documentUploadButton);this.documentChangePanel=new Ext.FormPanel({border:false,height:22,autoWidth:true,hideLabels:true,scope:this,fileUpload:true});this.documentChangeButton=new Ext.ux.form.FileUploadField({name:'customerstationdocument',buttonText:'',buttonCfg:{tooltip:'Dokument aktualisieren',iconCls:'filegrid-change'},buttonOnly:true,parentFormPanel:this.documentChangePanel,disabled:true,scope:this,listeners:{'fileselected':function(fb,v){console.log("new selected:",v,"fb",fb,"this",this);if(this.parentFormPanel.getForm().isValid()&&this.scope.getSelectionModel().getSelected()){this.parentFormPanel.getForm().submit({url:'backend/upload.php',params:{customerStationId:this.scope.customerStationId,customerStationDocumentId:this.scope.getSelectionModel().getSelected().data.id,debug:true},waitMsg:'Dokument wird hochgeladen...',success:function(fb,o){var uploadResponseObject=Ext.util.JSON.decode(o.response.responseText);console.log("CHANGED",uploadResponseObject,"arguments",arguments);fb.scope.addFileEntryToStore(uploadResponseObject);}});}}}});this.documentChangePanel.add(this.documentChangeButton);this.tbar=new Ext.Toolbar({items:['<b>'+this.title+'</b>',this.documentUploadPanel,this.documentChangePanel,{tooltip:'Dokument löschen',iconCls:'filegrid-delete',handler:this.deleteRow.createDelegate(this),disabled:!this.rights.write}]});this.title='';this.getSelectionModel().on("rowselect",function(){this.documentChangeButton.setDisabled(false);},this);this.on("afteredit",this.gridPanelAfterEdit,this);this.on("beforeedit",this.gridPanelBeforeEdit,this);diloc.rail.CustomerStationDocumentGrid.superclass.initComponent.call(this);},addFileEntryToStore:function(_data)
{console.log("Add File",_data);var record=new this.store.recordType(_data.data,_data.data.id);this.store.add([record]);},createRow:function()
{var createCustomerStationDocument=new gwf.helpers.ActionExecutor({successSilent:true});createCustomerStationDocument.on("success",function(_result){var CustomerStationDocumentRecord=Ext.data.Record.create(this.store.reader.meta);this.store.add([new CustomerStationDocumentRecord(_result.data)]);this.startEditing(this.store.getCount()-1,0);},this);var lastRecord=this.store.getAt(this.store.getCount()-1);var pos=1;if(lastRecord)pos=lastRecord.get('position')+1;createCustomerStationDocument.execute("customerstationdocument","create",{customerStationId:this.customerStationId,position:pos},"!Füge Gleis hinzu...");},deleteRow:function()
{var deleteCustomerStationDocument=new gwf.helpers.ActionExecutor({successSilent:true});this.deleteRecord=this.getSelectionModel().getSelected();deleteCustomerStationDocument.on("success",function(_result){var index=this.store.indexOf(this.deleteRecord);for(var i=index+1;i<this.store.getCount();i++)
{this.store.getAt(i).set('position',this.store.getAt(i).get('position')-1);this.gridPanelAfterEdit({record:this.store.getAt(i),field:'position',value:this.store.getAt(i).get('position')});}
this.store.remove(this.deleteRecord);delete this.deleteRecord;this.documentChangeButton.setDisabled(true);},this);if(this.deleteRecord)
{deleteCustomerStationDocument.execute("customerstationdocument","delete",{id:this.deleteRecord.get("id")},"!Lösche Gleis...");}},setCustomerStationId:function(_customerStationId)
{this.customerStationId=_customerStationId;},gridPanelBeforeEdit:function(_event)
{if(this.rights.write==false)_event.cancel=true;},gridPanelAfterEdit:function(_event)
{var id=_event.record.get('id');var value=_event.value;var field=_event.field;var data={id:id};data[field]=_event.value;var saveExecutor=new gwf.helpers.ActionExecutor({successSilent:true});saveExecutor.on("success",this.onUpdateCustomerStationDocumentSuccess,this);saveExecutor.execute("customerstationdocument","update",data,"Speichere Dokument",_event.record);},onUpdateCustomerStationDocumentSuccess:function(_data,_record)
{_record.commit();}});Ext.reg('diloc-customerstationdocumentgrid',diloc.rail.CustomerStationDocumentGrid);diloc.rail.CustomerStationDocumentGridCheckColumn=function(config){Ext.apply(this,config);if(!this.id){this.id=Ext.id();}
this.renderer=this.renderer.createDelegate(this);};diloc.rail.CustomerStationDocumentGridCheckColumn.prototype={init:function(grid){this.grid=grid;this.grid.on('render',function(){var view=this.grid.getView();view.mainBody.on('mousedown',this.onMouseDown,this);},this);},onMouseDown:function(e,t){if(t.className&&t.className.indexOf('x-grid3-cc-'+this.id)!=-1){if(this.grid.isReadOnly==true||t.className.indexOf('disabled')>0)
{e.stopEvent();return;}
else
{e.stopEvent();var index=this.grid.getView().findRowIndex(t);var record=this.grid.store.getAt(index);record.set(this.dataIndex,!record.data[this.dataIndex]);this.grid.gridPanelAfterEdit({field:this.dataIndex,value:record.data[this.dataIndex],record:record});}}},renderer:function(v,p,record){p.css+=' x-grid3-check-col-td';var tooltip='';var classAdd='';if(this.grid.isReadOnly==true)classAdd=' disabled';return'<div '+tooltip+' class="diloc-check-grid '+
(v?'on':'')+classAdd+' x-grid3-cc-'+
this.id+'"> </div>';}};

Ext.namespace("diloc","diloc.rail","diloc.rail.util");diloc.rail.CustomerStationPhoneNumberGrid=Ext.extend(Ext.grid.EditorGridPanel,{customerStationId:null,rights:{read:true,write:false,create:false},cls:"stationphonenumbergrid",title:"Telefonnummern",height:290,autoWidth:true,clicksToEdit:2,initComponent:function()
{console.log("initComponent CustomerStationPhoneNumbersGrid is called!");this.doSort=false;this.filters=null;this.selModel=new Ext.grid.RowSelectionModel();this.reader=new Ext.data.JsonReader({fields:[{name:'id'},{name:'customerStationId'},{name:'name'},{name:'number'},{name:'position'}],root:'phoneNumbers',id:'id',totalProperty:'length'});this.colModel=new Ext.grid.ColumnModel([{header:'Name',dataIndex:'name',sortable:true,width:200,editor:new Ext.form.TextField({maxLength:45})},{header:'Telefonnummer',dataIndex:'number',sortable:false,width:200,editor:new Ext.form.TextField({maxLength:45})},{header:'Sortierung',dataIndex:'position',hidden:true,sortable:true,resizable:false,width:80}]);this.sortInfo={field:'position',direction:'ASC'};this.store=new Ext.data.Store({reader:this.reader});this.tbar=new Ext.Toolbar({items:['<b>'+this.title+'</b>',{tooltip:'Nummer hinzufügen',iconCls:'station-add',handler:this.createRow.createDelegate(this),disabled:!this.rights.write},{tooltip:'Nummer löschen',iconCls:'station-delete',handler:this.deleteRow.createDelegate(this),disabled:!this.rights.write},'-',{tooltip:'Nach oben verschieben',iconCls:'move-up',handler:this.moveUp.createDelegate(this),disabled:!this.rights.write},{tooltip:'Nach unten verschieben',iconCls:'move-down',handler:this.moveDown.createDelegate(this),disabled:!this.rights.write}]});this.title='';this.on("afteredit",this.gridPanelAfterEdit,this);this.on("beforeedit",this.gridPanelBeforeEdit,this);diloc.rail.CustomerStationPhoneNumberGrid.superclass.initComponent.call(this);},moveUp:function()
{var selectedRecord=this.getSelectionModel().getSelected();var index=this.store.indexOf(selectedRecord);if(selectedRecord.get('position')>1)
{selectedRecord.set('position',selectedRecord.get('position')-1);var upperRecord=this.store.getAt(index-1);upperRecord.set('position',upperRecord.get('position')+1);this.store.sort('position','ASC');this.gridPanelAfterEdit({record:selectedRecord,field:'position',value:selectedRecord.get('position')});this.gridPanelAfterEdit({record:upperRecord,field:'position',value:upperRecord.get('position')});}},moveDown:function()
{var selectedRecord=this.getSelectionModel().getSelected();var index=this.store.indexOf(selectedRecord);if(index<this.store.getCount()-1)
{selectedRecord.set('position',selectedRecord.get('position')+1);var lowerRecord=this.store.getAt(index+1);if(lowerRecord)
{lowerRecord.set('position',lowerRecord.get('position')-1);}
this.store.sort('position','ASC');this.gridPanelAfterEdit({record:selectedRecord,field:'position',value:selectedRecord.get('position')});this.gridPanelAfterEdit({record:lowerRecord,field:'position',value:lowerRecord.get('position')});}},createRow:function()
{var createCustomerStationPhoneNumber=new gwf.helpers.ActionExecutor({successSilent:true});createCustomerStationPhoneNumber.on("success",function(_result){var CustomerStationPhoneNumberRecord=Ext.data.Record.create(this.store.reader.meta);this.store.add([new CustomerStationPhoneNumberRecord(_result.data)]);this.startEditing(this.store.getCount()-1,0);},this);var lastRecord=this.store.getAt(this.store.getCount()-1);var pos=1;if(lastRecord)pos=lastRecord.get('position')+1;createCustomerStationPhoneNumber.execute("customerstationphonenumber","create",{customerStationId:this.customerStationId,position:pos},"!Füge Telefonnummer hinzu...");},deleteRow:function()
{var deleteCustomerStationPhoneNumber=new gwf.helpers.ActionExecutor({successSilent:true});this.deleteRecord=this.getSelectionModel().getSelected();deleteCustomerStationPhoneNumber.on("success",function(_result){var index=this.store.indexOf(this.deleteRecord);for(var i=index+1;i<this.store.getCount();i++)
{this.store.getAt(i).set('position',this.store.getAt(i).get('position')-1);this.gridPanelAfterEdit({record:this.store.getAt(i),field:'position',value:this.store.getAt(i).get('position')});}
this.store.remove(this.deleteRecord);delete this.deleteRecord;},this);if(this.deleteRecord)
{deleteCustomerStationPhoneNumber.execute("customerstationphonenumber","delete",{id:this.deleteRecord.get("id")},"!Lösche Telefonnummer...");}},setCustomerStationId:function(_customerStationId)
{this.customerStationId=_customerStationId;},gridPanelBeforeEdit:function(_event)
{if(this.rights.write==false)_event.cancel=true;},gridPanelAfterEdit:function(_event)
{var id=_event.record.get('id');var value=_event.value;var field=_event.field;var data={id:id};data[field]=_event.value;var saveExecutor=new gwf.helpers.ActionExecutor({successSilent:true});saveExecutor.on("success",this.onUpdateCustomerStationPhoneNumberSuccess,this);saveExecutor.execute("customerstationphonenumber","update",data,"Speichere Telefonnummer",_event.record);},onUpdateCustomerStationPhoneNumberSuccess:function(_data,_record)
{_record.commit();}});Ext.reg('diloc-customerstationphonenumbergrid',diloc.rail.CustomerStationPhoneNumberGrid);

Ext.namespace("diloc","diloc.rail","diloc.rail.util");diloc.rail.ScheduleDayRedifinitionGrid=Ext.extend(Ext.grid.GridPanel,{scheduleId:null,rights:{read:true,write:false,create:false},cls:"stationtrackgrid",title:"Feiertage",height:400,width:250,clicksToEdit:2,initComponent:function()
{console.log("initComponent ScheduleDayRedifinitionGrid is called!",this.store);this.doSort=false;this.filters=null;this.editor=new Ext.ux.grid.RowEditor({saveText:'Speichern',cancelText:'Abbrechen'});this.plugins=[this.editor];this.selModel=new Ext.grid.RowSelectionModel();this.reader=new Ext.data.JsonReader({fields:[{name:'id'},{name:'scheduleId'},{name:'date',type:'date',dateFormat:'m/d/y'},{name:'meaning'}],root:'dayredefinitions',id:'id',totalProperty:'length'});this.colModel=new Ext.grid.ColumnModel([{header:'Datum',dataIndex:'date',sortable:false,resizable:false,width:100,xtype:'datecolumn',format:'d.M Y',editor:new Ext.form.DateField({minValue:new Date().add(Date.DAY,2)})},{header:'Wochentagsverhalten',dataIndex:'meaning',sortable:false,resizable:false,width:120,editor:new Ext.form.ComboBox({mode:'local',store:new Ext.data.ArrayStore({id:0,fields:['myId','displayText'],data:[['1','Montag'],['2','Dienstag'],['3','Mittwoch'],['4','Donnerstag'],['5','Freitag'],['6','Samstag'],['7','Sonntag']]}),valueField:'myId',displayField:'displayText',triggerAction:'all'}),renderer:function(_value,_meta,_record,_rowIndex,_colIndex,_store){var weekDays={1:'Montag',2:'Dienstag',3:'Mittwoch',4:'Donnerstag',5:'Freitag',6:'Samstag',7:'Sonntag'};return weekDays[_value];}}]);this.sortInfo={field:'date',direction:'ASC'};this.store=new Ext.data.Store({reader:this.reader});if(this.rights.write)
{this.tbar=new Ext.Toolbar({items:['<b>'+this.title+'</b>',{tooltip:'Feiertag hinzufügen',iconCls:'station-add',handler:this.createRow,scope:this,disabled:!this.rights.write},{tooltip:'Feiertag löschen',iconCls:'station-delete',handler:this.deleteRow,scope:this,disabled:!this.rights.write}]});this.title='';}
this.editor.on("afteredit",this.gridPanelAfterEdit,this);diloc.rail.CustomerStationTrackGrid.superclass.initComponent.call(this);},createRow:function()
{var record=new this.store.recordType({scheduleId:this.scheduleId,date:'',meaning:''});this.editor.stopEditing();this.store.insert(0,record);this.editor.startEditing(0);},deleteRow:function()
{var deleteScheduleDayRedifinition=new gwf.helpers.ActionExecutor({successSilent:true});this.deleteRecord=this.getSelectionModel().getSelected();if(this.deleteRecord&&this.deleteRecord.phantom)
{this.store.remove(this.deleteRecord);delete this.deleteRecord;}
else if(this.deleteRecord)
{deleteScheduleDayRedifinition.on("success",function(_result){var index=this.store.indexOf(this.deleteRecord);for(var i=index+1;i<this.store.getCount();i++)
{this.store.getAt(i).set('position',this.store.getAt(i).get('position')-1);this.gridPanelAfterEdit({record:this.store.getAt(i),field:'position',value:this.store.getAt(i).get('position')});}
this.store.remove(this.deleteRecord);delete this.deleteRecord;},this);deleteScheduleDayRedifinition.execute("scheduledayredefinition","delete",{id:this.deleteRecord.get("id")},"!Lösche Tagesumdefinition...");}},gridPanelAfterEdit:function(_roweditor,_changes,_record,_rowIndex)
{if(_record)
{var id=_record.get('id');if(id)
{var data={id:id};data=Ext.apply(data,_changes);var saveExecutor=new gwf.helpers.ActionExecutor({silent:true});saveExecutor.on("failure",this.onUpdateScheduleDayRedifinitionFailure,this);saveExecutor.on("success",this.onUpdateScheduleDayRedifinitionSuccess,this);saveExecutor.execute("scheduledayredefinition","update",data,"Speichere Feiertag",_record);}
else
{var data={scheduleId:this.scheduleId,date:_record.data.date,meaning:_record.data.meaning};var createScheduleDayRedifinition=new gwf.helpers.ActionExecutor({silent:true});createScheduleDayRedifinition.on("failure",this.onUpdateScheduleDayRedifinitionFailure,this);createScheduleDayRedifinition.on("success",this.onUpdateScheduleDayRedifinitionSuccess,this);createScheduleDayRedifinition.execute("scheduledayredefinition","create",data,"!Füge Feiertag hinzu...",_record);}}},onUpdateScheduleDayRedifinitionSuccess:function(_result,_record)
{_record.commit();this.store.sort('date','ASC');},onUpdateScheduleDayRedifinitionFailure:function(_errors,_record)
{this.editor.startEditing(this.store.indexOf(_record));if(_errors[0].id=='date')
{var column=this.colModel.getColumnById(this.colModel.getColumnId(0));column.editor.markInvalid(_errors[0].msg);}
else if(_errors[0].id=='meaning')
{var column=this.colModel.getColumnById(this.colModel.getColumnId(1));column.editor.markInvalid(_errors[0].msg);}
this.editor.showTooltip(_errors[0].msg);},setScheduleId:function(_scheduleId)
{this.scheduleId=_scheduleId;}});

diloc.rail.CheckboxColumn=Ext.extend(Ext.grid.Column,{dontRenderOnNull:false,constructor:function(config)
{Ext.apply(this,config);if(!this.renderId){this.renderId=Ext.id();}
this.renderer=this.renderer.createDelegate(this);this.addEvents("recordchange");diloc.rail.CheckboxColumn.superclass.constructor.call(this,config);},init:function(grid)
{this.grid=grid;this.grid.on('render',function(){var view=this.grid.getView();view.mainBody.on('mousedown',this.onMouseDown,this);},this);},onMouseDown:function(e,t)
{if(t.className&&t.className.indexOf('x-grid3-cc-'+this.renderId)!=-1)
{e.stopEvent();var index=this.grid.getView().findRowIndex(t);var record=this.grid.store.getAt(index);record.set(this.dataIndex,!record.data[this.dataIndex]);this.fireEvent('recordchange',record);}},renderer:function(v,p,record)
{if(this.dontRenderOnNull&&v===null)return'';p.style+="text-align: center;";var tooltip='';var classAdd='';return'<div '+tooltip+' class="diloc-check-grid '+
(v?'on':'')+classAdd+' x-grid3-cc-'+
this.renderId+'"> </div>';}});

diloc.rail.DateSelector=Ext.extend(Ext.BoxComponent,{todayText:'Today',okText:'&#160;OK&#160;',cancelText:'Cancel',todayTip:'{0} (Spacebar)',minText:'This date is before the minimum date',maxText:'This date is after the maximum date',format:'m/d/y',disabledDaysText:'Disabled',disabledDatesText:'Disabled',monthNames:Date.monthNames,dayNames:Date.dayNames,nextText:'Next Month (Control+Right)',prevText:'Previous Month (Control+Left)',monthYearText:'Choose a month (Control+Up/Down to move years)',startDay:1,showToday:true,focusOnSelect:true,initHour:12,initComponent:function(){diloc.rail.DateSelector.superclass.initComponent.call(this);this.value=this.value?this.value.clearTime(true):new Date().clearTime();this.addEvents('select');if(this.handler){this.on('select',this.handler,this.scope||this);}},setDisabledDates:function(dd){if(Ext.isArray(dd)){this.disabledDates=dd;this.disabledDatesRE=null;}else{this.disabledDatesRE=dd;}
this.initDisabledDays();},setDisabledDays:function(dd){this.disabledDays=dd;},setMinDate:function(dt){this.minDate=dt;},setMaxDate:function(dt){this.maxDate=dt;},setValue:function(value){this.value=value.clearTime(true);this.update(this.value,'',true);},getValue:function(){return this.value;},focus:function(){this.update(this.activeDate);},onEnable:function(initial){Ext.DatePicker.superclass.onEnable.call(this);this.doDisabled(false);this.update(initial?this.value:this.activeDate);if(Ext.isIE){this.el.repaint();}},onDisable:function(){Ext.DatePicker.superclass.onDisable.call(this);this.doDisabled(true);if(Ext.isIE&&!Ext.isIE8){Ext.each([].concat(this.textNodes,this.el.query('th span')),function(el){Ext.fly(el).repaint();});}},doDisabled:function(disabled){this.keyNav.setDisabled(disabled);this.prevRepeater.setDisabled(disabled);this.nextRepeater.setDisabled(disabled);if(this.showToday){this.todayKeyListener.setDisabled(disabled);this.todayBtn.setDisabled(disabled);}},onRender:function(container,position){var el1=document.createElement('div');el1.className='diloc-datemenu-div';el1.id='diloc-datemenu';container.dom.insertBefore(el1,position);var m=['<table cellspacing="0" style="width: 100%;">','<tr><td class="x-date-left"><a href="#" title="',this.prevText,'">&#160;</a></td><td class="x-date-middle" align="center"></td><td class="x-date-right"><a href="#" title="',this.nextText,'">&#160;</a></td></tr>','<tr><td colspan="3"><table class="x-date-inner" cellspacing="0" style="width: 100%;"><thead><tr><th>KW</th>'],dn=this.dayNames,i;for(i=0;i<7;i++){var d=this.startDay+i;if(d>6){d=d-7;}
m.push('<th><span>&nbsp;',dn[d].substr(0,2),'.</span></th>');}
m[m.length]='</tr></thead><tbody><tr><td class="week"><span class="week"></span></td>';for(i=0;i<42;i++){if(i%7===0&&i!==0){m[m.length]='</tr><tr><td class="week"><span class="week"></span></td>';}
m[m.length]='<td class="day"><a href="#" hidefocus="on" class="x-date-date" tabIndex="1"><em><span class="day"></span></em></a></td>';}
m.push('</tr></tbody></table></td></tr>');m.push('<tr><td class="x-date-left"></td><td class="x-date-middle2"></td><td class="x-date-right"></td></tr>','<tr><td colspan="3"><table class="x-date-inner" cellspacing="0" style="width: 100%;"><thead><tr><th>KW</th>');for(i=0;i<7;i++){var d=this.startDay+i;if(d>6){d=d-7;}
m.push('<th><span>&nbsp;',dn[d].substr(0,2),'.</span></th>');}
m[m.length]='</tr></thead><tbody><tr><td class="week"><span class="week"></span></td>';for(i=0;i<42;i++){if(i%7===0&&i!==0){m[m.length]='</tr><tr><td class="week"><span class="week"></span></td>';}
m[m.length]='<td class="day"><a href="#" hidefocus="on" class="x-date-date" tabIndex="1"><em><span class="day"></span></em></a></td>';}
m.push('</tr></tbody></table></td></tr>');m.push('<tr><td class="x-date-left"></td><td class="x-date-middle3" align="center"></td><td class="x-date-right"></td></tr>','<tr><td colspan="3"><table class="x-date-inner" cellspacing="0" style="width: 100%;"><thead><tr><th>KW</th>');for(i=0;i<7;i++){var d=this.startDay+i;if(d>6){d=d-7;}
m.push('<th><span>&nbsp;',dn[d].substr(0,2),'.</span></th>');}
m[m.length]='</tr></thead><tbody><tr><td class="week"><span class="week"></span></td>';for(i=0;i<42;i++){if(i%7===0&&i!==0){m[m.length]='</tr><tr><td class="week"><span class="week"></span></td>';}
m[m.length]='<td class="day"><a href="#" hidefocus="on" class="x-date-date" tabIndex="1"><em><span class="day"></span></em></a></td>';}
m.push('</tr></tbody></table></td></tr>');m.push('</table><div class="x-date-mp"></div>');var el=document.createElement('div');el.className='x-date-picker';el.innerHTML=m.join('');elExt=Ext.get('diloc-datemenu');elExt.insertFirst(el);this.el=Ext.get(el);this.eventEl=Ext.get(el.firstChild);this.prevRepeater=new Ext.util.ClickRepeater(this.el.child('td.x-date-left a'),{handler:this.showPrevMonth,scope:this,preventDefault:true,stopDefault:true});this.nextRepeater=new Ext.util.ClickRepeater(this.el.child('td.x-date-right a'),{handler:this.showNextMonth,scope:this,preventDefault:true,stopDefault:true});this.monthPicker=this.el.down('div.x-date-mp');this.monthPicker.enableDisplayMode('block');this.monthPicker.setY(26);this.keyNav=new Ext.KeyNav(this.eventEl,{'left':function(e){if(e.ctrlKey){this.showPrevMonth();}else{this.update(this.activeDate.add('d',-1));}},'right':function(e){if(e.ctrlKey){this.showNextMonth();}else{this.update(this.activeDate.add('d',1));}},'up':function(e){if(e.ctrlKey){this.showNextYear();}else{this.update(this.activeDate.add('d',-7));}},'down':function(e){if(e.ctrlKey){this.showPrevYear();}else{this.update(this.activeDate.add('d',7));}},'pageUp':function(e){this.showNextMonth();},'pageDown':function(e){this.showPrevMonth();},'enter':function(e){e.stopPropagation();return true;},scope:this});this.el.unselectable();this.cells=this.el.select('table.x-date-inner tbody td.day');this.weekcells=this.el.select('table.x-date-inner tbody td.week');this.textNodes=this.el.query('table.x-date-inner tbody span.day');this.weekTextNodes=this.el.query('table.x-date-inner tbody span.week');this.mbtn=new Ext.Button({text:'&#160;',tooltip:this.monthYearText,renderTo:this.el.child('td.x-date-middle',true)});this.mbtn.el.child('em').addClass('x-btn-arrow');this.mbtn2=new Ext.Component({html:'&#160;',renderTo:this.el.child('td.x-date-middle2',true)});this.mbtn3=new Ext.Component({text:'&#160;',renderTo:this.el.child('td.x-date-middle3',true)});if(this.showToday){this.todayKeyListener=this.eventEl.addKeyListener(Ext.EventObject.SPACE,this.selectToday,this);var today=(new Date()).dateFormat(this.format);this.todayBtn=new Ext.Button({renderTo:this.el.child('td.x-date-bottom',true),text:String.format(this.todayText,today),tooltip:String.format(this.todayTip,today),handler:this.selectToday,scope:this});}
this.mon(this.eventEl,'mousewheel',this.handleMouseWheel,this);this.mon(this.eventEl,'click',this.handleDateClick,this,{delegate:'a.x-date-date'});this.mon(this.mbtn,'click',function(){if(!this.monthPicker.isDisplayed())
{this.showMonthPicker();}
else
{this.hideMonthPicker();}},this);this.onEnable(true);},createMonthPicker:function(){if(!this.monthPicker.dom.firstChild){var buf=['<table border="0" cellspacing="0" style="width:100%;">'];for(var i=0;i<6;i++){buf.push('<tr><td class="x-date-mp-month"><a href="#">',Date.getShortMonthName(i),'</a></td>','<td class="x-date-mp-month x-date-mp-sep"><a href="#">',Date.getShortMonthName(i+6),'</a></td>',i===0?'<td class="x-date-mp-ybtn" align="center"><a class="x-date-mp-prev"></a></td><td class="x-date-mp-ybtn" align="center"><a class="x-date-mp-next"></a></td></tr>':'<td class="x-date-mp-year"><a href="#"></a></td><td class="x-date-mp-year"><a href="#"></a></td></tr>');}
buf.push('<tr class="x-date-mp-btns"><td colspan="4"><button type="button" class="x-date-mp-ok">',this.okText,'</button><button type="button" class="x-date-mp-cancel">',this.cancelText,'</button></td></tr>','</table>');this.monthPicker.update(buf.join(''));this.mon(this.monthPicker,'click',this.onMonthClick,this);this.mon(this.monthPicker,'dblclick',this.onMonthDblClick,this);this.mpMonths=this.monthPicker.select('td.x-date-mp-month');this.mpYears=this.monthPicker.select('td.x-date-mp-year');this.mpMonths.each(function(m,a,i){i+=1;if((i%2)===0){m.dom.xmonth=5+Math.round(i*0.5);}else{m.dom.xmonth=Math.round((i-1)*0.5);}});}},showMonthPicker:function(){if(!this.disabled){this.createMonthPicker();var size={width:(this.el.getWidth()-2),height:200};this.monthPicker.setSize(size);this.monthPicker.child('table').setSize(size);this.mpSelMonth=(this.activeDate||this.value).getMonth();this.updateMPMonth(this.mpSelMonth);this.mpSelYear=(this.activeDate||this.value).getFullYear();this.updateMPYear(this.mpSelYear);this.monthPicker.slideIn('t',{duration:0.2});}},updateMPYear:function(y){this.mpyear=y;var ys=this.mpYears.elements;for(var i=1;i<=10;i++){var td=ys[i-1],y2;if((i%2)===0){y2=y+Math.round(i*0.5);td.firstChild.innerHTML=y2;td.xyear=y2;}else{y2=y-(5-Math.round(i*0.5));td.firstChild.innerHTML=y2;td.xyear=y2;}
this.mpYears.item(i-1)[y2==this.mpSelYear?'addClass':'removeClass']('x-date-mp-sel');}},updateMPMonth:function(sm){this.mpMonths.each(function(m,a,i){m[m.dom.xmonth==sm?'addClass':'removeClass']('x-date-mp-sel');});},selectMPMonth:function(m){},onMonthClick:function(e,t){e.stopEvent();var el=new Ext.Element(t),pn;if(el.is('button.x-date-mp-cancel')){this.hideMonthPicker();}
else if(el.is('button.x-date-mp-ok')){var d=new Date(this.mpSelYear,this.mpSelMonth,(this.activeDate||this.value).getDate());if(d.getMonth()!=this.mpSelMonth){d=new Date(this.mpSelYear,this.mpSelMonth,1).getLastDateOfMonth();}
this.update((this.activeDate||this.value),d);this.hideMonthPicker();}
else if((pn=el.up('td.x-date-mp-month',2))){this.mpMonths.removeClass('x-date-mp-sel');pn.addClass('x-date-mp-sel');this.mpSelMonth=pn.dom.xmonth;}
else if((pn=el.up('td.x-date-mp-year',2))){this.mpYears.removeClass('x-date-mp-sel');pn.addClass('x-date-mp-sel');this.mpSelYear=pn.dom.xyear;}
else if(el.is('a.x-date-mp-prev')){this.updateMPYear(this.mpyear-10);}
else if(el.is('a.x-date-mp-next')){this.updateMPYear(this.mpyear+10);}},onMonthDblClick:function(e,t){e.stopEvent();var el=new Ext.Element(t),pn;if((pn=el.up('td.x-date-mp-month',2))){this.update((this.activeDate||this.value),new Date(this.mpSelYear,pn.dom.xmonth,(this.activeDate||this.value).getDate()));this.hideMonthPicker();}
else if((pn=el.up('td.x-date-mp-year',2))){this.update((this.activeDate||this.value),new Date(pn.dom.xyear,this.mpSelMonth,(this.activeDate||this.value).getDate()));this.hideMonthPicker();}},hideMonthPicker:function(disableAnim){if(this.monthPicker){if(disableAnim===true){this.monthPicker.hide();}else{this.monthPicker.slideOut('t',{duration:0.2});}}},showPrevMonth:function(e){this.update(this.activeDate,this.screenDate.add('mo',-1));},showNextMonth:function(e){this.update(this.activeDate,this.screenDate.add('mo',1));},showPrevYear:function(){this.update(this.activeDate,this.screenDate.add('y',-1));},showNextYear:function(){this.update(this.activeDate,this.screenDate.add('y',1));},handleMouseWheel:function(e){e.stopEvent();if(!this.disabled){var delta=e.getWheelDelta();if(delta>0){this.showPrevMonth();}else if(delta<0){this.showNextMonth();}}},handleDateClick:function(e,t){e.stopEvent();if(!this.disabled&&t.dateValue&&!Ext.fly(t.parentNode).hasClass('x-date-disabled')){this.cancelFocus=this.focusOnSelect===false;this.setValue(new Date(t.dateValue));delete this.cancelFocus;this.fireEvent('select',this,this.value);}},selectToday:function(){if(this.todayBtn&&!this.todayBtn.disabled){this.setValue(new Date().clearTime());this.fireEvent('select',this,this.value);}},update:function(date,screenDate,clicked){if(this.rendered){var vd=this.activeDate,vis=this.isVisible();this.activeDate=date;if(!screenDate&&!this.screenDate)
{screenDate=date;this.screenDate=screenDate;}
else if(this.screenDate&&!screenDate)
{screenDate=this.screenDate;}
else if(screenDate)
{screenDate=screenDate;this.screenDate=screenDate;}
if(clicked&&(date.format("U")>(screenDate.add('mo',+2).format("U"))))
{screenDate=date.add('mo',-2);this.screenDate=screenDate;}
if(clicked&&(date.format("U")<(screenDate.format("U"))))
{screenDate=date.add('mo',-0);this.screenDate=screenDate;}
var days=screenDate.getDaysInMonth(),firstOfMonth=screenDate.getFirstDateOfMonth(),startingPos=firstOfMonth.getDay()-this.startDay;if(startingPos<0){startingPos+=7;}
days+=startingPos;var pm=screenDate.add('mo',-1),prevStart=pm.getDaysInMonth()-startingPos,weekcells=this.weekcells.elements,cells=this.cells.elements,textEls=this.textNodes,weekTextEls=this.weekTextNodes,d=(new Date(pm.getFullYear(),pm.getMonth(),prevStart,this.initHour)),today=new Date().clearTime().getTime(),sel=date.clearTime(true).getTime(),min=this.minDate?this.minDate.clearTime(true):Number.NEGATIVE_INFINITY,max=this.maxDate?this.maxDate.clearTime(true):Number.POSITIVE_INFINITY,ddMatch=this.disabledDatesRE,ddText=this.disabledDatesText,ddays=this.disabledDays?this.disabledDays.join(''):false,ddaysText=this.disabledDaysText,format=this.format;if(this.showToday){var td=new Date().clearTime(),disable=(td<min||td>max||(ddMatch&&format&&ddMatch.test(td.dateFormat(format)))||(ddays&&ddays.indexOf(td.getDay())!=-1));if(!this.disabled){this.todayBtn.setDisabled(disable);this.todayKeyListener[disable?'disable':'enable']();}}
var setCellClass=function(cal,cell){cell.title='';var t=d.clearTime(true).getTime();cell.firstChild.dateValue=t;if(t==today){cell.className+=' x-date-today';cell.title=cal.todayText;}
if(t==sel){cell.className+=' x-date-selected';if(vis){Ext.fly(cell.firstChild).focus(50);}}
if(t<min){cell.className=' x-date-disabled';cell.title=cal.minText;return;}
if(t>max){cell.className=' x-date-disabled';cell.title=cal.maxText;return;}
if(ddays){if(ddays.indexOf(d.getDay())!=-1){cell.title=ddaysText;cell.className=' x-date-disabled';}}
if(ddMatch&&format){var fvalue=d.dateFormat(format);if(ddMatch.test(fvalue)){cell.title=ddText.replace('%0',fvalue);cell.className=' x-date-disabled';}}};var kwi=0;var i=0;for(;i<startingPos;i++){textEls[i].innerHTML=(++prevStart);d.setDate(d.getDate()+1);cells[i].className='x-date-prevday';setCellClass(this,cells[i]);if(i%7==0)
{weekTextEls[kwi].innerHTML=d.format("W");kwi++;}}
for(;i<days;i++){var intDay=i-startingPos+1;textEls[i].innerHTML=(intDay);d.setDate(d.getDate()+1);cells[i].className='x-date-active';setCellClass(this,cells[i]);if(i%7==0)
{weekTextEls[kwi].innerHTML=d.format("W");kwi++;}}
var extraDays=0;var countEmptyDays=0;for(;i<(42);i++){d.setDate(d.getDate()+1);cells[i].className='dontshow';countEmptyDays++;if(i%7==0)
{if(!(countEmptyDays>0))
{weekTextEls[kwi].innerHTML=d.format("W");}
else
{weekTextEls[kwi].innerHTML='';}
kwi++;}}
this.mbtn.setText(this.monthNames[screenDate.getMonth()]+' '+screenDate.getFullYear());screenDate=screenDate.add(Date.MONTH,1);var days=screenDate.getDaysInMonth(),firstOfMonth=screenDate.getFirstDateOfMonth(),startingPos=firstOfMonth.getDay()-this.startDay;if(startingPos<0){startingPos+=7;}
days+=startingPos;var pm=screenDate.add('mo',-1),prevStart=pm.getDaysInMonth()-startingPos,d=(new Date(pm.getFullYear(),pm.getMonth(),prevStart,this.initHour)),format=this.format;for(;i<(startingPos+42);i++){d.setDate(d.getDate()+1);cells[i].className='dontshow';if(i%7==0)
{weekTextEls[kwi].innerHTML=d.format("W");kwi++;}}
for(;i<(days+42);i++){var i2=i-(42*1);var intDay=i2-startingPos+1;textEls[i].innerHTML=(intDay);d.setDate(d.getDate()+1);cells[i].className='x-date-active';setCellClass(this,cells[i]);if(i%7==0)
{weekTextEls[kwi].innerHTML=d.format("W");kwi++;}}
var extraDays=0;var countEmptyDays=0;for(;i<(42+42);i++){d.setDate(d.getDate()+1);cells[i].className='dontshow';countEmptyDays++;if(i%7==0)
{if(!(countEmptyDays>0))
{weekTextEls[kwi].innerHTML=d.format("W");}
else
{weekTextEls[kwi].innerHTML='';}
kwi++;}}
console.log("ec",countEmptyDays);this.mbtn2.update(this.monthNames[screenDate.getMonth()]+' '+screenDate.getFullYear());screenDate=screenDate.add(Date.MONTH,1);var days=screenDate.getDaysInMonth(),firstOfMonth=screenDate.getFirstDateOfMonth(),startingPos=firstOfMonth.getDay()-this.startDay;if(startingPos<0){startingPos+=7;}
days+=startingPos;var pm=screenDate.add('mo',-1),prevStart=pm.getDaysInMonth()-startingPos,d=(new Date(pm.getFullYear(),pm.getMonth(),prevStart,this.initHour)),format=this.format;for(;i<(startingPos+(2*42));i++){d.setDate(d.getDate()+1);cells[i].className='dontshow';if(i%7==0)
{weekTextEls[kwi].innerHTML=d.format("W");kwi++;}}
for(;i<(days+(2*42));i++){var i3=i-(42*2);var intDay=i3-startingPos+1;textEls[i].innerHTML=(intDay);d.setDate(d.getDate()+1);cells[i].className='x-date-active';setCellClass(this,cells[i]);if(i%7==0)
{weekTextEls[kwi].innerHTML=d.format("W");kwi++;}}
var extraDays=0;var countEmptyDays=0;var emptyLine=false;for(;i<(42*3);i++){textEls[i].innerHTML=(++extraDays);d.setDate(d.getDate()+1);cells[i].className='x-date-nextday';countEmptyDays++;if(emptyLine)cells[i].className='dontshow';setCellClass(this,cells[i]);if(i%7==0)
{if(!(countEmptyDays>0))
{weekTextEls[kwi].innerHTML=d.format("W");}
else
{weekTextEls[kwi].innerHTML='';cells[i].className='dontshow';emptyLine=true;}
kwi++;}}
this.mbtn3.update(this.monthNames[screenDate.getMonth()]+' '+screenDate.getFullYear());if(!this.internalRender){var main=this.el.dom.firstChild,w=main.offsetWidth;this.internalRender=true;if(Ext.isOpera&&!this.secondPass){main.rows[0].cells[1].style.width=(w-(main.rows[0].cells[0].offsetWidth+main.rows[0].cells[2].offsetWidth))+'px';this.secondPass=true;this.update.defer(10,this,[date]);}}}},beforeDestroy:function(){if(this.rendered){Ext.destroy(this.keyNav,this.monthPicker,this.eventEl,this.mbtn,this.mbtn2,this.mbtn3,this.nextRepeater,this.prevRepeater,this.cells.el,this.todayBtn);delete this.textNodes;delete this.cells.elements;}}});Ext.reg('diloc.dateselector',diloc.rail.DateSelector);

Ext.namespace("diloc.rail.menu");diloc.rail.menu.StoreMenu=Ext.extend(Ext.menu.Menu,{reloadOnShow:false,store:new Ext.data.Store(),nameField:'',items:null,initComponent:function()
{this.staticItems=this.items;this.loadingItem={text:'Laden...',iconCls:'loading-indicator'};this.items=[this.loadingItem];this.addEvents('recordclicked');this.on('beforeshow',this.onBeforeshow,this);this.store.on('load',this.buildUpMenu,this);diloc.rail.menu.StoreMenu.superclass.initComponent.call(this);},onBeforeshow:function()
{if(this.reloadOnShow)
{this.removeAll();this.add([this.loadingItem,'-',this.staticItems]);this.store.reload();}
else
{this.buildUpMenu();}},buildUpMenu:function()
{this.removeAll();for(var i=0;i<this.store.getTotalCount();i++)
{var itemRecord=this.store.getAt(i);this.add({text:itemRecord.get(this.nameField),record:itemRecord,handler:this.storeItemHandler,scope:this});}
this.add(['-',this.staticItems]);},storeItemHandler:function(_button,_event)
{this.fireEvent('recordclicked',_button.record);}});

Ext.namespace("diloc.rail.formfields.HtmlEditor");diloc.rail.formfields.HtmlEditor.Template=Ext.extend(Ext.util.Observable,{group:'default',constructor:function(config)
{if(config.group)this.group=config.group;else this.group='default';this.loadedTemplateId='';this.loadedTemplateName='';this.templateStore=new Ext.data.JsonStore({url:gwf.App.backendUrl("texttemplate","list"),remoteSort:false,sortInfo:{field:'position',direction:'ASC'},fields:[{name:'id'},{name:'customerId'},{name:'group'},{name:'name'},{name:'text'},{name:'position'}],baseParams:{'filter[0][field]':'group','filter[0][data][type]':'string','filter[0][data][comparison]':'eq','filter[0][data][value]':this.group},root:'data',idProperty:'id',totalProperty:'length'});this.templateMenu=new diloc.rail.menu.StoreMenu({items:{iconCls:'htmleditor-config',text:'Vorlagen verwalten',handler:this.openTemplateConfigDialog,scope:this},reloadOnShow:true,store:this.templateStore,nameField:'name'});diloc.rail.formfields.HtmlEditor.Template.superclass.constructor.call(this,config);},init:function(cmp)
{this.cmp=cmp;this.cmp.on('render',this.onRender,this);this.templateMenu.on('recordclicked',this.onMenuRecordClicked,this);},onRender:function()
{var toolbar=this.cmp.getToolbar();toolbar.add('->');var addTemplateButton=toolbar.addButton({iconCls:'htmleditor-templates-add',handler:this.saveTemplateDialog,scope:this,tooltip:'Text als Vorlage speichern',overflowText:'Text als Vorlage speichern'});var templateButton=toolbar.addButton({iconCls:'htmleditor-templates',scope:this,menu:this.templateMenu,tooltip:'Vorlagen',overflowText:'Vorlagen'});},onMenuRecordClicked:function(_templateRecord)
{console.log("template selected",_templateRecord.get('id'));diloc.rail.MessageBox.show({title:'Vorlage laden?',id:'askloadtemplate',icon:Ext.MessageBox.QUESTION,text:'Beim Laden wird die bisherige Eingabe überschrieben.',buttons:Ext.Msg.YESNO,okHandler:function(_btn){this.loadedTemplateId=_templateRecord.get('id');this.loadedTemplateName=_templateRecord.get('name');this.cmp.setValue(_templateRecord.get('text'));},okScope:this});},saveTemplateDialog:function(_button,_event,_msg)
{if(this.loadedTemplateName!='')var value=this.loadedTemplateName;else var value='';if(this.templateStore.getCount()==0)this.templateStore.load();if(_msg)var msg=_msg;else var msg='Name:';Ext.Msg.prompt('Vorlage speichern unter',msg,this.onSaveTemplate,this,false,value);},onSaveTemplate:function(_button,_value)
{console.log("Prompt",this,arguments);if(_button=='ok')
{if(_value=='')
{this.saveTemplateDialog('','','Name (erforderlich):');}
else
{if(this.templateStore.findExact('name',_value)>=0)
{Ext.Msg.show({title:'Vorlage überschreiben?',msg:'Es existiert bereits eine Vorlage mit diesem Namen, soll sie überschrieben werden?',buttons:Ext.Msg.YESNO,fn:function(_btn){if(_btn=="yes")
{var updateTemplate=new gwf.helpers.ActionExecutor({successSilent:true});updateTemplate.on("success",function(_response){this.onSuccess(_response);},this);updateTemplate.execute("texttemplate","update",{id:this.templateStore.getAt(this.templateStore.findExact('name',_value)).get('id'),group:this.group,name:_value,text:this.cmp.getValue(),position:this.templateStore.getAt(this.templateStore.findExact('name',_value)).get('position'),customerId:diloc.User.customerId()});}
if(_btn=="no")
{this.saveTemplateDialog('','','Name (bitte ändern):');}},scope:this});}
else
{var saveNewTemplate=new gwf.helpers.ActionExecutor({silent:true});saveNewTemplate.on("success",function(_response){this.onSuccess(_response);},this);saveNewTemplate.on("failure",function(_errors)
{if(_errors.name)
{Ext.MessageBox.alert("Fehler beim speichern","Es existiert bereits eine Vorlage mit diesem Namen!");}
else Ext.MessageBox.alert("Fehler beim speichern","Es ist ein unbekannter Fehler beim Speichern der Vorlage aufgetreten.");},this);saveNewTemplate.execute("texttemplate","create",{group:this.group,name:_value,text:this.cmp.getValue(),position:'0',customerId:diloc.User.customerId()});}}}},onSuccess:function(_response)
{this.loadedTemplateId=_response.data.id;this.loadedTemplateName=_response.data.name;},openTemplateConfigDialog:function()
{var configDialog=new diloc.rail.dialogs.TemplateConfigDialog({name:this.name,templateStore:this.templateStore});configDialog.show();}});

Ext.ns('diloc.rail.plugins');diloc.rail.plugins.AutoFormPanelMask=function()
{this.init=function(_formPanel)
{_formPanel.getForm().on('beforeaction',this.onActionStart);_formPanel.getForm().on('actionfailed',this.onActionFinish);_formPanel.getForm().on('actioncomplete',this.onActionFinish);};this.onActionStart=function(_formPanel,_action)
{if(_formPanel.getEl()&&!_action.options.waitMsg)
{if(_action.type=="submit"||_action.type=="oosubmit")
{_formPanel.getEl().mask('Speichern...','x-mask-loading');}
else _formPanel.getEl().mask('Laden...','x-mask-loading');}};this.onActionFinish=function(_formPanel,_action)
{if(_formPanel.getEl())
{_formPanel.getEl().unmask();}};};

