NoPaste

Vista Sidebarteil

von Anonymous

SNIPPET_TEXT:
  1. // ##############################################
  2. //            kontakt@tiews.info
  3. // ##############################################
  4. var g_CallListUrl = '/cgi-bin/webcm?getpage=../html/de/FRITZ!Box_Anrufliste.csv';
  5. var g_CallListRefreshUrl = '/cgi-bin/webcm?getpage=../html/de/menus/menu2.html&var:lang=de&var:menu=fon&var:pagename=foncalls'
  6. var g_LoginSidUrl = '/cgi-bin/webcm?getpage=../html/login_sid.xml';
  7. var g_LoginUrl = '/cgi-bin/webcm';
  8. var g_SIDRegex = /name="sid"\s*value="([^\"]*)"/;
  9.  
  10. var g_ItemsToDisplay = 6;
  11.  
  12. var g_SessionID = null;
  13. var g_SecurePassword = null;
  14. var g_FritzboxCalls = null;
  15. var g_isFirstLoad = true;
  16. var g_LastRefresh = null;
  17. var g_ActiveTimeout = null;
  18.  
  19. var g_FritzboxIP = '';
  20. var g_FBPassword = '';
  21. var g_refreshInterval = 300;
  22.  
  23. // Create dummy Gadget-Object to test gadget in IE 7
  24.  
  25. if(typeof System == 'undefined')
  26.         System = new SystemObject();
  27.  
  28. function SystemObject()
  29. {
  30.         this.Gadget = new function()
  31.         {
  32.                 this.settingsUI = '';
  33.                 this.onSettingsClosed = null;
  34.                 this.Settings = new function()
  35.                 {
  36.                         function readString(key)
  37.                         {
  38.                                 if(key == 'FritzboxIP')
  39.                                         return 'fritz.box';
  40.                                 else if(key == 'Password')
  41.                                         return '12345678';
  42.                                 else if(key == 'Interval')
  43.                                         return '120';                                  
  44.                         }
  45.                         function writeString(key, value) {}
  46.                        
  47.                         this.readString = readString;
  48.                         this.writeString = writeString;
  49.                 }
  50.         }
  51. }
  52.  
  53. // ##############################################
  54. // Init main gadget
  55. // ##############################################
  56. function InitMain()
  57. {
  58.         BackgroundImage.src = 'url(images/back_docked.png)';
  59.        
  60.         // Settings
  61.         System.Gadget.settingsUI = 'settings.html';
  62.         System.Gadget.onSettingsClosed = function(event)
  63.             {
  64.                 if(event.closeAction == event.Action.commit)
  65.                     InitMain();
  66.             }
  67.  
  68.         UnsetTimer();
  69.         LoadSettings();
  70.  
  71.         // Check whether http object is available
  72.         XmlHttp = GetHttpObject();
  73.         if(!XmlHttp)
  74.         {
  75.                 DisplayStatus('Http-Objekt konnte nicht erzeugt werden!', true);
  76.                 return;
  77.         }
  78.         CheckLoginMethod();
  79. }
  80.  
  81. // ##############################################
  82. // CheckLoginMethod / Login / Refresh / Download calllist / Parse calllist
  83. // ##############################################
  84. function CheckLoginMethod()
  85. {
  86.         g_SecurePassword = null;
  87.        
  88.         if(g_isFirstLoad)
  89.                 DisplayStatus('Prüfe Anmeldeverfahren...', false);
  90.  
  91.         var XmlHttp = GetHttpObject();
  92.         XmlHttp.open('GET', GetPreparedFBLoginSidUrl(), true);
  93.         XmlHttp.onreadystatechange = function()
  94.         {
  95.                 if(XmlHttp.readyState != 4)
  96.                         return;
  97.                        
  98.                 // nur wenn login_sid.xml gefunden wird, dann ist die sichere Anmeldung erforderlich
  99.                 if(XmlHttp.status == 200)
  100.                 {
  101.                         var siddoc = XmlHttp.responseXML;
  102.                         // Password-Login erforderlich und SecurePassword muss generiert werden
  103.                         if(siddoc.documentElement.selectSingleNode("/SessionInfo/iswriteaccess").text == '0')
  104.                         {
  105.                                 if(g_FBPassword == null || g_FBPassword.length == 0)
  106.                                 {
  107.                                         DisplayStatus("Die Fritz!Box verlangt eine Anmeldung mit Passwort, aber es ist kein Passwort in den Einstellungen hinterlegt.", true);
  108.                                         return;
  109.                                 }
  110.                                 else
  111.                                 {
  112.                                         var challenge = siddoc.documentElement.selectSingleNode("/SessionInfo/Challenge").text;
  113.                                         g_SecurePassword = challenge + '-' + hex_md5(challenge + '-' + g_FBPassword);
  114.                                 }
  115.                         }
  116.                         // Kein Password-Login erforderlich, SID wird direkt zurückgegeben
  117.                         else
  118.                         {
  119.                                 g_SessionID = siddoc.documentElement.selectSingleNode("/SessionInfo/SID").text;
  120.                                 alert('Keine neue Session nötig: ' + g_SessionID);
  121.                         }
  122.                         Login();
  123.                 }
  124.         }
  125.         XmlHttp.send(null);
  126. }
  127.  
  128. function Login()
  129. {
  130.         if(g_isFirstLoad)
  131.                 DisplayStatus('Anmeldung läuft...', false);
  132.  
  133.         var XmlHttp = GetHttpObject();
  134.         XmlHttp.open('POST', GetPreparedFBLoginUrl(), true);
  135.         XmlHttp.setRequestHeader('Content-type', 'application/x-www-form-urlencoded');
  136.         XmlHttp.onreadystatechange = function()
  137.         {
  138.                 if(XmlHttp.readyState != 4)
  139.                         return;
  140.                
  141.                 if(XmlHttp.status == 200)
  142.                 {
  143.                         var responsetext = XmlHttp.responseText;
  144.                         if(responsetext.indexOf('FRITZ!Box Anmeldung') < 0)
  145.                         {
  146.                                 if(g_SecurePassword != null)
  147.                                 {
  148.                                         sidresult = g_SIDRegex.exec(responsetext);
  149.                                         if(sidresult.length > 0)
  150.                                         {
  151.                                                 g_SessionID = sidresult[1];
  152.                                         }
  153.                                         else
  154.                                         {
  155.                                                 DisplayStatus("SessionID konnte aus Fritz!Box-Seite nicht ermittelt.", true);
  156.                                                 return;
  157.                                         }
  158.                                 }
  159.                         }
  160.                         else
  161.                         {
  162.                                 DisplayStatus("Das Fritz!Box Passwort ist ungültig.", true);
  163.                                 return;
  164.                         }
  165.                 }
  166.                 else
  167.                 {
  168.                         DisplayStatus('[An Fritz!Box anmelden] Http-Fehler: ' + XmlHttp.status, true);
  169.                         SetTimer();
  170.                         return;
  171.                 }
  172.                 RefreshCallList();
  173.         }              
  174.         if(g_SecurePassword != null)
  175.         {XmlHttp.send('sid=0000000000000000&getpage=../html/de/menus/menu2.html&login:command/response=' + g_SecurePassword); }
  176.         else
  177.         { XmlHttp.send('login:command/password=' + g_FBPassword); }
  178. }
  179.  
  180. function Logout()
  181. {
  182.         if(g_SessionID != null)
  183.         {
  184.                 var XmlHttp = GetHttpObject();
  185.                 XmlHttp.open('POST', GetPreparedFBLoginUrl(), true);
  186.                 XmlHttp.setRequestHeader('Content-type', 'application/x-www-form-urlencoded');
  187.                 XmlHttp.onreadystatechange = function()
  188.                 {
  189.                         if(XmlHttp.readyState != 4)
  190.                                 return;
  191.                        
  192.                         if(XmlHttp.status == 200)
  193.                         {
  194.                                 g_SessionID = null;
  195.                         }
  196.                 }
  197.                 XmlHttp.send('security:command/logout=raushier&sid=' + g_SessionID );
  198.         }      
  199. }
  200.  
  201. function RefreshCallList()
  202. {
  203.         if(g_isFirstLoad)
  204.                 DisplayStatus('Anrufliste auf Fritz!Box aktualisieren lassen...', false);
  205.  
  206.         var XmlHttp = GetHttpObject();
  207.         XmlHttp.open('GET', GetPreparedFBCallListRefreshUrl(), true);
  208.         XmlHttp.onreadystatechange = function()
  209.         {
  210.                 if(XmlHttp.readyState != 4)
  211.                         return;
  212.  
  213.                 if(XmlHttp.status == 200)
  214.                 {
  215.                         GetCallList();
  216.                 }
  217.                 else
  218.                 {
  219.                         DisplayStatus('[Anrufliste auf Fritz!Box aktualisieren] Http-Fehler: ' + GetHttpObject.status, true);
  220.                         SetTimer();
  221.                         return;
  222.                 }
  223.         }
  224.     XmlHttp.send(null);
  225. }
  226.  
  227. function GetCallList()
  228. {
  229.         var status = false;
  230.         if(g_isFirstLoad)
  231.                 DisplayStatus('Anrufliste wird heruntergeladen...', false);
  232.  
  233.         var XmlHttp = GetHttpObject();
  234.         XmlHttp.open('GET', GetPreparedFBCallListUrl(), true);
  235.     XmlHttp.onreadystatechange = function()
  236.         {
  237.                 if(XmlHttp.readyState != 4)
  238.                         return;
  239.  
  240.                 if(XmlHttp.status == 200)
  241.                 {
  242.                         // responseText will not work, due to wrong encoding of requested calllist
  243.                         if(ParseFBCallList(BinaryToString(XmlHttp.responseBody)))
  244.                         {
  245.                                 FillGadgetCallList();
  246.                         }
  247.                         Logout();
  248.                         g_isFirstLoad = false;
  249.                         SetTimer();
  250.                 }
  251.                 else
  252.                 { DisplayStatus('[Anrufliste laden] Http-Fehler: ' + XmlHttp.status, true); }
  253.         }      
  254.         XmlHttp.send(null);
  255. }
  256.  
  257. function ParseFBCallList(Data)
  258. {
  259.         var status = false;
  260.  
  261.         if(g_isFirstLoad)
  262.                 DisplayStatus('Anrufliste wird verarbeitet...', false);
  263.        
  264.         try
  265.         {
  266.                 // 2 -> Eingehend in Abwesenheit / 1 ->  Eingehend / 3 -> Ausgehend
  267.                 // Typ;Datum;Name;Rufnummer;Nebenstelle;Eigene Rufnummer;Dauer
  268.                 var LineOffset = 2;
  269.                 var DataCells = null;
  270.                 var ItemsInList = 0;
  271.                
  272.                 g_FritzboxCalls = new Array(g_ItemsToDisplay);
  273.                
  274.                 var CsvLines = Data.split('\n');
  275.                
  276.                 if(CsvLines == null || CsvLines.length < 2 || CsvLines[0].indexOf('sep=;') < 0)
  277.                 {
  278.                         DisplayStatus('Ungültige Anrufliste. (Falsches/kein Passwort angegeben?)', true);
  279.                 }
  280.                 else
  281.                 {
  282.                         for(var i = LineOffset; i < CsvLines.length; i++)
  283.                         {
  284.                                 if(CsvLines[i].search(/;/) != -1)      
  285.                                 {
  286.                                         g_FritzboxCalls[ItemsInList] = new FritzboxCall();
  287.                                         try
  288.                                         {
  289.                                                 DataCells = CsvLines[i].split(";");
  290.                                                 g_FritzboxCalls[ItemsInList].Name = DataCells[2];
  291.                                                 g_FritzboxCalls[ItemsInList].Number = DataCells[3];
  292.                                                 g_FritzboxCalls[ItemsInList].Date = DataCells[1];
  293.                                                 g_FritzboxCalls[ItemsInList].CallType = DataCells[0];
  294.                                                 g_FritzboxCalls[ItemsInList].OwnNumber = DataCells[5];
  295.                                                 g_FritzboxCalls[ItemsInList].ExtensionLine = DataCells[4];
  296.                                                 g_FritzboxCalls[ItemsInList].Duration = DataCells[6];
  297.                                         }
  298.                                         catch (e)
  299.                                         {
  300.                                                 g_FritzboxCalls[ItemsInList].ParseError = e;
  301.                                         }
  302.                                         ItemsInList++;
  303.                                 }
  304.                         }
  305.                         status = true;
  306.                 }
  307.         }
  308.         catch (e)
  309.         {
  310.                 DisplayStatus('Fehler beim Bearbeiten der Anrufliste. Error: ' + e, true);
  311.         }
  312.         return status;
  313. }
  314.  
  315. // ##############################################
  316. // timer
  317. // ##############################################
  318. function SetTimer()
  319. {
  320.         setTimeout("CheckLoginMethod()", g_refreshInterval * 1000);
  321. }
  322.  
  323. function UnsetTimer()
  324. {
  325.         g_isFirstLoad = true;
  326.         if(g_ActiveTimeout != null)
  327.         {
  328.                 clearTimeout(g_ActiveTimeout);
  329.                 g_ActiveTimeout = null;
  330.         }
  331. }
  332.  
  333. // ##############################################
  334. // Display calllist in gadget
  335. // ##############################################
  336. function FillGadgetCallList()
  337. {
  338.         ClearGadgetCallList();
  339.         ListContentDiv.style.visibility = 'visible';
  340.         var calltypeimage = '';
  341.  
  342.         for(var i = 0; i < g_ItemsToDisplay && i < g_FritzboxCalls.length; i++)
  343.         {
  344.                 if(g_FritzboxCalls[i] != null)
  345.                 {
  346.                         eval('ListItemHeader' + i).innerHTML =g_FritzboxCalls[i].GetDisplayName();
  347.                         eval('ListItemText' + i).innerHTML = g_FritzboxCalls[i].Date;
  348.                         calltypeimage = GetCallTypeImage(g_FritzboxCalls[i].CallType);
  349.                         if(calltypeimage != null && calltypeimage.length > 0)
  350.                                 eval('ListItemImage' + i).style.background = 'url(' + GetCallTypeImage(g_FritzboxCalls[i].CallType) + ')';
  351.                         eval('ListItemImage' + i).style.backgroundRepeat = 'no-repeat';
  352.                         eval('ListItemHeader' + i).setAttribute('title', g_FritzboxCalls[i].ToString());
  353.                         eval('ListItemText' + i).setAttribute('title', g_FritzboxCalls[i].ToString());
  354.                 }
  355.         }
  356.        
  357.         // set timestamp of last refresh
  358.         var date=new Date();
  359.         HeaderDiv.setAttribute('title', 'Letzte Aktualisierung: ' + date.getHours() + ':' + (date.getMinutes()<10 ? '0' : '') + date.getMinutes() + ':' + (date.getSeconds()<10 ? '0' : '') + date.getSeconds());
  360.        
  361.         HideStatus();
  362. }
  363.  
  364. function ClearGadgetCallList()
  365. {
  366.         for(var i = 0; i < g_ItemsToDisplay; i++)
  367.         {
  368.                 eval('ListItemHeader' + i).innerHTML = '';
  369.                 eval('ListItemText' + i).innerHTML = '';
  370.                 eval('ListItemImage' + i).style.background = '';
  371.                 eval('ListItemImage' + i).style.backgroundRepeat = '';
  372.                 eval('ListItemHeader' + i).setAttribute('title', '');
  373.                 eval('ListItemText' + i).setAttribute('title', '');
  374.         }
  375. }
  376.  
  377. function GetCallTypeImage(CallType)
  378. {
  379.         // 2 -> Eingehend in Abwesenheit / 1 ->  Eingehend / 3 -> Ausgehend
  380.         if(CallType == 2)
  381.                 return 'images/callinfailed.png';
  382.         else if(CallType == 1)
  383.                 return 'images/callin.png';
  384.         else if(CallType == 3)
  385.                 return 'images/callout.png';
  386.                
  387.         return '';
  388. }
  389. // #####################################################
  390. // A call
  391. // #####################################################
  392. function FritzboxCall()
  393. {
  394.         this.Name = '';
  395.         this.Number = '';
  396.         this.OwnNumber = '';
  397.         this.ExtensionLine = '';
  398.         this.Date = '';
  399.         this.CallType = -1;
  400.         this.ParseError = '';
  401.         this.Duration = '';
  402.        
  403.         return true;
  404. }
  405.  
  406. FritzboxCall.prototype.GetDisplayName = function()
  407. {
  408.         if(this.Name != null && this.Name.length > 0)
  409.                 return this.Name;
  410.         else
  411.         {
  412.                 return (this.Number == null || this.Number.length == 0) ? 'unbekannt' : this.Number;
  413.         }
  414. }
  415.  
  416. FritzboxCall.prototype.ToString = function()
  417. {
  418.         var ttText = '';
  419.        
  420.         if(this.CallType == 2)
  421.                 ttText = 'Anruf in Abwesenheit';
  422.         else if(this.CallType == 1)
  423.                 ttText = 'Eingehender Anruf';
  424.         else if(this.CallType == 3)
  425.                 ttText = 'Ausgehender Anruf';
  426.         else
  427.                 ttText = 'Unbekannter Anruftyp';
  428.        
  429.         ttText += '\nName: ' + ((this.Name != null) ? this.Name : ' - ');
  430.         ttText += '\nNummer: ' + ((this.Number != null) ? this.Number : ' - ');
  431.         ttText += '\nDatum: ' + ((this.Date != null) ? this.Date : ' - ');
  432.         ttText += '\nEigene Nummer: ' + ((this.OwnNumber != null) ? this.OwnNumber : ' - ');
  433.         ttText += '\nNebenstelle: ' + ((this.ExtensionLine != null) ? this.ExtensionLine : ' - ');
  434.         ttText += '\nDauer: ' + ((this.Duration != null) ? this.Duration : ' - ');
  435.        
  436.         ttText += ((this.ParseError != null && this.ParseError.length > 0) ? ('\nFehler beim Bearbeiten: ' + this.ParseError) : '');
  437.        
  438.         return ttText;
  439. }
  440.        
  441. // #####################################################
  442. // Display/Hide status information
  443. // #####################################################
  444. function DisplayStatus(StatusText, IsError)
  445. {
  446.         ListContentDiv.style.visibility = 'hidden';
  447.         ErrorTextDiv.style.visibility = 'visible';
  448.         ErrorTextDiv.innerText = StatusText;
  449.         ErrorTextDiv.style.top = '35%';
  450. }
  451.  
  452. function HideStatus()
  453. {
  454.         ErrorTextDiv.style.visibility = 'hidden';
  455. }
  456.  
  457. // #####################################################
  458. // Flyout
  459. // #####################################################
  460. function SetFlyout()
  461. {      
  462.         if (System.Gadget.Flyout.show==false) {        
  463.                 System.Gadget.Flyout.file = "flyout.html";
  464.                 System.Gadget.Flyout.onHide = CloseFlyout;
  465.                 System.Gadget.Flyout.show = true;
  466.                 System.Gadget.Flyout.onShow = DrawFlyoutContent;
  467.         }
  468.         else
  469.         {              
  470.                 System.Gadget.Flyout.show = false;             
  471.         }
  472.        
  473. }
  474.  
  475. function CloseFlyout()
  476. {
  477.         // something to do here???
  478. }
  479.  
  480. function DrawFlyoutContent()
  481. {
  482.         var contenthtml = '';
  483.         var FlyoutContentDiv = System.Gadget.Flyout.document.getElementById("content");
  484.        
  485.         contenthtml += '<table cellpadding="2" cellspacing="0" border="0">';
  486.  
  487.         contenthtml += '<tr>';
  488.         contenthtml += '<th class="dark"></th>';
  489.         contenthtml += '<th class="dark">Datum</td>';
  490.         contenthtml += '<th class="dark">Name/Rufnummer</td>';
  491.         contenthtml += '<th class="dark">Telefoniegerät</td>';
  492.         contenthtml += '<th class="dark">Eigene Rufnummer</td>';
  493.         contenthtml += '<th class="dark">Dauer [hh:mm]</td>';
  494.         contenthtml += '</tr>';
  495.                
  496.         var tdstyle = '';
  497.         for(var i = 0; i < g_FritzboxCalls.length; i++)
  498.         {
  499.                 if(g_FritzboxCalls[i] != null)
  500.                 {
  501.                         if(i%2 != 0)
  502.                                 tdstyle = 'class="dark"';
  503.                         else
  504.                                 tdstyle = '';
  505.                
  506.                         contenthtml += '<tr>';
  507.                        
  508.                         calltypeimage = GetCallTypeImage(g_FritzboxCalls[i].CallType);
  509.                         if(calltypeimage != null && calltypeimage.length > 0)
  510.                                 contenthtml += '<td ' + tdstyle + '><img src="' + GetCallTypeImage(g_FritzboxCalls[i].CallType) + '" alt="' + g_FritzboxCalls[i].ToString() + '"/></td>';
  511.                         else
  512.                                 contenthtml += '<td ' + tdstyle + '></td>';
  513.                                
  514.                         contenthtml += '<td ' + tdstyle + '>' + g_FritzboxCalls[i].Date + '</td>';
  515.                         contenthtml += '<td ' + tdstyle + '>' + g_FritzboxCalls[i].GetDisplayName() + '</td>';
  516.                         contenthtml += '<td ' + tdstyle + '>' + g_FritzboxCalls[i].ExtensionLine + '</td>';
  517.                         contenthtml += '<td ' + tdstyle + '>' + g_FritzboxCalls[i].OwnNumber + '</td>';
  518.                         contenthtml += '<td ' + tdstyle + '>' + g_FritzboxCalls[i].Duration + '</td>';
  519.                         contenthtml += '</tr>';
  520.                 }
  521.         }      
  522.         contenthtml += '</table>';
  523.        
  524.         FlyoutContentDiv.innerHTML = contenthtml;
  525. }
  526.  
  527. // #####################################################
  528. // Get HTTPRequest object
  529. // #####################################################
  530. function GetHttpObject()
  531. {
  532.         var http = null;
  533.        
  534.         if(typeof XMLHttpRequest != 'undefined')
  535.         {
  536.                 try
  537.                 {
  538.                         http = new XMLHttpRequest();
  539.                 }
  540.                 catch(e)
  541.                 {
  542.                         http = null;
  543.                 }
  544.         }
  545.        
  546.         if(typeof ActiveXObject != 'undefined')
  547.         {
  548.                 if(!http)
  549.                 {
  550.                         try
  551.                         {
  552.                                 http = new ActiveXObject('Msxml2.XMLHTTP');
  553.                         }
  554.                         catch(e)
  555.                         {
  556.                                 try
  557.                                 {
  558.                                         http = new ActiveXObject('Microsoft.XMLHTTP');
  559.                                 }
  560.                                 catch(e)
  561.                                 {
  562.                                         http = null;
  563.                                 }
  564.                         }
  565.                 }
  566.         }
  567.        
  568.         return http;
  569. }
  570.  
  571.  
  572. // #####################################################
  573. // Prepare Url/Password
  574. // #####################################################
  575. function GetPreparedFBCallListUrl()
  576. {
  577.         return AddSessionIdToUrl('http://' + g_FritzboxIP + g_CallListUrl);
  578. }
  579.  
  580. function GetPreparedFBCallListRefreshUrl()
  581. {
  582.         g_SessionID
  583.        
  584.         return AddSessionIdToUrl('http://' + g_FritzboxIP + g_CallListRefreshUrl);
  585. }
  586.  
  587. function GetPreparedFBLoginUrl()
  588. {
  589.         return 'http://' + g_FritzboxIP + g_LoginUrl;
  590. }
  591.  
  592. function GetPreparedFBLoginSidUrl()
  593. {
  594.         return 'http://' + g_FritzboxIP + g_LoginSidUrl;
  595. }
  596.  
  597. function AddSessionIdToUrl(url)
  598. {
  599.         if(g_SessionID != null)
  600.         {
  601.                 url = url + (url.indexOf('?') > -1 ? '&': '?') + 'sid=' + g_SessionID;
  602.         }
  603.         return url;
  604. }
  605.  
  606. // #####################################################
  607. // Settings
  608. // #####################################################
  609. function LoadSettings()
  610. {
  611.         var settings = new FBGadgetSettings();
  612.        
  613.         g_FritzboxIP = settings.FritzboxIP;
  614.         g_FBPassword = settings.Password;
  615.         g_refreshInterval = settings.Interval; 
  616. }

Quellcode

Hier kannst du den Code kopieren und ihn in deinen bevorzugten Editor einfügen. PASTEBIN_DOWNLOAD_SNIPPET_EXPLAIN