Changeset 2616


Ignore:
Timestamp:
04/22/10 11:33:37 (14 years ago)
Author:
amuller
Message:

Ticket #911 - Aproveitamento de funções comuns do expressoMail

Location:
trunk
Files:
5 edited

Legend:

Unmodified
Added
Removed
  • trunk/expressoMail1_2/js/jscode/DropDownContacts.js

    r2602 r2616  
    8282        lines.cellspacing='0'; 
    8383 
    84         var REG_EXP = /^[^\#|^\$|^\%|^\!|^\?|^\"|^\']+$/; 
    8584        var match_cont = ""; 
    8685        for (var i=0; i<match_contacts.length; i++) 
    8786        { 
    88                 var aux = match_contacts[i].split(""); 
    89                 for ( var j = 0; j < aux.length; j ++ ) 
    90                 { 
    91                         if(REG_EXP.test(aux[j])){ 
    92                                 match_cont += aux[j]; 
    93                         }else{ 
    94                                 match_cont += ""; 
    95                         } 
    96                 } 
     87                match_cont += match_contacts[i]; 
     88 
    9789                var trElement = document.createElement('TR'); 
    9890                var tdElement = document.createElement('TD'); 
    9991                tdElement.id = 'td_DD_'+i; 
    10092                tdElement.name = fld_id; 
    101                 tdElement.onmousedown = function (){ 
     93                XEvents.add( tdElement, 'onmousedown', function ( ) 
     94                { 
    10295                        hideTip(); 
    10396                        makeMailList(this.innerHTML,this.name); 
    10497                        setTimeout('document.getElementById("'+this.name+'").focus()',300); 
    105                 }; 
    106                 tdElement.onmouseover = function (){ 
     98                } ); 
     99                XEvents.add( tdElement, 'onmouseover', function( ) 
     100                { 
    107101                        selectContact(this.id.substr(6)); 
    108                 }; 
     102                } ); 
    109103                tdElement.innerHTML = match_cont; 
    110104                trElement.appendChild(tdElement); 
  • trunk/expressoMail1_2/js/jscode/common_functions.js

    r2579 r2616  
    2020 
    2121window.onresize = resizeWindow; 
    22  
    23 function config_events(pObj, pEvent, pHandler) 
    24 { 
    25     if( typeof pObj == 'object') 
    26     { 
    27         if( pEvent.substring(0, 2) == 'on') 
    28             pEvent = pEvent.substring(2, pEvent.length); 
    29  
    30         if ( pObj.addEventListener ) 
    31             pObj.addEventListener(pEvent, pHandler, false); 
    32         else if( pObj.attachEvent ) 
    33             pObj.attachEvent('on' + pEvent, pHandler ); 
    34     } 
    35 } 
    3622 
    3723function resizeWindow(){ 
     
    10995                return _key+"*"; 
    11096        } 
    111 } 
    112  
    113 // Make decimal round, using in size message 
    114 function round(value, decimal){ 
    115         var return_value = Math.round( value * Math.pow( 10 , decimal ) ) / Math.pow( 10 , decimal ); 
    116         return( return_value ); 
    11797} 
    11898 
     
    156136} 
    157137 
    158 function removeAll(id){ 
    159         do 
    160         { 
    161                 if (typeof(Element(id)) == 'undefined') 
    162                         break; 
    163                 Element(id).parentNode.removeChild(Element(id)); 
    164         } 
    165         while(Element(id)); 
    166 } 
    167138 
    168139function get_current_folder(){ 
     
    437408} 
    438409 
    439 function validateEmail(email){ 
    440         if (typeof(email) != 'string') 
    441                 return false; 
    442         var validName = /^[a-z][a-z-_0-9\.]*/i; 
    443         emailParts = email.split('@'); 
    444         return (validName.test(emailParts[0]) && validateDomain(emailParts[1])); 
    445 } 
    446 function validateDomain(domain){ 
    447         var domainReg = /^(([A-Za-z\d][A-Za-z\d-]{0,61}[A-Za-z\d]\.)+[A-Za-z]{2,6}|\[\d{1,3}(\.\d{1,3}){3}\])$/i; 
    448         return (domainReg.test(domain)); 
    449 } 
    450  
    451 function validateUrl(url){ 
    452         var urlReg = /([A-Za-z]{2,7}:\/\/)(.*)/i; 
    453         urlParts = url.split(urlReg); 
    454         return (urlParts[1].length > 4 &&  validateDomain(urlParts[2])); 
    455 } 
    456410function emQuickSearch(emailList, field, ID){ 
    457411        var quickSearchKeyBegin; 
     
    561515} 
    562516 
    563 function url_encode(str){ 
    564     var hex_chars = "0123456789ABCDEF";  
    565     var noEncode = /^([a-zA-Z0-9\_\-\.])$/;  
    566     var n, strCode, hex1, hex2, strEncode = "";  
    567  
    568     for(n = 0; n < str.length; n++) {  
    569         if (noEncode.test(str.charAt(n))) {  
    570             strEncode += str.charAt(n);  
    571         } else {  
    572             strCode = str.charCodeAt(n);  
    573             hex1 = hex_chars.charAt(Math.floor(strCode / 16));  
    574             hex2 = hex_chars.charAt(strCode % 16);  
    575             strEncode += "%" + (hex1 + hex2);  
    576         }  
    577     }  
    578     return strEncode;  
    579  
    580  
    581 function url_decode(str) {  
    582  
    583         var n, strCode, strDecode = "";  
    584         for (n = 0; n < str.length; n++) {  
    585             if (str.charAt(n) == "%") {  
    586                 strCode = str.charAt(n + 1) + str.charAt(n + 2);  
    587                 strDecode += String.fromCharCode(parseInt(strCode, 16));  
    588                 n += 2;  
    589             } else {  
    590                 strDecode += str.charAt(n);  
    591             }  
    592         }  
    593         return strDecode;  
    594  
    595  
    596517function Element (el) { 
    597518        return  document.getElementById(el); 
     
    626547                return rb; 
    627548        } 
    628 } 
    629  
    630 function borkb(size){ 
    631         kbyte = 1024; 
    632         mbyte = kbyte*1024; 
    633         gbyte = mbyte*1024; 
    634         if (!size) 
    635                 size = 0; 
    636         if (size < kbyte) 
    637                 return size + 'B'; 
    638         else if (size < mbyte) 
    639                 return parseInt(size/kbyte) + 'KB'; 
    640         else if (size < gbyte) 
    641                 if (size/mbyte > 100) 
    642                         return (size/mbyte).toFixed(0) + 'MB'; 
    643                 else 
    644                         return (size/mbyte).toFixed(1) + 'MB'; 
    645         else 
    646                 return parseInt(size/gbyte).toFixed(1) + 'GB'; 
    647 } 
    648  
    649 function trim(inputString) { 
    650    if (typeof inputString != "string")  
    651         return inputString; 
    652        
    653    var retValue = inputString; 
    654    var ch = retValue.substring(0, 1); 
    655    while (ch == " ") {  
    656           retValue = retValue.substring(1, retValue.length); 
    657           ch = retValue.substring(0, 1); 
    658    } 
    659    ch = retValue.substring(retValue.length-1, retValue.length); 
    660    while (ch == " ") {  
    661           retValue = retValue.substring(0, retValue.length-1); 
    662           ch = retValue.substring(retValue.length-1, retValue.length); 
    663    } 
    664    while (retValue.indexOf("  ") != -1) {  
    665           retValue = retValue.substring(0, retValue.indexOf("  ")) + retValue.substring(retValue.indexOf("  ")+1, retValue.length);  
    666    } 
    667    return retValue;  
    668 } 
     549}; 
    669550 
    670551function increment_folder_unseen(){ 
     
    772653} 
    773654 
    774 function LTrim(value){ 
    775         var w_space = String.fromCharCode(32); 
    776         var strTemp = ""; 
    777         var iTemp = 0; 
    778  
    779         var v_length = value ? value.length : 0; 
    780         if(v_length < 1) 
    781                 return ""; 
    782  
    783         while(iTemp < v_length){ 
    784                 if(value && value.charAt(iTemp) != w_space){ 
    785                         strTemp = value.substring(iTemp,v_length); 
    786                         break; 
    787                 } 
    788                 iTemp++; 
    789         } 
    790         return strTemp; 
    791 } 
    792  
    793655//changes MENU background color. 
    794656function set_menu_bg(menu) 
     
    824686} 
    825687 
    826 function add_className(obj, className){ 
    827         if (obj && !exist_className(obj, className)) 
    828                 obj.className = obj.className + ' ' + className; 
    829 } 
    830  
    831 function remove_className(obj, className){ 
    832         var re = new RegExp("\\s*"+className); 
    833         if (obj) 
    834                 obj.className = obj.className.replace(re, ' '); 
    835 } 
    836  
    837 function exist_className(obj, className){ 
    838         return ( obj && obj.className.indexOf(className) != -1 ); 
    839 } 
    840  
    841688function select_all_messages(select) 
    842689{ 
     
    861708                } 
    862709        } 
    863 } 
    864  
    865 function validate_date(date){ 
    866     if (date.match(/^[0-3][0-9]\/[0-1][0-9]\/\d{4,4}$/)) 
    867     { 
    868         tmp = date.split('/'); 
    869  
    870         day = new Number(tmp[0]); 
    871         month = new Number(tmp[1]); 
    872         year = new Number(tmp[2]); 
    873         if (month >= 1 && month <= 12 && day >= 1 && day <= 31) 
    874         { 
    875             if (month == 02 && day <= 29) 
    876             { 
    877                 return true; 
    878             } 
    879             return true; 
    880         } 
    881         else 
    882             { 
    883                 return false; 
    884             } 
    885     } 
    886     else 
    887         { 
    888             return false; 
    889         } 
    890710}; 
  • trunk/expressoMail1_2/js/jscode/main.js

    r2603 r2616  
    930930        else 
    931931                return selected_messages; 
    932 } 
    933  
    934 function replaceAll(string, token, newtoken) { 
    935         while (string.indexOf(token) != -1) { 
    936                 string = string.replace(token, newtoken); 
    937         } 
    938         return string; 
    939932} 
    940933 
  • trunk/phpgwapi/inc/class.common.inc.php

    r2611 r2616  
    392392                                        $GLOBALS[ 'phpgw' ] -> js -> validate_file( 'wz_dragdrop', 'wz_dragdrop', NULL, true ); 
    393393                                        $GLOBALS[ 'phpgw' ] -> js -> validate_file( 'expressoAjax', 'expressoAjax', NULL, true ); 
     394                                        $GLOBALS[ 'phpgw' ] -> js -> validate_file( 'expressoAjax', 'dom', NULL, true ); 
    394395                                        $GLOBALS[ 'phpgw' ] -> js -> validate_file( 'tools','xlink', NULL, true ); 
    395396                                        $GLOBALS[ 'phpgw' ] -> js -> validate_file( 'tools','xconnector', NULL, true ); 
  • trunk/phpgwapi/js/expressoAjax/dom.js

    r1999 r2616  
    1 dom.prototype.config_events = function (pObj, pEvent, pHandler) 
     1function borkb(size){ 
     2        kbyte = 1024; 
     3        mbyte = kbyte*1024; 
     4        gbyte = mbyte*1024; 
     5        if (!size) 
     6                size = 0; 
     7        if (size < kbyte) 
     8                return size + ' B'; 
     9        else if (size < mbyte) 
     10                return parseInt(size/kbyte) + ' KB'; 
     11        else if (size < gbyte) 
     12                if (size/mbyte > 100) 
     13                        return (size/mbyte).toFixed(0) + ' MB'; 
     14                else 
     15                        return (size/mbyte).toFixed(1) + ' MB'; 
     16        else 
     17                return parseInt(size/gbyte).toFixed(1) + ' GB'; 
     18} 
     19 
     20function url_encode(str){ 
     21    return escape(str); 
     22} 
     23function url_decode(str) { 
     24        return unescape(str); 
     25} 
     26 
     27function replaceAll(string, token, newtoken) { 
     28        while (string.indexOf(token) != -1) { 
     29                string = string.replace(token, newtoken); 
     30        } 
     31        return string; 
     32} 
     33 
     34function config_events(pObj, pEvent, pHandler) 
    235{ 
    336    if( typeof pObj == 'object') 
     
    1447 
    1548 
    16 var _beforeunload_ = window.onbeforeunload; 
    17  
    18 window.onbeforeunload = function() 
    19 { 
    20         return unloadMess(); 
     49// Make decimal round, using in size message 
     50function round(value, decimal){ 
     51        var return_value = Math.round( value * Math.pow( 10 , decimal ) ) / Math.pow( 10 , decimal ); 
     52        return( return_value ); 
    2153} 
    2254 
    23 dom.prototype.unloadMess = function (){ 
    24         var mess = get_lang("All change you made has not been saved and will be discarted."); 
    25         for (var i = 0; i < BordersArray.length; i++) { 
    26                 var body = Element('body_' + BordersArray[i].sequence); 
    27                 if (body && body.contentWindow && body.contentWindow.document.designMode.toLowerCase() == 'on') { 
    28                         return mess; 
    29                 } 
    30         } 
     55function removeAll(id){ 
     56        do 
     57        { 
     58                if (typeof(Element(id)) == 'undefined') 
     59                        break; 
     60                Element(id).parentNode.removeChild(Element(id)); 
     61        } 
     62        while(Element(id)); 
     63} 
     64function validateEmail(email){ 
     65        if (typeof(email) != 'string') 
     66                return false; 
     67        var validName = /^[a-z][a-z-_0-9\.]*/i; 
     68        emailParts = email.split('@'); 
     69        return (validName.test(emailParts[0]) && validateDomain(emailParts[1])); 
     70} 
     71function validateDomain(domain){ 
     72        var domainReg = /^(([A-Za-z\d][A-Za-z\d-]{0,61}[A-Za-z\d]\.)+[A-Za-z]{2,6}|\[\d{1,3}(\.\d{1,3}){3}\])$/i; 
     73        return (domainReg.test(domain)); 
    3174} 
    3275 
    33 // Make decimal round, using in size message 
    34 dom.prototype.round = function (value, decimal){ 
    35         var return_value = Math.round( value * Math.pow( 10 , decimal ) ) / Math.pow( 10 , decimal ); 
    36         return( return_value ); 
     76function validateUrl(url){ 
     77        var urlReg = /([A-Za-z]{2,7}:\/\/)(.*)/i; 
     78        urlParts = url.split(urlReg); 
     79        return (urlParts[1].length > 4 &&  validateDomain(urlParts[2])); 
    3780} 
    3881 
    39  
    40 dom.prototype.removeAllById = function (id){ 
    41         do 
    42         { 
    43                 if (typeof(Element(id)) == 'undefined') 
    44                         break; 
    45                 Element(id).parentNode.removeChild(Element(id)); 
    46         } 
    47         while(Element(id)); 
    48 } 
    49 // Add Input File Dynamically. 
    50 dom.prototype.addFile = function (id_border){ 
    51         divFiles = document.getElementById("divFiles_"+id_border); 
    52         if (! divFiles) 
    53                 return false; 
    54          
    55         if (divFiles.lastChild) 
    56                 var countDivFiles = parseInt(divFiles.lastChild.id.split('_')[2]) + 1; 
    57  
    58         if (! countDivFiles) 
    59                 var countDivFiles = 1; 
    60          
    61         divFile = document.createElement('DIV'); 
    62          
    63          
    64         divFile.innerHTML = "<input type='file' id_border='"+id_border+"' size='50' maxLength='255' onchange=\"function () {validateFileExtension(this.value, this.id.replace('input','div'), this.getAttribute('id_border'));};\" id='"+"inputFile_"+id_border+"_"+countDivFiles+"' name='file_"+countDivFiles+"'>"; 
    65  
    66          
    67         var linkFile = document.createElement("A"); 
    68         linkFile.id = "linkFile_"+id_border+"_"+countDivFiles; 
    69         linkFile.href='javascript:void(0)'; 
    70         linkFile.onclick=function () {removeFile(this.id.replace("link","div")); return false;}; 
    71         linkFile.innerHTML=get_lang("Remove");   
    72         //divFile.innerHTML += "&nbsp;&nbsp;"; 
    73         divFile.appendChild(linkFile); 
    74         divFile.id = "divFile_"+id_border+"_"+countDivFiles;     
    75         divFiles.appendChild(divFile); 
    76  
    77          
    78  
    79         return document.getElementById("inputFile_"+id_border+"_"+countDivFiles); 
    80 } 
    81 //      Remove Input File Dynamically. 
    82 dom.prototype.removeFile = function (id){ 
    83         var border_id = id.substr(8,1); 
    84         var el = Element(id); 
    85         el.parentNode.removeChild(el); 
    86 } 
    87  
    88 var denyFileExtensions = new Array('exe','com','reg','chm','cnf','hta','ins', 
    89                                         'jse','job','lnk','pif','src','scf','sct','shb', 
    90                                         'vbe','vbs','wsc','wsf','wsh','cer','its','mau', 
    91                                         'mda','mar','mdz','prf','pst'); 
    92 dom.prototype.validateFileExtension = function (fileName){ 
    93         var error_flag = false; 
    94         var fileExtension = fileName.split("."); 
    95         fileExtension = fileExtension[(fileExtension.length-1)]; 
    96         for(var i=0; i<denyFileExtensions.length; i++) 
    97         { 
    98                 if(denyFileExtensions[i] == fileExtension) 
    99                 { 
    100                         error_flag = true; 
    101                         break; 
    102                 } 
    103  
    104         } 
    105  
    106         if ( error_flag == true ) 
    107         { 
    108                 write_error(get_lang('File extension forbidden or invalid file') + '.'); 
    109                 return false; 
    110         } 
    111         return true; 
    112 } 
    113  
    114  
    115 dom.prototype.validatePath = function (fileName, id, id_border){ 
    116          
    117         var error_flag  = false; 
    118  
    119         if ( fileName.indexOf('/') != -1 ) 
    120         { 
    121                 if (fileName[0] != '/'){ // file name is windows format? 
    122                         var file = fileName.substr(fileName.lastIndexOf('\\') + 1, fileName.length); 
    123                         if ((fileName.indexOf(':\\') != 1) && (fileName.indexOf('\\\\') != 0)) // Is stored in partition or a network file? 
    124                                 error_flag = true;       
    125                 } 
    126                 else // is Unix 
    127                         var file = fileName.substr(fileName.lastIndexOf('/') + 1, fileName.length);                                              
    128         } 
    129         else  // is Firefox 3 
    130                 var file = fileName; 
    131         return (validateFileExtension(file)); 
    132 } 
    133  
    134 var setTimeout_write_msg = 0; 
    135 var old_msg = false; 
    136 // Funcao usada para escrever mensagem 
    137 // notimeout = True : mensagem nao apaga 
    138 dom.prototype.write_msg = function (msg, notimeout){     
    139          
    140         if (setTimeout_write_msg) 
    141                 clearTimeout(setTimeout_write_msg); 
    142          
    143         var msg_div = Element('em_div_write_msg'); 
    144         var old_divStatusBar = Element("divStatusBar"); 
    145  
    146         if(!msg_div) { 
    147                 msg_div = document.createElement('DIV'); 
    148                 msg_div.id = 'em_div_write_msg'; 
    149                 msg_div.className = 'em_div_write_msg'; 
    150                 old_divStatusBar.parentNode.insertBefore(msg_div,old_divStatusBar); 
    151         } 
    152          
    153         if( document.getElementById('JabberMessenger')) 
    154                 loadscript.adIcon(); 
    155  
    156         msg_div.innerHTML = '<table width="100%" cellspacing="0" cellpadding="0" border="0"><tbody><tr><th width="40%"></th><th noWrap class="action_info_th">'+msg+'</th><th width="40%"></th></tr></tbody></table>'; 
    157  
    158         old_divStatusBar.style.display = 'none'; 
    159         msg_div.style.display = '';      
    160         // Nao ponha var na frente!! jakjr 
    161         handle_write_msg = function(){ 
    162                 try{ 
    163                         if(!old_msg) 
    164                                 clean_msg(); 
    165                         else 
    166                                 write_msg(old_msg, true);                        
    167                 } 
    168                 catch(e){} 
    169         } 
    170         if(notimeout) 
    171                 old_msg = msg; 
    172         else 
    173                 setTimeout_write_msg = setTimeout("handle_write_msg();", 5000); 
    174 } 
    175 // Funcao usada para apagar mensagem sem timeout 
    176 dom.prototype.clean_msg = function (){ 
    177         old_msg = false; 
    178         var msg_div = Element('em_div_write_msg'); 
    179         var old_divStatusBar = Element("divStatusBar"); 
    180         if(msg_div) 
    181                 msg_div.style.display = 'none'; 
    182         old_divStatusBar.style.display = '';     
    183 } 
    184 function Element (el) { 
    185         return  document.getElementById(el); 
    186 } 
    187  
    188 dom.prototype.trim = function (inputString) { 
     82function trim(inputString) { 
    18983   if (typeof inputString != "string")  
    190         return inputString; 
    191   
     84        return inputString; 
     85       
    19286   var retValue = inputString; 
    19387   var ch = retValue.substring(0, 1); 
    19488   while (ch == " ") {  
    195           retValue = retValue.substring(1, retValue.length); 
    196           ch = retValue.substring(0, 1); 
     89          retValue = retValue.substring(1, retValue.length); 
     90          ch = retValue.substring(0, 1); 
    19791   } 
    19892   ch = retValue.substring(retValue.length-1, retValue.length); 
    19993   while (ch == " ") {  
    200           retValue = retValue.substring(0, retValue.length-1); 
    201           ch = retValue.substring(retValue.length-1, retValue.length); 
     94          retValue = retValue.substring(0, retValue.length-1); 
     95          ch = retValue.substring(retValue.length-1, retValue.length); 
    20296   } 
    20397   while (retValue.indexOf("  ") != -1) {  
    204           retValue = retValue.substring(0, retValue.indexOf("  ")) + retValue.substring(retValue.indexOf("  ")+1, retValue.length);  
     98          retValue = retValue.substring(0, retValue.indexOf("  ")) + retValue.substring(retValue.indexOf("  ")+1, retValue.length);  
    20599   } 
    206100   return retValue;  
     
    208102 
    209103 
    210 dom.prototype.LTrim = function (value){ 
    211         var w_space = String.fromCharCode(32); 
    212         var strTemp = ""; 
    213         var iTemp = 0; 
     104function LTrim(value){ 
     105        var w_space = String.fromCharCode(32); 
     106        var strTemp = ""; 
     107        var iTemp = 0; 
    214108 
    215         var v_length = value ? value.length : 0; 
    216         if(v_length < 1) 
    217                 return ""; 
     109        var v_length = value ? value.length : 0; 
     110        if(v_length < 1) 
     111                return ""; 
    218112 
    219         while(iTemp < v_length){ 
    220                 if(value && value.charAt(iTemp) != w_space){ 
    221                         strTemp = value.substring(iTemp,v_length); 
    222                         break; 
    223                 } 
    224                 iTemp++; 
    225         } 
    226         return strTemp; 
     113        while(iTemp < v_length){ 
     114                if(value && value.charAt(iTemp) != w_space){ 
     115                        strTemp = value.substring(iTemp,v_length); 
     116                        break; 
     117                } 
     118                iTemp++; 
     119        } 
     120        return strTemp; 
    227121} 
    228122 
    229123 
    230 dom.prototype.array_search = function (needle, haystack) { 
    231         var n = haystack.length; 
    232         for (var i=0; i<n; i++) { 
    233                 if (haystack[i]==needle) { 
    234                         return true; 
    235                 } 
    236         } 
    237         return false; 
     124function add_className(obj, className){ 
     125        if (obj && !exist_className(obj, className)) 
     126                obj.className = obj.className + ' ' + className; 
     127} 
     128 
     129function remove_className(obj, className){ 
     130        var re = new RegExp("\\s*"+className); 
     131        if (obj) 
     132                obj.className = obj.className.replace(re, ' '); 
     133} 
     134 
     135function exist_className(obj, className){ 
     136        return ( obj && obj.className.indexOf(className) != -1 ); 
    238137} 
    239138 
    240139 
    241 dom.prototype.add_className = function (obj, className){ 
    242         if (obj && !exist_className(obj, className)) 
    243                 obj.className = obj.className + ' ' + className; 
    244 } 
    245140 
    246 dom.prototype.remove_className = function (obj, className){ 
    247         var re = new RegExp("\\s*"+className); 
    248         if (obj) 
    249                 obj.className = obj.className.replace(re, ' '); 
    250 } 
    251  
    252 dom.prototype.exist_className = function (obj, className){ 
    253         return ( obj && obj.className.indexOf(className) != -1 ) 
    254 } 
    255  
    256  
    257 dom.prototype.validate_date = function (date){ 
     141function validate_date(date){ 
    258142    if (date.match(/^[0-3][0-9]\/[0-1][0-9]\/\d{4,4}$/)) 
    259143    { 
     
    280164            return false; 
    281165        } 
    282 } 
     166}; 
    283167 
Note: See TracChangeset for help on using the changeset viewer.