[ Index ] |
PHP Cross Reference of phpwcms V1.4.3 _r380 (23.11.09) |
[Summary view] [Print] [Text view]
1 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" > 2 <!-- 3 * FCKeditor - The text editor for Internet - http://www.fckeditor.net 4 * Copyright (C) 2003-2009 Frederico Caldeira Knabben 5 * 6 * == BEGIN LICENSE == 7 * 8 * Licensed under the terms of any of the following licenses at your 9 * choice: 10 * 11 * - GNU General Public License Version 2 or later (the "GPL") 12 * http://www.gnu.org/licenses/gpl.html 13 * 14 * - GNU Lesser General Public License Version 2.1 or later (the "LGPL") 15 * http://www.gnu.org/licenses/lgpl.html 16 * 17 * - Mozilla Public License Version 1.1 or later (the "MPL") 18 * http://www.mozilla.org/MPL/MPL-1.1.html 19 * 20 * == END LICENSE == 21 --> 22 <html> 23 <head> 24 <title>SCAYT Properties</title> 25 <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> 26 <meta content="noindex, nofollow" name="robots"> 27 <script src="common/fck_dialog_common.js" type="text/javascript"></script> 28 <link type="text/css" href="fck_scayt/scayt_dialog.css" rel="stylesheet" /> 29 <script type="text/javascript"> 30 31 var dialog = window.parent ; 32 var oEditor = dialog.InnerDialogLoaded() ; 33 var FCKLang = oEditor.FCKLang; 34 var scayt = oEditor.scayt; 35 var scayt_control = oEditor.scayt_control; 36 var lang_list = {}; 37 var sLang; 38 var fckLang; 39 var chosed_lang; 40 var options; 41 var tabs = scayt_control.uiTags || [1,1,0,1]; 42 var userDicActive = tabs[2] == 1; 43 var captions; 44 var dic_buttons = [ 45 // [0] contains buttons for creating 46 "dic_create,dic_restore", 47 // [1] contains buton for manipulation 48 "dic_rename,dic_delete" 49 ]; 50 51 var get = 52 new function(){ 53 54 var mergeObjs = function(obj1, obj2) 55 { 56 for (var k in obj1) 57 obj2[k] = obj1[k]; 58 59 return obj2; 60 }; 61 62 var removeWhitespaces = function( s ) 63 { 64 s = s.replace( new RegExp("^ +| +$"), '' ) ; 65 return s ; 66 }; 67 68 var addEvent = function( el ,sEventName, fTodo ) 69 { 70 if (el.addEventListener) { 71 el.addEventListener (sEventName,fTodo,false); 72 73 } else if (el.attachEvent) { 74 el.attachEvent ("on"+sEventName,fTodo); 75 76 } else { 77 el["on"+sEventName] = fTodo; 78 } 79 }; 80 81 var getElementsByClassName = function (node,classname ,strTag) { 82 strTag = strTag || "*"; 83 node = node || document; 84 if (node.getElementsByClassName) 85 return node.getElementsByClassName(classname); 86 else { 87 var objColl = node.getElementsByTagName(strTag); 88 if (!objColl.length && strTag == "*" && node.all) objColl = node.all; 89 var arr = new Array(); 90 var delim = classname.indexOf('|') != -1 ? '|' : ' '; 91 var arrClass = classname.split(delim); 92 for (var i = 0, j = objColl.length; i < j; i++) { 93 var arrObjClass = objColl[i].className.split(' '); 94 if (delim == ' ' && arrClass.length > arrObjClass.length) continue; 95 var c = 0; 96 comparisonLoop: 97 for ( var k = 0, l = arrObjClass.length ; k < l ; k++ ) 98 { 99 for ( var m = 0, n = arrClass.length ; m < n ; m++ ) 100 { 101 if ( arrClass[m] == arrObjClass[k] ) 102 c++ ; 103 104 if ( ( delim == '|' && c == 1 ) || ( delim == ' ' && c == arrClass.length ) ) 105 { 106 arr.push( objColl[i] ) ; 107 break comparisonLoop ; 108 } 109 } 110 } 111 } 112 return arr; 113 } 114 }; 115 116 var hasClassName = function ( sClassName, elem ) { 117 //.split(/\s+/); 118 var aCnames = elem.className.split(/\s+/) || []; 119 for (var i=0, l=aCnames.length; i<l ; i++){ 120 if (sClassName == aCnames[i]) 121 return true; 122 } 123 return false; 124 } 125 126 var single = { 127 addClass : function ( sClassName ) { 128 //console.info( sClassName, this.className, ); 129 if ( hasClassName(sClassName , this) ) 130 return this; 131 var s = removeWhitespaces(this.className + " " +sClassName); 132 this.className = s; 133 return this; 134 135 }, 136 removeClass : function ( sClassName ) { 137 var s = removeWhitespaces(this.className.replace(sClassName,"")); 138 this.className = s; 139 return this; 140 }, 141 setStyle : function( oStyles ) 142 { 143 for ( var style in oStyles ) 144 { 145 this.style[style] = oStyles[style] ; 146 } 147 return this ; 148 }, 149 bindOnclick : function ( handler ) { 150 //addEvent( this, "click" , handler); 151 this.onclick = handler; 152 return this; 153 }, 154 bindOnchange : function ( handler ) { 155 //addEvent( this, "change" , handler); 156 this.onchange = handler; 157 return this; 158 }, 159 getAttr : function ( sAttrName ) 160 { 161 if ( !sAttrName ) 162 return null; 163 164 return this[sAttrName]; 165 }, 166 setAttr : function ( sAttrName , attrVal ) 167 { 168 if ( !sAttrName || !attrVal ) 169 return null; 170 171 this[sAttrName] = attrVal; 172 173 return this; 174 }, 175 remAttr : function ( sAttrName ) 176 { 177 if ( !sAttrName ) 178 return null; 179 } 180 }; 181 182 var singleCaller = function ( sMethod,args ) { 183 for ( var i=0, l=this.length; i<l ; i++ ){ 184 var oItem = mergeObjs( single, this[i] ); 185 oItem[sMethod].apply(this[i],args); 186 } 187 }; 188 189 190 var collection = { 191 192 addClass : function ( sClassName ){ 193 singleCaller.call(this, "addClass", [sClassName]) 194 return this; 195 }, 196 removeClass : function ( sClassName ) { 197 singleCaller.call(this, "removeClass", [sClassName]) 198 return this; 199 }, 200 setStyle : function ( oStyles ) { 201 singleCaller.call(this, "setStyle", [oStyles]) 202 return this; 203 }, 204 bindOnclick : function ( f ) { 205 singleCaller.call(this, "bindOnclick", [f]) 206 return this; 207 }, 208 bindOnchange : function ( f ) { 209 singleCaller.call(this, "bindOnchange", [f]) 210 return this; 211 }, 212 213 forEach : function ( fTodo ) { 214 //el,i 215 for (var i=0, l=this.length; i<l ; i++){ 216 fTodo.apply(this[i], [this[i],i ]); 217 } 218 return this; 219 } 220 221 }; 222 223 224 225 this.byClass = function( sClassName ){ 226 var o = getElementsByClassName(document, sClassName ); 227 return o ? mergeObjs( collection, o ) : o; 228 }; 229 230 this.byId = function( sId ){ 231 var o = document.getElementById( sId ); 232 return o ? mergeObjs( single, o ) : o; 233 }; 234 235 this.gup = function ( name ){ 236 name = name.replace( /[\[]/, '\\\[' ).replace( /[\]]/, '\\\]' ) ; 237 var regexS = '[\\?&]' + name + '=([^&#]*)' ; 238 var regex = new RegExp( regexS ) ; 239 var results = regex.exec( window.location.href ) ; 240 241 if( results == null ) 242 return '' ; 243 else 244 return results[ 1 ] ; 245 }; 246 this.wrap = function ( o ) { 247 return o ? mergeObjs( single, o ) : o; 248 }; 249 this.forEach = function ( oScope, fTodo ){ 250 collection.forEach.apply( oScope,[fTodo] ); 251 }; 252 253 }; 254 255 256 257 // Add the dialog tabs. 258 tabs[0] == 1 && dialog.AddTab( 'options', 'Options' ) ; 259 tabs[1] == 1 && dialog.AddTab( 'langs', 'Languages' ) ; 260 tabs[2] == 1 && dialog.AddTab( 'dictionary', 'Dictionary' ) ; 261 tabs[3] == 1 && dialog.AddTab( 'about', 'About' ) ; 262 263 // Function called when a dialog tab is selected. 264 function OnDialogTabChange( tabCode ) 265 { 266 ShowE('inner_options' , ( tabCode == 'options' ) ) ; 267 ShowE('inner_langs' , ( tabCode == 'langs' ) ) ; 268 ShowE('inner_dictionary' , ( tabCode == 'dictionary' ) ) ; 269 ShowE('inner_about' , ( tabCode == 'about' ) ) ; 270 } 271 272 273 274 275 276 window.onload = function() 277 { 278 // Things to do when the page is loaded. 279 280 if ( document.location.search.length ) 281 dialog.SetSelectedTab( document.location.search.substr(1) ) ; 282 283 dialog.SetOkButton( true ) ; 284 285 286 if (!scayt) throw "SCAYT is undefined"; 287 if (!scayt_control) throw "SCAYT_CONTROL is undefined"; 288 289 // show alowed tabs 290 tabs = scayt_control.uiTags || [1,1,1,0]; 291 292 293 sLang = scayt_control.getLang(); 294 fckLang = "en"; 295 options = scayt_control.option(); 296 // apply captions 297 scayt.getCaption( fckLang, function( caps ) 298 { 299 //console.info( "scayt.getCaption runned" ) 300 captions = caps; 301 apllyCaptions(); 302 //lang_list = scayt.getLangList(); 303 lang_list = scayt.getLangList() ;//|| {ltr: {"en_US" : "English","en_GB" : "British English","pt_BR" : "Brazilian Portuguese","da_DK" : "Danish","nl_NL" : "Dutch","en_CA" : "English Canadian","fi_FI" : "Finnish","fr_FR" : "French","fr_CA" : "French Canadian","de_DE" : "German","el_GR" : "Greek","hu_HU" : "Hungarian","it_IT" : "Italian","nb_NO" : "Norwegian","pl_PL" : "Polish","pt_PT" : "Portuguese","ru_RU" : "Russian","es_ES" : "Spanish","sv_SE" : "Swedish","tr_TR" : "Turkish","uk_UA" : "Ukrainian","cy_GB" : "Welsh"},rtl: {"ar_EG" : "Arabic"}}; 304 305 306 307 308 // ** animate options 309 get.byClass("_scayt_option").forEach(function(el,i){ 310 311 if ('undefined' != typeof(options[el.name])) { 312 // *** set default values 313 314 if ( 1 == options[ el.name ] ){ 315 //el.setAttribute("checked","true"); 316 get.wrap(el).setAttr("checked" ,true) 317 //document.all_options[el.name].checked = "true"; 318 //el.checked = true; 319 //alert( options[ dojo.attr(el ,'name') ] + " el " ) 320 } 321 //console.info(options) 322 // *** bind events 323 get.wrap(el).bindOnclick( function(ev){ 324 325 var that = get.wrap(this); 326 var isCheck = that.getAttr("checked"); 327 //console.info(isCheck) 328 if ( isCheck == false ) { 329 330 //that.setAttr("checked",false); 331 options[ this.name ] = 0; 332 }else{ 333 //that.setAttr("checked",true); 334 options[ this.name ] = 1; 335 } 336 //console.info(options) 337 }); 338 } 339 }); 340 341 342 // * Create languages tab 343 // ** convert langs obj to array 344 var lang_arr = []; 345 346 for (var k in lang_list.rtl){ 347 // find curent lang 348 if ( k == sLang) 349 chosed_lang = lang_list.rtl[k] + "::" + k; 350 lang_arr[lang_arr.length] = lang_list.rtl[k] + "::" + k; 351 352 } 353 for (var k in lang_list.ltr){ 354 // find curent lang 355 if ( k == sLang) 356 chosed_lang = lang_list.ltr[k] + "::" + k; 357 lang_arr[lang_arr.length] = lang_list.ltr[k] + "::" + k; 358 } 359 lang_arr.sort(); 360 361 // ** find lang containers 362 363 var lcol = get.byId("lcolid"); 364 var rcol = get.byId("rcolid"); 365 // ** place langs in DOM 366 367 get.forEach(lang_arr , function( l , i ){ 368 369 //console.info( l,i ); 370 371 var l_arr = l.split('::'); 372 var l_name = l_arr[0]; 373 var l_code = l_arr[1]; 374 var row = document.createElement('div'); 375 row.id = l_code; 376 row.className = "li"; 377 // split langs on half 378 var col = ( i < lang_arr.length/2 ) ? lcol:rcol ; 379 380 // append row 381 //console.dir( col ) 382 col.appendChild(row); 383 var row_dom = get.byId( l_code ) 384 row_dom.innerHTML = l_name; 385 386 var checkActiveLang = function( id ){ 387 return chosed_lang.split("::")[1] == id; 388 }; 389 // bind click 390 row_dom.bindOnclick(function(ev){ 391 392 if ( checkActiveLang(this.id) ) return false; 393 var elId = this.id; 394 get.byId(this.id) 395 .addClass("Button") 396 .removeClass("DarkBackground"); 397 398 window.setTimeout( function (){ get.byId(elId).setStyle({opacity:"0.5",cursor:"no-drop"}); } ,300 ); 399 400 get.byId(chosed_lang.split("::")[1]) 401 .addClass("DarkBackground") 402 .removeClass("Button") 403 .setStyle({opacity:"1",cursor:"pointer"}); 404 405 chosed_lang = this.innerHTML + "::" + this.id; 406 return true; 407 }) 408 .setStyle({ 409 cursor:"pointer" 410 }); 411 // select current lang 412 if (l == chosed_lang) 413 row_dom.addClass("Button").setStyle({opacity:"0.5",cursor:"no-drop"}); 414 else 415 row_dom.addClass("DarkBackground").setStyle({opacity:"1"}); 416 417 }); 418 // * user dictionary 419 if ( userDicActive ){ 420 initUserDictionary() 421 422 } 423 }); 424 425 426 427 } 428 429 430 431 432 var buttons = [ 'dic_create','dic_delete','dic_rename','dic_restore' ]; 433 var labels = [ 'mixedCase','mixedWithDigits','allCaps','ignoreDomainNames' ]; 434 435 436 function apllyCaptions ( ) 437 { 438 439 // fill tabs headers 440 // add missing captions 441 442 get.byClass("PopupTab").forEach(function(el,i){ 443 444 if ( tabs[i] == 1 ){ 445 el.style.display = "block"; 446 } 447 el.innerHTML = captions['tab_'+el.id]; 448 449 }); 450 451 // Fill options labels. 452 for ( i in labels ) 453 { 454 var label = 'label_' + labels[ i ], 455 labelElement = document.getElementById( label ); 456 457 if ( 'undefined' != typeof labelElement 458 && 'undefined' != typeof captions[ label ] && captions[ label ] !== "" 459 && 'undefined' != typeof options[labels[ i ]] ) 460 { 461 labelElement.innerHTML = captions[ label ]; 462 var labelParent = labelElement.parentNode; 463 labelParent.style.display = "block"; 464 } 465 } 466 // fill dictionary section 467 for ( var i in buttons ) 468 { 469 var button = buttons[ i ]; 470 get.byId( button ).innerHTML = '<span>' + captions[ 'button_' + button] +'</span>' ; 471 } 472 get.byId("dname").innerHTML = captions['label_dname']; 473 get.byId( 'dic_info' ).innerHTML = captions[ 'dic_info' ]; 474 475 // fill about tab 476 var about = '<p>' + captions[ 'about_throwt_image' ] + '</p>'+ 477 '<p>' + captions[ 'version' ] + scayt.version.toString() + '</p>' + 478 '<p>' + captions[ 'about_throwt_copy' ] + '</p>'; 479 480 get.byId( 'scayt_about' ).innerHTML = about; 481 482 } 483 484 485 function initUserDictionary () { 486 487 scayt.getNameUserDictionary( 488 function( o ) 489 { 490 var dic_name = o.dname; 491 if ( dic_name ) 492 { 493 get.byId( 'dic_name' ).value = dic_name; 494 display_dic_buttons( dic_buttons[1] ); 495 } 496 else 497 display_dic_buttons( dic_buttons[0] ); 498 499 }, 500 function () 501 { 502 get.byId( 'dic_name' ).value(""); 503 dic_error_message(captions["err_dic_enable"] || "Used dictionary are unaveilable now.") 504 } 505 ); 506 507 dic_success_message(""); 508 509 // ** bind event listeners 510 get.byClass("button").bindOnclick(function( ){ 511 512 // get dic name 513 var dic_name = get.byId('dic_name').value ; 514 // check common dictionary rules 515 if (!dic_name) { 516 dic_error_message(" Dictionary name should not be empty. "); 517 return false; 518 } 519 //apply handler 520 window[this.id].apply( window, [this, dic_name, dic_buttons ] ); 521 522 //console.info( typeof window[this.id], window[this.id].calle ) 523 return false; 524 }); 525 526 } 527 528 dic_create = function( el, dic_name , dic_buttons ) 529 { 530 // comma separated button's ids include repeats if exists 531 var all_buttons = dic_buttons[0] + ',' + dic_buttons[1]; 532 533 var err_massage = captions["err_dic_create"]; 534 var suc_massage = captions["succ_dic_create"]; 535 //console.info("--plugin "); 536 537 scayt.createUserDictionary(dic_name, 538 function(arg) 539 { 540 //console.info( "dic_create callback called with args" , arg ); 541 hide_dic_buttons ( all_buttons ); 542 display_dic_buttons ( dic_buttons[1] ); 543 suc_massage = suc_massage.replace("%s" , arg.dname ); 544 dic_success_message (suc_massage); 545 }, 546 function(arg) 547 { 548 //console.info( "dic_create errorback called with args" , arg ) 549 err_massage = err_massage.replace("%s" ,arg.dname ); 550 dic_error_message ( err_massage + "( "+ (arg.message || "") +")"); 551 }); 552 553 }; 554 555 dic_rename = function( el, dic_name , dic_buttons ) 556 { 557 // 558 // try to rename dictionary 559 // @TODO: rename dict 560 //console.info ( captions["err_dic_rename"] ) 561 var err_massage = captions["err_dic_rename"] || ""; 562 var suc_massage = captions["succ_dic_rename"] || ""; 563 scayt.renameUserDictionary(dic_name, 564 function(arg) 565 { 566 //console.info( "dic_rename callback called with args" , arg ); 567 suc_massage = suc_massage.replace("%s" , arg.dname ); 568 set_dic_name( dic_name ); 569 dic_success_message ( suc_massage ); 570 }, 571 function(arg) 572 { 573 //console.info( "dic_rename errorback called with args" , arg ) 574 err_massage = err_massage.replace("%s" , arg.dname ); 575 set_dic_name( dic_name ); 576 dic_error_message( err_massage + "( " + ( arg.message || "" ) + " )" ); 577 }); 578 }; 579 580 dic_delete = function ( el, dic_name , dic_buttons ) 581 { 582 var all_buttons = dic_buttons[0] + ',' + dic_buttons[1]; 583 var err_massage = captions["err_dic_delete"]; 584 var suc_massage = captions["succ_dic_delete"]; 585 586 // try to delete dictionary 587 // @TODO: delete dict 588 scayt.deleteUserDictionary( 589 function(arg) 590 { 591 //console.info( "dic_delete callback " , dic_name ,arg ); 592 suc_massage = suc_massage.replace("%s" , arg.dname ); 593 hide_dic_buttons ( all_buttons ); 594 display_dic_buttons ( dic_buttons[0] ); 595 set_dic_name( "" ); // empty input field 596 dic_success_message( suc_massage ); 597 }, 598 function(arg) 599 { 600 //console.info( " dic_delete errorback called with args" , arg ) 601 err_massage = err_massage.replace("%s" , arg.dname ); 602 dic_error_message(err_massage); 603 }); 604 }; 605 606 dic_restore = dialog.dic_restore || function ( el, dic_name , dic_buttons ) 607 { 608 // try to restore existing dictionary 609 var all_buttons = dic_buttons[0] + ',' + dic_buttons[1]; 610 var err_massage = captions["err_dic_restore"]; 611 var suc_massage = captions["succ_dic_restore"]; 612 613 scayt.restoreUserDictionary(dic_name, 614 function(arg) 615 { 616 //console.info( "dic_restore callback called with args" , arg ); 617 suc_massage = suc_massage.replace("%s" , arg.dname ); 618 hide_dic_buttons ( all_buttons ); 619 display_dic_buttons(dic_buttons[1]); 620 dic_success_message( suc_massage ); 621 }, 622 function(arg) 623 { 624 //console.info( " dic_restore errorback called with args" , arg ) 625 err_massage = err_massage.replace("%s" , arg.dname ); 626 dic_error_message( err_massage ); 627 }); 628 }; 629 630 function dic_error_message( m ) 631 { 632 if ( !m ) 633 return ; 634 635 get.byId('dic_message').innerHTML = '<span class="error">' + m + '</span>' ; 636 } 637 638 function dic_success_message( m ) 639 { 640 if ( !m ) 641 return ; 642 643 get.byId('dic_message').innerHTML = '<span class="success">' + m + '</span>' ; 644 } 645 646 function display_dic_buttons ( sIds ){ 647 sIds = new String( sIds ); 648 get.forEach( sIds.split(','), function ( id,i) { 649 get.byId(id).setStyle({display:"inline"}); 650 }); 651 } 652 function hide_dic_buttons ( sIds ){ 653 sIds = new String( sIds ); 654 get.forEach( sIds.split(','), function ( id,i) { 655 get.byId(id).setStyle({display:"none"}); 656 }); 657 } 658 function set_dic_name ( dic_name ) { 659 get.byId('dic_name').value = dic_name; 660 } 661 function display_dic_tab () { 662 get.byId("dic_tab").style.display = "block"; 663 } 664 665 function Ok() 666 { 667 // Things to do when the Ok button is clicked. 668 var c = 0; 669 // set upp options if any was set 670 var o = scayt_control.option(); 671 //console.info(options) 672 for ( var oN in options ) { 673 674 if ( o[oN] != options[oN] && c == 0){ 675 //console.info( "set option " ) 676 scayt_control.option( options ); 677 c++; 678 } 679 } 680 //setup languge if it was change 681 var csLang = chosed_lang.split("::")[1]; 682 if ( csLang && sLang != csLang ){ 683 scayt_control.setLang( csLang ); 684 //console.info(sLang+" -> "+csLang , scayt_control) 685 c++; 686 } 687 688 if ( c > 0 ) scayt_control.refresh(); 689 690 return dialog.Cancel(); 691 692 } 693 694 </script> 695 </head> 696 <body style="OVERFLOW: hidden" scroll="no"> 697 <div class="tab_container" id="inner_options"> 698 699 <ul id="scayt_options"> 700 <li class="_scayt_options"> 701 <input class="_scayt_option" type="checkbox" value="0" name="allCaps" /> 702 <label for="allCaps" id="label_allCaps"></label> 703 </li> 704 <li> 705 <input class="_scayt_option" type="checkbox" value="0" name="ignoreDomainNames" /> 706 <label for="ignoreDomainNames" id="label_ignoreDomainNames"></label> 707 </li> 708 <li> 709 <input class="_scayt_option" type="checkbox" value="0" name="mixedCase" /> 710 <label for="mixedCase" id="label_mixedCase"></label> 711 </li> 712 <li> 713 <input class="_scayt_option" type="checkbox" value="0" name="mixedWithDigits" /> 714 <label for="mixedWithDigits" id="label_mixedWithDigits"></label> 715 </li> 716 </ul> 717 </div> 718 <div class="tab_container" id="inner_langs"> 719 720 <div class="lcol" id="lcolid"></div> 721 <div class="rcol" id="rcolid"></div> 722 </div> 723 <div class="tab_container" id="inner_dictionary"> 724 725 <div id="dic_message"></div> 726 <div id="_off_dic_tab" class="dictionary" > 727 <div style="padding-left:10px;"> 728 <label id="dname" for="dname"></label> 729 <input type="text" size="14" maxlength="15" value="" id="dic_name" name="dic_name"/> 730 </div> 731 <div class="dic_buttons"> 732 <a href="#" id="dic_create" class="button"> </a> 733 <a href="#" id="dic_delete" class="button"> </a> 734 <a href="#" id="dic_rename" class="button"> </a> 735 <a href="#" id="dic_restore" class="button"> </a> 736 </div> 737 738 <div id="dic_info"></div> 739 740 </div> 741 </div> 742 <div id="inner_about" class="tab_container"> 743 <div id="scayt_about"></div> 744 </div> 745 </body> 746 </html>
title
Description
Body
title
Description
Body
title
Description
Body
title
Body
Generated: Wed Dec 30 05:55:15 2009 | Cross-referenced by PHPXref 0.7 |