
function openTrail(idtrails){Tom.MyApp.showTab('trail',idtrails);}
function deletePoi(idpois){Tom.MyApp.PoiStore.remove(Tom.MyApp.PoiStore.getById(idpois));}
continents={EU:'Europa',AS:'Asien',NA:'Nordamerika',AF:'Afrika',AN:'Antarktis',SA:'Südamerika',OC:'Ozeanien'}
function obj2arr(o){result=new Array();for(var i in o){result.push(o[i]);}
return result;}
Array.prototype.toUniqueArray=function(){var unique=new Array();var contains;for(var i=0;i<this.length;i++){contains=false;for(var j=0;j<unique.length;j++){if(this[i]==unique[j])
contains=true;}
if(!contains){unique.push(this[i]);}}
return unique;}
Ext.apply(Ext.form.VTypes,{password:function(val,field){if(field.initialPassField){var pwd=Ext.getCmp(field.initialPassField);return(val==pwd.getValue());}
return true;},passwordText:'Passwörter stimmen nicht überein'},{GpsFile:function(v){return/\.(gpx|ovl|tk|trk)$/i.test(v);},GpsFileText:'Folgende Dateitypen werden unterstützt: *.gpx, *.ovl, *.tk, *.trk',GpsFileMask:/\.(jpg|gif|doc|pdf)$/i});formatS=function(value){return(isInt(value)?value:Math.floor(value)+'/'+Math.ceil(value))}
Array.prototype.inArray=function(value){var i;for(i=0;i<this.length;i++){if(this[i]===value){return true;}}
return false;};String.prototype.toHref=function(text,target){text=text||this;target=target||'_self'
return'<a href="http://'+this+' target="'+target+'">'+text
+'</a>';}
String.prototype.startsWith=function(str){return(this.match("^"+str)==str)}
String.prototype.endsWith=function(str){return(this.match(str+"$")==str)}
function pad(number,length){var str=''+number;while(str.length<length){str='0'+str;}
return str;}
function isInt(x){var y=parseInt(x);if(isNaN(y))
return false;return x==y&&x.toString()==y.toString();}
function vis(obj,vis){if(vis){obj.show();}else{obj.hide();}}
Tom.smileyImgs=new Array(' <img src="/images/smilies/face-angel.png" class="smilie"></img> ',' <img src="/images/smilies/face-angry.png" class="smilie"></img> ',' <img src="/images/smilies/face-cool.png" class="smilie"></img> ',' <img src="/images/smilies/face-cool.png" class="smilie"></img> ',' <img src="/images/smilies/face-crying.png" class="smilie"></img> ',' <img src="/images/smilies/face-crying.png" class="smilie"></img> ',' <img src="/images/smilies/face-devilish.png" class="smilie"></img> ',' <img src="/images/smilies/face-embarrassed.png" class="smilie"></img> ',' <img src="/images/smilies/face-kiss.png" class="smilie"></img> ',' <img src="/images/smilies/face-kiss.png" class="smilie"></img> ',' <img src="/images/smilies/face-laugh.png" class="smilie"></img> ',' <img src="/images/smilies/face-laugh.png" class="smilie"></img> ',' <img src="/images/smilies/face-plain.png" class="smilie"></img> ',' <img src="/images/smilies/face-plain.png" class="smilie"></img> ',' <img src="/images/smilies/face-raspberry.png" class="smilie"></img> ',' <img src="/images/smilies/face-raspberry.png" class="smilie"></img> ',' <img src="/images/smilies/face-sad.png" class="smilie"></img> ',' <img src="/images/smilies/face-sad.png" class="smilie"></img> ',' <img src="/images/smilies/face-sick.png" class="smilie"></img> ',' <img src="/images/smilies/face-smile.png" class="smilie"></img> ',' <img src="/images/smilies/face-smile.png" class="smilie"></img> ',' <img src="/images/smilies/face-smirk.png" class="smilie"></img> ',' <img src="/images/smilies/face-smirk.png" class="smilie"></img> ',' <img src="/images/smilies/face-surprise.png" class="smilie"></img> ',' <img src="/images/smilies/face-surprise.png" class="smilie"></img> ',' <img src="/images/smilies/face-surprise.png" class="smilie"></img> ',' <img src="/images/smilies/face-surprise.png" class="smilie"></img> ',' <img src="/images/smilies/face-tired.png" class="smilie"></img> ',' <img src="/images/smilies/face-uncertain.png" class="smilie"></img> ',' <img src="/images/smilies/face-uncertain.png" class="smilie"></img> ',' <img src="/images/smilies/face-wink.png" class="smilie"></img> ',' <img src="/images/smilies/face-wink.png" class="smilie"></img> ',' <img src="/images/smilies/face-worried.png" class="smilie"></img> ',' <img src="/images/smilies/face-worried.png" class="smilie"></img>');Tom.smileyKeys=new Array('(angel)',':@','8-)','8)',';-(',';()','(devil)','(blush)',':-*',':*',':-D',':D',':-|',':|',':-P',':P',':-(',':(','(sick)',':-)',':)',';-)',';)',':-O',':-o',':O',':o','(tired)',':-/',':/',';-)',';)',':-S',':S');(function(){var chr=window.CSSHttpRequest={};chr.id=0;chr.requests={};chr.MATCH_ORDINAL=/#c(\d+)/;chr.MATCH_URL=/url\("?data\:[^,]*,([^")]+)"?\)/;chr.get=function(url,callback){var id=++chr.id;var iframe=document.createElement("iframe");iframe.style.position="absolute";iframe.style.left=iframe.style.top="-1000px";iframe.style.width=iframe.style.height=0;document.documentElement.appendChild(iframe);var r=chr.requests[id]={id:id,iframe:iframe,document:iframe.contentDocument||iframe.contentWindow.document,callback:callback};r.document.open("text/html",false);r.document.write("<html><head>");r.document.write("<link rel='stylesheet' type='text/css' media='print, csshttprequest' href='"
+chr.escapeHTML(url)+"' />");r.document.write("</head><body>");r.document.write("<script type='text/javascript'>");r.document.write("(function(){var w = window; var p = w.parent; p.CSSHttpRequest.sandbox(w); w.onload = function(){p.CSSHttpRequest.callback('"
+id+"');};})();");r.document.write("</script>");r.document.write("</body></html>");r.document.close();};chr.sandbox=function(w){};chr.callback=function(id){var r=chr.requests[id];var data=chr.parse(r);r.callback(data);window.setTimeout(function(){var r=chr.requests[id];try{r.iframe.parentElement.removeChild(r.iframe);}catch(e){};delete chr.requests[id];},0);};chr.parse=function(r){var data=[];try{var rules=r.document.styleSheets[0].cssRules||r.document.styleSheets[0].rules;for(var i=0;i<rules.length;i++){try{var r=rules.item?rules.item(i):rules[i];var ord=r.selectorText.match(chr.MATCH_ORDINAL)[1];var val=r.style.backgroundImage.match(chr.MATCH_URL)[1];data[ord]=val;}catch(e){}}}catch(e){r.document.getElementsByTagName("link")[0].setAttribute("media","screen");var x=r.document.createElement("div");x.innerHTML="foo";r.document.body.appendChild(x);var ord=0;try{while(1){x.id="c"+ord;var style=r.document.defaultView.getComputedStyle(x,null);var bg=style["background-image"]||style.backgroundImage||style.getPropertyValue("background-image");var val=bg.match(chr.MATCH_URL)[1];data[ord]=val;ord++;}}catch(e){}}
return decodeURIComponent(data.join(""));};chr.escapeHTML=function(s){return s.replace(/([<>&""''])/g,function(m,c){switch(c){case"<":return"&lt;";case">":return"&gt;";case"&":return"&amp;";case'"':return"&quot;";case"'":return"&apos;";}
return c;});};})();function str_replace(search,replace,subject,count){var i=0,j=0,temp='',repl='',sl=0,fl=0,f=[].concat(search),r=[].concat(replace),s=subject,ra=r instanceof Array,sa=s instanceof Array;s=[].concat(s);if(count){this.window[count]=0;}
for(i=0,sl=s.length;i<sl;i++){if(s[i]===''){continue;}
for(j=0,fl=f.length;j<fl;j++){temp=s[i]+'';repl=ra?(r[j]!==undefined?r[j]:''):r[0];s[i]=(temp).split(f[j]).join(repl);if(count&&s[i]!==temp){this.window[count]+=(temp.length-s[i].length)/f[j].length;}}}
return sa?s:s[0];}
function setActiveStyleSheet(title){var i,a,links=document.getElementsByTagName("link"),len=links.length;for(i=0;i<len;i++){a=links[i];if(a.getAttribute("rel").indexOf("style")!=-1&&a.getAttribute("title")){a.disabled=true;if(a.getAttribute("title")==title)a.disabled=false;}}}
Tom.Image=Ext.extend(Ext.Container,{initComponent:function(){Ext.apply(this,{style:"overflow : 'hidden';text-align:center;vertical-align: middle",items:[{xtype:'box',style:'background-image:url("'
+(this.ajaxPreloader||'/images/ajax-loader.gif')
+'"); background-repeat:no-repeat; background-position:center center;',height:'100%',width:'100%'}]});Tom.Image.superclass.initComponent.apply(this,arguments);if(this.forceReload){this.imageUrl+="?random="+Math.random().toFixed(10);}
this.imgLoad=new Image();this.imgLoad.onload=(function(){this.imageConfig=Ext.apply({itemId:'image',xtype:'container',autoEl:{tag:'img',src:this.imageUrl},plugins:[new Ext.ux.FitToParent({preserveAspectRatio:this.preserveAspectRatio||true,fitWidth:Ext.isDefined(this.fitWidth)?this.fitWidth:true,fitHeight:Ext.isDefined(this.fitHeight)?this.fitHeight:true,myWidth:this.imgLoad.width,myHeight:this.imgLoad.height})]},this.imageConfig);this.removeAll();this.add(this.imageConfig);this.doLayout(true);}).createDelegate(this);this.imgLoad.src=this.imageUrl;}});Ext.reg('tom_image',Tom.Image);Tom.TrailDef=Ext.data.Record.create([{name:'idtrails',type:'int'},{name:'creator',type:'int'},{name:'editor',type:'int'},{name:'checked',type:'boolean'},{name:'deleted',type:'boolean'},{name:'title',type:'string'},{name:'idcountries',type:'string'},{name:'trailnumbers',type:'string'},{name:'isgps',type:'boolean'},{name:'gpstrack',type:'string'},{name:'encLatLngs',type:'string'},{name:'encLevels',type:'string'},{name:'bounds',type:'string'},{name:'s',type:'float'},{name:'g',type:'float'},{name:'alt_up',type:'int'},{name:'alt_down',type:'int'},{name:'alt_max',type:'int'},{name:'alt_min',type:'int'},{name:'len',type:'int'},{name:'description',type:'string'},{name:'description_starting_point',type:'string'},{name:'description_up',type:'string'},{name:'description_down',type:'string'},{name:'label_lat',type:'float'},{name:'label_lng',type:'float'},{name:'tsc',type:'date',dateFormat:'Y-m-d H:i:s'},{name:'tsm',type:'date',dateFormat:'Y-m-d H:i:s'},{name:'visited',type:'auto'},{name:'fav',type:'string'},{name:'fnew',type:'string'},{name:'tags',type:'auto'},{name:'nearbyTrails',type:'auto'},{name:'similarTrails',type:'auto'},{name:'files',type:'auto'}]);Tom.ProjectDef=Ext.data.Record.create([{name:'idprojects',type:'int'},{name:'creator',type:'int'},{name:'editor',type:'int'},{name:'title',type:'string'},{name:'encLatLngs',type:'string'},{name:'encLevels',type:'string'},{name:'bounds',type:'string'},{name:'description',type:'string'},{name:'label_lat',type:'float'},{name:'label_lng',type:'float'},{name:'tsc',type:'date',dateFormat:'Y-m-d H:i:s'},{name:'tsm',type:'date',dateFormat:'Y-m-d H:i:s'}]);Tom.WarningDef=Ext.data.Record.create([{name:'idwarnings',type:'int'},{name:'creator',type:'int'},{name:'editor',type:'int'},{name:'title',type:'string'},{name:'encLatLngs',type:'string'},{name:'encLevels',type:'string'},{name:'bounds',type:'string'},{name:'description',type:'string'},{name:'label_lat',type:'float'},{name:'label_lng',type:'float'},{name:'tsc',type:'date',dateFormat:'Y-m-d H:i:s'},{name:'tsm',type:'date',dateFormat:'Y-m-d H:i:s'}]);Tom.PoiDef=Ext.data.Record.create([{name:'idpois',type:'int'},{name:'creator',type:'int'},{name:'editor',type:'int'},{name:'title',type:'string'},{name:'type',type:'int'},{name:'lat',type:'float'},{name:'lng',type:'float'},{name:'config',type:'string'},{name:'tsc',type:'date',dateFormat:'Y-m-d H:i:s'},{name:'tsm',type:'date',dateFormat:'Y-m-d H:i:s'}]);Tom.CommentDef=Ext.data.Record.create([{name:'idcomments',type:'int'},{name:'creator',type:'int'},{name:'comment',type:'string'},{name:'tsc',type:'date',dateFormat:'Y-m-d H:i:s'}]);Tom.FileDef=Ext.data.Record.create([{name:'idfiles',type:'int'},{name:'name',type:'string'},{name:'url',type:'string'},{name:'filesize',type:'int'},{name:'is_image',type:'boolean'},{name:'comment',type:'string'}]);Tom.NoteDef=Ext.data.Record.create([{name:'title',type:'string'},{name:'trailnumbers',type:'string'},{name:'s',type:'float'},{name:'g',type:'float'},{name:'description',type:'string'},{name:'description_starting_point',type:'string'},{name:'description_up',type:'string'},{name:'description_down',type:'string'},{name:'day',type:'string'},{name:'gpstrack',type:'string'}]);Tom.MapServerOverlayRecord=Ext.data.Record.create([{name:'id'},{name:'mapId',type:'int'},{name:'title',type:'string'},{name:'continent',type:'string'},{name:'country',type:'string'},{name:'subFolder',type:'string'},{name:'local',type:'boolean'},{name:'copyrightPrefix',type:'string'},{name:'copyrightText',type:'string'},{name:'points',type:'string'},{name:'levels',type:'string'},{name:'bounds'},{name:'minZoom',type:'int'},{name:'maxZoom',type:'int'},{name:'getTileURL'}]);Tom.Action=Ext.extend(Ext.Action,{constructor:function(config){var validTypes=new Array('trail','project','warning','poi');if(!validTypes.inArray(config.myType)){config.myType='trail';}
this.myType=config.myType||'trail';this.myAction=config.myAction||'list';this.myId=config.myId;switch(this.myAction){case'new':config=Ext.apply({text:(this.myType=='trail')?'Neuer Trail':(this.myType=='project')?'Neues Projekt':(this.myType=='warning')?'Neue Warnung':(this.myType=='poi')?'Neuer POI':'',scope:this,handler:function(){Tom.MyApp.showTab('edit'+this.myType);},icon:'/icon/add_'+this.myType+'/'
+ip+'_16.png'},config);break;case'edit':config=Ext.apply({text:(this.myType=='trail')?'Trail bearbeiten':(this.myType=='project')?'Projekt bearbeiten':(this.myType=='warning')?'Warnung bearbeiten':(this.myType=='poi')?'POI bearbeiten':'',scope:this,handler:function(){Tom.MyApp.showTab('edit'+this.myType,this.myId);},icon:'/icon/edit_'+this.myType+'/'
+ip+'_16.png'},config);case'details':config=Ext.apply({text:(this.myType=='trail')?'Trail':(this.myType=='project')?'Projekt':(this.myType=='warning')?'Warnung':(this.myType=='poi')?'POI':'',scope:this,handler:function(){Tom.MyApp.showTab(this.myType,this.myId);},icon:'/icon/'+this.myType+'/'+ip
+'_16.png'},config);break;case'load':config=Ext.apply({text:(this.myType=='trail')?'Trails neu laden':(this.myType=='project')?'Projekte neu laden':(this.myType=='warning')?'Warnungen neu laden':(this.myType=='poi')?'POIs neu laden':'',scope:this,handler:function(){Tom.MyApp.loadStore(this.myType);},icon:'/icon/refresh/'+ip+'_16.png'},config);break;case'list':default:config=Ext.apply({text:(this.myType=='trail')?'Liste der Trails':(this.myType=='project')?'Liste der Projekt':(this.myType=='warning')?'Liste der Warnungen':(this.myType=='poi')?'Liste der POIs':'',scope:this,handler:function(){Tom.MyApp.showTab('list'+this.myType);},icon:'/icon/list_'+this.myType+'/'
+ip+'_16.png'},config);break;}
delete config.myAction;delete config.myType;if(Ext.isDefined(config.myId)){delete config.myId;}
Tom.Action.superclass.constructor.call(this,config);}});var action_open_map=new Ext.Action({text:'Karte',handler:function(){Tom.MyApp.showTab('map');},icon:'/icon/map/'+ip+'_16.png'});var action_new_trail=new Tom.Action({myType:'trail',myAction:'new'});var action_show_notes=new Ext.Action({text:'Meine Vorlagen',handler:function(){new Tom.NotesDialog().show();},icon:'/icon/notes/'+ip+'_16.png'});var action_traillist=new Tom.Action({myType:'trail',myAction:'list'});var action_load_trails=new Tom.Action({myType:'trail',myAction:'load'});var action_new_poi=new Tom.Action({myType:'poi',myAction:'new'});var action_poilist=new Tom.Action({myType:'poi',myAction:'list'});var action_load_pois=new Tom.Action({myType:'poi',myAction:'load'});var action_new_project=new Tom.Action({myType:'project',myAction:'new'});var action_projectlist=new Tom.Action({myType:'project',myAction:'list'});var action_load_projects=new Tom.Action({myType:'project',myAction:'load'});var action_new_warning=new Tom.Action({myType:'warning',myAction:'new'});var action_warninglist=new Tom.Action({myType:'warning',myAction:'list'});var action_load_warnings=new Tom.Action({myType:'warning',myAction:'load'});var action_open_memberlist=new Ext.Action({text:'Benutzerliste',handler:function(){Tom.MyApp.showTab('listmember');},icon:'/icon/members/'+ip+'_16.png'});var action_mobile_trails=new Ext.Action({text:'MobileTrails',handler:function(){Tom.MyApp.showTab('mobileTrails');},icon:'/iconstatic/mobile_trails_16.png'});var action_email=new Ext.Action({text:'Email schicken',handler:function(){Tom.MyApp.email();},icon:'/icon/email/'+ip+'_16.png'});var action_feedback=new Ext.Action({text:'Feedback',handler:function(){Tom.MyApp.email('1');},icon:'/icon/feedback/'+ip+'_16.png'});var action_about=new Ext.Action({text:'Über www.trails.at',handler:function(){Tom.MyApp.about();},icon:'/iconstatic/mobile_trails_16.png'});var action_preferences=new Ext.Action({text:'Einstellungen',handler:function(){Tom.MyApp.showTab('preferences');},icon:'/icon/settings/'+ip+'_16.png'});var action_open_widgeteditor=new Ext.Action({text:'Startseite anpassen',handler:function(){Tom.MyApp.showTab('customizehomescreen');},icon:'/icon/home/'+ip+'_16.png'});var action_admin_webcams=new Ext.Action({text:'Webcams',handler:function(){Tom.MyApp.showTab('adminwebcams');},icon:'/icon/settings/'+ip+'_16.png'});var action_update_overlays=new Ext.Action({text:'Overlays aktualisieren',handler:function(){Tom.MyApp.showTab('adminupdateoverlays');},icon:'/icon/maps/'+ip+'_16.png'});var actionGrp_trail=new Array(new Tom.Action({myType:'trail',myAction:'edit'}));var actionGrp_project=new Array(new Tom.Action({myType:'project',myAction:'edit'}));var actionGrp_warning=new Array(new Tom.Action({myType:'warning',myAction:'edit'}));var actionGrp_poi=new Array(new Tom.Action({myType:'poi',myAction:'edit'}));var allActionGrps=actionGrp_trail.concat(actionGrp_project).concat(actionGrp_warning).concat(actionGrp_poi);Tom.Trail=Ext.extend(Ext.Panel,{constructor:function(config){this.idtrails=config.idtrails;this.trackTitle='';this.eProfile=new Tom.TrailEProfile();this.btnImageGallery=new Ext.menu.Item({text:'Bilder anzeigen',icon:'/icon/image/'+ip+'_16.png',disabled:true,scope:this,handler:function(){Tom.ImageGallery.showImages(this.files);}});this.showInMapButton=new Ext.menu.Item({text:'In Karte anzeigen',disabled:true});this.gmapPanel=new Tom.GMapTrackViewer({id:'trail_'+String(this.idtrails)+'_gmap',region:'center',title:'Karte',flex:2,GMapConfig:{hasTrack:true},listeners:{mapready:{fn:function(){this.store.load({add:true,scope:this,params:{idmembers:Tom.MyApp.member.idmembers,idtrails:this.idtrails,mode:'full'},callback:this.loadTrack});},scope:this}}});this.infoBox=new Ext.Panel({id:'trail'+String(this.idtrails)+'_infoBox',title:"Infobox",autoScroll:true,tpl:new Ext.XTemplate('<h1>{title} <img src="/iconstatic/s{[Math.floor(values.s)]}.png"></h1>'
+'<table>','<tr><td rowspan="20"><img src="/data/thumbs/{idtrails}.jpg"></td></tr>','<tr><td class="i_members iLeft" colspan="4">{[this.getMember(values.creator)]} ({[fm.date(values.tsc,"d.m.y")]})</td></tr>','<tr><td></td><td>S{[formatS(values.s)]} G{g}</td><td class="i_len iLeft r">{len}</td><td>m</td><td colspan="2"></td></tr>','<tr><td class="i_alt_max iLeft r">{alt_max}</td><td>m</td><td class="i_alt_up iLeft r">{alt_up}</td><td>hm</td></tr>','<tr><td class="i_alt_min iLeft r">{alt_min}</td><td>m</td><td class="i_alt_down iLeft r">{alt_down}</td><td>hm</td></tr>','</table>','<ul class="inlineTagList">','<tpl for="tags">','<li><a title="{[this.getTag(values)]}" href="#" class="tag"><span>{[this.getTag(values)]}</span></a></li>','</tpl>','</ul>',{compiled:true,disableFormats:true,getMember:function(idmembers){return Tom.MyApp.getMember(idmembers);},getTag:function(idtags){return Tom.MyApp.getTag(idtags);}})});this.otherTrailBox=new Ext.Panel({id:'trail_'+String(this.idtrails)+'_otherTrailsBox',title:'Alternativen',flex:1,autoScroll:true,tpl:new Ext.XTemplate('<h1>Trails in der Nähe</h1>','<ul class="text">','<tpl for="nearbyTrails">','<li><a href="javascript:Tom.MyApp.showTab(\'trail\',{idtrails})">{title}</a> ({distance} km)</li>','</tpl>','</ul>','<h1>Ähnliche Trails</h1>','<ul class="text">','<tpl for="similarTrails">','<li><a href="javascript:Tom.MyApp.showTab(\'trail\',{idtrails})">{title}</a> ({similarity}%)</li>','</tpl>','</ul>',{compiled:true,disableFormats:true})});this.descriptionBox=new Ext.Panel({id:'trail_'+String(this.idtrails)+'_descriptionBox',title:'Beschreibung',flex:1,autoScroll:true,tpl:new Ext.XTemplate('<tpl if="description_starting_point !=&quot;&quot;"><h1>Startpunkt</h1><p>{[this.repl(values.description_starting_point)]}</p></tpl>','<h1>Aufstieg</h1><p>{[this.repl(values.description_up)]}</p>','<h1>Abfahrt</h1><p>{[this.repl(values.description_down)]}</p>',{compiled:true,disableFormats:true,repl:function(orig){orig=orig.replace(/#\[(\d+)\]/gi,'<a href="javascript:Tom.MyApp.showTab(\'trail\',$1)">Tour #[$1]</a>');orig=str_replace(Tom.smileyKeys,Tom.smileyImgs,orig);return orig;}})});this.commentBox=new Tom.Comments({table:'trail',idowner:this.idtrails});var datasheet=new Ext.Panel({title:'Datenblatt',region:'west',layout:'vbox',collapsible:true,collapsedTitle:true,collapsed:false,width:500,frame:false,layoutConfig:{type:'vbox',align:'stretch',pack:'start'},flex:1,defaults:{flex:1,frame:false},items:[{layout:'hbox',layoutConfig:{type:'hbox',align:'stretch',pack:'start'},flex:1,frame:false,defaults:{flex:1,frame:false},items:[this.infoBox,this.otherTrailBox]},this.commentBox,this.descriptionBox]});var eProfileBox=new Ext.Panel({id:'trail_'+String(this.idtrails)+'_hp',title:'Höhenprofil',region:'east',collapsible:true,collapsedTitle:true,collapsed:true,width:500,layout:'fit',items:[this.eProfile]});config=Ext.apply({closable:true,title:'Lade Trail ...',layout:'tdgi_border',disabled:true,tbar:new Ext.Toolbar({items:[{text:'Trail',icon:'/icon/trail/'+ip+'_16.png',menu:{items:[new Tom.Action({myType:'trail',myAction:'edit',myId:this.idtrails}),this.showInMapButton,{text:'Download',icon:'/icon/download/'+ip+'_16.png',menu:{items:[{text:'Als GPX-Track',handler:function(){Tom.MyApp.download({mode:'gpstrack',gpsformat:'gpx',idtrails:this.idtrails});}}]}}]}},{text:'Bilder',icon:'/icon/image/'+ip+'_16.png',menu:{items:[this.btnImageGallery,{text:'Bilder hochladen',icon:'/icon/add_image/'+ip+'_16.png',scope:this,handler:function(){if(!Ext.isDefined(this.Uploader)){this.Uploader=new Tom.UploadWindow({'type':'trail','idtrails':this.idtrails,'title':'Bilder für Trail '
+this.trackTitle,extraPostData:{idmembers:Tom.MyApp.member.idmembers,idtrails:this.idtrails}})}
this.Uploader.show();}}]}}]}),items:[datasheet,this.gmapPanel,eProfileBox]},config);Tom.Trail.superclass.constructor.call(this,config);},loadTrack:function(records,options,success){if((success)&&(Ext.isDefined(records[0]))){var r=records[0];this.trackTitle=r.data.title;this.gmapPanel.loadTrack(r.data.gpstrack);this.setTitle(this.trackTitle);this.gmapPanel.setTitle(this.trackTitle);this.infoBox.update(r.data);this.descriptionBox.update(r.data);this.otherTrailBox.update(r.data);this.eProfile.updateProfile(this.gmapPanel.trackEditor.pt);this.files=r.data.files||new Array();this.btnImageGallery.setDisabled(this.files.length==0);var bounds=r.data.bounds;this.showInMapButton.setHandler(function(){Tom.MyApp.getTab('map').gmap.zoomToBounds(bounds);},this);this.enable();}else{this.close();Tom.MyApp.showError("Daten für diesen Trail konnten nicht geladen werden!");}}});Tom.TrailList=Ext.extend(Ext.grid.GridPanel,{initComponent:function(){this.filters=new Ext.ux.grid.GridFilters({local:true,filters:[{type:'string',dataIndex:'title'},{type:'numeric',dataIndex:'s'},{type:'numeric',dataIndex:'g'}]});this.cellActions=new Ext.ux.grid.CellActions({listeners:{action:function(grid,record,action,value){switch(action){case'i_fav':record.set('fav','i_nofav');break;case'i_nofav':record.set('fav','i_fav');break;}}},align:'left'});Ext.apply(this,{store:Tom.MyApp.TrailStore,listeners:{cellclick:this.onSelectTrail,cellcontextmenu:function(grid,rowIndex,cellIndex,e){e.stopEvent();var record=grid.getStore().getAt(rowIndex);var idtrails=record.get('idtrails');var bounds=record.get('bounds');if(!this.contextMenu){this.contextMenu=new Ext.menu.Menu({id:'gridCtxMenuTrails',idtrails:idtrails,bounds:bounds,items:[{text:'Anzeigen',scope:this,icon:'/icon/trail/'+ip+'_16.png',handler:function(){Tom.MyApp.showTab('trail',this.contextMenu.idtrails);}},{text:'Bearbeiten',scope:this,icon:'/icon/edit_trail/'+ip+'_16.png',handler:function(){Tom.MyApp.showTab('edittrail',this.contextMenu.idtrails);}},{text:'In Karte zeigen',scope:this,icon:'/icon/map/'+ip+'_16.png',handler:function(){Tom.MyApp.getTab('map').map.zoomToBounds(record.get('bounds'));}}]});}else{this.contextMenu.idtrails=idtrails;}
var xy=e.getXY();this.contextMenu.showAt(xy);}},columns:[{header:'',width:8,sortable:false,fixed:true,dataIndex:'s',renderer:function(value,metaData,record,rowIndex,colIndex,store){metaData.css='s'+Math.floor(value);return'';}},{header:'Fav',width:30,sortable:true,fixed:true,css:'text-color: white',dataIndex:'title',cellActions:[{iconIndex:'fav',qtip:'Favoriten'}],renderer:function(value,metaData,record,rowIndex,colIndex,store){return'&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;_';}},{header:'Neu',width:30,fixed:true,css:'color: white',dataIndex:'visited',renderer:function(value,metaData,record,rowIndex,colIndex,store){if(value==1){return""}else{if(record.get('tsm')>Tom.MyApp.member.last_login){return'<img src="/icon/new/'+ip+'_16.png">'}else{return'<img src="/icon/unread/'+ip+'_16.png">'}}}},{header:'Name',dataIndex:'title',sortable:true,width:250,filterable:true,renderer:function(value,metaData,record,rowIndex,colIndex,store){return'<a href="Javascript:Tom.MyApp.showTab(\'trail\','
+record.get('idtrails')+')">'+value+'</a>';}},{header:'Land',sortable:true,dataIndex:'idcountries',renderer:function(value,metaData,record,rowIndex,colIndex,store){return Tom.MyApp.getCountry(record.get('idcountries'));}},{header:'S',width:50,sortable:true,align:'center',dataIndex:'s',filterable:true,renderer:function(value,metaData,record,rowIndex,colIndex,store){return'S'+formatS(value);}},{header:'G',width:50,sortable:true,align:'center',dataIndex:'g',filterable:true,renderer:function(value,metaData,record,rowIndex,colIndex,store){return'G'+value;}},{header:'Gegenanstieg [hm]',width:100,sortable:true,align:'right',dataIndex:'alt_up'},{header:'abwärts [hm]',width:100,sortable:true,align:'right',dataIndex:'alt_down'},{header:'Höchster P. [m]',width:100,sortable:true,align:'right',dataIndex:'alt_max'},{header:'Tiefster P. [m]',width:100,sortable:true,align:'right',dataIndex:'alt_min'},{header:'erstellt von',width:250,sortable:true,dataIndex:'creator',renderer:function(value,metaData,record,rowIndex,colIndex,store){return Tom.MyApp.getMember(record.get('creator'));}},{header:'erstellt am',width:100,sortable:true,align:'right',dataIndex:'tsc',renderer:Ext.util.Format.dateRenderer('d.m.Y')}],plugins:[this.cellActions,this.filters]});Tom.TrailList.superclass.initComponent.apply(this,arguments);},onSelectTrail:function(e){}});Tom.WidgetTypeComboBox=Ext.extend(Ext.form.ComboBox,{initComponent:function(){Ext.apply(this,{fieldLabel:'Typ',width:160,name:'wtypecombo',hiddenName:'wtype',hiddenValue:this.wtype||'',value:this.wtype||'',valueField:'wtype',displayField:'label',store:new Ext.data.SimpleStore({fields:['wtype','label'],data:[['','--- Nichts ---'],['Launcher','Schnellstartleiste'],['Version','Neuigkeiten'],['TrailsFav','Trails Favoriten'],['TrailsNew','Neue Trails'],['WeatherProvinzBozen','Wetter Alto Adige'],['Webcam','Webcam']]}),typeAhead:true,mode:'local',triggerAction:'all',emptyText:'Typ auswählen...',selectOnFocus:true,bubbleEvents:['select']});Tom.WidgetTypeComboBox.superclass.initComponent.apply(this,arguments);}});createWidget=function(w){switch(w.wtype){case'Launcher':return new Tom.WidgetLauncher(w);break;case'Version':return new Tom.WidgetVersion(w);break;case'TrailsFav':return new Tom.WidgetTrailsFav(w);break;case'TrailsNew':return new Tom.WidgetTrailsNew(w);break;case'Weather':return new Tom.WidgetWeather(w);break;case'WeatherProvinzBozen':return new Tom.WidgetWeatherProvinzBozen(w);break;case'Webcam':return new Tom.WidgetWebcam(w);break;case'Statistics':return new Tom.WidgetStatistics(w)
break;case'TabWidgetPanel':return new Tom.TabWidgetPanel(w);break;default:Ext.apply({wtype:''},w);return new Tom.Widget(w);}}
Tom.Widget=Ext.extend(Ext.Panel,{subform:{},initComponent:function(){this.flex=parseFloat(((''+this.flex)||'1').replace(/,/,"."));Tom.Widget.superclass.initComponent.apply(this,arguments);},createForm:function(){return new Ext.form.FormPanel({isWidgetFormPanel:true,labelWidth:50,border:false,padding:5,title:this.title||'Leer',wtype:this.wtype,tools:[{id:'up',handler:function(event,toolEl,panel,tc){panel.ownerCt.moveUpFormPanel(panel);},qtip:'Nach oben verschieben'},{id:'down',handler:function(event,toolEl,panel,tc){panel.ownerCt.moveDownFormPanel(panel);},qtip:'Nach unten verschieben'},{id:'close',handler:function(event,toolEl,panel,tc){panel.ownerCt.removeFormPanel(panel);},qtip:'Widget löschen'}],items:new Array(new Tom.WidgetTypeComboBox({wtype:this.wtype}),{xtype:'spinnerfield',fieldLabel:'Höhe',name:'flex',minValue:0.5,maxValue:3,defaultValue:1,allowDecimals:true,defaultValue:1,decimalPrecision:1,incrementValue:0.5,alternateIncrementValue:1.0,accelerate:false,width:50}).concat(this.subform),listeners:{select:function(combo,record,index){if(this.wtype!=record.get('wtype')){this.fireEvent('replaceMe',this,record.get('wtype'));}}},bubbleEvents:['replaceMe']});}});Tom.TabWidgetPanel=Ext.extend(Ext.TabPanel,{flex:1,activeTab:0,subform:{},initComponent:function(){var items=new Array();if(Ext.isArray(this.widgets)){for(var c=0;c<this.widgets.length;c++){var wDef=this.widgets[c];var w=createWidget(wDef);if(!w===false){items.push(w);}}}
switch(this.query){case'webcams':Ext.Ajax.request({scope:this,url:'/queries/poistore/read.php',params:{'idmembers':Tom.MyApp.member.idmembers,'action':'member_has_pois'},success:function(result,request){var k=result;},failure:function(result,request){this.showError('Webcams konnten nicht geladen werden');}});break;}
Ext.apply(this,{defaults:{frame:false,flex:1},flex:1,items:items});Tom.TabWidgetPanel.superclass.initComponent.apply(this,arguments);},createForm:function(){return new Ext.form.FormPanel({items:[new Tom.WidgetTypeComboBox()].concat(this.subform)});}});Tom.WidgetPanel=Ext.extend(Ext.Panel,{initComponent:function(){Ext.apply(this,{layout:'hbox',layoutConfig:{type:'hbox',align:'stretch'},defaults:{frame:false,flex:1},flex:1,items:this.calculateItems(this.widgets)});Tom.WidgetPanel.superclass.initComponent.apply(this,arguments);},updateWidgets:function(widgets){var items=this.calculateItems(widgets);this.removeAll();this.add(items);this.doLayout();},calculateItems:function(widgets){var columns=new Array();if(Ext.isArray(widgets)){for(var c=0;c<widgets.length;c++){var col=widgets[c];var flex=1;var items=new Array();for(var r=0;r<col.length;r++){var wDef=col[r];if(Ext.isDefined(wDef.wtype)){var w=createWidget(wDef);items.push(w);}else if(Ext.isDefined(wDef.flex)){flex=parseFloat(wDef.flex.replace(/,/,".")||1);}}
if(items.length>0){columns.push({layout:'vbox',layoutConfig:{type:'vbox',align:'stretch'},flex:flex,items:items})}}}
return columns;}});Tom.DefaultWidgetConfiguration=[[{"flex":"0.5"},{"wtype":"Launcher","flex":""},{"wtype":"TrailsNew","flex":""},{"wtype":"TrailsFav","flex":""}],[{"flex":"2"},{"wtype":"Webcam","flex":"","idpois":"3"},{"wtype":"WeatherProvinzBozen","flex":"","region":"gardasee"}],[{"flex":"2"},{"wtype":"Version","flex":""}]];Tom.BlankWidget=Ext.extend(Tom.Widget,{title:'Leer',wtype:''});Tom.WidgetLauncher=Ext.extend(Tom.Widget,{title:'Starter',initComponent:function(){Ext.apply(this,{layout:'hbox',layoutConfig:{type:'hbox',align:'stretch',pack:'start'},defaults:{frame:false,flex:1},items:[{layout:'vbox',layoutConfig:{type:'vbox',align:'stretch',pack:'start'},defaults:{frame:false,flex:1},flex:1,items:[new Ext.Button(action_open_map),new Ext.Button(action_traillist),new Ext.Button(action_projectlist),new Ext.Button(action_poilist),new Ext.Button(action_warninglist)]},{layout:'vbox',layoutConfig:{type:'vbox',align:'stretch',pack:'start'},defaults:{frame:false,flex:1},flex:1,items:[new Ext.Button(action_preferences),new Ext.Button(action_new_trail),new Ext.Button(action_new_project),new Ext.Button(action_new_poi),new Ext.Button(action_new_warning)]}]});Tom.WidgetLauncher.superclass.initComponent.apply(this,arguments);}});Tom.WidgetVersion=Ext.extend(Tom.Widget,{title:'Neuigkeiten',initComponent:function(){Ext.apply(this,{autoScroll:true,tpl:new Ext.XTemplate('<h1>Versionsinformation</h1>','<tpl for=".">','<h2>{version}: Codename &quot;{title}&quot; ({date})</h2>','<p>{desc}</p>','<ul class="text">','<tpl for="changes">','<li>{.}</li>','</tpl>','</ul>','</tpl>'),data:Tom.MyApp.history});Tom.WidgetVersion.superclass.initComponent.apply(this,arguments);}});Tom.WidgetStatistics=Ext.extend(Tom.Widget,{title:'Statistik',initComponent:function(){Ext.apply(this,{tpl:new Ext.XTemplate('<h1>Statistik</h1>','<tpl for=".">','<h2>POIs:</h2>','<p>Anzahl: {countPoi}</p>','<ul class="text">','<tpl for="changes">','<li>{.}</li>','</tpl>','</ul>','</tpl>'),data:{}});Tom.WidgetStatistics.superclass.initComponent.apply(this,arguments);if(Tom.MyApp.PoiStore.getTotalCount()==0){Tom.MyApp.PoiStore.on('load',this.updatePoi,this)}else{this.updatePoi();}},updatePoi:function(){this.update({countPoi:Tom.MyApp.PoiStore.getTotalCount()})}});Tom.WidgetTrailsFav=Ext.extend(Tom.Widget,{initComponent:function(){Ext.apply(this,{title:'Meine Favoriten (Trails)',autoScroll:true,items:[new Ext.DataView({store:Tom.MyApp.TrailStore,itemSelector:'div.wtfav',tpl:new Ext.XTemplate('<p><ul><tpl for=".">','<div class="wtfav{[values.fav=="i_fav" ? "" : " x-hide-display"]}" id="{idtrails}">','<a href="Javascript:openTrail({idtrails})">{title}</a>','</div>','</tpl>'+'</ul></p>'),emptyText:'Noch keine Favoriten festgelegt'})]});Tom.WidgetTrailsFav.superclass.initComponent.apply(this,arguments);}});Tom.WidgetTrailsNew=Ext.extend(Tom.Widget,{initComponent:function(){Ext.apply(this,{title:'Neue Trails seit letztem Login',autoScroll:true,items:[new Ext.DataView({store:Tom.MyApp.TrailStore,itemSelector:'div.wtnew',tpl:new Ext.XTemplate('<p><ul><tpl for=".">','<div class="wtnew{[values.fnew=="i_new" ? "" : " x-hide-display"]}" id="{idtrails}">','<a href="Javascript:openTrail({idtrails})">{title}</a>','</div>','</tpl></ul></p>'),emptyText:'Keine neuen Trails seit dem letzten Login vorhanden'})]});Tom.WidgetTrailsNew.superclass.initComponent.apply(this,arguments);}});Tom.WidgetWeather=Ext.extend(Tom.Widget,{initComponent:function(){Ext.apply(this,{subform:[{xtype:'hidden',name:'place'},{xtype:'hidden',name:'lat'},{xtype:'hidden',name:'lng'},{label:'Ort',xtype:'gxux_geonamessearchcombo',width:150,listeners:{'select':{fn:function(combo,record,index){this.ownerCt.getForm().setValues({place:record.get('place'),lat:record.get('lat'),lng:record.get('lng')})}}}}],store:new Ext.data.Store({proxy:new Ext.data.ScriptTagProxy({url:'http://www.worldweatheronline.com/feed/weather.ashx',method:'GET'}),baseParams:{q:this.lat+','+this.lng,format:'xml',num_of_days:4,key:'6e2cab9a32192612100908'},reader:new Ext.data.XmlReader({record:"data"},Ext.data.Record.create([{name:'current_condition'},{name:'weather'}])),listeners:{load:{fn:function(store,records,options){alert('asdf');},scope:this}},autoLoad:true}),items:[new Ext.XTemplate('<tpl for=".">','<div class="widgetweather" id="{id}">','<h2>Wetter für {place} ({lat}/{lng}):</h2>','<tpl for="current_condition">','<div><h3>Aktuell</h3>'
+'<img src="/iconstatic/weather/w{weatherCode}.png" alt="{weatherDesc}" title="{weatherDesc}" width="48" height="48">'
+'</div>','<tpl for="weather">','<div><h3>{date}</h3>'
+'<img src="/iconstatic/weather/{weatherCode}.png" alt="{weatherDesc}" title="{weatherDesc}" width="48" height="48">'
+'</div>','</tpl>','</div>','</tpl>')],listeners:{'render':function(){this.store.load();}}});Tom.WidgetWeather.superclass.initComponent.apply(this,arguments);}});Tom.WidgetWeatherProvinzBozen=Ext.extend(Tom.Widget,{initComponent:function(){switch(this.region){case'suedtirol':var title='Wetter Südtirol';break;case'gardasee':var title='Wetter Gardasee';break;}
Ext.apply(this,{title:title,layout:'table',title:'Wettervorschau',tools:[{id:'refresh',handler:function(event,toolEl,panel,tc){panel.fetchData();},qtip:'Wetterbericht aktualisieren',scope:this}],hideBorders:true,layoutConfig:{columns:2},autoScroll:true,subform:[{xtype:'combo',fieldLabel:'Region',width:160,name:'regioncombo',hiddenName:'region',hiddenValue:this.region||'suedtirol',value:this.region||'suedtirol',valueField:'region',displayField:'label',store:new Ext.data.SimpleStore({fields:['region','label'],data:[['suedtirol','Südtirol'],['gardasee','Gardasee']]}),typeAhead:true,mode:'local',triggerAction:'all',emptyText:'Typ auswählen...',allowBlank:false,selectOnFocus:true}],items:[{xtype:'box',autoEl:{tag:'img',src:'/images/ajax-loader.gif'}},{}]});Tom.WidgetWeatherProvinzBozen.superclass.initComponent.apply(this,arguments);this.fetchData();},fetchData:function(){switch(this.region){case'suedtirol':var urlMeteo='http://www.provinz.bz.it/wetter/suedtirol.asp';var regImgHeute=/src="(http:\/\/www\.provinz\.bz\.it\/wetter\/graphics\.asp\?type=meteomap0.*?)"/;var regImgMorgen=/src="(http:\/\/www\.provinz\.bz\.it\/wetter\/graphics\.asp\?type=meteomap1.*?)"/;var regBerichtHeute=/<h3>(Das Wetter heute[\S\s]*?)<\/div>/mg;var regBerichtMorgen=/<h3>(Das Wetter morgen[\S\s]*?)<\/div>/mg;break;case'gardasee':var urlMeteo='http://www.provinz.bz.it/wetter/gardasee.asp';var regImgHeute=/src="(http:\/\/www\.provinz\.bz\.it\/wetter\/graphics\.asp\?type=gardamap0.*?)"/;var regImgMorgen=/src="(http:\/\/www\.provinz\.bz\.it\/wetter\/graphics\.asp\?type=gardamap1.*?)"/;var regBerichtHeute=/<h3>(Das Wetter heute[\S\s]*?)<\/div>/mg
var regBerichtMorgen=/<h3>(Das Wetter morgen[\S\s]*?)<\/div>/mg
break;}
var a1='<a href="'+urlMeteo+'" target="_blank">';var a2='</a>';Ext.Ajax.request({url:'/queries/fetch.php',params:{idmembers:Tom.MyApp.member.idmembers,target:urlMeteo},scope:this,success:function(response,opts){this.removeAll();var imgUrl=response.responseText.match(regImgHeute);var bericht=response.responseText.match(regBerichtHeute);try{var heute=Ext.util.Format.htmlDecode(imgUrl[1]);this.add({html:bericht[0].replace("</div>",""),cellCls:'valignTop'});}catch(e){this.add({html:"Wetterbericht konnte nicht abgerufen werden",cellCls:'valignTop'});}
try{this.add({xtype:'tom_image',imageUrl:heute,cellCls:'valignTop'});}catch(e){this.add({html:"Wetterbericht konnte nicht abgerufen werden",cellCls:'valignTop'});}
var imgUrl=response.responseText.match(regImgMorgen);var bericht=response.responseText.match(regBerichtMorgen);try{var morgen=Ext.util.Format.htmlDecode(imgUrl[1]);this.add({html:bericht[0].replace("</div>",""),cellCls:'valignTop'});}catch(e){this.add({html:"Wetterbericht konnte nicht abgerufen werden",cellCls:'valignTop'});}
try{this.add({xtype:'tom_image',imageUrl:morgen,cellCls:'valignTop'});}catch(e){this.add({html:"Wetterbericht konnte nicht abgerufen werden",cellCls:'valignTop'});}
this.doLayout();},failure:function(){this.removeAll();this.add({html:'Wetterbericht konnte nicht abgerufen werden.'});}});}});Tom.WidgetWebcam=Ext.extend(Tom.Widget,{initComponent:function(){Ext.apply(this,{title:'Webcam',layout:'fit',tools:[{id:'refresh',handler:function(event,toolEl,panel,tc){panel.loadWebcamData();},qtip:'Webcam aktualisieren',scope:this}],subform:[{xtype:'combo',fieldLabel:'Webcam',width:160,name:'regioncombo',hiddenName:'idpois',hiddenValue:this.idpois||1,value:this.idpois||1,valueField:'idpois',displayField:'title',store:Ext.StoreMgr.get('webcamCombo'),typeAhead:true,mode:'local',triggerAction:'all',emptyText:'Typ auswählen...',allowBlank:false,selectOnFocus:true}],items:[]});Tom.WidgetWebcam.superclass.initComponent.apply(this,arguments);if(!this.silent){if(Tom.MyApp.PoiStore.getTotalCount()==0){Tom.MyApp.PoiStore.on('load',this.loadWebcamData,this)}else{this.loadWebcamData();}}},loadWebcamData:function(){var poiRecord=Tom.MyApp.PoiStore.getById(this.idpois);if(Ext.isDefined(poiRecord)){this.setTitle(poiRecord.get('title'));this.removeAll();this.add({xtype:'tom_image',imageUrl:poiRecord.get('config').imgUrl||'',forceReload:true})
this.doLayout();}}});Tom.WidgetEditorColumn=Ext.extend(Ext.Panel,{constructor:function(config){colId=config.colId;config=Ext.apply({itemId:'col'+colId,layout:'vbox',layoutConfig:{align:'stretch'},items:[{xtype:'form',isColumnDef:true,title:'SPALTE '+(colId+1),padding:5,tools:[{id:'left',handler:function(event,toolEl,panel,tc){var col=this.ownerCt.items.indexOf(this);if(col>0){this.ownerCt.swapColumns(col,col
-1);}},scope:this,qtip:'Ganze Spalte nach links verschieben'},{id:'right',handler:function(event,toolEl,panel,tc){var col=this.ownerCt.items.indexOf(this);if(col<this.ownerCt.items.getCount()
-2){this.ownerCt.swapColumns(col,col
+1);}},scope:this,qtip:'Ganze Spalte nach rechts verschieben'},{id:'close',handler:function(event,toolEl,panel,tc){this.ownerCt.removeColumn(this);},scope:this,qtip:'Ganze Spalte löschen'}],items:[{xtype:'spinnerfield',isColumnDef:true,fieldLabel:'Spaltenbreite',name:'flex',minValue:0.5,maxValue:3,value:config.colFlex||1,defaultValue:1,allowDecimals:true,decimalPrecision:1,incrementValue:0.5,alternateIncrementValue:1.0,accelerate:false,allowBlank:false,width:50}]},config.widgetItems||new Array(),{xtype:'button',text:'Neues Widget',icon:'/icon/add/'+ip+'_16.png',myCol:'col'+colId,handler:function(){var col=this.ownerCt.ownerCt.getComponent(this.myCol);col.insert(col.items.length-1,new Tom.BlankWidget({silent:true}).createForm());col.doLayout();}}]},config);this.addEvents({"replaceMe":true});this.on('replaceMe',function(formPanel,newWtype){var insertPos=this.items.indexOf(formPanel);this.remove(formPanel);var w=createWidget({wtype:newWtype,silent:true});if(w){this.insert(insertPos,w.createForm());}
this.doLayout();})
this.listeners=config.listeners;Tom.WidgetEditorColumn.superclass.constructor.call(this,config);},removeFormPanel:function(panel){this.remove(panel);this.doLayout();},moveUpFormPanel:function(panel){var currentpos=this.items.indexOf(panel);if(currentpos>1){var w=panel.getForm().getValues();this.remove(panel);this.insert(currentpos-1,createWidget(Ext.apply({silent:true},w)).createForm());this.doLayout();}},moveDownFormPanel:function(panel){var currentpos=this.items.indexOf(panel);if(currentpos<this.items.getCount()-2){var w=panel.getForm().getValues();this.remove(panel);this.insert(currentpos+1,createWidget(Ext.apply({silent:true},w)).createForm());this.doLayout();}}});Tom.WidgetEditorPanel=Ext.extend(Ext.Panel,{initComponent:function(){this.webcamStore=new Ext.data.Store({storeId:'webcamCombo',proxy:new Ext.data.HttpProxy({api:{read:'/queries/poistore/read.php'}}),baseParams:{idmembers:Tom.MyApp.member.idmembers,action:'webcams'},autoLoad:true,reader:new Ext.data.JsonReader({successProperty:'success',idProperty:'idpois',root:'data'},Tom.PoiDef)});columns=this.widgets2form(this.widgets);Ext.apply(this,{layout:'hbox',layoutConfig:{align:'stretch',pack:'start'},defaults:{flex:0,width:250},items:columns});Tom.WidgetEditorPanel.superclass.initComponent.apply(this,arguments);},widgets2form:function(widgets){var columns=new Array();if(Ext.isArray(widgets)){for(var c=0;c<widgets.length;c++){var col=widgets[c];var items=new Array();var colFlex=1;for(var r=0;r<col.length;r++){var wDef=col[r];if(Ext.isDefined(wDef.wtype)){var w=createWidget(Ext.apply({silent:true},wDef));var formpanel=w.createForm();formpanel.getForm().setValues(w);items.push(formpanel);}else if(Ext.isDefined(wDef.flex)){colFlex=parseFloat(wDef.flex||1);}}
if(items.length>0){columns.push(new Tom.WidgetEditorColumn({colId:c,colFlex:colFlex,widgetItems:items}));}}}
columns.push({xtype:'button',text:'Neue Spalte',width:100,icon:'/icon/add/'+ip+'_16.png',handler:function(){var colId=this.items.length-1
this.insert(colId,new Tom.WidgetEditorColumn({colId:colId}));this.doLayout();this.ownerCt.doLayout();},scope:this});return columns;},form2widgets:function(){var widgets=new Array();this.items.each(function(col){if(Ext.isDefined(col.items)){var colWidgets=new Array();col.items.each(function(w){if(w.isWidgetFormPanel){colWidgets.push(w.getForm().getValues());}else if((w.isColumnDef)){colWidgets.push(w.getForm().getValues());}});widgets.push(colWidgets);}});return widgets;},swapColumns:function(col1,col2){var widgets=this.form2widgets();var tmp=widgets[col1];widgets[col1]=widgets[col2];widgets[col2]=tmp;this.updateForm(widgets);},removeColumn:function(col){this.remove(col);this.doLayout();},updateForm:function(widgets){this.removeAll();this.add(this.widgets2form(widgets));this.doLayout();}});Tom.TrailEProfile=Ext.extend(Ext.BoxComponent,{px:new Array(),py:new Array(),afterRender:function(ct,position){Tom.TrailEProfile.superclass.afterRender.apply(this,arguments);this.draw();},onResize:function(w,h){Tom.TrailEProfile.superclass.onResize.call(this,w,h);if(!w||!h){return;}
this.draw();},setSize:function(w,h,animate){Tom.TrailEProfile.superclass.setSize.call(this,w,h,animate);if(!w||!h){return;}
this.draw();},updateProfile:function(pt){this.px=new Array();this.py=new Array();if(Ext.isArray(pt)&&pt.length>0){this.px.push(0);this.py.push(pt[0].altitude());var p,c;for(var i=1;i<pt.length;i++){p=pt[i-1];c=pt[i];this.px.push(this.px[i-1]+c.distanceFrom(p));this.py.push(c.altitude());};this.draw();}},draw:function(){if(!Ext.isDefined(this.el.id))
return;if(!this.el.getWidth()>0)
return;if(!this.el.getHeight()>0)
return;if(!this.px.length>0)
return;if(!this.py.length>0)
return;var r=Raphael(this.el.id,this.el.getWidth(),this.el.getHeight());var lines=r.g.linechart(0,0,this.el.getWidth(),this.el.getHeight(),new Array(this.px),new Array(this.py),{nostroke:false,gutter:40,axis:"0 0 1 1",smooth:false}).hoverColumn(function(){this.tags=r.set();for(var i=0,ii=this.y.length;i<ii;i++){this.tags.push(r.g.tag(this.x,this.y[i],this.values[i],30,10).insertBefore(this).attr([{fill:"#fff"},{fill:'#000000'}]));}},function(){this.tags&&this.tags.remove();});}});Tom.NotificationArea=Ext.extend(Ext.Window,{constructor:function(config){config=config||{};Ext.apply(config,{layout:'fit',title:'Benachrichtigungen',closable:false,autoHeight:true,width:300,target:config.target||new Ext.Element(),shadow:false});this.hidePanelTask=new Ext.util.DelayedTask(function(){this.hide();},this),Tom.NotificationArea.superclass.constructor.call(this,config);},addMsg:function(msg,iconCls,options){try{var pos=this.target.getPosition();this.setPosition(pos[0]-300+22,pos[1]+22);this.doMsg(msg,iconCls,options);}catch(e){this.target=Ext.getCmp('infobox');new Ext.util.DelayedTask(function(){this.addMsg(msg,iconCls,options);},this).delay(1000);}},doMsg:function(msg,iconCls,options){msg=msg||'';iconCls=iconCls||'i_info';options=options||{};var newEntry=this.insert(0,new Ext.BoxComponent({layout:'fit',autoHeight:true,ctcls:'i_Left '+iconCls,html:msg}));this.doLayout();if(Ext.isNumber(options.autoHide)){new Ext.util.DelayedTask(function(){this.remove(newEntry);this.doLayout();},this).delay(options.autoHide);this.hidePanelTask.delay(options.autoHide);}else{this.hidePanelTask.cancel();}
this.show();},show:function(){if(this.items.length==0){var newEntry=this.insert(0,new Ext.BoxComponent({layout:'fit',autoHeight:true,ctcls:'i_Left i_info',html:'Keine Benachrichtigungen vorhanden'}));this.doLayout();new Ext.util.DelayedTask(function(){this.remove(newEntry);this.doLayout();},this).delay(5000);this.hidePanelTask.delay(5000);}
Tom.NotificationArea.superclass.show.call(this);}});Tom.StatusBox=Ext.extend(Ext.Container,{initComponent:function(){Ext.apply(this,{html:'Filter'});Tom.StatusBox.superclass.initComponent.apply(this,arguments);},setTrailsTotal:function(num){this.trailsTotal=num;this.update();},setTrailsFiltered:function(num){this.trailsFiltered=num;this.update();},setPoisTotal:function(num){this.poisTotal=num;this.update();},setPoisFiltered:function(num){this.poisFiltered=num;this.update();},update:function(){this.el.update(this.poisFiltered+" von "+this.poisTotal
+" POIs"+" | "+this.trailsFiltered+" von "+this.trailsTotal
+" Trails");this.doLayout();}});Ext.namespace('MAPS');GPolygon.prototype.containsLatLng=function(latLng){var bounds=this.getBounds();if(bounds!=null&&!bounds.containsLatLng(latLng)){return false;}
var numPoints=this.getVertexCount();var inPoly=false;var i;var j=numPoints-1;for(var i=0;i<numPoints;i++){var v1=this.getVertex(i);var v2=this.getVertex(j);if(v1.lng()<latLng.lng()&&v2.lng()>=latLng.lng()||v2.lng()<latLng.lng()&&v1.lng()>=latLng.lng()){if(v1.lat()+(latLng.lng()-v1.lng())/(v2.lng()-v1.lng())*(v2.lat()-v1.lat())<latLng.lat()){inPoly=!inPoly;}}
j=i;}
return inPoly;};MAPS.counter=0;MAPS.next=function(max){MAPS.counter=Math.min((MAPS.counter+1)%(max+1),max);return MAPS.counter;}
MAPS.random=function(max){return Math.floor(Math.random()*max+1);};MAPS.encodeQuadTree=function(tileX,tileY,level){var quadKey="";for(var i=level;i>0;i--){var digit=0;var mask=1<<(i-1);if((tileX&mask)!=0){digit++;}
if((tileY&mask)!=0){digit++;digit++;}
quadKey+=digit;}
return quadKey;};MAPS.Rectangle=function(bounds,opt_weight,opt_color){this.firstCorner_=bounds.getNorthEast();this.secondCorner_=bounds.getSouthWest();this.bounds_=bounds;this.weight_=opt_weight||2;this.color_=opt_color||"#888888";}
MAPS.Rectangle.prototype=new google.maps.Overlay();MAPS.Rectangle.prototype.initialize=function(map){var div=document.createElement("div");div.style.border=this.weight_+"px solid "+this.color_;div.style.position="absolute";map.getPane(G_MAP_MAP_PANE).appendChild(div);this.map_=map;this.div_=div;}
MAPS.Rectangle.prototype.remove=function(){this.div_.parentNode.removeChild(this.div_);}
MAPS.Rectangle.prototype.copy=function(){return new MAPS.Rectangle(this.bounds_,this.weight_,this.color_,this.backgroundColor_,this.opacity_);}
MAPS.Rectangle.prototype.redraw=function(force){if(!force)
return;var c1=this.map_.fromLatLngToDivPixel(this.bounds_.getSouthWest());var c2=this.map_.fromLatLngToDivPixel(this.bounds_.getNorthEast());this.div_.style.width=Math.abs(c2.x-c1.x)+"px";this.div_.style.height=Math.abs(c2.y-c1.y)+"px";this.div_.style.left=(Math.min(c2.x,c1.x)-this.weight_)+"px";this.div_.style.top=(Math.min(c2.y,c1.y)-this.weight_)+"px";}
MAPS.Rectangle.prototype.moveCorner=function(latlng){this.secondCorner_=latlng;this.bounds_=new google.maps.LatLngBounds(this.firstCorner_,this.secondCorner_);this.redraw(true);}
MAPS.Rectangle.prototype.endMove=function(){this.remove();this.latMax=this.bounds_.getSouthWest().lat();this.lngMin=this.bounds_.getSouthWest().lng();this.latMin=this.bounds_.getNorthEast().lat();this.lngMax=this.bounds_.getNorthEast().lng();}
MAPS.Rectangle.prototype.insideBounds=function(latlng){return(this.latMin<latlng.lat()&&latlng.lat()<this.latMax&&this.lngMin<latlng.lng()&&latlng.lng()<this.lngMax);}
MAPS.TrackPoint=function(c){this.myLat=Number(c.lat||c.myLat);this.myLng=Number(c.lng||c.myLng);this.config=c.config||{};}
MAPS.TrackPoint.prototype.toLatLng=function(){return new google.maps.LatLng(this.myLat,this.myLng);}
MAPS.TrackPoint.prototype.lat=function(){return this.myLat||0;}
MAPS.TrackPoint.prototype.lng=function(){return this.myLng||0;}
MAPS.TrackPoint.prototype.altitude=function(){return this.config.a||0;}
MAPS.TrackPoint.prototype.distanceFrom=function(otherPt){var lng=otherPt.lng()||0;var lat=otherPt.lat()||0;if(Ext.isDefined(otherPt)){return(Math.sqrt(Math.pow(71.5*(this.lng()-lng),2)
+Math.pow(111.3*(this.lat()-lat),2)))*1000}else{return 0;}}
MAPS.TrackPoint.prototype.move=function(lat,lng){this.myLat=lat;this.myLng=lng;}
MAPS.TrackPoint.prototype.toString=function(){return this.myLat+"#"+this.myLng+"#"+(this.config.hpx||"")+"#"
+(this.config.a||"")+"#"+(this.config.sec||"")+"#"
+(this.config.label||"")+"#"+(this.config.labelpos||"");}
function currentTrackEditorGetClosestPoint(latlng){var len=currentTrackEditor.pl.getVertexCount();var minDist=1E10;var minI=0;for(i=0;i<len;i++){dist=latlng.distanceFrom(currentTrackEditor.pl.getVertex(i));if(dist<minDist){minI=i;minDist=dist;}}
currentTrackEditor.closestVertexIndex=minI;currentTrackEditor.closestVertex=currentTrackEditor.pl.getVertex(minI);}
function currentTrackEditorAcceptTruncate(){currentTrackEditor.acceptTruncate();}
function currentTrackEditorReverseTruncate(){currentTrackEditor.clearPreviewTruncateTrack();currentTrackEditor.previewTruncatedTrack(!currentTrackEditor.previewTruncateFromStart)
currentTrackEditor.showTruncateMenu();}
function currentTrackEditorCancelTruncate(){currentTrackEditor.clearPreviewTruncateTrack();}
MAPS.TrackEditor=function(rwAccess){this.pt=new Array();this.plColor='#FF0000';this.plWeight=5;this.plOpacity=1;this.pl=new google.maps.Polyline(new Array(),this.plColor,this.plWeight,this.plOpacity);this.undos=new Array();this.redos=new Array();this.undoSteps=10;this.selectionRectangle=new MAPS.Rectangle(new google.maps.LatLngBounds());this.selectedKeys=new Array();this.rwAccess=rwAccess;};MAPS.TrackEditor.prototype.hasValidTrack=function(){return(this.pt.length>=2);}
MAPS.TrackEditor.prototype.addAsOverlay=function(map){this.map=map;this.map.myEditor=this;this.pt2pl();this.previewPl=new google.maps.Polyline(new Array());this.map.addOverlay(this.previewPl);var gIconStart=new google.maps.Icon();gIconStart.image="/iconstatic/gm_start_64.png";gIconStart.iconSize=new google.maps.Size(64,64);gIconStart.iconAnchor=new google.maps.Point(32,32);var gIconEnd=new google.maps.Icon(gIconStart);gIconEnd.image="iconstatic/gm_end_64.png";this.markerStart=new BpMarkerLight(new google.maps.LatLng(),{icon:gIconStart});this.markerEnd=new BpMarkerLight(new google.maps.LatLng(),{icon:gIconEnd});map.addOverlay(this.markerStart);map.addOverlay(this.markerEnd);this.markerStart.hide();this.markerEnd.hide();};MAPS.TrackEditor.prototype.clear=function(){this.snapshot();this.pt=new Array();this.undos=new Array();this.redos=new Array();this.pt2pl();}
MAPS.TrackEditor.prototype.plClear=function(plNew){if(Ext.isDefined(this.pl)){this.map.removeOverlay(this.pl);}
this.pl=plNew||new google.maps.Polyline(new Array(),this.plColor,this.plWeight,this.plOpacity);if(this.pl.getVertexCount()>0){this.plBounds=this.pl.getBounds();}else{this.plBounds=new google.maps.LatLngBounds();}
this.pl.myEditor=this;this.map.addOverlay(this.pl);return true;};MAPS.TrackEditor.prototype.pt2pl=function(){this.plClear();var len=this.pt.length;var p;for(var i=0;i<len;i++){p=this.pt[i].toLatLng();this.pl.insertVertex(i,p);this.plBounds.extend(p);};this.pl.redraw(true);return true;};MAPS.TrackEditor.prototype.pl2ptFullReplace=function(){this.pt=new Array();var plLen=this.pl.getVertexCount();for(var i=0;i<plLen;i++){var c=this.pl.getVertex(i);this.pt.push(new MAPS.TrackPoint({lat:c.lat(),lng:c.lng()}));}};MAPS.TrackEditor.prototype.pl2ptOnePoint=function(){var plLen=this.pl.getVertexCount();var ptLen=this.pt.length;var action=plLen-ptLen;for(var i=0;i<Math.min(ptLen,plLen);i++){var c=this.pl.getVertex(i);if((c.lat()!=this.pt[i].lat())||(c.lng()!=this.pt[i].lng())){switch(action){case 1:this.pt.splice(i,0,new MAPS.TrackPoint({lat:c.lat(),lng:c.lng()}));return true;break;case 0:this.pt[i].move(c.lat(),c.lng());return true;break;case-1:this.pt.splice(i,1);return true;break;default:return false;}};};switch(action){case 1:var c=this.pl.getVertex(i);this.pt.push(new MAPS.TrackPoint({lat:c.lat(),lng:c.lng()}));return true;break;case-1:this.pt.pop();return true;break;}
return false;};MAPS.TrackEditor.prototype.hasTrack=function(){if(this.pt.length>1){return true;}else{Ext.MessageBox.alert('Kein Track vorhanden','Der Track muss mindestens 2 Punkte lang sein!')
return false;}};MAPS.TrackEditor.prototype.importTrack=function(data,config){if(!Ext.isString(data)){return false;}
var newPt=new Array();var format=config.format;if(!Ext.isDefined(format)){if(data.search(/.*#.*#.*#.*\|/)>=0){format="db";}else if(data.search(/.*;.*;.*/)>=0){format="parser";}}
switch(format){case"db":lines=data.split("|");var len=lines.length;for(var i=0;i<len;i++){Tom.MyApp.showTip(i+"/"+len);point=lines[i].split("#");if(point.length==7){newPt.push(new MAPS.TrackPoint({lat:point[0],lng:point[1],config:{hpx:point[2],a:point[3],sec:point[4],label:point[5],labelpos:point[6]}}));}}
break;case"parser":lines=data.split("\n");var len=lines.length;for(var i=0;i<len;i++){point=lines[i].split(";");if(point.length>2){newPt.push(new MAPS.TrackPoint({lat:point[0],lng:point[1],config:{a:point[2]}}));}}
break;default:break;}
if(newPt.length>0){this.snapshot();switch(config.insertMode){case"append":this.pt=this.pt.concat(newPt);break;case"prepend":this.pt=newPt.concat(this.pt);break;default:this.pt=newPt;break;}
this.pt2pl();this.zoomFit();return true;}else{return false;}};MAPS.TrackEditor.prototype.importEncodedPoly=function(encLatLngs,encLevels){if(!Ext.isString(encLatLngs)&&!Ext.isString(encLevels)){return false;}
if(encLatLngs.length==0||encLevels.length==0){return false;}
this.snapshot();this.plClear(new google.maps.Polyline.fromEncoded({color:this.plColor,weight:this.plWeight,opacity:this.plOpacity,points:encLatLngs,levels:encLevels,zoomFactor:2,numLevels:18}));this.pl2ptFullReplace();this.zoomFit();};MAPS.TrackEditor.prototype.toDB=function(){var data="";var len=this.pt.length;for(var i=0;i<len;i++){data+=this.pt[i].toString()+'|';}
return data;}
MAPS.TrackEditor.prototype.exportTrack=function(format){switch(format){case"gpx":Tom.Download({mode:'gpstrack',gpsformat:'gpx',title:'',data:this.toDB()});return true;break;}};MAPS.TrackEditor.prototype.getEncodedPoly=function(){var polylineEncoder=new PolylineEncoder();var t=polylineEncoder.dpEncodeToJSON(this.pt);return t;}
MAPS.TrackEditor.prototype.undo=function(){if(this.undos.length>0){this.redos=new Array(Ext.encode(this.pt)).concat(this.redos);var tmp=Ext.decode(this.undos.shift());var len=tmp.length;this.pt=new Array();for(var i=0;i<len;i++){this.pt.push(new MAPS.TrackPoint(tmp[i]));}
this.pt2pl();}}
MAPS.TrackEditor.prototype.redo=function(){if(this.redos.length>0){this.undos=new Array(Ext.encode(this.pt)).concat(this.undos);var tmp=Ext.decode(this.redos.shift());var len=tmp.length;this.pt=new Array();for(var i=0;i<len;i++){this.pt.push(new MAPS.TrackPoint(tmp[i]));}
this.pt2pl();}}
MAPS.TrackEditor.prototype.snapshot=function(){while(this.undos.length>=this.undoSteps){this.undos.pop();}
this.undos=new Array(Ext.encode(this.pt)).concat(this.undos);this.redos=new Array();}
MAPS.TrackEditor.prototype.plChanged=function(){this.snapshot();this.pl2ptOnePoint();};MAPS.TrackEditor.prototype.enableDrawing=function(fromStart){this.pl.enableDrawing({fromStart:fromStart});this.updateListener=google.maps.Event.addListener(this.pl,"lineupdated",function(){this.myEditor.plChanged();});this.endlineListener=google.maps.Event.addListener(this.pl,"endline",function(){untoggleEditModeButtons();});};MAPS.TrackEditor.prototype.disableDrawing=function(){this.pl.disableEditing();google.maps.Event.removeListener(this.updateListener);google.maps.Event.removeListener(this.endlineListener);};MAPS.TrackEditor.prototype.enableEditing=function(){this.pl.enableEditing();this.rmbListener=google.maps.Event.addListener(this.pl,"click",function(latlng,index){if(typeof index=="number"){this.myEditor.pl.deleteVertex(index);this.myEditor.pl2ptOnePoint();}});this.updateListener=google.maps.Event.addListener(this.pl,"lineupdated",function(){this.myEditor.plChanged();});};MAPS.TrackEditor.prototype.disableEditing=function(){this.pl.disableEditing();google.maps.Event.removeListener(this.rmbListener);google.maps.Event.removeListener(this.updateListener);};MAPS.TrackEditor.prototype.reverse=function(){this.snapshot();this.pt.reverse();this.pt2pl();this.markersShowOnce();};MAPS.TrackEditor.prototype.clearPreviewSimplifiedTrack=function(){if(Ext.isDefined(this.previewPl)){this.map.removeOverlay(this.previewPl);}}
MAPS.TrackEditor.prototype.previewSimplifiedTrack=function(precision){var sim=GDouglasPeucker(this.pt,Math.abs(10*precision));this.clearPreviewSimplifiedTrack();this.previewPl=new google.maps.Polyline(new Array(),"#CC0000");this.map.addOverlay(this.previewPl);var len=sim.length;var p;for(var i=0;i<len;i++){p=sim[i].toLatLng();this.previewPl.insertVertex(i,p);};this.previewPl.redraw(true);};MAPS.TrackEditor.prototype.simplifyTrack=function(precision){this.snapshot();this.pt=GDouglasPeucker(this.pt,Math.abs(10*precision));this.pt2pl();};MAPS.TrackEditor.prototype.addTruncateListener=function(precision){currentTrackEditor=this;this.truncateListener=google.maps.Event.addListener(this.pl,"click",function(latlng){currentTrackEditorGetClosestPoint(latlng);this.myEditor.previewTruncatedTrack(false);this.myEditor.showTruncateMenu();});};MAPS.TrackEditor.prototype.showTruncateMenu=function(){google.maps.Event.removeListener(currentTrackEditor.truncateListener);this.truncateControl=new BpLabel(this.closestVertex,'<a href="javascript:currentTrackEditorAcceptTruncate()"><img src="/icon/ok/'
+ip
+'_16.png"></a>'
+'<a href="javascript:currentTrackEditorReverseTruncate()"><img src="/iconstatic/edit_reverse_16.png"></a>'
+'<a href="javascript:currentTrackEditorCancelTruncate()"><img src="/icon/cancel/'
+ip+'_16.png"></a>','','nw',false);this.map.addOverlay(this.truncateControl);}
MAPS.TrackEditor.prototype.previewTruncatedTrack=function(fromStart){this.previewTruncateFromStart=fromStart;var len=this.pt.length;if((len>0)&&(this.closestVertexIndex>0)&&(this.closestVertexIndex<len-1)){this.clearPreviewSimplifiedTrack();this.previewPl=new google.maps.Polyline(new Array(),"#CC0000");this.map.addOverlay(this.previewPl);if(fromStart){start=this.closestVertexIndex;end=len;}else{start=0;end=this.closestVertexIndex+1;}
var p;for(var i=start;i<end;i++){p=this.pt[i].toLatLng();this.previewPl.insertVertex(i,p);};this.previewPl.redraw(true);}};MAPS.TrackEditor.prototype.acceptTruncate=function(){this.snapshot();if(this.previewTruncateFromStart){this.pt.splice(0,this.closestVertexIndex);}else{this.pt.splice(this.closestVertexIndex+1,this.pt.length
-this.closestVertexIndex);}
this.pt2pl();this.clearPreviewTruncateTrack();}
MAPS.TrackEditor.prototype.cancelTruncate=function(){this.clearPreviewTruncateTrack();}
MAPS.TrackEditor.prototype.clearPreviewTruncateTrack=function(){this.map.removeOverlay(this.truncateControl);this.clearPreviewSimplifiedTrack();}
MAPS.TrackEditor.prototype.startSelection=function(){this.startSelectionListener=google.maps.Event.addListener(this.map,"click",function(overlay,latlng,index){this.myEditor.selectionRectangle=new MAPS.Rectangle(new google.maps.LatLngBounds(latlng,latlng));this.addOverlay(this.myEditor.selectionRectangle);google.maps.Event.removeListener(this.myEditor.startSelectionListener);this.myEditor.duringSelectionListener=google.maps.Event.addListener(this,"mousemove",function(latlng){this.myEditor.selectionRectangle.moveCorner(latlng);});this.myEditor.stopSelectionListener=google.maps.Event.addListener(this,"click",function(overlay,latlng){google.maps.Event.removeListener(this.myEditor.duringSelectionListener);google.maps.Event.removeListener(this.myEditor.stopSelectionListener);this.myEditor.selectionRectangle.endMove();this.myEditor.selectionChanged();});});}
MAPS.TrackEditor.prototype.selectionChanged=function(){this.selectedKeys=new Array();for(var i=0;i<this.pt.length;i++){if(this.selectionRectangle.insideBounds(this.pt[i].toLatLng())){this.selectedKeys.push(i);}}};MAPS.TrackEditor.prototype.markersShowOnce=function(){var len=this.pt.length;if(len>1){this.markerStart.setPoint(this.pt[0].toLatLng());this.markerEnd.setPoint(this.pt[len-1].toLatLng());this.markerStart.show();this.markerEnd.show();var hideMarkers=new Ext.util.DelayedTask(function(){this.markerStart.hide();this.markerEnd.hide();},this);hideMarkers.delay(5000);}}
MAPS.TrackEditor.prototype.zoomFit=function(){this.map.setCenter(this.plBounds.getCenter(),this.map.getBoundsZoomLevel(this.plBounds));return true;};MAPS.TrackEditor.prototype.getLabelLat=function(){if(this.hasTrack()){return this.pt[Math.floor(this.pt.length/2)].lat();}else{return 0;}}
MAPS.TrackEditor.prototype.getLabelLng=function(){if(this.hasTrack()){return this.pt[Math.floor(this.pt.length/2)].lng();}else{return 0;}}
MAPS.TrackEditor.prototype.getTrackBounds=function(){if(this.hasTrack()){var bounds=this.pl.getBounds();var sw=bounds.getSouthWest();var ne=bounds.getNorthEast();return sw.lat()+","+sw.lng()+","+ne.lat()+","+ne.lng();}else{return'0,0,0,0';}}
MAPS.TrackEditor.prototype.getTrackProperties=function(){if(!this.hasValidTrack()){return false;}
var prop={alt_down:0,alt_up:0,alt_max:this.pt[0].config.a,alt_min:this.pt[0].config.a,len:0}
for(var i=1;i<this.pt.length;i++){p=this.pt[i-1];c=this.pt[i];var deltaA=c.altitude()-p.altitude();if(deltaA>0){prop.alt_up+=deltaA;}else{prop.alt_down-=deltaA;}
prop.alt_max=Math.max(prop.alt_max,c.altitude());prop.alt_min=Math.min(prop.alt_min,c.altitude());prop.len+=c.distanceFrom(p);};return prop;};MAPS.TrackEditor.prototype.getTrackProperties=function(){if(!this.hasValidTrack()){return false;}
var prop={alt_down:0,alt_up:0,alt_max:this.pt[0].config.a,alt_min:this.pt[0].config.a,len:0}
for(var i=1;i<this.pt.length;i++){p=this.pt[i-1];c=this.pt[i];var deltaA=c.config.a-p.config.a;if(deltaA>0){prop.alt_up+=deltaA;}else{prop.alt_down-=deltaA;}
prop.alt_max=Math.max(prop.alt_max,c.config.a);prop.alt_min=Math.min(prop.alt_min,c.config.a);prop.len+=(Math.sqrt(Math.pow(71.5*(c.lng()-p.lng()),2)
+Math.pow(111.3*(c.lat()-p.lat()),2)))*1000;};return prop;};MAPS.customBasemap=function(title,options){this.copyright=new google.maps.Copyright(1,new google.maps.LatLngBounds(new google.maps.LatLng(-90,-180),new google.maps.LatLng(90,180)),0,options.copyrightText);this.copyrightCollection=new google.maps.CopyrightCollection(options.copyrightPrefix);this.copyrightCollection.addCopyright(this.copyright);this.tilelayer=new google.maps.TileLayer(this.copyrightCollection,options.minZoom,options.maxZoom);this.tilelayer.getTileUrl=options.getTileUrl;this.tilelayer.isPng=function(){return options.isPng;};this.tilelayer.getOpacity=function(){return 1.0;};this.projection=new google.maps.MercatorProjection(options.maxZoom+1);this.map=new google.maps.MapType([this.tilelayer],this.projection,this.title,{linkColor:'#000000'});};MAPS.copyrightPrefix='Kartendaten &copy;';MAPS.OSM_copyrightText='<a href="http://www.openstreetmap.org/">OpenStreetMap</a> Contributors (<a rel="license" href="http://creativecommons.org/licenses/by-sa/2.0/">CC-BY-SA</a>)';MAPS.MS_copyrightText='www.microsoft.com'.toHref();MAPS.OA_copyrightText='www.outdooractive.com'.toHref();MAPS.HM_copyrightText='www.hubermedia.de'.toHref();MAPS.mapCl={'blankMap':new MAPS.customBasemap('Leere Karte',{minZoom:0,maxZoom:18,isPng:true,copyrightPrefix:"",copyrightText:"",getTileUrl:function(p,z){return"/images/blanktile.png";}}),'OSM':new MAPS.customBasemap('Open Street Map',{minZoom:0,maxZoom:18,isPng:true,copyrightPrefix:MAPS.copyrightPrefix,copyrightText:MAPS.OSM_copyrightText,getTileUrl:function(p,z){return"http://"+String.fromCharCode(97+MAPS.next(2))+".tile.openstreetmap.org/"+z+"/"+p.x
+"/"+p.y+".png";}}),'OSMA':new MAPS.customBasemap('Osmarenderer',{minZoom:0,maxZoom:17,isPng:true,copyrightPrefix:MAPS.copyrightPrefix,copyrightText:MAPS.OSM_copyrightText,getTileUrl:function(p,z){return"http://tah.openstreetmap.org/Tiles/tile/"+z+"/"
+p.x+"/"+p.y+".png";}}),'MS_VirtualEarth':new MAPS.customBasemap('Bing Maps',{minZoom:1,maxZoom:19,isPng:true,copyrightPrefix:MAPS.copyrightPrefix,copyrightText:MAPS.MS_copyrightText,getTileUrl:function(p,z){return"http://r"+MAPS.next(3)
+".ortho.tiles.virtualearth.net/tiles/r"
+MAPS.encodeQuadTree(p.x,p.y,z)+".png?g=45";}})};Tom.GMap=Ext.extend(Ext.Panel,{gMap:undefined,gMapEl:undefined,gMapOptions:{mapTypes:[G_NORMAL_MAP,G_SATELLITE_MAP,G_SATELLITE_3D_MAP,G_HYBRID_MAP,G_PHYSICAL_MAP]},gMapCustomize:undefined,gMapCustomizeScope:undefined,constructor:function(config){Ext.apply(config,{});this.addEvents('gmapready');this.enableBubble('gmapready');Tom.GMap.superclass.constructor.call(this,config);this.addEvents('mapsupdated');this.on('mapsupdated',function(panel){alert('panel');});this.MapOverlays=new Array();this.MapOverlayHtml="";},afterRender:function(){Tom.GMap.superclass.afterRender.apply(this,arguments);this.gMapEl=Ext.DomHelper.append(this.body,'<div style="width: 100%; height: 100%"></div>',true);this.gMap=new google.maps.Map2(this.gMapEl.dom,this.gMapOptions);this.gMap.disableDoubleClickZoom();this.gMap.enableScrollWheelZoom();for(var key in MAPS.mapCl){this.gMap.addMapType(MAPS.mapCl[key].map);}
var lat=(parseFloat(Tom.MyApp.member.config.map_lat)||geoplugin_latitude())||47.266701;var lng=(parseFloat(Tom.MyApp.member.config.map_lng)||geoplugin_longitude())||11.400000;if(this.setCenter){this.gMap.setCenter(new google.maps.LatLng(this.setCenter.lat||lat,this.setCenter.lng||lng),this.setCenter.zoom||10);}else{this.gMap.setCenter(new google.maps.LatLng(lat,lng),10);}
if(this.gMapCustomize){this.gMapCustomize.call(this.gMapCustomizeScope||window,this.gMap);}
this.mapZoomControl=new BpControl('ZOOM',new google.maps.Size(10,10),G_ANCHOR_TOP_LEFT);this.gMap.addControl(this.mapZoomControl);this.updateMapZoomControl();var myId=this.getId();var panelId=this.ownerCt.getId();GEvent.addListener(this.gMap,'zoomend',function(oldLevel,newLevel){Ext.getCmp(myId).updateMapZoomControl(true);});GEvent.addListener(this.gMap,'singlerightclick',function(point,src,overlay){var objItems=new Array();var items=new Array();overlay=overlay||Tom.MyApp.cmOverlay||{};if(Ext.isDefined(overlay.idtrails)){var trail=Tom.MyApp.TrailStore.getById(overlay.idtrails);try{objItems=objItems.concat(['<b class="menu-title">'+trail.get('title')
+'</b>',{text:'Anzeigen',icon:'/icon/trail/'+ip+'_16.png',handler:function(){Tom.MyApp.showTab('trail',overlay.idtrails);}},{text:'Bearbeiten',icon:'/icon/edit_trail/'+ip+'_16.png',handler:function(){Tom.MyApp.showTab('edittrail',overlay.idtrails);}}]);}catch(e){}}else if(Ext.isDefined(overlay.idpois)){var poi=Tom.MyApp.PoiStore.getById(overlay.idpois);try{objItems=objItems.concat(['<b class="menu-title">'+poi.get('title')
+'</b>',{text:'Bearbeiten',icon:'/icon/edit_poi/'+ip+'_16.png',handler:function(){Tom.MyApp.showTab('editpoi',overlay.idpois);}}]);}catch(e){}}else if(Ext.isDefined(overlay.idwarnings)){var warning=Tom.MyApp.WarningStore.getById(overlay.idwarnings);try{objItems=objItems.concat(['<b class="menu-title">'+warning.get('title')
+'</b>',{text:'Bearbeiten',icon:'/icon/edit_warning/'+ip+'_16.png',handler:function(){Tom.MyApp.showTab('editwarning',overlay.idwarnings);}}]);}catch(e){}}else if(Ext.isDefined(overlay.idprojects)){var project=Tom.MyApp.ProjectStore.getById(overlay.idprojects);try{objItems=objItems.concat(['<b class="menu-title">'+project.get('title')
+'</b>',{text:'Bearbeiten',icon:'/icon/edit_project/'+ip+'_16.png',handler:function(){Tom.MyApp.showTab('editproject',overlay.idprojects);}}]);}catch(e){}}
Tom.MyApp.cmOverlay={};try{var newCenter=this.fromDivPixelToLatLng(point);var title='Punkt ('
+Ext.util.Format.number(newCenter.lat(),'0.000')+','
+Ext.util.Format.number(newCenter.lng(),'0.000')+')';var availableMaps=Tom.MyApp.MapServer.getAvailableOverlayMenu(panelId,newCenter);items=items.concat(['<b class="menu-title">'+title+'</b>',{text:'Karten',icon:'/iconstatic/topo_16.png',disabled:(availableMaps.length==0),menu:{items:availableMaps}},{text:'Als Ausgangspunkt festlegen',icon:'/icon/home/'+ip+'_16.png',handler:function(){Tom.MyApp.member.config.map_lat=newCenter.lat();Tom.MyApp.member.config.map_lng=newCenter.lng();Tom.MyApp.saveMember();}},'-',{text:'Zentrieren',icon:'/iconstatic/center_16.png',handler:function(){Ext.getCmp(myId).gMap.setCenter(newCenter);}}]);}catch(e){items=items.concat('<b class="menu-title">Karte</b>');}
items=items.concat([{text:'Zoom in',icon:'/icon/zoom_in/'+ip+'_16.png',handler:function(){Ext.getCmp(myId).gMap.zoomIn();}},{text:'Zoom out',icon:'/icon/zoom_out/'+ip+'_16.png',handler:function(){Ext.getCmp(myId).gMap.zoomOut();}}]);cmenu=new Ext.menu.Menu({items:objItems.concat(items)});var pos=Ext.getCmp(myId).getPosition();cmenu.showAt(new Array(pos[0]+point.x,pos[1]+point.y));});GEvent.addListener(this.gMap,'click',function(){Ext.menu.MenuMgr.hideAll();});this.gMap.enableKeyDragZoom({visualEnabled:false,visualPosition:new GControlPosition(G_ANCHOR_TOP_LEFT,new GSize(250,15)),visualSprite:"http://maps.gstatic.com/mapfiles/ftr/controls/dragzoom_btn.png",visualSize:new google.maps.Size(20,20),visualTips:{off:"Zoom Fenster",on:"Abbrechen"}});this.fireEvent('gmapready');},onResize:function(w,h){Tom.GMap.superclass.onResize.call(this,w,h);if(!w||!h||!this.gMap){return;}
var center=this.gMap.getCenter();this.gMap.checkResize();this.gMap.setCenter(center);},setSize:function(w,h,animate){Tom.GMap.superclass.setSize.call(this,w,h,animate);if(!w||!h||!this.gMap){return;}
var center=this.gMap.getCenter();this.gMap.checkResize();this.gMap.setCenter(center);},zoomToBounds:function(bounds){var b=bounds.split(",");if(b.length==4){var bounds=new GLatLngBounds();bounds.extend(new GLatLng(b[0],b[1]));bounds.extend(new GLatLng(b[2],b[3]));this.gMap.setCenter(bounds.getCenter(),this.gMap.getBoundsZoomLevel(bounds));}},addMapOverlay:function(item,forceZoom){this.MapOverlays[item.mapId]=item;this.updateMapZoomControl();this.gMap.addOverlay(item.tileLayerOverlay);if(forceZoom){this.forceZoom(item);}},removeMapOverlay:function(item){delete this.MapOverlays[item.mapId];this.updateMapZoomControl();this.gMap.removeOverlay(item.tileLayerOverlay);},hasOverlay:function(mapId){return Ext.isDefined(this.MapOverlays[mapId]);},forceZoom:function(item){try{this.gMap.setZoom(Math.max(item.minZoom,Math.min(item.maxZoom,this.gMap.getZoom())));return true;}catch(e){return false;}},updateMapZoomControl:function(onlyZoomlevelChanged){var currentZoomLevel=this.gMap.getZoom();var myId=this.getId();var html='<table><tr><td>Karte</td><td></td>'
+'<td align="left"><a href="Javascript:Ext.getCmp(\''
+myId
+'\').gMap.setZoom('
+Math.max(currentZoomLevel-1,0)
+')"><img src="/icon/zoom_out/'
+ip
+'_24.png"></a></td>'
+'<td align="center" style="background-image:url(/images/zoombg.png); background-repeat:no-repeat;">Zoomlevels</td>'
+'<td align="left"><a href="Javascript:Ext.getCmp(\''
+myId
+'\').gMap.setZoom('
+Math.min(currentZoomLevel+1,19)
+')"><img src="/icon/zoom_in/'
+ip
+'_24.png"></a></td></tr>'
+'<tr><td valign="middle">Aktuell</td><td></td><td colspan="3">';for(var i=0;i<=19;i++){if(i==currentZoomLevel){html+='<a href=""><img src="/images/mzcc.png" width="8" height="17"></a>';}else{html+='<a href="Javascript:Ext.getCmp(\''
+myId
+'\').gMap.setZoom('
+i
+')"><img src="/images/mzcb.png" width="8" height="17"></a>';}}
html+="</td></tr>";var empty=false;if(!onlyZoomlevelChanged){this.MapOverlayHtml="";for(mapId in this.MapOverlays){var m=this.MapOverlays[mapId];if(Ext.isDefined(m.mapId)&&Ext.isDefined(m.text)){emtpy=true;this.MapOverlayHtml+='<tr><th valign="middle">'
+'<a href="Javascript:Ext.getCmp(\''+myId
+'\').gMap.panTo(new google.maps.LatLng('
+m.centerLat+','+m.centerLng+'))">'+m.text
+'</th><th><a href="Javascript:Ext.getCmp(\''
+m.getId()
+'\').setChecked(false)"><img src="/icon/delete/'
+ip+'_16.png"></a></th><th colspan="3">';for(var i=0;i<m.minZoom;i++){this.MapOverlayHtml+='<img src="/images/mzcb.png" width="8" height="17">'}
for(var i=m.minZoom;i<=m.maxZoom;i++){this.MapOverlayHtml+='<a href="Javascript:Ext.getCmp(\''
+myId
+'\').gMap.setZoom('
+i
+')"><img src="/images/mzcf.png" width="8" height="17"></a>'}
for(var i=m.maxZoom+1;i<=19;i++){this.MapOverlayHtml+='<img src="/images/mzcb.png" width="8" height="17">'}
this.MapOverlayHtml+="</th></tr>";}}}
html+=this.MapOverlayHtml;html+="</table>";this.mapZoomControl.setContent(html);if(empty){this.mapZoomControl.hide();}else{this.mapZoomControl.show();}}});Tom.GMapPanel=Ext.extend(Ext.Panel,{constructor:function(config){this.map=new Tom.GMap(Ext.apply({itemId:'gmap',region:'center'},config.GMapConfig));var onBasemapChange=function(item,checked){if(checked){this.getGMap().setMapType(item.mapType);}};var onOverlayChange=function(item,checked){if(checked){this.getGMap().addOverlay(item.tileLayerOverlay);}else{this.getGMap().removeOverlay(item.tileLayerOverlay);}};var onUseLocalOverlayChange=function(item,checked){var m=mainTb.getComponent('panel').menu;if(checked){m.items.each(function(item){if(item.local){item.show();}})}else{m.items.each(function(item){if(item.local){item.hide();}})}
m.doLayout();};this.mainTb=new Ext.Toolbar({itemId:'mainTb',region:'north',height:32,items:[new Ext.Button({scope:this,handler:function(b){this.map.gMap.zoomOut();},xtype:'tbbutton',cls:'x-btn-icon',icon:'/icon/zoom_out/'+ip+'_16.png'}),new Ext.Button({scope:this,handler:function(b){this.map.gMap.zoomIn();},xtype:'tbbutton',cls:'x-btn-icon',icon:'/icon/zoom_in/'+ip+'_16.png'}),{text:'Basiskarte',menu:{items:['<b class="menu-title">2D Satellitenbilder</b>',{text:'Google Satellit',checked:true,group:'basemap',mapType:G_SATELLITE_MAP,scope:this,checkHandler:onBasemapChange},{text:'Google Hybrid',checked:false,group:'basemap',mapType:G_HYBRID_MAP,scope:this,checkHandler:onBasemapChange},'<b class="menu-title">3D Satellitenbilder</b>',{text:'Google Earth',checked:false,group:'basemap',mapType:G_SATELLITE_3D_MAP,scope:this,checkHandler:onBasemapChange},'<b class="menu-title">Gelände</b>',{text:'Google Terrain',checked:false,group:'basemap',mapType:G_PHYSICAL_MAP,scope:this,checkHandler:onBasemapChange},'<b class="menu-title">Sonstige</b>',{text:'Google Maps',checked:false,group:'basemap',mapType:G_NORMAL_MAP,scope:this,checkHandler:onBasemapChange},{text:'OSM',checked:false,group:'basemap',mapType:MAPS.mapCl.OSM.map,scope:this,checkHandler:onBasemapChange},{text:'OSM Osmarenderer',checked:false,group:'basemap',mapType:MAPS.mapCl.OSMA.map,scope:this,checkHandler:onBasemapChange},{text:'MS Virtual Earth',checked:false,group:'basemap',mapType:MAPS.mapCl.MS_VirtualEarth.map,scope:this,checkHandler:onBasemapChange},{text:'Keine Karte',checked:false,group:'basemap',mapType:MAPS.mapCl.blankMap.map,scope:this,checkHandler:onBasemapChange}]}},{text:'Wanderkarten',icon:'/iconstatic/topo_16.png',itemId:'overlayMenu'},'-',{xtype:'gxux_geonamessearchcombo',listeners:{'select':{fn:function(combo,record,index){this.map.gMap.panTo(new google.maps.LatLng(record.data.lat,record.data.lng));},scope:this}}}]});config=Ext.apply({layout:'border',hideBorders:true,items:[this.mainTb,this.map]},config);Tom.GMapPanel.superclass.constructor.call(this,config);this.updateMapMenu();},getGMap:function(){return this.map.gMap;},updateMapMenu:function(){this.getComponent('mainTb').getComponent('overlayMenu').menu=Tom.MyApp.MapServer.getOverlayMenu(this.getId());this.getComponent('mainTb').getComponent('overlayMenu').menu.doLayout();},getOverlayMenuItem:function(mapId){return this.getComponent('mainTb').getComponent('overlayMenu').menu.find('mapId',mapId)[0];}});Tom.GMapTrackViewer=Ext.extend(Tom.GMapPanel,{constructor:function(config){this.trackEditor=new MAPS.TrackEditor(false);this.addEvents('mapready');Tom.GMapTrackViewer.superclass.constructor.call(this,config);this.on('gmapready',this.onGMapReady,this);},onGMapReady:function(){this.trackEditor.addAsOverlay(this.map.gMap);this.fireEvent('mapready');},loadTrack:function(data){this.trackEditor.importTrack(data,{format:"db"});}});Tom.GMapTrackEditor=Ext.extend(Tom.GMapPanel,{constructor:function(config){this.trackEditor=new MAPS.TrackEditor(true);Tom.GMapTrackEditor.superclass.constructor.call(this,config);this.on('gmapready',this.onGMapReady,this);untoggleEditModeButtons=function(skip){for(var i=0;i<editModeButtons.length;i++){if((i!=skip)&&(Ext.isDefined(editModeButtons[i].initialConfig))){if(editModeButtons[i].initialConfig.enableToggle&&editModeButtons[i].pressed){editModeButtons[i].toggle(false);}}}}
editModeButtons=new Array();editModeButtons.push(new Ext.Button({scope:this,disabled:true,handler:function(b){untoggleEditModeButtons(0);new Tom.wTrackEditorImport({"trackEditor":this.trackEditor}).show();},tooltip:{text:'Einlesen eines lokalen GPS-Tracks',title:'Track importieren'},xtype:'tbbutton',cls:'x-btn-icon',icon:'/icon/import/'+ip+'_16.png'}));editModeButtons.push(new Ext.Button({scope:this,disabled:true,handler:function(b){untoggleEditModeButtons(1);if(this.trackEditor.hasTrack()){Ext.Msg.show({scope:this,title:'Track löschen',msg:'Soll der Track wirklich gelöscht werden?',buttons:Ext.Msg.OKCANCEL,fn:function(btn){if(btn=='ok'){this.trackEditor.clear();}}});}},tooltip:{text:'Löschen des gesamten Tracks',title:'Track löschen'},xtype:'tbbutton',cls:'x-btn-icon',icon:'/icon/delete/'+ip+'_16.png'}));editModeButtons.push(new Ext.Button({scope:this,disabled:true,handler:function(b){untoggleEditModeButtons(2);this.trackEditor.undo();},tooltip:{text:'Letzten Schritt rückgängig machen',title:'Undo'},xtype:'tbbutton',cls:'x-btn-icon',icon:'/icon/undo/'+ip+'_16.png'}));editModeButtons.push(new Ext.Button({scope:this,disabled:true,handler:function(b){untoggleEditModeButtons(3);this.trackEditor.redo();},tooltip:{text:'Letztes Undo zurücknehmen',title:'Redo'},xtype:'tbbutton',cls:'x-btn-icon',icon:'/icon/redo/'+ip+'_16.png'}));editModeButtons.push(new Ext.Button({scope:this,disabled:true,toggleHandler:function(b,pressed){if(pressed){untoggleEditModeButtons(4);this.trackEditor.enableDrawing(false);Tom.MyApp.showTip("Doppelklicken auf letzten Punkt zum Abschließen");}else{this.trackEditor.disableDrawing();}},tooltip:{text:'Doppelklicken auf letzten Punkt zum Abschließen',title:'Am Ende weiterzeichnen'},xtype:'tbbutton',cls:'x-btn-icon',icon:'/iconstatic/edit_draw_e_16.png',enableToggle:true}));editModeButtons.push(new Ext.Button({scope:this,disabled:true,toggleHandler:function(b,pressed){if(pressed){untoggleEditModeButtons(5);this.trackEditor.enableDrawing(true);Tom.MyApp.showTip("Doppelklicken auf ersten Punkt zum Abschließen");}else{this.trackEditor.disableDrawing();}},tooltip:{text:'Doppelklicken auf letzten Punkt zum Abschließen',title:'Am Anfang weiterzeichnen'},xtype:'tbbutton',cls:'x-btn-icon',icon:'/iconstatic/edit_draw_s_16.png',enableToggle:true}));editModeButtons.push(new Ext.Button({scope:this,disabled:true,toggleHandler:function(b,pressed){if(pressed){if(this.trackEditor.hasTrack()){untoggleEditModeButtons(6);this.trackEditor.enableEditing(true);Tom.MyApp.showTip("Hauptpunkte (hell) verschieben oder löschen durch Anklicken, Zwischenpunkte einfügen durch Verschieben der Mittelpunkte (dunkler)");}}else{this.trackEditor.disableEditing();}},tooltip:{text:'Maus gedrückt halten zum Punkte verschieben, anklicken zum Punkte löschen',title:'Einzelne Punkte bearbeiten'},xtype:'tbbutton',cls:'x-btn-icon',icon:'/iconstatic/edit_draw_16.png',enableToggle:true}));editModeButtons.push(new Ext.Button({scope:this,disabled:true,toggleHandler:function(b,pressed){if(pressed){if(this.trackEditor.hasTrack()){untoggleEditModeButtons(7);this.trackEditor.addTruncateListener();}}else{}},tooltip:{text:'Punkt auf der Linie anklicken zum Abschneiden des Tracks',title:'Track kürzen'},xtype:'tbbutton',cls:'x-btn-icon',icon:'/icon/cut/'+ip+'_16.png',enableToggle:true}));editModeButtons.push(new Ext.Button({scope:this,disabled:true,handler:function(b){if(this.trackEditor.hasTrack()){untoggleEditModeButtons(8);this.trackEditor.reverse();}},tooltip:{text:'Anfang und Ende vertauschen',title:'Trackorientierung tauschen'},xtype:'tbbutton',cls:'x-btn-icon',icon:'/iconstatic/edit_reverse_16.png'}));editModeButtons.push(new Ext.Button({scope:this,disabled:true,toggleHandler:function(b,pressed){if(pressed){if(this.trackEditor.hasTrack()){untoggleEditModeButtons(9);this.simplifyDialog=new Tom.wTrackEditorSimplify({"trackEditor":this.trackEditor}).show();this.simplifyDialog.on('close',function(){untoggleEditModeButtons();});}}else{this.simplifyDialog.close();}},tooltip:{text:'Anzahl der Polygonpunkte reduzieren',title:'Track vereinfachen'},xtype:'tbbutton',cls:'x-btn-icon',icon:'/iconstatic/edit_simplify_16.png',enableToggle:true}));this.mainTb.addSeparator();for(var i=0;i<editModeButtons.length;i++){if(i==4){this.mainTb.addSeparator();}
this.mainTb.addItem(editModeButtons[i]);}},onGMapReady:function(){this.trackEditor.addAsOverlay(this.map.gMap);this.fireEvent('mapready');},enableEditor:function(){for(var i=0;i<editModeButtons.length;i++){editModeButtons[i].enable();}},loadTrack:function(data){this.trackEditor.importTrack(data,{});},loadEncodedPoly:function(encLatLngs,encLevels){this.trackEditor.importEncodedPoly(encLatLngs,encLevels);},getEncodedPoly:function(){return this.trackEditor.getEncodedPoly();},getTrack:function(data){return this.trackEditor.toDB();},getPoints:function(data){return this.trackEditor.pt;},hasValidTrack:function(){return this.trackEditor.hasValidTrack();},getTrackBounds:function(){return this.trackEditor.getTrackBounds();},getTrackProperties:function(){return this.trackEditor.getTrackProperties();},getLabelLat:function(){return this.trackEditor.getLabelLat();},getLabelLng:function(){return this.trackEditor.getLabelLng();}});Tom.GMapPointEditor=Ext.extend(Tom.GMapPanel,{constructor:function(config){this.addEvents({"dragend":true});this.listeners=config.listeners;Tom.GMapPointEditor.superclass.constructor.call(this,config);this.toBeCentered=!(Ext.isDefined(config.lat)&&Ext.isDefined(config.lng));this.marker=new google.maps.Marker(new google.maps.LatLng(config.lat||0,config.lng||0),{draggable:true});this.marker.myEditor=this;this.marker.hide();google.maps.Event.addListener(this.marker,"dragend",function(){this.myEditor.fireEvent('dragend',this.getLatLng().lat(),this.getLatLng().lng());});this.on('gmapready',this.onGMapReady,this);},onGMapReady:function(){if(this.toBeCentered){this.marker.setLatLng(this.getGMap().getCenter());}
this.getGMap().addOverlay(this.marker);this.fireEvent('mapready');},enableEditor:function(){this.marker.show();},setLatLng:function(latlng){this.marker.setLatLng(latlng);},getLatLng:function(){return this.marker.getLatLng();}});Tom.GMapViewer=Ext.extend(Tom.GMapPanel,{constructor:function(config){this.OvlDef=Ext.data.Record.create([{name:'id',type:'string'},'recorddata','ovl',{name:'gevents',defaultValue:''}]);this.ovlStore=new Ext.data.JsonStore({idProperty:'id',listeners:{add:{fn:function(store,records,index){for(var i=0,len=records.length;i<len;i++){var ovlid=records[i].get('id');var rd=records[i].get('recorddata');var rovl=records[i].get('ovl');var gevents=records[i].get('gevents');this.getGMap().addOverlay(rovl);if(Ext.isArray(gevents)){var target=rovl.getEventTarget();for(var i=0,len=gevents.length;i<len;i++){var e=gevents[i];google.maps.Event.bindDom(target,e.event,rovl,e.fn);}}}},scope:this},remove:{fn:function(store,records,index){records=[].concat(records);for(var i=0,len=records.length;i<len;i++){var rovl=records[i].get('ovl');this.getGMap().removeOverlay(rovl);}},scope:this}}});this.filter={labels:{display:true},projects:{display:true},warnings:{display:true}}
Tom.GMapViewer.superclass.constructor.call(this,config);this.on('gmapready',this.onGMapReady,this);this.mainTb.addItem('-',{text:'Projekte',enableToggle:true,pressed:this.filter.projects.display,scope:this,toggleHandler:function(item,state){this.filter.projects.display=state;this.doFilter();}},{text:'Warnungen',enableToggle:true,pressed:this.filter.warnings.display,scope:this,toggleHandler:function(item,state){this.filter.warnings.display=state;this.doFilter();}});},afterRender:function(){Tom.GMapViewer.superclass.afterRender.apply(this,arguments);},onGMapReady:function(){this.PoiLabel=new BpLabel(this.getGMap().getCenter(),'',false,'nw',true);this.getGMap().addOverlay(this.PoiLabel);this.PoiIcons=new Array();Tom.MyApp.PoiTypesStore.each(function(record){var gIcon=new google.maps.Icon(G_DEFAULT_ICON);gIcon.image="iconstatic/poi_"+record.get('idpoitypes')+".png";gIcon.shadow="iconstatic/blank16.png"
this.PoiIcons[record.get('idpoitypes')]=gIcon;},this);this.trailStore.each(this.addTrail,this);this.projectStore.each(this.addProject,this);this.warningStore.each(this.addWarning,this);this.poiStore.each(this.addPoi,this);this.doFilter();this.fireEvent('mapready');},filterTrails:function(keys){this.ovlStore.each(function(r){var rd=r.get('recorddata');var rovl=r.get('ovl');if(r.id.startsWith('traillabel')){vis(rovl,keys.inArray(rd.idtrails.toString()));return;}
if(r.id.startsWith('trail')){vis(rovl,keys.inArray(rd.idtrails.toString()));return;}});},filterPois:function(keys){this.ovlStore.each(function(r){var rd=r.get('recorddata');var rovl=r.get('ovl');if(r.id.startsWith('poi')){vis(rovl,keys.inArray(rd.idpois.toString()));return;}});},addTrail:function(record){var id='trail'+record.data.idtrails;var ovl=this.ovlStore.getById(id);if(Ext.isDefined(ovl)){if((ovl.data.recorddata.gpstrack==record.data.gpstrack)&&(ovl.data.recorddata.title==record.data.title)&&(ovl.data.recorddata.label_lat==record.data.label_lat)&&(ovl.data.recorddata.label_lng==record.data.label_lng)){return true;}
this.ovlStore.remove(ovl);}
var ovl=new google.maps.Polyline.fromEncoded({color:colorS[Math.floor(record.data.s)],weight:4,opacity:0.8,points:record.data.encLatLngs,levels:record.data.encLevels,zoomFactor:2,numLevels:18});ovl.idtrails=record.data.idtrails;this.ovlStore.add(new this.OvlDef({recorddata:record.data,ovl:ovl},id));var id='traillabel'+record.data.idtrails;var ovl=this.ovlStore.getById(id);if(Ext.isDefined(ovl)){if((ovl.data.recorddata.title==record.data.title)&&(ovl.data.recorddata.label_lat==record.data.label_lat)&&(ovl.data.recorddata.label_lng==record.data.label_lng)){return true;}
this.ovlStore.remove(ovl);}
if(Ext.isNumber(record.data.label_lat)&&Ext.isNumber(record.data.label_lng)){var label=new BpLabel(new google.maps.LatLng(record.data.label_lat,record.data.label_lng),record.data.title,'gmLabelTrail','center');label.setCursor('pointer');label.idtrails=record.data.idtrails;var labelHtml='Übersicht'
+"<h1 class=\"iLeft\" style=\"background-image: url(/flags/"
+record.data.idcountries.toLowerCase()
+".png\"><a href=\"Javascript:Tom.MyApp.showTab('trail',"
+record.data.idtrails
+");\">"
+record.data.title
+"</a></h1><p>"
+"S"
+record.data.s
+"/G"
+record.data.g
+"<br>"
+record.data.description
+"</p>"
+'Details'
+"<p>"
+"&nbsp;<span class=\"iLeft i_alt_max\" style=\"width:100px\">"
+record.data.alt_max
+"m</span>"
+"&nbsp;<span class=\"iLeft i_alt_min\">"
+record.data.alt_min
+"m</span><br>"
+"&nbsp;<span class=\"iLeft i_alt_up\" style=\"width:150px\">"
+record.data.alt_up+"m</span>"
+"&nbsp;<span class=\"iLeft i_alt_down\">"
+record.data.alt_down+"m</span></p><p>"
+"&nbsp;<span class=\"iLeft i_len\">"+record.data.len
+"m</span></p>";this.ovlStore.add(new this.OvlDef({recorddata:record.data,ovl:label,gevents:[{event:'click',fn:function(){label.openInfoWindowHtml(labelHtml)}},{event:'contextmenu',fn:function(){Tom.MyApp.cmOverlay=this;}}]},id));}},addProject:function(record){var id='project'+record.data.idprojects;var ovl=this.ovlStore.getById(id);if(Ext.isDefined(ovl)){this.ovlStore.remove(ovl);}
ovl=new google.maps.Polyline.fromEncoded({color:"#FFFF33",weight:4,opacity:0.8,points:record.data.encLatLngs,levels:record.data.encLevels,zoomFactor:2,numLevels:18});ovl.idprojects=record.data.idprojects;this.ovlStore.add(new this.OvlDef({recorddata:record.data,ovl:ovl},id));var id='projectlabel'+record.data.idprojects;var ovl=this.ovlStore.getById(id);if(Ext.isDefined(ovl)){this.ovlStore.remove(ovl);}
if(Ext.isNumber(record.data.label_lat)&&Ext.isNumber(record.data.label_lng)){var label=new BpLabel(new google.maps.LatLng(record.data.label_lat,record.data.label_lng),record.data.title,'gmLabelProject','center');label.setCursor('pointer');label.idprojects=record.data.idprojects;var labelHtml='<h1>'
+record.data.title
+'</h1><p>'
+record.data.description
+'</p><p><a class="iLeft i_delete" href="Javascript:Tom.MyApp.removeProject('
+record.data.idprojects+',\''+record.data.title
+'\')">Projekt löschen</a></p>';this.ovlStore.add(new this.OvlDef({recorddata:record.data,ovl:label,gevents:[{event:'click',fn:function(){label.openInfoWindowHtml(labelHtml)}},{event:'contextmenu',fn:function(){Tom.MyApp.cmOverlay=this;}}]},id));}},removeProject:function(record){var id='project'+record.data.idprojects;var ovl=this.ovlStore.getById(id);if(ovl){this.ovlStore.remove(ovl);}
var id='projectlabel'+record.data.idprojects;var ovl=this.ovlStore.getById(id);if(ovl){this.ovlStore.remove(ovl);}},addWarning:function(record){var id='warning'+record.data.idwarnings;var ovl=this.ovlStore.getById(id);if(Ext.isDefined(ovl)){this.ovlStore.remove(ovl);}
var ovl=new google.maps.Polyline.fromEncoded({color:"#FFFFFF",weight:4,opacity:0.8,points:record.data.encLatLngs,levels:record.data.encLevels,zoomFactor:2,numLevels:18});ovl.idwarnings=record.data.idwarnings;this.ovlStore.add(new this.OvlDef({recorddata:record.data,ovl:ovl},id));var id='warninglabel'+record.data.idwarnings;var ovl=this.ovlStore.getById(id);if(Ext.isDefined(ovl)){this.ovlStore.remove(ovl);}
if(Ext.isNumber(record.data.label_lat)&&Ext.isNumber(record.data.label_lng)){var label=new BpLabel(new google.maps.LatLng(record.data.label_lat,record.data.label_lng),record.data.title,'gmLabelWarning','center');label.setCursor('pointer');label.idwarnings=record.data.idwarnings;var labelHtml='<h1>'
+record.data.title
+'</h1><p>'
+record.data.description
+'</p><p><a class="iLeft i_delete" href="Javascript:Tom.MyApp.removeWarning('
+record.data.idwarnings+',\''+record.data.title
+'\')">Warnung löschen</a></p>';this.ovlStore.add(new this.OvlDef({recorddata:record.data,ovl:label,gevents:[{event:'click',fn:function(){label.openInfoWindowHtml(labelHtml)}},{event:'contextmenu',fn:function(){Tom.MyApp.cmOverlay=this;}}]},id));}},removeWarning:function(record){var id='warning'+record.data.idwarnings;var ovl=this.ovlStore.getById(id);if(ovl){this.ovlStore.remove(ovl);}
var id='warninglabel'+record.data.idwarnings;var ovl=this.ovlStore.getById(id);if(ovl){this.ovlStore.remove(ovl);}},addPoi:function(record){var id='poi'+record.data.idpois;var ovl=this.ovlStore.getById(id);if(Ext.isDefined(ovl)){this.ovlStore.remove(ovl);}
switch(record.get('type')){case 1:if(Ext.isDefined(record.get('config').imgUrl)){var events=new Array({event:'click',fn:function(){Tom.ImageGallery.showImages({idfiles:0,name:record.get('title'),url:record.get('config').imgUrl,is_image:true})}});}
break;case 5:if(Ext.isDefined(record.get('config').html)){var events=new Array({event:'click',fn:function(){this.openInfoWindowHtml(record.get('config').html)}})}
break;default:var events=new Array();break;}
events.push({event:'contextmenu',fn:function(){Tom.MyApp.cmOverlay=this;}});var marker=new BpMarkerLight(new google.maps.LatLng(record.get('lat'),record.get('lng')),{icon:this.PoiIcons[record.get('type')]});marker.idpois=record.data.idpois;this.ovlStore.add(new this.OvlDef({recorddata:record.data,ovl:marker,gevents:events},id));},removePoi:function(record){var id='poi'+record.data.idpois;var ovl=this.ovlStore.getById(id);if(ovl){this.ovlStore.remove(ovl);}},doFilter:function(){this.ovlStore.each(function(r){var rd=r.get('recorddata');var rovl=r.get('ovl');if(r.id.startsWith('projectlabel')){vis(rovl,(this.filter.labels.display)&&(this.filter.projects.display));return;}
if(r.id.startsWith('project')){vis(rovl,this.filter.projects.display);return;}
if(r.id.startsWith('warninglabel')){vis(rovl,(this.filter.labels.display)&&(this.filter.warnings.display));return;}
if(r.id.startsWith('warning')){vis(rovl,this.filter.warnings.display);return;}},this);}});﻿
function GDouglasPeucker(source,kink)
{var n_source,n_stack,n_dest,start,end,i,sig;var dev_sqr,max_dev_sqr,band_sqr;var x12,y12,d12,x13,y13,d13,x23,y23,d23;var F=((Math.PI/180.0)*0.5);var index=new Array();var sig_start=new Array();var sig_end=new Array();if(source.length<3)
return(source);n_source=source.length;band_sqr=kink*360.0/(2.0*Math.PI*6378137.0);band_sqr*=band_sqr;n_dest=0;sig_start[0]=0;sig_end[0]=n_source-1;n_stack=1;while(n_stack>0){start=sig_start[n_stack-1];end=sig_end[n_stack-1];n_stack--;if((end-start)>1){x12=(source[end].lng()-source[start].lng());y12=(source[end].lat()-source[start].lat());if(Math.abs(x12)>180.0)
x12=360.0-Math.abs(x12);x12*=Math.cos(F*(source[end].lat()+source[start].lat()));d12=(x12*x12)+(y12*y12);for(i=start+1,sig=start,max_dev_sqr=-1.0;i<end;i++){x13=(source[i].lng()-source[start].lng());y13=(source[i].lat()-source[start].lat());if(Math.abs(x13)>180.0)
x13=360.0-Math.abs(x13);x13*=Math.cos(F*(source[i].lat()+source[start].lat()));d13=(x13*x13)+(y13*y13);x23=(source[i].lng()-source[end].lng());y23=(source[i].lat()-source[end].lat());if(Math.abs(x23)>180.0)
x23=360.0-Math.abs(x23);x23*=Math.cos(F*(source[i].lat()+source[end].lat()));d23=(x23*x23)+(y23*y23);if(d13>=(d12+d23))
dev_sqr=d23;else if(d23>=(d12+d13))
dev_sqr=d13;else
dev_sqr=(x13*y12-y13*x12)*(x13*y12-y13*x12)/d12;if(dev_sqr>max_dev_sqr){sig=i;max_dev_sqr=dev_sqr;}}
if(max_dev_sqr<band_sqr){index[n_dest]=start;n_dest++;}
else{n_stack++;sig_start[n_stack-1]=sig;sig_end[n_stack-1]=end;n_stack++;sig_start[n_stack-1]=start;sig_end[n_stack-1]=sig;}}
else{index[n_dest]=start;n_dest++;}}
index[n_dest]=n_source-1;n_dest++;var r=new Array();for(var i=0;i<n_dest;i++)
r.push(source[index[i]]);return r;};Tom.wWidgeteditor=Ext.extend(Ext.Window,{constructor:function(config){config=Ext.apply({title:'Startseite anpassen',layout:'fit',autoScroll:true,width:800,height:600,iconCls:'i_home',closeAction:'close',items:[new Tom.WidgetEditorPanel({itemId:'form',widgets:config.widgets})],buttons:[{text:'Anwenden',icon:'/icon/save/'+ip+'_16.png',handler:function(){this.saveWidgets();},scope:this},{text:'<b>Speichern</b>',icon:'/icon/ok/'+ip+'_16.png',handler:function(){this.saveWidgets();this.close();},scope:this},{text:'Abbrechen',icon:'/icon/cancel/'+ip+'_16.png',handler:function(){this.close();},scope:this}]},config);Tom.wWidgeteditor.superclass.constructor.call(this,config);},saveWidgets:function(){var newWidgets=this.getComponent('form').form2widgets();Tom.MyApp.member.config.widgets=newWidgets;Tom.MyApp.saveMember();Ext.getCmp('start').updateWidgets(newWidgets);}});Tom.wTrackEditorImport=Ext.extend(Ext.Window,{constructor:function(config){myFormPanel=new Ext.FormPanel({url:'/queries/parsegps.php',frame:true,bodyStyle:'padding:5px 5px 0',method:'POST',fileUpload:true,enctype:'multipart/form-data',timeout:15000,labelWidth:125,items:[{xtype:"textfield",fieldLabel:"Datei",name:"fimport",id:"fimport",vtype:'GpsFile',inputType:"file",width:200,allowBlank:false},{itemId:'radioSimplify',xtype:"radiogroup",fieldLabel:"Track vereinfachen",itemCls:"x-check-group-alt",columns:1,items:[{boxLabel:'Nein (Original)',name:'kink',inputValue:0},{boxLabel:'Fein',name:'kink',inputValue:0.00002,checked:true},{boxLabel:'Mittel',name:'kink',inputValue:0.00020},{boxLabel:'Grob',name:'kink',inputValue:0.00060}]},{itemId:'radioMode',xtype:"radiogroup",fieldLabel:"Modus",itemCls:"x-check-group-alt",columns:1,items:[{boxLabel:'Bestehenden Track ersetzen',name:'insertMode',inputValue:'replace',checked:true},{boxLabel:'Hinten anhängen',name:'insertMode',inputValue:'append'},{boxLabel:'Vorne einfügen',name:'insertMode',inputValue:'prepend'}]}]});config=Ext.apply({modal:true,title:'GPS-Track Datei-Upload',id:'modal',items:myFormPanel,width:550,autoHeight:true,buttons:[{text:'Importieren',handler:function(){var theForm=myFormPanel.getForm();if(!theForm.isValid()){Ext.MessageBox.alert('Importiere Track','Bitte eine Datei auswählen');return;}
theForm.submit({clientValidation:true,params:{idmembers:Tom.MyApp.member.idmembers},waitTitle:'GPS-Track Datei-Upload',waitMsg:'Datei hochladen...',success:function(form,action){Ext.getCmp('modal').close();if(!config.trackEditor.importTrack(action.result.xyz,{"format":"parser","insertMode":action.result.insertMode})){Ext.MessageBox.alert('Der Track konnte nicht geladen werden!')}},failure:function(form,action){Ext.Msg.alert('done',action.result.success);switch(action.failureType){case Ext.form.Action.CLIENT_INVALID:Ext.Msg.alert('Failure','Form fields may not be submitted with invalid values');break;case Ext.form.Action.CONNECT_FAILURE:Ext.Msg.alert('Failure','Ajax communication failed');break;default:Ext.Msg.alert('Failure',action.result.myErrorMsg);}}});}},{text:'Abbrechen',scope:this,handler:function(){this.close();}}]},config);Tom.wTrackEditorImport.superclass.constructor.call(this,config);}});Tom.wTrackEditorSimplify=Ext.extend(Ext.Window,{constructor:function(config){simplifyFormPanel=new Ext.FormPanel({frame:true,bodyStyle:'padding:5px 5px 0',items:[{itemId:'slider',xtype:'sliderfield',fieldLabel:'Genauigkeit',minValue:-10,maxValue:0,value:-2,name:'detail',tipText:function(sliderwrapper){switch(sliderwrapper.slider.getValue()){case 0:return"Original";break;case-1:case-2:return"Fein";break;case-3:case-4:case-5:return"Mittel";break;case-6:case-7:case-8:return"Grob";break;default:return"Sehr grob";}}}]});this.trackEditor=config.trackEditor;config=Ext.apply({title:'Track vereinfachen',items:simplifyFormPanel,width:500,buttons:[{text:'Vorschau',scope:this,handler:function(){config.trackEditor.previewSimplifiedTrack(simplifyFormPanel.getComponent('slider').getValue());}},{text:'Durchführen',scope:this,handler:function(){config.trackEditor.simplifyTrack(simplifyFormPanel.getComponent('slider').getValue());this.close();}},{text:'Abbrechen',scope:this,handler:function(){this.close();}}],scope:this,listeners:{beforeClose:function(){this.trackEditor.clearPreviewSimplifiedTrack();}}},config);Tom.wTrackEditorSimplify.superclass.constructor.call(this,config);}});Tom.UploadWindow=Ext.extend(Ext.Window,{constructor:function(config){config=Ext.apply({title:config.title||'Dateien hochladen',items:[new AwesomeUploader({frame:false,gridWidth:400,gridHeight:300,awesomeUploaderRoot:'/lib/Ext/ux/awesome/',maxFileSizeBytes:5242880,extraPostData:config.extraPostData||{},flashSwfUploadFileTypes:config.uploadFileTypes||'*.jpg',flashSwfUploadFileTypesDescription:config.uploadFileTypesDescription||'Bilder',flashUploadUrl:'/queries/upload.php',standardUploadUrl:'/queries/upload.php'})],autoHeight:true,width:450,closeAction:'hide',buttons:[{text:'Minimieren',scope:this,handler:function(){this.hide();}}],scope:this,listeners:{beforeClose:function(){}}},config);Tom.UploadWindow.superclass.constructor.call(this,config);}});Tom.EMailWindow=Ext.extend(Ext.Window,{constructor:function(config){config=Ext.apply({title:'E-Mail verfassen',width:600,height:300,minWidth:300,minHeight:200,layout:'fit',plain:true,bodyStyle:'padding:5px;',buttonAlign:'center',items:[new Ext.form.FormPanel({itemId:'FEMail',baseCls:'x-plain',labelWidth:100,monitorValid:true,url:'/queries/email.php',layout:{type:'vbox',align:'stretch'},defaults:{xtype:'textfield'},items:[{xtype:'combo',name:'to',hiddenName:'sendto',plugins:[Ext.ux.FieldLabeler],store:config.store,mode:'local',fieldLabel:'Empfänger',valueField:'idmembers',displayField:'name',value:config.recipient,hiddenValue:config.recipient,disabled:(Ext.isDefined(config.recipient)),forceSelection:true,allowBlank:false},{plugins:[Ext.ux.FieldLabeler],fieldLabel:'Betreff',name:'subject',allowBlank:false},{plugins:[Ext.ux.FieldLabeler],xtype:'textarea',fieldLabel:'Nachricht',hideLabel:true,name:'message',flex:1,allowBlank:false}]})],buttons:[{text:'Versenden',formBind:true,scope:this,handler:function(){var f=this.getComponent('FEMail').getForm();f.submit({url:this.url,params:{idmembers:Tom.MyApp.member.idmembers,sendto:f.findField('sendto').getValue()},scope:this,success:this.onSuccess,failure:this.onFailure,waitMsg:'E-Mail wird verschickt...'});}},{text:'Abbrechen',scope:this,handler:function(){this.close();}}],onSuccess:function(form,action){this.close();},onFailure:function(form,action){var res=Ext.util.JSON.decode(action.response.responseText);if(Ext.isDefined(res.myErrorMsg)){Tom.MyApp.showError(res.myErrorMsg);}else{Tom.MyApp.showError(action.result.error||action.response.responseText);}}});Tom.EMailWindow.superclass.constructor.call(this,config);}})
Tom.CropWindowUi=Ext.extend(Ext.Window,{title:'Bild zuschneiden',width:660,height:510,modal:true,initComponent:function(){this.fbar={xtype:'toolbar',items:[{xtype:'button',text:'cancel',ref:'../buttonCancel'},{xtype:'button',text:'save',ref:'../buttonSave'}]};Tom.CropWindowUi.superclass.initComponent.call(this);}});Tom.CropWindow=Ext.extend(Tom.CropWindowUi,{cropData:null,imageUrl:'',initComponent:function(){Tom.CropWindow.superclass.initComponent.call(this);var imgLoad=new Image();imgLoad.onload=(function(){this.setSize(imgLoad.width+80,imgLoad.height+120);var crop=new Ext.ux.ImageCrop({imageUrl:this.imageUrl,initialWidth:imgLoad.width,minWidth:110,minHeight:110,initialHeight:imgLoad.height,quadratic:true});this.cropData=crop.getCropData();crop.on('change',function(foo,x){this.cropData=x;},this);this.add(crop);}).createDelegate(this);imgLoad.src=this.imageUrl;this.buttonCancel.on('click',this.close,this);this.buttonSave.on('click',this.saveCrop,this);},saveCrop:function(){Ext.get('output-2').update('X Offset: '+this.cropData.x
+' Y Offset: '+this.cropData.y+' Width: '
+this.cropData.width+' Height: '
+this.cropData.height);if(this.fireEvent('save',this)===false){return this;}}});Tom.MobileTrailsPanel=Ext.extend(Ext.Panel,{constructor:function(config){config=Ext.apply({layout:'hbox',flex:1,layoutConfig:{type:'hbox',align:'stretch',pack:'start'},defaults:{flex:1},items:[{title:'Übersicht',autoScroll:true,items:[{xtype:'box',autoEl:{tag:'div',html:'<img src="/images/mobiletrails/android.png" style="float:right"><h1>MobileTrails Version 0.4</h1>'
+'<p>MobileTrails, eine App für Android Handys, speichert die Traildatenbank auf dem Handy und zeigt dann Trails auch OHNE Internetverbindung an. Damit fallen weder Roaminggebühren im Ausland an noch muss mitten in der Pampa auf die Traildatenbank verzichtet werden.</p>'
+'<h2>Voraussetzungen</h2>'
+'<p><ul class="text">'
+'<li>Handy mit Android Version 1.6 oder höher</li>'
+'<li>rund 450kb Speicherplatz für Anwendung'
+'<li>rund 500kb Speicherplatz für Datenbank (200 Trails), welche (derzeit noch) am internen Speicher des Geräts abgelegt wird.</li>'
+'</ul></p>'
+'<h1>Installation</h1>'
+'<p>MobileTrails ist nicht über den Android Market verfügbar, daher zunächst unter &quot;Einstellungen&quot; - &quot;Anwendungen&quot; - &quot;Unbekannte Quellen&quot; zulassen. Die Installationsdatei auf das Gerät herunterladen und öffnen, die Installation läuft automatisch ab.</p><br><br>'}},{xtype:'container',layout:'hbox',layoutConfig:{pack:'center'},items:[{xtype:'button',text:'MobileTrails herunterladen',scale:'large',icon:'/iconstatic/mobile_trails_32.png',handler:function(){Tom.MyApp.download({mode:'mobileTrails'});}}]}]},{title:'Funktionsumfang',autoScroll:true,html:'<h2>Funktionsumfang</h2>'
+'<p>'
+'<ul class="text">'
+'<li>Kartenansicht: Basierend auf OpenStreetMaps plus diverse Wanderkarten (Amap, Kompass, Outdooractive)</li>'
+'<li>Liste aller Trails: Filtermöglichkeit nach Schwierigkeitsgrad, Nähe zum Standpunkt, ...</li>'
+'<li>Detailansicht inklusive Beschreibung und Track Darstellung auf Google Maps(*)</li>'
+'<li>Exportfunktion des Tracks zum Anzeigen des Trails in anderen Apps wie Apemap oder OruxMaps, welche Offline Kartenmaterial verwalten können</li>'
+'<li>Notizen: Damit können unterwegs neue Trails am Handy erfasst werden. Diese lassen sich dann mit dem Webserver synchronisieren und als Vorlage für neue Trails verwenden.</li>'
+'<li><i>GPS-Logger zur Aufzeichnung eigener Tracks, derzeit noch in der Testphase</i></li>'
+'<li>Synchronisierung Trails und Notizen</li>'
+'<li>Updatefunktion zur Aktualisierung der App</li>'
+'</ul></p>'
+'<p>(*) Zu Beginn ist eine Internetverbindung notwendig. Die Karten werden auf der SD-Karte gecached und stehen dann lokal zur Verfügung</p>'
+'<p>In allen Kartenansichten kann auf den aktuellen Standpunkt gezoomt werden.</p>'},{title:'Screenshots',autoScroll:true,bodyStyle:'backgroundColor : #000000',flex:0,width:440,html:'<img style="padding:5px" src="/images/mobiletrails/welcome.png">'
+'<img style="padding:5px" src="/images/mobiletrails/map.png">'
+'<img style="padding:5px" src="/images/mobiletrails/traillist.png">'
+'<img style="padding:5px" src="/images/mobiletrails/trail1.png">'
+'<img style="padding:5px" src="/images/mobiletrails/trail2.png">'
+'<img style="padding:5px" src="/images/mobiletrails/trail3.png">'
+'<img style="padding:5px" src="/images/mobiletrails/trailsync.png">'
+'<img style="padding:5px" src="/images/mobiletrails/note1.png">'
+'<img style="padding:5px" src="/images/mobiletrails/note2.png">'
+'<img style="padding:5px" src="/images/mobiletrails/note3.png">'}]},config);Tom.MobileTrailsPanel.superclass.constructor.call(this,config);}});Tom.MapServer=Ext.extend(Ext.util.Observable,{constructor:function(config){this.tileLayers=new Array();this.overlayStore=new Ext.data.Store({id:'id',reader:new Ext.data.JsonReader({successProperty:'success',idProperty:'id',root:'data'},Tom.MapServerOverlayRecord),listeners:{load:{fn:function(store,records,options){records=[].concat(records);if(records.length<1){return;}
for(var i=0,len=records.length;i<len;i++){records[i].data.ovlBounds=new google.maps.Polyline.fromEncoded({points:records[i].data.points,levels:records[i].data.levels,zoomFactor:2,numLevels:18});if(records[i].data.ovlBounds.getVertexCount()>0){var center=records[i].data.ovlBounds.getBounds().getCenter();}else{center=new google.maps.LatLng(0,0);}
records[i].data.centerLat=center.lat();records[i].data.centerLng=center.lng();}},scope:this}}})
this.readConfig(config);this.isRunning=false;this.addEvents('started','stopped','failed');this.listeners=config.listeners;Tom.MapServer.superclass.constructor.call(this,config)},readConfig:function(config){this.hostname=config.ms_hostname||'localhost';this.webroot=config.ms_webroot||'/';this.port=config.ms_port||'8080';this.mode=config.ms_mode||'none';this.apparch=config.ms_apparch||'windows';this.appport=config.ms_appport||'8080';},start:function(){if((!Ext.isDefined(this.applet))&&(this.mode=='applet')){this.applet=new Ext.Panel({bodyCfg:{name:'MapServerApplet',tag:'applet',code:'at.trails.www.mapserver.mapServer',archive:'/applet/mapserver.jar',height:16,width:16,cn:[{tag:'param',name:'backcolor',value:'234,234,234'},{tag:'param',name:'arch',value:'linux'},{tag:'param',name:'port',value:'18061'}]}});Tom.MyApp.StatusElement.add(this.applet);Tom.MyApp.StatusElement.doLayout();}
try{var subFolder=Tom.MyApp.member.config.ms_overlays.data[0].subFolder;CSSHttpRequest.get(Tom.MyApp.MapServer.fullServerUrl()+subFolder
+'/config.css',function(response){if(response==""){Tom.MyApp.MapServer.startFailed();}else{Tom.MyApp.MapServer.startSuccessfull();}});}catch(e){this.startSuccessfull();}},startSuccessfull:function(){this.isRunning=true;this.updateOverlays();this.fireEvent('started',this);},startFailed:function(){this.isRunning=false;this.updateOverlays();this.fireEvent('failed',this);},stop:function(){if(Ext.isDefined(this.applet)){Tom.MyApp.StatusElement.remove(this.applet);Tom.MyApp.StatusElement.doLayout();delete this.applet;}
this.isRunning=false;this.updateOverlays();this.fireEvent('stopped',this);},update:function(config){this.stop();this.readConfig(config);this.start();},updateOverlays:function(){this.overlayStore.loadData(Tom.OnlineMapData,false);if(Tom.MyApp.member.config.swissmap){this.overlayStore.loadData(Tom.OnlineMapDataSwissMap,true);}
if(this.isRunning&&(Ext.isDefined(Tom.MyApp.member.config.ms_overlays))&&(Tom.MyApp.member.config.ms_overlays!=null)){this.overlayStore.loadData(Tom.MyApp.member.config.ms_overlays,true);}
this.overlayStore.sort([{field:'continent',direction:'ASC'},{field:'title',direction:'ASC'}],'ASC');this.updateTileLayers();Tom.MyApp.showInfo('Lokale Wanderkarten neu geladen ...');if(Ext.isDefined(Tom.MyApp.TabPanel)){Tom.MyApp.TabPanel.items.each(function(item,index,length){if(Ext.isDefined(item.updateMapMenu))
item.updateMapMenu();},this);}},fullServerUrl:function(){return'http://'+this.hostname+':'+this.port+'/'+this.webroot;},updateTileLayers:function(){this.tileLayers=new Array();this.overlayStore.each(function(r){if(r.data.subFolder!=""){r.data.mapId=r.data.subFolder.replace("/","");}else if(Ext.isDefined(r.data.mapId)){r.data.mapId=r.data.mapId.toString();}else{return true;}
var copyright=new google.maps.Copyright(1,new google.maps.LatLngBounds(new google.maps.LatLng(-90,-180),new google.maps.LatLng(90,180)),0,r.data.copyrightText||'');var copyrightCollection=new google.maps.CopyrightCollection(r.data.copyrightPrefix||'');copyrightCollection.addCopyright(copyright);var tilelayer=new google.maps.TileLayer(copyrightCollection,r.data.minZoom,r.data.maxZoom);tilelayer.myBounds=r.data.bounds;tilelayer.myMinZoom=r.data.minZoom;tilelayer.myMaxZoom=r.data.maxZoom;tilelayer.subFolder=r.data.subFolder||'';tilelayer.isPng=function(){return true;};tilelayer.getOpacity=function(){return 1.0;};tilelayer.getTileUrl=r.data.getTileURL||function(p,z){if(z>this.myMaxZoom||z<this.myMinZoom){return"";}else if(p.x>=this.myBounds[z][0]&&p.x<=this.myBounds[z][1]&&p.y>=this.myBounds[z][2]&&p.y<=this.myBounds[z][3]){return Tom.MyApp.MapServer.fullServerUrl()+this.subFolder
+'Z'+z+'/'+p.y+'/'+p.x+'.png';}else{return"";}};this.tileLayers[r.data.mapId]=new google.maps.TileLayerOverlay(tilelayer);},this)},getOverlayMenu:function(gmapPanelId){overlayMenu=new Ext.menu.Menu();var maps={};this.overlayStore.each(function(r){cat=(r.get('continent')=='EU')?r.get('country'):r.get('continent');if(!Ext.isDefined(maps[cat])){maps[cat]={};}
if(r.get('local')){cls='local';}else{cls='online';}
maps[cat][r.get('title')]={text:r.get('title'),cls:'mapstatus',style:'background-image: url("/icon/map'+cls+'/'
+ip+'_16.png");',mapId:r.data.mapId,minZoom:r.data.minZoom,maxZoom:r.data.maxZoom,centerLat:r.data.centerLat,centerLng:r.data.centerLng,checked:false,tileLayerOverlay:this.tileLayers[r.data.mapId],local:r.data.local,hideOnClick:false,checkHandler:function(item,checked){var gmapPanel=Ext.getCmp(gmapPanelId);if(checked){gmapPanel.map.addMapOverlay(item);}else{gmapPanel.map.removeMapOverlay(item);}}};},this);overlayMenu.add([{text:'<b>Österreich</b>',icon:'/flags/at.png'}].concat(obj2arr(maps['AT'])).concat(['-',{text:'<b>Europa</b>'}]));delete maps['AT'];for(var c in maps){overlayMenu.add({text:Tom.MyApp.getCountry(c),icon:'/flags/'+c.toLowerCase()+'.png',menu:{items:obj2arr(maps[c])}});}
return overlayMenu;},getAvailableOverlayMenu:function(gmapPanelId,latlng){var maps=new Array();var gmapPanel=Ext.getCmp(gmapPanelId);this.overlayStore.each(function(r){try{var boundary=new google.maps.Polygon.fromEncoded({polylines:[{color:this.plColor,weight:this.plWeight,opacity:this.plOpacity,points:r.get('points'),levels:r.get('levels'),zoomFactor:2,numLevels:18}]});if(boundary.containsLatLng(latlng)){var baseItem=gmapPanel.getOverlayMenuItem(r.data.mapId);maps.push({text:r.get('title'),cls:'mapstatus',checked:baseItem.checked,style:'background-image: url("/icon/map'
+(r.get('local')?'local':'online')
+'/'
+ip
+'_16.png");',hideOnClick:false,checkHandler:function(item,checked){baseItem.setChecked(checked);}});}}catch(e){}},this);return maps;}});Tom.OnlineMapDataSwissMap={data:[{title:'Map+ Schweiz',mapId:'-1',local:false,continent:'EU',country:'CH',minZoom:7,maxZoom:16,points:"wcbcHslss@`rkAm_|Enn`A|vXn|TyxlD`bzAu_NfmsA|trAcgXdjwC|jgBhxv@}m~Ax`sCp_hAfbjAl}Sz|_DwcyBpqnBzj`ApknAkjRftcAmntGad~E",levels:"PNMNPMMONMNNMPP",centerLat:47,centerLng:8.3,isPng:false,copyrightPrefix:MAPS.copyrightPrefix,copyrightText:"www.mapplus.ch".toHref(),getTileURL:function(p,z){MAPS.counter=(MAPS.counter%3)+1;return"http://mp"+MAPS.counter+".mapplus.ch/kacache/"
+(17-z)+"/def/def/t"+p.y+"/l"+p.x+"/t"+p.y
+"l"+p.x+".jpg";}}]};Tom.OnlineMapData={data:[{title:'Amap',mapId:'-2',local:false,continent:'EU',country:'AT',minZoom:8,maxZoom:15,points:"sinjHa~ozAdfz@iyiKbcqEgnc@jcVztrAl`wDzrlC`sx@tbgHasx@f_jLa`dA|xeAtjr@xtyDmqSbldEuxp@zv_Cc|nBgxv@njm@er}BldI|lE}h}@qen@lva@qwnC_}u@mgbEjwQqwnC}lrAr}gAsfmCcd~Evb^ex}C",levels:"PPNMPNMMMLPNKMMMMNNNP",centerLat:47,centerLng:14,isPng:true,copyrightPrefix:MAPS.copyrightPrefix,copyrightText:"www.bergfex.at".toHref(),getTileURL:function(p,z){MAPS.counter=(MAPS.counter+1)%2;if(z>=8&&z<=15){var xBase="";if(z>13){xBase=p.x.toString().substring(0,z-12)+"/";}
return"http://static"+(MAPS.counter+4)
+".bergfex.at/images/amap/"+z+"/"+xBase+z
+"_"+p.x+"_"+p.y+".png";}else{return"";}}},{title:'Outdooractive Österreich',mapId:'-3',local:false,continent:'EU',country:'AT',minZoom:9,maxZoom:17,points:"sinjHa~ozAdfz@iyiKbcqEgnc@jcVztrAl`wDzrlC`sx@tbgHasx@f_jLa`dA|xeAtjr@xtyDmqSbldEuxp@zv_Cc|nBgxv@njm@er}BldI|lE}h}@qen@lva@qwnC_}u@mgbEjwQqwnC}lrAr}gAsfmCcd~Evb^ex}C",levels:"PPNMPNMMMLPNKMMMMNNNP",centerLat:47,centerLng:14,isPng:true,copyrightPrefix:MAPS.copyrightPrefix,copyrightText:MAPS.OA_copyrightText,getTileURL:function(p,z){if(z>=9&&z<=17){MAPS.counter=(MAPS.counter+1)%4;return"http://s"+MAPS.counter
+".outdooractive.com/austria/map/"+z+"/"+p.x
+"/"+p.y+".png";}else{return"";}}},{title:'Outdooractive Deutschland',mapId:'-4',local:false,continent:'EU',country:'DE',minZoom:8,maxZoom:17,points:"_}puHaz|zAj{lCn~aObf_HkjyH`znBxicEfwpCsia@dw_@jtuQu}~@nznOqzrGsa{@mlt@bxdG_ieJn~qCuvfDsen@wapCectCg~hEsvdAoxlA_i{GoqvD|yh@hwb@ihsJd`TkvbSvesCoabD",levels:"PPONPPPOOPMMOOPKNP",centerLat:51,centerLng:10,isPng:true,copyrightPrefix:MAPS.copyrightPrefix,copyrightText:MAPS.OA_copyrightText,getTileURL:function(p,z){if(z>=8&&z<=17){MAPS.counter=(MAPS.counter+1)%4;return"http://s"+MAPS.counter
+".outdooractive.com/portal/map/"+z+"/"+p.x
+"/"+p.y+".png";}else{return"";}}},{title:'Outdooractive Südtirol',mapId:'-5',local:false,continent:'EU',country:'IT',minZoom:9,maxZoom:17,points:"koq~Gm|uiAdtzAcgv@j~yAvcjGaor@xtAzfs@sqG{fs@rqGn~Hvx{A{sVl{p@ibj@dlL_}^}c|@fkUy`bAgce@irV",levels:"PNMMNMLOMLLP",centerLat:46.734095,centerLng:11.288802,isPng:true,copyrightPrefix:MAPS.copyrightPrefix,copyrightText:MAPS.OA_copyrightText,getTileURL:function(p,z){if(z>=9&&z<=17){MAPS.counter=(MAPS.counter+1)%4;return"http://s"+MAPS.counter
+".outdooractive.com/suedtirol/map/"+z+"/"+p.x
+"/"+p.y+".png";}else{return"";}}},{title:'Norwegen Statkart Topo 2',mapId:'-6',local:false,continent:'EU',country:'NO',minZoom:0,maxZoom:17,points:"c~r~Iwbyo@wajF|hrVesiS|nr@kl`]_xdu@qk|BjivI}tsOih|i@uosEsbgv@bbyGohnc@vshGxhyY}~}Cvn`GxvoFr~zKcww@dncWzssFpstWfg`s@`nq]vajFd~vX",levels:"PPPPPOPPNOOOPPP",centerLat:60,centerLng:8,isPng:true,copyrightPrefix:MAPS.copyrightPrefix,copyrightText:'www.statkart.no'.toHref(),getTileURL:function(p,z){if(z>=0&&z<=17){return"http://opencache.statkart.no/gatekeeper/gk/gk.open_gmaps?layers=topo2&zoom="
+z+"&x="+p.x+"&y="+p.y;}else{return"";}}},{title:'Norwegen Statkart Topo 2 Raster',mapId:'-7',local:false,continent:'EU',country:'NO',minZoom:0,maxZoom:17,points:"c~r~Iwbyo@wajF|hrVesiS|nr@kl`]_xdu@qk|BjivI}tsOih|i@uosEsbgv@bbyGohnc@vshGxhyY}~}Cvn`GxvoFr~zKcww@dncWzssFpstWfg`s@`nq]vajFd~vX",levels:"PPPPPOPPNOOOPPP",centerLat:60,centerLng:8,isPng:true,copyrightPrefix:MAPS.copyrightPrefix,copyrightText:'www.statkart.no'.toHref(),getTileURL:function(p,z){if(z>=0&&z<=17){return"http://opencache.statkart.no/gatekeeper/gk/gk.open_gmaps?layers=toporaster2&zoom="
+z+"&x="+p.x+"&y="+p.y;}else{return"";}}}].concat(Tom.TemporaryMaps||[])};Tom.MemberList=Ext.extend(Ext.grid.GridPanel,{initComponent:function(){Tom.MyApp.MemberStore.reload();this.cellActions=new Ext.ux.grid.CellActions({listeners:{action:function(grid,record,action,value){switch(action){case'i_email':Tom.MyApp.email(record.data.idmembers);break;}}},align:'left'});Ext.apply(this,{store:Tom.MyApp.MemberStore,plugins:[this.cellActions],columns:[{header:'Name',dataIndex:'name',sortable:true,width:250,cellActions:[{iconCls:'i_email',qtip:'E-Mail verfassen'}]},{header:'Freeride',dataIndex:'freeride',sortable:true,width:100,renderer:function(value,metaData,record,rowIndex,colIndex,store){if(value==1){return'Freeride'}else{return'';}}},{header:'Cross Country',dataIndex:'crosscountry',sortable:true,width:100,renderer:function(value,metaData,record,rowIndex,colIndex,store){if(value==1){return'Cross Country'}else{return'';}}},{header:'Trails erstellt ',align:'right',dataIndex:'trailscreated',sortable:true,width:100}]});Tom.MemberList.superclass.initComponent.apply(this,arguments);}});Tom.ProjectList=Ext.extend(Ext.grid.GridPanel,{initComponent:function(){Ext.apply(this,{store:Tom.MyApp.ProjectStore,listeners:{cellclick:this.onSelectProject,cellcontextmenu:function(grid,rowIndex,cellIndex,e){e.stopEvent();var record=grid.getStore().getAt(rowIndex);var idprojects=record.get('idprojects');var bounds=record.get('bounds');if(!this.contextMenu){this.contextMenu=new Ext.menu.Menu({id:'gridCtxMenuProjects'});}else{this.contextMenu.removeAll();}
this.contextMenu.add([{text:'<b>'+record.get('title')+'</b>'},{text:'Bearbeiten',scope:this,icon:'/icon/edit_project/'+ip+'_16.png',handler:function(){Tom.MyApp.showTab('editproject',record.get('idprojects'));}},{text:'In Karte zeigen',scope:this,icon:'/icon/map/'+ip+'_16.png',handler:function(){Tom.MyApp.getTab('map').map.zoomToBounds(record.get('bounds'));}},{text:'Löschen',scope:this,icon:'/icon/delete/'+ip+'_16.png',handler:function(){Tom.MyApp.removeProject(record.get('idprojects'),record.get('title'));}}]);var xy=e.getXY();this.contextMenu.showAt(xy);}},columns:[{header:'Name',dataIndex:'title',sortable:true,width:250},{header:'erstellt von',sortable:true,dataIndex:'creator',renderer:function(value,metaData,record,rowIndex,colIndex,store){return Tom.MyApp.getMember(record.get('creator'));}},{header:'erstellt am',width:100,sortable:true,align:'right',dataIndex:'tsc',renderer:Ext.util.Format.dateRenderer('d.m.Y')},{header:'Beschreibung',width:400,sortable:false,dataIndex:'description'}]});Tom.ProjectList.superclass.initComponent.apply(this,arguments);},onSelectProject:function(e){}});Tom.TrackEditorPanel=Ext.extend(Ext.Panel,{constructor:function(config){this.addEvents('onAfterSave');this.idtrack=config.idtrack;this.complexEditor=config.complexEditor;this.store=config.store;this.GMapPanel=new Tom.GMapTrackEditor({region:'center',listeners:{mapready:{fn:config.mapready||Ext.emptyFn,scope:this}}});this.FormPanel=config.FormPanel;config=Ext.apply({closable:true,hideBorders:true,defaults:{},layout:'tdgi_border',bbar:new Ext.Toolbar({buttonAlign:'center',items:[{cls:'x-btn-text-icon',icon:'/icon/save/'+ip+'_32.png',scale:'large',text:'Anwenden',scope:this,handler:function(b,e){this.saveTrack();}},' ',{cls:'x-btn-text-icon',icon:'/icon/ok/'+ip+'_32.png',scale:'large',text:'<b>Speichern</b>',scope:this,handler:function(b,e){if(this.saveTrack()){Tom.MyApp.TabPanel.remove(this.getId());}}},' ',{cls:'x-btn-text-icon',icon:'/icon/cancel/'+ip+'_32.png',scale:'large',text:'Abbrechen',scope:this,handler:function(b,e){Ext.Msg.show({title:'Track Editor',msg:'Willst du wirklich die Änderungen verwerfen?',buttons:Ext.Msg.YESNO,fn:function(buttonId,text,options){if(buttonId=='yes'){Tom.MyApp.TabPanel.remove(config.id);}},icon:Ext.MessageBox.QUESTION})}}]}),items:[this.GMapPanel,this.FormPanel].concat(Ext.isDefined(this.HelpPanel)?[this.HelpPanel]:[])},config);Tom.TrackEditorPanel.superclass.constructor.call(this,config);},setFormData:function(record){this.FormPanel.getForm().loadRecord(record);},setTrackEditorData:function(record){if(this.complexEditor){this.GMapPanel.loadTrack(record.data.gpstrack);}else{this.GMapPanel.loadEncodedPoly(record.data.encLatLngs,record.data.encLevels);}},getTrackEditorData:function(){var f=this.FormPanel.getForm();if(this.complexEditor){f.findField('gpstrack').setValue(this.GMapPanel.getTrack());}else{var encPolyline=this.GMapPanel.getEncodedPoly();f.findField('encLatLngs').setValue(encPolyline.points);f.findField('encLevels').setValue(encPolyline.levels);}
f.findField('bounds').setValue(this.GMapPanel.getTrackBounds());f.findField('label_lat').setValue(this.GMapPanel.getLabelLat());f.findField('label_lng').setValue(this.GMapPanel.getLabelLng());},loadTrack:function(records,options,success){if((success)&&(Ext.isDefined(records[0]))){this.record=records[0];this.setFormData(this.record);this.setTrackEditorData(this.record);this.setTitle('Edit: '+this.record.data.title);this.FormPanel.enable();this.GMapPanel.enableEditor();}else{Tom.MyApp.showError("Daten für diesen Track konnten nicht geladen werden!")}},saveTrack:function(){var f=this.FormPanel.getForm();if(this.GMapPanel.hasValidTrack()){this.getTrackEditorData();if(f.isValid()){this.record.beginEdit();f.updateRecord(this.record);this.record.endEdit();if(!Ext.isDefined(this.idtrack)){this.store.add(this.record);}
this.fireEvent('onAfterSave');return true;}else{Tom.MyApp.showError("Formular nicht vollständig ausgefüllt!");return false;}}else{Tom.MyApp.showError("Kein Track vorhanden!");return false;}},getIdtracks:function(){return this.idtracks;}});Tom.TrailEditorPanel=Ext.extend(Tom.TrackEditorPanel,{constructor:function(config){var helpFirstSteps=new Ext.Panel({title:'Erste Schritte',items:[{xtype:'box',autoScroll:true,autoEl:{tag:'div',html:'<p>Mit dem Trackeditor können direkt im Browser Tracks erstellt und bearbeitet werden. Und so gehts:</p>'
+'<h2>Karte auswählen</h2>'
+'<p>In der Kartenansicht auf den gewünschten Bereich gehen und unter Menü &quot;Wanderkarten&quot; eine geeignete Karte auswählen.</p>'
+'<h2>Ich habe einen Track mit einem GPS-Gerät aufgezeichnet</h2>'
+'<p>Mit <span class="iLeft i_import"> kann ein GPX-Track direkt importiert werden. '
+'Danach eventuell noch vorne oder hinten <span class="iLeft i_cut">abschneiden</span> und '
+'<span class="iLeft i_edit_simplify">vereinfachen</span>, um die Anzahl der Trackpunkte zu reduzieren.</p>'
+'<h2>Ich habe keinen GPS-Track</h2>'
+'<p>Mit <span class="iLeft i_edit_draw_e"></span> in den Zeichenmodus und Track nachzeichnen. '
+'Entweder nochmals auf <span class="iLeft i_edit_draw_e"></span> klicken oder doppelklicken auf den letzten Punkt um die Bearbeitung der Linie abzuschließen.</p>'
+'<p>Wenn der Track nicht genau passt, dann kann mit dem <span class="iLeft i_edit_draw">Button</span> wieder in den Bearbeitungsmodus gewechselt werden. '
+'Die weissen Quadrate sind die Punkte: Anklicken löscht einen Punkt. Wird die linke Maustaste gehalten, kann der Punkt verschoben werden. '
+'Verschiebt man eines der blasseren Quadrate (jeweils im Mittelpunkt einer Teillinie), können Zwischenpunkte eingefügt werden.'
+'<h2>Des war jetzt nit so gescheit...</h2>'
+'<p>Wenn was schief geht, dann kann mit <span class="iLeft i_undo"></span> die letzten Schritte wieder rückgängig gemacht werden.</p>'
+'<h2>Wofür sind die restlichen Icons?</h2>'
+'<p>In der Funktionsreferenz (siehe unten) sind alle erklärt...</p>'}}]});var helpReference=new Ext.Panel({title:'Funktionsreferenz',autoScroll:true,data:{common:[{i:"import",t:'Track importieren',m:'Der Track aus einer GPX Datei kann den bestehenden Track ersetzen oder vorne/hinten an den vorhandenen Track angehängt werden.'},{i:"delete",t:'Track löschen',m:'Alle Trackpunkte werden gelöscht.'},{i:"undo",t:'Rückgängig',m:'Letzte Aktion rückgängig machen.'},{i:"redo",t:'Wiederherstellen',m:'Wiederherstellen des Zustandes vor dem letzten &quot;Rückgängig&quot;-Befehls.'}],drawing:[{i:"edit_draw_e",t:'Zeichnen (Ende)',m:'Neue Punkte werden am Ende des Trails eingefügt. Entweder nochmals auf <span class="iLeft i_edit_draw_e"></span> klicken oder doppelklicken auf den letzten Punkt um die Bearbeitung der Linie abzuschließen.'},{i:"edit_draw_s",t:'Zeichnen (Anfang)',m:'Neue Punkte werden am Anfang des Trails eingefügt.'},{i:"edit_draw",t:'Trackpunkte bearbeiten',m:'Es werden helle Quadrate (Trackpunkt) und blassere Quadrate (Zwischenpunkt) eingeblendet. '
+'Trackpunkte können durch Anklicken gelöscht werden. Wird die Maustaste gedrückt gehalten, kann der Punkt verschoben werden. '
+'Zwischenpunkte können durch Verschieben mit der Maus eingefügt werden.'},{i:"cut",t:'Track kürzen',m:'Durch Anklicken eines Trackpunktes wird in Rot die Vorschau des gekürzten Tracks und ein kleines Menü angezeigt:<br>'
+'<span class="iLeft i_ok">Änderungen akzeptieren</span><br>'
+'<span class="iLeft i_edit_reverse">Umschalten auf die andere Seite</span><br>'
+'<span class="iLeft i_cancel">Vorgang abbrechen</span><br>'},{i:"edit_reverse",t:'Trackorientierung umkehren',m:'Anfang und Ende des Tracks werden vertauscht, zur Verdeutlichung werden kurz Symbole an den Trackenden eingeblendet.'},{i:"edit_simplify",t:'Track vereinfachen',m:'Aufzeichnungen mit einem GPS-Gerät liefern je nach Einstellung manchmal Tracks mit sehr vielen Punkten, dann kann es sinnvoll sein, die Linie zu vereinfachen. '
+'Im Dialogfenster kann die Aggressivität des Algorithmus eingestellt werden und mit Hilfe einer Vorschau kontrolliert werden.'}]},tpl:new Ext.XTemplate('<h1>Allgemeine Funktionen</h1>','<tpl for="common">','<h3 class="iLeft i_{i}">{t}</h3><p class="iLeft">{m}</p>','</tpl>','<h1>Zeichenfunktionen</h1>','<tpl for="drawing">','<h3 class="iLeft i_{i}">{t}</h3><p class="iLeft">{m}</p>','</tpl>')});this.HelpPanel=new Ext.Panel({itemId:'help',iconCls:'i_help',width:400,region:'west',margins:'0 0 0 0',collapsible:true,collapsedTitle:true,collapsed:false,frame:false,border:true,autoScroll:true,title:'Anleitung zum Track Editor',margins:'0 0 0 0',layout:'accordion',items:[helpFirstSteps,helpReference]});config=Ext.apply({listeners:{onAfterSave:{fn:function(){if(Ext.isDefined(this.note)){Ext.Msg.show({title:'Vorlage löschen',msg:'Soll die verwendete Vorlagen jetzt gelöscht werden?',buttons:Ext.Msg.YESNO,fn:function(buttonId,text,options){if(buttonId=='yes'){this.note.store.remove(this.note);}},scope:this,icon:Ext.MessageBox.QUESTION});}},scope:this}},complexEditor:true,FormPanel:new FTrail({region:'east',width:700,autoScroll:true,frame:true,title:'Datenblatt',collapsible:true,collapsedTitle:true,collapsed:false,disabled:true,TrailEditor:config.id,method:'POST',url:'/queries/trailstore/create.php',baseParams:{idmembers:Tom.MyApp.member.idmembers,mode:'basic'},listeners:{'gettrackproperties':{fn:function(f){var prop=this.GMapPanel.getTrackProperties();if(prop){for(var p in prop){f.findField(p).setValue(Math.round(prop[p],0));}
Tom.MyApp.showInfo('Statistik aus GPS-Track übernommen...');}else{Tom.MyApp.showWarning('Kein GPS-Track vorhanden!');}},scope:this}}}),mapready:function(){if(Ext.isDefined(this.idtrack)){this.store.load({add:true,scope:this,params:{idmembers:Tom.MyApp.member.idmembers,idtrails:this.idtrack,mode:'full'},callback:this.loadTrack});}else if(Ext.isDefined(this.note)){this.loadTrack(new Array(new Tom.TrailDef(this.note.data)),{},true);}else{this.record=new Tom.TrailDef({});this.FormPanel.enable();this.GMapPanel.enableEditor();}}},config);Tom.TrailEditorPanel.superclass.constructor.call(this,config);},setFormData:function(record){this.FormPanel.setTagCheckboxes(record.data.tags);Tom.TrailEditorPanel.superclass.setFormData.apply(this,arguments);},getTrackEditorData:function(){var f=this.FormPanel.getForm();f.findField('tags').setValue(this.FormPanel.getTagCheckboxes());Tom.TrailEditorPanel.superclass.getTrackEditorData.apply(this,arguments);}});Tom.PointEditorPanel=Ext.extend(Ext.Panel,{constructor:function(config){this.addEvents('onAfterSave');this.idpoint=config.idpoint;this.store=config.store;this.FormPanel=config.FormPanel;this.GMapPanel=new Tom.GMapPointEditor({region:'center',listeners:{mapready:{fn:config.mapready||Ext.emptyFn,scope:this}}});this.GMapPanel.on('dragend',function(lat,lng){this.FormPanel.getForm().setValues({lat:lat,lng:lng});},this);config=Ext.apply({closable:true,hideBorders:true,layout:'tdgi_border',bbar:new Ext.Toolbar({buttonAlign:'center',items:[{cls:'x-btn-text-icon',icon:'/icon/save/'+ip+'_32.png',scale:'large',text:'Anwenden',scope:this,handler:function(b,e){this.savePoint();}},' ',{cls:'x-btn-text-icon',icon:'/icon/ok/'+ip+'_32.png',scale:'large',text:'<b>Speichern</b>',scope:this,handler:function(b,e){if(this.savePoint()){Tom.MyApp.TabPanel.remove(this.getId());}}},' ',{cls:'x-btn-text-icon',icon:'/icon/cancel/'+ip+'_32.png',scale:'large',text:'Abbrechen',scope:this,handler:function(b,e){Ext.Msg.show({title:'Point Editor',msg:'Willst du wirklich die Änderungen verwerfen?',buttons:Ext.Msg.YESNO,fn:function(buttonId,text,options){if(buttonId=='yes'){Tom.MyApp.TabPanel.remove(config.id);}},icon:Ext.MessageBox.QUESTION})}}]}),items:[this.GMapPanel,this.FormPanel].concat(Ext.isDefined(this.HelpPanel)?[this.HelpPanel]:[])},config);Tom.PointEditorPanel.superclass.constructor.call(this,config);},loadPoint:function(records,options,success){if((success)&&(Ext.isDefined(records[0]))){this.record=records[0];c=this.record.get('config');switch(this.record.get('type')){case 1:v={imgUrl1:c.imgUrl,homepage1:c.homepage,altitude1:c.altitude}
break;case 2:v={html2:c.html}
break;case 3:v={html3:c.html}
break;case 4:v={html4:c.html}
break;case 5:v={html5:c.html}
break;default:v={}}
this.FormPanel.getForm().setValues(v);this.FormPanel.getForm().loadRecord(this.record);this.FormPanel.showSubForm(this.record.get('type'));var markerLatLng=new google.maps.LatLng(this.record.get('lat'),this.record.get('lng'))
this.GMapPanel.setLatLng(markerLatLng);this.GMapPanel.getGMap().setCenter(markerLatLng,10);this.setTitle('Edit: '+this.record.data.title);this.FormPanel.enable();this.GMapPanel.enableEditor();}else{Tom.MyApp.showError("Daten für diesen Punkt konnten nicht geladen werden!")}},savePoint:function(){var f=this.FormPanel.getForm();var markerLatLng=this.GMapPanel.getLatLng();this.FormPanel.getForm().setValues({lat:markerLatLng.lat(),lng:markerLatLng.lng()});if(f.isValid()){var allData=this.FormPanel.getForm().getValues();switch(allData.type){case"1":c={imgUrl:allData.imgUrl1,homepage:allData.homepage1,altitude:allData.altitude1}
break;case"2":c={html:allData.html2}
break;case"3":c={html:allData.html3}
break;case"4":c={html:allData.html4}
break;case"5":c={html:allData.html5}
break;}
this.record.beginEdit();this.record.set('title',allData.title);this.record.set('type',allData.type);this.record.set('lat',allData.lat);this.record.set('lng',allData.lng);this.record.set('config',Ext.encode(c||{}));this.record.endEdit();if(!Ext.isDefined(this.idpoint)){this.store.add(this.record);}
this.fireEvent('onAfterSave');return true;}else{Tom.MyApp.showError("Formular nicht vollständig ausgefüllt!");return false;}},getIdpoints:function(){return this.idpoints;}});Tom.WarningList=Ext.extend(Ext.grid.GridPanel,{initComponent:function(){Ext.apply(this,{store:Tom.MyApp.WarningStore,listeners:{cellclick:this.onSelectWarning,cellcontextmenu:function(grid,rowIndex,cellIndex,e){e.stopEvent();var record=grid.getStore().getAt(rowIndex);var idwarnings=record.get('idwarnings');var bounds=record.get('bounds');if(!this.contextMenu){this.contextMenu=new Ext.menu.Menu({id:'gridCtxMenuWarnings'});}else{this.contextMenu.removeAll();}
this.contextMenu.add([{text:'<b>'+record.get('title')+'</b>'},{text:'Bearbeiten',scope:this,icon:'/icon/edit_warning/'+ip+'_16.png',handler:function(){Tom.MyApp.showTab('editwarning',record.get('idwarnings'));}},{text:'In Karte zeigen',scope:this,icon:'/icon/map/'+ip+'_16.png',handler:function(){Tom.MyApp.getTab('map').map.zoomToBounds(record.get('bounds'));}},{text:'Löschen',scope:this,icon:'/icon/delete/'+ip+'_16.png',handler:function(){Tom.MyApp.removeWarning(record.get('idwarnings'),record.get('title'));}}]);var xy=e.getXY();this.contextMenu.showAt(xy);}},columns:[{header:'Name',dataIndex:'title',sortable:true,width:250},{header:'erstellt von',sortable:true,dataIndex:'creator',renderer:function(value,metaData,record,rowIndex,colIndex,store){return Tom.MyApp.getMember(record.get('creator'));}},{header:'erstellt am',width:100,sortable:true,align:'right',dataIndex:'tsc',renderer:Ext.util.Format.dateRenderer('d.m.Y')},{header:'Beschreibung',width:400,sortable:false,dataIndex:'description'}]});Tom.WarningList.superclass.initComponent.apply(this,arguments);},onSelectWarning:function(e){}});Tom.PoiList=Ext.extend(Ext.grid.GridPanel,{initComponent:function(){Ext.apply(this,{store:Tom.MyApp.PoiStore,listeners:{cellclick:this.onSelectPoi,cellcontextmenu:function(grid,rowIndex,cellIndex,e){e.stopEvent();var record=grid.getStore().getAt(rowIndex);var idpois=record.get('idpois');var bounds=record.get('bounds');if(!this.contextMenu){this.contextMenu=new Ext.menu.Menu({id:'gridCtxMenuPois'});}else{this.contextMenu.removeAll();}
this.contextMenu.add([{text:'<b>'+record.get('title')+'</b>'},{text:'Bearbeiten',scope:this,icon:'/icon/edit_poi/'+ip+'_16.png',handler:function(){Tom.MyApp.showTab('editpoi',record.get('idpois'));}},{text:'In Karte zeigen',scope:this,icon:'/icon/map/'+ip+'_16.png',handler:function(){Tom.MyApp.getTab('map').getGMap().setCenter(new google.maps.LatLng(record.get('lat'),record.get('lng')));}},{text:'Löschen',scope:this,icon:'/icon/delete/'+ip+'_16.png',handler:function(){Tom.MyApp.removePoi(record.get('idpois'),record.get('title'));}}]);var xy=e.getXY();this.contextMenu.showAt(xy);}},columns:[{header:'Name',dataIndex:'title',sortable:true,width:250},{header:'erstellt von',sortable:true,dataIndex:'creator',renderer:function(value,metaData,record,rowIndex,colIndex,store){return Tom.MyApp.getMember(value);}},{header:'erstellt am',width:100,sortable:true,align:'right',dataIndex:'tsc',renderer:Ext.util.Format.dateRenderer('d.m.Y')},{header:'Typ',sortable:true,dataIndex:'type',renderer:function(value,metaData,record,rowIndex,colIndex,store){return Tom.MyApp.getPoiType(value);}}]});Tom.PoiList.superclass.initComponent.apply(this,arguments);},onSelectPoi:function(e){}});Tom.Comments=Ext.extend(Ext.Panel,{constructor:function(config){this.store=new Ext.data.Store({autoDestroy:true,proxy:new Ext.data.HttpProxy({api:{read:'/queries/commentstore/read.php',create:'/queries/commentstore/create.php'}}),root:'data',baseParams:{idmembers:Tom.MyApp.member.idmembers,table:config.table,idowner:config.idowner},batch:false,autoLoad:true,autoSave:true,idProperty:'idcomments',reader:new Ext.data.JsonReader({successProperty:'success',idProperty:'idcomments',root:'data'},Tom.CommentDef),writer:new Ext.data.JsonWriter({encode:true,writeAllFields:false})});this.form=new Ext.FormPanel({labelAlign:'left',monitorValid:true,url:'/queries/comments.php',border:false,labelWidth:'200px',items:[{xtype:'textfield',fieldLabel:'Neues Kommentar',name:'comment',allowBlank:false},{xtype:'button',text:'Abschicken',scope:this,handler:function(){f=this.form.getForm();if(f.isValid()){var record=new Tom.CommentDef({});f.updateRecord(record);this.store.add(record);f.reset();}}},{xtype:'hidden',name:'mode',value:'create'},{xtype:'hidden',name:'idowner',value:config.idowner}]});config=Ext.apply({autoScroll:true,title:'Kommentare',items:[new Ext.DataView({store:this.store,itemSelector:'p',tpl:new Ext.XTemplate('<tpl for=".">','<p><b>{[this.getMember(values.creator)]} ({[fm.date(values.tsc,"d.m.y")]}):</b>','{comment}</p>','</tpl>',{compiled:true,disableFormats:true,getMember:function(idmembers){return Tom.MyApp.getMember(idmembers);}}),emptyText:'Keine Kommentare vorhanden ...'}),this.form]},config);Tom.Comments.superclass.constructor.call(this,config);}});Tom.NotesDialog=Ext.extend(Ext.Window,{title:'Meine Vorlagen',width:600,height:300,layout:'fit',iconCls:'i_notes',buttonAlign:'center',modal:true,initComponent:function(){Tom.NotesDialog.superclass.initComponent.call(this);this.store=new Ext.data.Store({proxy:new Ext.data.HttpProxy({api:{read:'/queries/notestore/read.php',destroy:'/queries/notestore/destroy.php'}}),root:'data',successProperty:'success',idProperty:'idnotes',autoLoad:true,baseParams:{idmembers:Tom.MyApp.member.idmembers},reader:new Ext.data.JsonReader({successProperty:'success',idProperty:'idnotes',root:'data'},Tom.NoteDef),sortInfo:{field:'day',direction:'DESC'},autoSave:true,batch:false,writer:new Ext.data.JsonWriter({encode:true,writeAllFields:true})});this.sm=new Ext.grid.CheckboxSelectionModel();this.gridPanel=new Ext.grid.GridPanel({store:this.store,colModel:new Ext.grid.ColumnModel({defaults:{width:180,sortable:true},columns:[this.sm,{id:'title',header:'Bezeichnung',dataIndex:'title'},{id:'s',header:"S",width:50,align:'center',dataIndex:'s',renderer:function(value,metaData,record,rowIndex,colIndex,store){return'S'+formatS(value);}},{id:'g',header:'G',dataIndex:'g',width:50},{id:'description',header:'Beschreibung',dataIndex:'description'},{id:'day',header:'Tag',dataIndex:'day'}]}),sm:this.sm,viewConfig:{forceFit:true}});this.add(this.gridPanel);var okayButton=new Ext.Button({text:'Umwandeln in neuen Trail',scope:this,minWidth:75,handler:this.onOkay});this.addButton(okayButton);var deleteButton=new Ext.Button({text:'Vorlagen löschen',scope:this,minWidth:75,handler:this.onDelete});this.addButton(deleteButton);var closeButton=new Ext.Button({text:'Abbrechen',scope:this,minWidth:75,handler:this.onClose});this.addButton(closeButton);},onClose:function(){this.close();},onOkay:function(){this.sm.each(function(record){Tom.MyApp.showTab('note2trail',record.id,{'record':record});});this.close();},onDelete:function(){Ext.Msg.show({title:'Vorlagen löschen',msg:'Willst du wirklich die ausgewählten Vorlagen löschen?',buttons:Ext.Msg.YESNO,fn:function(buttonId,text,options){if(buttonId=='yes'){this.sm.each(function(record){record.store.remove(record);});}},scope:this,icon:Ext.MessageBox.QUESTION})}});Tom.ImageGallery=function(){handlerNext=function(){dv=Ext.getCmp('imagegallerydataview')
var current=parseInt(dv.getSelectedIndexes())||0;dv.select(Math.min(dv.getStore().getCount()-1,current+1));Tom.ImageGallery.updateButtons();},handlerPrevious=function(){dv=Ext.getCmp('imagegallerydataview')
var current=parseInt(dv.getSelectedIndexes())||0;dv.select(Math.max(0,current-1));Tom.ImageGallery.updateButtons();},showRecord=function(record){if(!Ext.isDefined(record)){return;}
var main=Ext.getCmp('imagegallerymain');main.removeAll();main.add({xtype:'tom_image',ajaxPreloader:'/images/ajax-loader-black.gif',imageUrl:(String(record.get('url')).length==0)?"/data/files/"
+record.get('idfiles')+".jpg":record.get('url')});main.doLayout();};return Ext.apply(new Ext.Window({id:'imagegallery',maximized:true,modal:true,closable:true,closeAction:'hide',plain:true,resizable:false,border:false,hideBorders:true,bbar:[{text:''},'->',{itemId:'btnBack',text:'Zurück',icon:'/icon/back/'+ip+'_16.png',handler:handlerPrevious},{itemId:'btnNext',text:'Weiter',icon:'/icon/next/'+ip+'_16.png',handler:handlerNext},{text:'Fenster Schließen',icon:'/icon/delete/'+ip+'_16.png',handler:function(){Ext.getCmp('imagegallery').hide();}}],layout:'vbox',layoutConfig:{align:'stretch',pack:'start'},defaults:{xtype:'panel'},items:[{id:'imagegallerymain',layout:'fit',bodyStyle:'background: #000000',items:[],flex:1},{title:'Vorschau',hidden:true,height:130,autoScroll:true,bodyStyle:'background: #000000',itemId:'preview',items:[{xtype:'dataview',id:'imagegallerydataview',singleSelect:true,selectedClass:'selected',margins:{top:3,right:10,bottom:3,left:10},store:new Ext.data.Store({autoDestroy:true,storeId:'myStore',reader:new Ext.data.JsonReader({idProperty:'idfiles'},Tom.FileDef),listeners:{load:{fn:function(store,records,options){Ext.getCmp('imagegallerydataview').select(0);if(store.getCount()>1){Tom.ImageGallery.getComponent('preview').show();}else{Tom.ImageGallery.getComponent('preview').hide();}
Ext.getCmp('imagegallery').doLayout();},scope:this}}}),itemSelector:'img',tpl:new Ext.XTemplate('<tpl for=".">','<img src="/data/files/{idfiles}t.jpg" class="unselected"></tpl>'),listeners:{selectionchange:{fn:function(dv,nodes){if(nodes.length==1){this.showRecord(Ext.getCmp('imagegallerydataview').getRecord(nodes[0]));Tom.ImageGallery.updateButtons();}},scope:this}}}]}]}),{showImages:function(images){this.getComponent('preview').hide();Ext.getCmp('imagegallerymain').removeAll();this.show();var store=Ext.getCmp('imagegallerydataview').getStore();store.loadData(images||new Array());},updateButtons:function(){var current=parseInt(Ext.getCmp('imagegallerydataview').getSelectedIndexes())||0;var count=Ext.getCmp('imagegallerydataview').getStore().getCount();Ext.getCmp('imagegallery').getBottomToolbar().getComponent('btnBack').setDisabled(current==0);Ext.getCmp('imagegallery').getBottomToolbar().getComponent('btnNext').setDisabled(current+1==count);}})}();Tom.AdminWebcams=Ext.extend(Ext.Panel,{constructor:function(config){config=Ext.apply({id:'adminwebcams',closable:true,title:'ADMIN Webcams',layout:'fit',autoScroll:true,items:[{xtype:'dataview',store:Tom.MyApp.PoiStore,tpl:new Ext.XTemplate('<tpl for=".">'
+'<tpl if="type==1">','<h1>{idpois} - {title}</h1>','<h2><a href="javascript:deletePoi({idpois})">Löschen</a></h2>','<img src="{[values.config.imgUrl]}">','</tpl></tpl>')}]},config);Tom.AdminWebcams.superclass.constructor.call(this,config);}});Ext.QuickTips.init();Ext.App=function(config){this.initStateProvider();this.views=[];Ext.apply(this,config);if(!this.api.actions){this.api.actions={};}
Ext.onReady(this.onReady,this);Ext.App.superclass.constructor.apply(this,arguments);}
Ext.extend(Ext.App,Ext.util.Observable,{currentVersion:'2.07',history:[{version:'2.07',title:'Bug fix day',date:'17.07.2011',desc:'Ein Update auf die neueste (und letzte) 3.x Version des ExtJs Frameworks bring vorallem Bugfixes mit. Ich mach mir Gedanken über eine Portierung auf Version 4, was aber einen Haufen Arbeit mit sich bringt, mal schauen.',changes:['Einloggen mit Enter-Taste ermöglicht','Bug Spalte hm-bergab in Trailsliste behoben','Bug Trail speichern behoben']},{version:'2.06',title:'unique user experience stage 1',date:'25.02.2011',desc:'Nachdem inzwischen die wichtigsten Dinge implementiert sind, wird jetzt an der "usability" gearbeitet. Alles muss einfacher werden.',changes:['<b>Rechte Maus Taste</b> öffnet (fast) überall ein Kontexmenü (in Listen, in der Kartenansicht, auf den Tabs, ...). Und es werden ständig mehr, bitte einfach ausprobieren, zahlreiche nützliche Funktionen stehen bereit. In der Kartenansicht kann zum Beispiel eine Liste aller Wanderkarten angezeigt werden, die an diesem Punkt verfügbar sind.','Als Vorgeschmack auf "stage 2": Themes - in den Einstellungen kann ein anderes Farbschema gewählt werden. Ein eigenes trails.at Schema kommt später.']},{version:'2.05',title:'Zipflbob statt Spikes',date:'29.01.2011',desc:'Zahlreiche Bugfixes, ein paar Kleinigkeiten da und dort, dieses Monat wurde hauptsächlich an <b>Mobile Trails</b> gearbeitet.',changes:['POIs: Gleiche Filtermöglichkeiten wie bei den Trails','Aktualisieren Button für Webcams','Anzahl von erstellten Trails in der Benutzerliste']},{version:'2.04',title:'Neuseeland || Daheimbleiben',date:'20.12.2010',desc:'Widgets, Widgets, Widgets !!!',changes:['Die Startseite kann jetzt den eigenen Wünschen angepasst werden (siehe Extras -> Startseite anpassen).','Bildergalerie wurde fertiggestellt (und damit funktionieren auch die Webcams wieder)','POIs (Webcams, Bikeparks, ...) können nun auch hinzugefügt/bearbeitet werden','Automatische Aktualisierung aller bereits geöffneter Wanderkartenmenüs, wenn sich die verfügbaren Wanderkarten ändern.']},{version:'2.03',title:'B-Team',date:'21.11.2010',desc:'Diesmal gibts bessere Filtermöglichkeiten für Trails und eine halbfertige Bildergalerie, die Todo List wird dauernd länger, zuviel Ideen kommen immer wieder neu dazu...',changes:['Globaler Filter für Trails: im Hauptmenü Trails können die Trails nach verschiedenen Kriterien gefiltert werden, damit wird gleichzeitig die Liste der Trails und die Übersichtskarte gefiltert.','Die Farben zur Darstellung der Schwierigkeitsskale S1-S6 wurden überarbeitet (ident mit den in MobileTrails verwendeten Farben)','In der Liste der Trails werden in der Spalte &quot;Neu&quot; neue Trails mit einem roten Symbol und noch ungelesene Trails mit einem grünen Symbol markiert.','Bildergalerie zur Anzeige von Fotos für Trails']},{version:'2.02',title:'Transition Double',date:'24.10.2010',desc:'Dieses monatliche Update (benannt nach dem neuen Felix`schen Radl) bringt die Point of Interests, kurz POI (derzeit Webcams und Bikerides-Touren) und arbeitet nun mit der Notizfunktion von MobileTrails zusammen.',changes:['Bug Framework behoben (Liste der Trails bleibt offen, wenn Trails bearbeitet werden)','Notizen aus MobileTrails können nun als Vorlage für neue Trails verwendet werden (Menüpunkt Trails -> Meine Vorlagen)','Detailansicht Trail: Kommentarfunktion und Infos (S/G) ergänzt','POI (Point of Interests), darunter sind nun Webcams, Bikeparks, Seilbahnen und externe Trails wie die Trails von Bikerides.at zusammengefasst. In dieser Version ist noch keine Editor zum Bearbeiten der POIs enthalten.','Zoom Fenster in Karte ergänzt (Shift Taste drücken und Fenster mit Maus aufziehen)']},{version:'2.01',title:'Transition Blindside',date:'02.09.2010',desc:'Die Bereiche Projekte, Warnungen wurden ergänzt. Die Kommunikation zwischen den einzelnen Seiten wurde ergänzt, dh neue Trails werden z.B. sofort in der Übersichtskarte eingetragen. Die Todo-Liste ist noch lange...',changes:['Projekte und Warnungen ergänzt','Bug Basiskarten behoben','Detailansicht Trail: Infos (Ersteller) ergänzt']},{version:'2.00',title:'Lichtenwald',date:'14.08.2010',desc:'Die Umstellung auf das Javascript-Framework ExtJs bedeutet zwar eine vollständige Neuprogrammierung, dafür konnte die Benutzerführung deutlich verbessert werden. In der aktuellen Version sind noch nicht alle Features der alten Homepage enthalten, diese werden demnächst noch ergänzt.<br><b>Zudem sind sicher noch eine Menge Bugs enthalten, bitte mir Bescheid geben...</b><br>Im Moment muss aufgrund eines Bugs im Framework die Liste der Trails geschlossen werden, wenn aus dem Kontextmenü heraus "Trail bearbeiten" ausgewählt wird (nicht zahlende Kunden haben keinen Zugriff auf die Patches und müssen auf die Updates warten).',changes:['Die Homepage besteht nun aus einer Menüzeile und einem Bereich, in dem die einzelnen Unterseiten angezeigt werden. Zwischen den Unterseiten kann jederzeit umgeschaltet werden, ohne dass diese neu geladen werden müssen.<br>Im Moment sind noch ein paar kleinere Schönheitsfehler enthalten, an denen wird noch gearbeitet. Die grundlegenden Funktionen wie Trails anlegen/bearbeiten funktionieren und sind umfangreich getestet...','Wanderkarten sind nun direkt in jeder Kartenansicht verfügbar, zusätzlich können eigene Karten von einem lokalen Kartenserver eingebunden werden','Trackeditor mit allen Funktionen wie Zeichnen, Kürzen, Vereinfachen und Importieren von GPS-Tracks','Google Earth Plugin zur Anzeige der Trails in 3D (nur Windows/Mac)','Android App &quot;MobileTrails&quot; zur lokalen Speicherung der Trails am Handy als Download verfügbar','Für einige Elemente (Tabs, Listeneinträge, ...) wird mit der rechten Maustaste ein Kontextmenü geöffnet, das zusätzliche Möglichkeiten bietet']}],STATUS_EXCEPTION:'exception',STATUS_VALIDATION_ERROR:"validation",STATUS_ERROR:"error",STATUS_NOTICE:"notice",STATUS_OK:"ok",STATUS_HELP:"help",api:{url:null,type:null,actions:{}},unload:function(){google.maps.Unload();},initStateProvider:function(){var days='';if(days){var date=new Date();date.setTime(date.getTime()+(days*24*60*60*1000));var exptime="; expires="+date.toGMTString();}else{var exptime=null;}
Ext.state.Manager.setProvider(new Ext.state.CookieProvider({path:'/',expires:exptime,domain:null,secure:false}));},registerView:function(view){this.views.push(view);},getViews:function(){return this.views;},registerActions:function(actions){Ext.apply(this.api.actions,actions);},getAPI:function(){return this.api;},decodeStatusIcon:function(status){iconCls='';switch(status){case true:case this.STATUS_OK:iconCls=this.ICON_OK;break;case this.STATUS_NOTICE:iconCls=this.ICON_NOTICE;break;case false:case this.STATUS_ERROR:iconCls=this.ICON_ERROR;break;case this.STATUS_HELP:iconCls=this.ICON_HELP;break;}
return iconCls;},setViewState:function(key,value){Ext.state.Manager.set(key,value);},getViewState:function(key){return Ext.state.Manager.get(key);},t:function(words){return words;},handleResponse:function(res){if(res.type==this.STATUS_EXCEPTION){return this.handleException(res);}
if(res.message.length>0){this.setAlert(res.status,res.message);}},handleException:function(res){Ext.MessageBox.alert(res.type.toUpperCase(),res.message);},filter:{trails:{},pois:{},warnings:{}},distinctUsers:new Array(),distinctCountries:new Array(),onReady:function(){Ext.getBody().on("contextmenu",Ext.emptyFn,null,{preventDefault:true});var body=Ext.getBody();var frame=body.createChild({tag:'iframe',cls:'x-hidden',id:'iframe',name:'iframe'});this.downloadForm=body.createChild({tag:'form',cls:'x-hidden',id:'form',action:'/queries/download.php',method:'POST',target:'iframe'});Ext.getDom('el-artwork').style.visibility='hidden';Ext.getDom('el-framework').style.visibility='hidden';Ext.getDom('el-gmap').style.visibility='hidden';Ext.getDom('el-modules').style.visibility='hidden';Ext.getDom('el-msg').style.visibility='hidden';this.tfUser=new Ext.form.TextField({xtype:'textfield',name:'formUser',emptyText:'Benutzername',width:100,scope:this,listeners:{specialkey:function(f,e){if(e.getKey()==e.ENTER){Tom.MyApp.login();}}}});this.tfFakePass=new Ext.form.TextField({xtype:'textfield',emptyText:'Password',width:100,listeners:{focus:{fn:function(){this.tfFakePass.hide();this.tfPass.show();this.tfPass.focus();this.loginForm.doLayout();},scope:this}}});this.tfPass=new Ext.form.TextField({xtype:'textfield',name:'formPassword',inputType:'password',emptyText:'Passwort',hidden:true,width:100,scope:this,listeners:{specialkey:function(f,e){if(e.getKey()==e.ENTER){Tom.MyApp.login();}}}});this.btLogin=new Ext.Button({xtype:'button',name:'formButton',text:'Go!',scope:this,handler:this.login});this.loginForm=new Ext.Container({layout:{type:'hbox',pack:'center'},defaults:{margins:'0 2 0 2'},style:'position:absolute;top:335px;left:0px;width:700px',items:[this.tfUser,this.tfPass,this.tfFakePass,this.btLogin],renderTo:'el-login'});this.CountryStore=new Ext.data.JsonStore({url:'/queries/countries.php',root:'data',successProperty:'success',idProperty:'idcountries',fields:['idcountries','country','continent',{name:'rank',type:'int'}],sortInfo:{field:'rank',direction:'DESC'},autoLoad:true,listeners:{load:{fn:function(store,records,options){this.updateFilters();},scope:this}}});this.MemberStore=new Ext.data.Store({id:'memberstore',url:'/queries/members.php',reader:new Ext.data.JsonReader({root:'data',idProperty:'idmembers',fields:[{name:'idmembers',type:'int'},'name','crosscountry','freeride','trailscreated']}),listeners:{load:{fn:function(store,records,options){this.updateFilters();},scope:this}}});this.PoiTypesStore=new Ext.data.JsonStore({storeId:'poiTypesStore',url:'/queries/poitypes.php',root:'data',successProperty:'success',idProperty:'idpoitypes',fields:['idpoitypes','poitype'],autoLoad:true});},login:function(){this.btLogin.disable();Ext.Ajax.request({url:'/lib/php/member.php',scope:this,success:function(result,request){var member=this.JSONdecode(result);if(Ext.isDefined(member.session)){this.loginSuccessfull(member);}else{this.btLogin.enable();Ext.MessageBox.alert('Login','Benutzername und Password stimmen nicht überein!');}},failure:function(){Ext.MessageBox.alert('Login','Benutzername und Password konnten nicht überprüft werden!');},params:{action:'login',user:this.tfUser.getValue(),password:this.tfPass.getValue()}});},loginSuccessfull:function(member){this.member=member;this.member.last_login=Date.parseDate(this.member.last_login,'Y-m-d H:i:s');this.member.current_login=Date.parseDate(this.member.current_login,'Y-m-d H:i:s');if(Ext.isString(member.config)){if(member.config.length>0){this.member.config=Ext.decode(member.config);}else{this.member.config={};}}else{this.member.config={};}
this.member.config.widgets=this.member.config.widgets||Tom.DefaultWidgetConfiguration;setActiveStyleSheet(this.member.config.theme||'blue');this.loginForm.hide();Ext.getDom('el-greets').innerHTML='Hallo '+member.name+'!';Ext.get('welcome').pause(1.5).fadeOut({duration:0.5});this.distinctMembers=new Array();this.distinctCountries=new Array();this.TrailStore=new Ext.data.Store({id:'trail',proxy:new Ext.data.HttpProxy({api:{read:'/queries/trailstore/read.php',create:'/queries/trailstore/create.php',update:'/queries/trailstore/update.php',destroy:'/queries/trailstore/destroy.php'}}),reader:new Ext.data.JsonReader({successProperty:'success',idProperty:'idtrails',root:'data'},Tom.TrailDef),writer:new Ext.data.JsonWriter({encode:true,writeAllFields:false}),autoSave:true,batch:false,listeners:{load:{fn:function(store,records,options){this.completeTrails(records);var allCountries=new Array();var allMembers=new Array();store.each(function(record){allCountries.push(record.get('idcountries'));allMembers.push(record.get('creator'));},this);this.distinctCountries=allCountries.toUniqueArray();this.distinctCountries.sort(function(a,b){return Tom.MyApp.getCountry(a)>Tom.MyApp.getCountry(b);});this.distinctMembers=allMembers.toUniqueArray();this.distinctMembers.sort(function(a,b){return Tom.MyApp.getMember(a)>Tom.MyApp.getMember(b);});this.updateFilters();this.StatusBox.setTrailsTotal(this.TrailStore.getTotalCount());},scope:this},add:{fn:function(store,records,index){this.completeTrails(records);},scope:this},update:{fn:function(store,records,index){this.completeTrails(records);},scope:this},save:{fn:function(store,batch,data){this.showInfo('Änderungen an Trail gespeichert...');},scope:this},dataChanged:{fn:function(store){this.filterTrails();},scope:this}}});this.ProjectStore=new Ext.data.Store({id:'project',proxy:new Ext.data.HttpProxy({api:{read:'/queries/projectstore/read.php',create:'/queries/projectstore/create.php',update:'/queries/projectstore/update.php',destroy:'/queries/projectstore/destroy.php'}}),reader:new Ext.data.JsonReader({successProperty:'success',idProperty:'idprojects',root:'data'},Tom.ProjectDef),writer:new Ext.data.JsonWriter({encode:true,writeAllFields:false}),autoSave:true,batch:false,listeners:{load:{fn:function(store,records,options){this.completeProjects(records);},scope:this},add:{fn:function(store,records,index){this.completeProjects(records);},scope:this},update:{fn:function(store,records,index){this.completeProjects(records);},scope:this},remove:{fn:function(store,records,index){this.removeProjects(records);},scope:this},save:{fn:function(store,batch,data){this.showInfo('Änderungen an Projekt gespeichert...');},scope:this}}});this.WarningStore=new Ext.data.Store({id:'warning',proxy:new Ext.data.HttpProxy({api:{read:'/queries/warningstore/read.php',create:'/queries/warningstore/create.php',update:'/queries/warningstore/update.php',destroy:'/queries/warningstore/destroy.php'}}),reader:new Ext.data.JsonReader({successProperty:'success',idProperty:'idwarnings',root:'data'},Tom.WarningDef),writer:new Ext.data.JsonWriter({encode:true,writeAllFields:false}),autoSave:true,batch:false,listeners:{load:{fn:function(store,records,options){this.completeWarnings(records);},scope:this},add:{fn:function(store,records,index){this.completeWarnings(records);},scope:this},update:{fn:function(store,records,index){this.completeWarnings(records);},scope:this},remove:{fn:function(store,records,index){this.removeWarnings(records);},scope:this},save:{fn:function(store,batch,data){this.showInfo('Änderungen an Warnung gespeichert...');},scope:this}}});this.PoiStore=new Ext.data.Store({id:'poi',proxy:new Ext.data.HttpProxy({api:{read:'/queries/poistore/read.php',create:'/queries/poistore/create.php',update:'/queries/poistore/update.php',destroy:'/queries/poistore/destroy.php'}}),reader:new Ext.data.JsonReader({successProperty:'success',idProperty:'idpois',root:'data'},Tom.PoiDef),writer:new Ext.data.JsonWriter({encode:true,writeAllFields:false}),autoSave:true,batch:false,listeners:{load:{fn:function(store,records,options){this.completePois(records);this.updateFilterPois();this.StatusBox.setPoisTotal(this.PoiStore.getTotalCount());},scope:this},add:{fn:function(store,records,index){this.completePois(records);},scope:this},update:{fn:function(store,records,index){this.completePois(records);},scope:this},save:{fn:function(store,batch,data){this.showInfo('Änderungen an Poi gespeichert...');},scope:this},dataChanged:{fn:function(store){this.filterPois();},scope:this}}});this.TrailStore.setBaseParam('idmembers',member.idmembers);this.ProjectStore.setBaseParam('idmembers',member.idmembers);this.WarningStore.setBaseParam('idmembers',member.idmembers);this.MemberStore.setBaseParam('idmembers',member.idmembers);this.PoiStore.setBaseParam('idmembers',member.idmembers);var cHsMin=function(item,checked){if(checked){this.filter.trails.smin={fn:function(record){return record.get('s')>=item.s;},scope:this}
Ext.getCmp('filterTrails').setChecked(true,true);this.TrailStore.filter(obj2arr(this.filter.trails));}};var cHsMax=function(item,checked){if(checked){this.filter.trails.smin={fn:function(record){return record.get('s')<=item.s;},scope:this}
Ext.getCmp('filterTrails').setChecked(true,true);this.TrailStore.filter(obj2arr(this.filter.trails));}};var sMinItems=new Array();var sMaxItems=new Array();for(var i=0;i<=10;i++){sMinItems.push({text:"S"+i,s:i,checked:(i==0)?true:false,checkHandler:cHsMin,hideOnClick:false,group:'smin',scope:this});sMaxItems.push({text:"S"+i,s:i,checked:(i==10)?true:false,checkHandler:cHsMax,hideOnClick:false,group:'smax',scope:this});}
var menu_trail_filter={id:'filterTrails',text:'Filter',checked:false,hideOnClick:false,checkHandler:function(item,checked){if(checked){this.TrailStore.filter(obj2arr(this.filter.trails));}else{this.TrailStore.clearFilter();}},scope:this,menu:{items:[{text:'Ersteller',menu:{id:'mFilterMembers',items:[]}},{text:'Land',menu:{id:'mFilterCountry',items:[]}},{text:'mindestens S',menu:{items:sMinItems}},{text:'maximal S',menu:{items:sMaxItems}},{text:'Status',menu:{items:[{text:"Alle",checked:true,checkHandler:function(item,checked){if(checked){this.filter.trails.status={fn:function(record){return true;},scope:this}
Ext.getCmp('filterTrails').setChecked(true,true);this.TrailStore.filter(obj2arr(this.filter.trails));}},hideOnClick:false,group:'status',scope:this},{text:"Gelesen",checked:false,checkHandler:function(item,checked){if(checked){this.filter.trails.status={fn:function(record){return(record.get('visited')==true);},scope:this}
Ext.getCmp('filterTrails').setChecked(true,true);this.TrailStore.filter(obj2arr(this.filter.trails));}},hideOnClick:false,group:'status',scope:this},{text:"Ungelesen",checked:false,checkHandler:function(item,checked){if(checked){this.filter.trails.status={fn:function(record){return(record.get('visited')==false);},scope:this}
Ext.getCmp('filterTrails').setChecked(true,true);this.TrailStore.filter(obj2arr(this.filter.trails));}},hideOnClick:false,group:'status',scope:this},{text:"Neu",checked:false,checkHandler:function(item,checked){if(checked){this.filter.trails.status={fn:function(record){return(record.get('tsm')>Tom.MyApp.member.last_login);},scope:this}
Ext.getCmp('filterTrails').setChecked(true,true);this.TrailStore.filter(obj2arr(this.filter.trails));}},hideOnClick:false,group:'status',scope:this}]}}]}};var menu_poi_filter={id:'filterPois',text:'Filter',checked:false,hideOnClick:false,checkHandler:function(item,checked){if(checked){this.PoiStore.filter(obj2arr(this.filter.pois));}else{this.PoiStore.clearFilter();}},scope:this,menu:{items:[{text:'Ersteller',menu:{id:'mFilterPoiMembers',items:[]}},{text:'Typ',menu:{id:'mFilterPoitypes',items:[]}}]}};this.Notification=new Tom.NotificationArea();this.InfoBox=new Ext.Button({id:'infobox',icon:'/icon/info/'+ip+'_16.png',scope:this,enableToggle:true,toggleHandler:function(button,state){if(state){this.Notification.show();}else{this.Notification.hide();}}});this.Notification.target=this.Infobox;this.StatusBox=new Tom.StatusBox();this.StatusElement=new Ext.Panel({layout:'toolbar',items:[this.InfoBox]});this.allIdTrails=new Array();this.allTrailsTitle=new Array();this.MemberStore.load({scope:this,callback:function(records,options,success){if(!success){this.showError("Daten der Benutzer konnten nicht geladen werden!");}}});this.loadStore('project');this.loadStore('warning');this.loadStore('poi');this.loadStore('trail');this.MapServer=new Tom.MapServer(this.member.config);this.MapServer.start();if(this.member.idmembers==1){adminMenu={text:'Admin',icon:'/icon/admin/'+ip+'_16.png',menu:{items:[action_admin_webcams,action_update_overlays]}}}else{adminMenu={};};this.MainMenu=new Ext.Toolbar({id:'mainTB',region:'north',height:32,items:[new Ext.Button(action_open_map),{text:'Trails',icon:'/icon/trail/'+ip+'_16.png',menu:{items:[action_traillist,action_new_trail,action_show_notes,menu_trail_filter].concat(actionGrp_trail).concat(['-',action_load_trails])}},{icon:'/icon/project/'+ip+'_16.png',text:'Projekte',menu:{items:[action_projectlist,action_new_project].concat(actionGrp_project).concat(['-',action_load_projects])}},{icon:'/icon/warning/'+ip+'_16.png',text:'Warnungen',menu:{items:[action_warninglist,action_new_warning].concat(actionGrp_warning).concat(['-',action_load_warnings])}},{icon:'/icon/poi/'+ip+'_16.png',text:'Pois',menu:{items:[action_poilist,action_new_poi,menu_poi_filter].concat(actionGrp_poi).concat(['-',action_load_pois])}},{icon:'/icon/extras/'+ip+'_16.png',text:'Extras',menu:{items:[action_mobile_trails,action_open_memberlist,'-',action_preferences,action_open_widgeteditor,'-',action_feedback,action_about]}},adminMenu,'->',this.StatusBox,this.StatusElement,new Ext.Button({icon:'/icon/log_out/'+ip+'_16.png',handler:function(){Ext.Msg.show({title:'Abmeldung',msg:'Willst du dich wirklich abmelden?',buttons:Ext.Msg.YESNO,fn:function(buttonId,text,options){if(buttonId=='yes'){location.reload(true);}},icon:Ext.MessageBox.QUESTION})}})]});this.TabPanel=new Ext.TabPanel({region:'center',activeTab:0,items:[new Tom.WidgetPanel({id:'start',title:'Start',closable:false,autoScroll:true,iconCls:'iTab i_home',widgets:this.member.config.widgets})],listeners:{'beforetabchange':function(panel,newTab,currentTab){for(var a=0;a<allActionGrps.length;a++){allActionGrps[a].disable();}
var tabId=newTab.getId().split("_");if(tabId.length==2){switch(tabId[0]){case"trail":for(var a=0;a<actionGrp_trail.length;a++){actionGrp_trail[a].myId=tabId[1];actionGrp_trail[a].enable();}
break;}}}},plugins:new Ext.ux.TabCloseMenu()});Ext.Ajax.request({scope:this,url:'/queries/tags.php',params:{'idmembers':this.member.idmembers},success:this.tagDataLoaded});return new Ext.Viewport({layout:'border',items:[this.MainMenu,this.TabPanel]});},JSONdecode:function(result){var res=Ext.util.JSON.decode(result.responseText);if(res.success){return res.data;}else{if(Ext.isDefined(res.myErrorMsg)){this.showError(res.myErrorMsg);}
return new Array();}},saveMember:function(){Ext.Ajax.request({scope:this,url:'/lib/php/member.php',params:{'idmembers':this.member.idmembers,'action':'update','data':Ext.encode(this.member)},success:function(result,request){this.JSONdecode(result);},failure:function(result,request){this.showError('Benutzereinstellungen konnten nicht gespeichert werden!');}});},tagDataLoaded:function(result,request){this.availableTags=this.JSONdecode(result);},showInfo:function(msg){this.Notification.addMsg(msg,'i_msg_info',{autoHide:3000});},showWarning:function(msg){this.Notification.addMsg(msg,'i_msg_warning');},showError:function(msg){this.Notification.addMsg(msg,'i_msg_error');},showTab:function(tabContent,ID,options){this.getTab(tabContent,ID,options);},getTab:function(tabContent,ID,options){var tabId=tabContent;if(Ext.isDefined(ID)){tabId+='_'+ID;}
options=options||{};var tab=this.TabPanel.getItem(tabId);if(tab){tab.show();this.TabPanel.setActiveTab(tab)
return tab;}else{switch(tabContent){case"edittrail":return this.TabPanel.add(new Tom.TrailEditorPanel({id:tabId,idtrack:ID,store:this.TrailStore,iconCls:Ext.isDefined(ID)?'iTab i_edit_trail':'iTab i_add_trail',title:Ext.isDefined(ID)?'Edit Trail':'Neuer Trail'})).show();break;case"note2trail":if(!Ext.isDefined(options.record)){return null;}else{return this.TabPanel.add(new Tom.TrailEditorPanel({id:tabId,store:this.TrailStore,note:options.record,iconCls:'iTab i_add_trail',title:Ext.isDefined(options.record.get('title'))?options.record.get('title'):'Neuer Trail'})).show();}
break;case"trail":return this.TabPanel.add(new Tom.Trail({id:tabId,store:this.TrailStore,iconCls:'iTab i_trail',idtrails:ID})).show();break;case"listtrail":return this.TabPanel.add(new Tom.TrailList({id:tabId,title:'Trails/Liste',iconCls:'iTab i_list_trail',closable:true})).show();break;case"editproject":return this.TabPanel.add(new Tom.TrackEditorPanel({id:tabId,idtrack:ID,iconCls:Ext.isDefined(ID)?'iTab i_edit_project':'iTab i_add_project',title:Ext.isDefined(ID)?'Edit Projekt':'Neues Projekt',store:this.ProjectStore,complexEditor:false,mapready:function(){if(Ext.isDefined(this.idtrack)){var r=this.store.getById(this.idtrack);this.loadTrack([r],{},Ext.isDefined(r));}else{this.record=new Tom.ProjectDef({});}
this.FormPanel.enable();this.GMapPanel.enableEditor();},FormPanel:new FProject({region:'east',baseParams:{idmembers:Tom.MyApp.member.idmembers,mode:'basic'}})})).show();break;case"listproject":return this.TabPanel.add(new Tom.ProjectList({id:tabId,title:'Projekte/Liste',iconCls:'iTab i_list_project',closable:true})).show();break;case"editwarning":return this.TabPanel.add(new Tom.TrackEditorPanel({id:tabId,idtrack:ID,iconCls:Ext.isDefined(ID)?'iTab i_edit_warning':'iTab i_add_warning',title:Ext.isDefined(ID)?'Edit Warnung':'Neue Warnung',store:this.WarningStore,mapready:function(){if(Ext.isDefined(this.idtrack)){var r=this.store.getById(this.idtrack);this.loadTrack([r],{},Ext.isDefined(r));}else{this.record=new Tom.WarningDef({});}
this.FormPanel.enable();this.GMapPanel.enableEditor();},complexEditor:false,FormPanel:new FWarning({region:'east',baseParams:{idmembers:Tom.MyApp.member.idmembers,mode:'basic'}})})).show();break;case"listwarning":return this.TabPanel.add(new Tom.WarningList({id:tabId,title:'Warnungen/Liste',iconCls:'iTab i_list_warning',closable:true})).show();break;case"listpoi":return this.TabPanel.add(new Tom.PoiList({id:tabId,title:'Pois/Liste',iconCls:'iTab i_list_poi',closable:true})).show();break;case"editpoi":return this.TabPanel.add(new Tom.PointEditorPanel({id:tabId,idpoint:ID,iconCls:Ext.isDefined(ID)?'iTab i_edit_poi':'iTab i_add_poi',title:Ext.isDefined(ID)?'Edit POI':'Neuer POI',store:this.PoiStore,mapready:function(){if(Ext.isDefined(this.idpoint)){var r=this.store.getById(this.idpoint);this.loadPoint([r],{},Ext.isDefined(r));}else{this.record=new Tom.PoiDef({});}
this.FormPanel.enable();this.GMapPanel.enableEditor();},FormPanel:new FPoi({region:'east',baseParams:{idmembers:Tom.MyApp.member.idmembers,mode:'basic'}})})).show();break;case"listmember":return this.TabPanel.add(new Tom.MemberList({id:tabId,title:'Benutzerliste',iconCls:'iTab i_members',closable:true})).show();break;case"map":return this.TabPanel.add(new Tom.GMapViewer({id:tabId,title:'Karte',iconCls:'iTab i_map',closable:true,trailStore:this.TrailStore,projectStore:this.ProjectStore,warningStore:this.WarningStore,poiStore:this.PoiStore,GMapConfig:{trailStore:this.TrailStore}})).show();break;case'mobileTrails':return this.TabPanel.add(new Tom.MobileTrailsPanel({title:'MobileTrails',iconCls:'iTab i_mobile_trails',closable:true})).show();break;case'preferences':var w=Ext.getCmp('editPrefsWindow');return(Ext.isDefined(w)?w.show():new Tom.editPrefs({id:'editPrefsWindow',listeners:{'beforeshow':function(){var f=this.getComponent('prefForm').getForm();f.setValues({user:Tom.MyApp.member.user,name:Tom.MyApp.member.name,email:Tom.MyApp.member.email});f.setValues(Tom.MyApp.member.config);f.setValues({'ms_overlays_tf':Ext.encode(Tom.MyApp.member.config.ms_overlays)});}}}).show());break;case'customizehomescreen':var w=Ext.getCmp('customizeHomeScreen');return(Ext.isDefined(w)?w.show():new Tom.wWidgeteditor({id:'customizeHomeScreen',widgets:Tom.MyApp.member.config.widgets}).show());break;case'adminwebcams':return this.TabPanel.add(new Tom.AdminWebcams()).show();break;case'adminupdateoverlays':return this.TabPanel.add(new Ext.TabPanel({title:'Overlays',closable:true,autoLoad:{url:'http://192.168.2.51/overlays/update_overlays.php'}})).show();break;}}},filterTrails:function(){this.StatusBox.setTrailsFiltered(this.TrailStore.getCount());var mapPanel=Ext.getCmp('map');if(Ext.isDefined(mapPanel)){mapPanel.filterTrails(this.TrailStore.data.keys);}},completeTrails:function(records){var mapPanel=Ext.getCmp('map');if(!Ext.isDefined(mapPanel)){return;}
records=[].concat(records);if(records.length<1){return;}
for(var i=0,len=records.length;i<len;i++){mapPanel.addTrail(records[i]);}},completeProjects:function(records){var mapPanel=Ext.getCmp('map');if(!Ext.isDefined(mapPanel)){return;}
records=[].concat(records);if(records.length<1){return;}
for(var i=0,len=records.length;i<len;i++){mapPanel.addProject(records[i]);}},removeProjects:function(records){var mapPanel=Ext.getCmp('map');if(!Ext.isDefined(mapPanel)){return;}
records=[].concat(records);if(records.length<1){return;}
for(var i=0,len=records.length;i<len;i++){mapPanel.removeProject(records[i]);}},completeWarnings:function(records){var mapPanel=Ext.getCmp('map');if(!Ext.isDefined(mapPanel)){return;}
records=[].concat(records);if(records.length<1){return;}
for(var i=0,len=records.length;i<len;i++){mapPanel.addWarning(records[i]);}},removeWarnings:function(records){var mapPanel=Ext.getCmp('map');if(!Ext.isDefined(mapPanel)){return;}
records=[].concat(records);if(records.length<1){return;}
for(var i=0,len=records.length;i<len;i++){mapPanel.removeWarning(records[i]);}},filterPois:function(){this.StatusBox.setPoisFiltered(this.PoiStore.getCount());var mapPanel=Ext.getCmp('map');if(Ext.isDefined(mapPanel)){mapPanel.filterPois(this.PoiStore.data.keys);}},completePois:function(records){records=[].concat(records);if(records.length<1){return;}
for(var i=0,len=records.length;i<len;i++){try{records[i].data.config=Ext.decode(records[i].data.config);}catch(err){records[i].data.config={}}}
var mapPanel=Ext.getCmp('map');if(!Ext.isDefined(mapPanel)){return;}
for(var i=0,len=records.length;i<len;i++){mapPanel.addPoi(records[i]);}},removePois:function(records){var mapPanel=Ext.getCmp('map');if(!Ext.isDefined(mapPanel)){return;}
records=[].concat(records);if(records.length<1){return;}
for(var i=0,len=records.length;i<len;i++){mapPanel.removePoi(records[i]);}},toogleTooltip:function(item,pressed){this.member.config.tooltipEnable=pressed;},showTip:function(msg){},email:function(recipient){new Tom.EMailWindow({recipient:recipient,store:this.MemberStore}).show();},download:function(params){params.idmembers=Tom.MyApp.member.idmembers;this.downloadForm.dom.action=Ext.urlEncode(params,'/queries/download.php?');this.downloadForm.dom.submit();},about:function(){Ext.Msg.show({title:'www.trails.at',msg:'<b>Idee und Programmierung:</b> Thomas Oberthanner<br>'
+'Version '
+this.currentVersion
+'<br><br>'
+'<b>Danke an:</b><br>'
+'Felix: für die zahlreichen Anregungen, Trails und die Splashscreen Fotos<br>'
+'Markus: für viele Trails',buttons:Ext.Msg.OK,icon:'i_about32'});},getCountry:function(idcountries){var countryRecord=this.CountryStore.getById(idcountries);if(Ext.isDefined(countryRecord)){return countryRecord.get('country');}},getMember:function(idmembers){var memberRecord=this.MemberStore.getById(idmembers);return(Ext.isDefined(memberRecord))?memberRecord.get('name'):"";},getTag:function(idtags){var tag=this.availableTags[idtags];return(Ext.isDefined(tag))?tag.tag:"";},getPoiType:function(idpoitypes){var poiTypeRecord=this.PoiTypesStore.getById(idpoitypes);if(Ext.isDefined(poiTypeRecord)){return poiTypeRecord.get('poitype');}},loadStore:function(type){switch(type){case'trail':this.TrailStore.load({scope:this,callback:function(records,options,success){if(success){this.showInfo(records.length+" Trails geladen.");}else{this.showError("Daten der Trails konnten nicht geladen werden!");}},params:{mode:'basic'}});break;case'project':this.ProjectStore.load({scope:this,callback:function(records,options,success){if(success){this.showInfo(records.length
+" Projekte geladen.");}else{this.showError("Daten der Projekte konnten nicht geladen werden!");}}});break;case'warning':this.WarningStore.load({scope:this,callback:function(records,options,success){if(success){this.showInfo(records.length
+" Warnungen geladen.");}else{this.showError("Daten der Warnungen konnten nicht geladen werden!");}}});break;case'poi':this.PoiStore.load({scope:this,callback:function(records,options,success){if(success){this.showInfo(records.length+" Pois geladen.");}else{this.showError("Daten der Pois konnten nicht geladen werden!");}}});break;}},removeProject:function(idprojects,title){Ext.Msg.show({title:'Projekt löschen',msg:'Willst du wirklich das Projekt "'+title
+'" löschen?',buttons:Ext.Msg.YESNO,fn:function(buttonId,text,options){if(buttonId=='yes'){var r=this.ProjectStore.getById(idprojects);if(!Ext.isDefined(r)){this.showError('Projekt konnte nicht gelöscht werden');return;}
this.ProjectStore.remove(r);}},scope:this,icon:Ext.MessageBox.QUESTION})},removeWarning:function(idwarnings,title){Ext.Msg.show({title:'Warnung löschen',msg:'Willst du dich wirklich die Warnung "'+title
+'" löschen?',buttons:Ext.Msg.YESNO,fn:function(buttonId,text,options){if(buttonId=='yes'){var r=this.WarningStore.getById(idwarnings);if(!Ext.isDefined(r)){this.showError('Warnung konnte nicht gelöscht werden');return;}
this.WarningStore.remove(r);}},scope:this,icon:Ext.MessageBox.QUESTION})},removePoi:function(idwarnings,title){Ext.Msg.show({title:'Poi löschen',msg:'Willst du dich wirklich den Poi "'+title
+'" löschen?',buttons:Ext.Msg.YESNO,fn:function(buttonId,text,options){if(buttonId=='yes'){var r=this.PoiStore.getById(idwarnings);if(!Ext.isDefined(r)){this.showError('Poi konnte nicht gelöscht werden');return;}
this.PoiStore.remove(r);}},scope:this,icon:Ext.MessageBox.QUESTION})},updateFilters:function(){try{this.updateFilterPois();this.updateFilterTrails();}catch(exception){}},updateFilterTrails:function(){Ext.getCmp('mFilterCountry').removeAll();Ext.getCmp('mFilterCountry').add([{text:'Alle',hideOnClick:false,handler:function(item,event){Ext.getCmp('mFilterCountry').items.each(function(item,index,length){if(item.getXType()=='menucheckitem'){item.setChecked(true,true);}},this);this.filter.trails.countries={fn:function(record){return true;},scope:this}
Ext.getCmp('filterTrails').setChecked(true,true);this.TrailStore.filter(obj2arr(this.filter.trails));},scope:this},{text:'Keines',hideOnClick:false,handler:function(item,event){Ext.getCmp('mFilterCountry').items.each(function(item,index,length){if(item.getXType()=='menucheckitem'){item.setChecked(false,true);}},this);this.filter.trails.countries={fn:function(record){return false;},scope:this}
Ext.getCmp('filterTrails').setChecked(true,true);this.TrailStore.filter(obj2arr(this.filter.trails));},scope:this},'-']);for(var i=0;i<this.distinctCountries.length;i++){Ext.getCmp('mFilterCountry').add({text:this.getCountry(this.distinctCountries[i]),idcountries:this.distinctCountries[i],checked:true,hideOnClick:false,checkHandler:function(item,checked){var checkedCountries=new Array();Ext.getCmp('mFilterCountry').items.each(function(item,index,length){if(item.checked){checkedCountries.push(item.idcountries);}},this);this.filter.trails.countries={fn:function(record){return checkedCountries.inArray(record.get('idcountries'));},scope:this}
Ext.getCmp('filterTrails').setChecked(true,true);this.TrailStore.filter(obj2arr(this.filter.trails));},scope:this});}
Ext.getCmp('mFilterMembers').removeAll();Ext.getCmp('mFilterMembers').add([{text:'Alle',hideOnClick:false,handler:function(item,event){Ext.getCmp('mFilterMembers').items.each(function(item,index,length){if(item.getXType()=='menucheckitem'){item.setChecked(true,true);}},this);this.filter.trails.members={fn:function(record){return true;},scope:this}
Ext.getCmp('filterTrails').setChecked(true,true);this.TrailStore.filter(obj2arr(this.filter.trails));},scope:this},{text:'Keiner',hideOnClick:false,handler:function(item,event){Ext.getCmp('mFilterMembers').items.each(function(item,index,length){if(item.getXType()=='menucheckitem'){item.setChecked(false,true);}},this);this.filter.trails.members={fn:function(record){return false;},scope:this}
Ext.getCmp('filterTrails').setChecked(true,true);this.TrailStore.filter(obj2arr(this.filter.trails));},scope:this},'-']);for(var i=0;i<this.distinctMembers.length;i++){Ext.getCmp('mFilterMembers').add({text:this.getMember(this.distinctMembers[i]),idmembers:this.distinctMembers[i],hideOnClick:false,checked:true,hideOnClick:false,checkHandler:function(item,checked){var checkedMembers=new Array();Ext.getCmp('mFilterMembers').items.each(function(item,index,length){if(item.checked){checkedMembers.push(item.idmembers);}},this);this.filter.trails.members={fn:function(record){return checkedMembers.inArray(record.get('creator'));},scope:this}
Ext.getCmp('filterTrails').setChecked(true,true);this.TrailStore.filter(obj2arr(this.filter.trails));},scope:this});}},updateFilterPois:function(){Ext.getCmp('mFilterPoiMembers').removeAll();Ext.getCmp('mFilterPoiMembers').add([{text:'Alle',hideOnClick:false,handler:function(item,event){Ext.getCmp('mFilterPoiMembers').items.each(function(item,index,length){if(item.getXType()=='menucheckitem'){item.setChecked(true,true);}},this);this.filter.pois.members={fn:function(record){return true;},scope:this}
Ext.getCmp('filterPois').setChecked(true,true);this.PoiStore.filter(obj2arr(this.filter.pois));},scope:this},{text:'Keiner',hideOnClick:false,handler:function(item,event){Ext.getCmp('mFilterPoiMembers').items.each(function(item,index,length){if(item.getXType()=='menucheckitem'){item.setChecked(false,true);}},this);this.filter.pois.members={fn:function(record){return false;},scope:this}
Ext.getCmp('filterPois').setChecked(true,true);this.PoiStore.filter(obj2arr(this.filter.pois));},scope:this},'-']);for(var i=0;i<this.distinctMembers.length;i++){Ext.getCmp('mFilterPoiMembers').add({text:this.getMember(this.distinctMembers[i]),idmembers:this.distinctMembers[i],hideOnClick:false,checked:true,hideOnClick:false,checkHandler:function(item,checked){var checkedMembers=new Array();Ext.getCmp('mFilterPoiMembers').items.each(function(item,index,length){if(item.checked){checkedMembers.push(item.idmembers);}},this);this.filter.pois.members={fn:function(record){return checkedMembers.inArray(record.get('creator'));},scope:this}
Ext.getCmp('filterPois').setChecked(true,true);this.PoiStore.filter(obj2arr(this.filter.pois));},scope:this});};Ext.getCmp('mFilterPoitypes').removeAll();Ext.getCmp('mFilterPoitypes').add([{text:'Alle',hideOnClick:false,handler:function(item,event){Ext.getCmp('mFilterPoitypes').items.each(function(item,index,length){if(item.getXType()=='menucheckitem'){item.setChecked(true,true);}},this);this.filter.pois.type={fn:function(record){return true;},scope:this}
Ext.getCmp('filterPois').setChecked(true,true);this.PoiStore.filter(obj2arr(this.filter.pois));},scope:this},{text:'Keine',hideOnClick:false,handler:function(item,event){Ext.getCmp('mFilterPoitypes').items.each(function(item,index,length){if(item.getXType()=='menucheckitem'){item.setChecked(false,true);}},this);this.filter.pois.type={fn:function(record){return false;},scope:this}
Ext.getCmp('filterPois').setChecked(true,true);this.PoiStore.filter(obj2arr(this.filter.pois));},scope:this},'-']);this.PoiTypesStore.each(function(record){Ext.getCmp('mFilterPoitypes').add({text:record.get('poitype'),idpoitypes:record.get('idpoitypes'),checked:true,hideOnClick:false,checkHandler:function(item,checked){var checkedPoiTypes=new Array();Ext.getCmp('mFilterPoitypes').items.each(function(item,index,length){if(item.checked){checkedPoiTypes.push(item.idpoitypes);}},this);this.filter.pois.type={fn:function(record){return checkedPoiTypes.inArray(record.get('type').toString());},scope:this}
Ext.getCmp('filterPois').setChecked(true,true);this.PoiStore.filter(obj2arr(this.filter.pois));},scope:this});},this);}});Tom.MyApp=new Ext.App({});
