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-2010 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', FCKLang.ScaytOptionsTab||'Options' ) ;
259			tabs[1] == 1 && dialog.AddTab( 'langs', FCKLang.ScaytLangsTab || 'Languages' ) ;
260			tabs[2] == 1 && dialog.AddTab( 'dictionary', FCKLang.ScaytDictTab || 'Dictionary' ) ;
261			tabs[3] == 1 && dialog.AddTab( 'about', FCKLang.ScaytAboutTab ||'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                        fckLangStr = 'Scayt' +  labels[ i ];
456						labelElement = document.getElementById( label );
457
458					if (  'undefined' != typeof labelElement
459					   && 'undefined' != typeof captions[ label ] && captions[ label ] !== ""
460					   && 'undefined' != typeof options[labels[ i ]] )
461					{
462
463                        var label_text = FCKLang[fckLangStr] || captions[ label ];
464						labelElement.innerHTML = label_text;
465						var labelParent = labelElement.parentNode;
466						labelParent.style.display = "block";
467					}
468				}
469
470				// fill dictionary section
471				for ( var i in buttons )
472				{
473					var button = buttons[ i ];
474					get.byId( button ).innerHTML = '<span>' + captions[ 'button_' + button]  +'</span>' ;
475				}
476				get.byId("dname").innerHTML = captions['label_dname'];
477				get.byId( 'dic_info' ).innerHTML = captions[ 'dic_info' ];
478
479				// fill about tab
480				var about = '<p>' + captions[ 'about_throwt_image' ] + '</p>'+
481					'<p>' + captions[ 'version' ]  + scayt.version.toString() + '</p>' +
482					'<p>' + captions[ 'about_throwt_copy' ] + '</p>';
483
484				get.byId( 'scayt_about' ).innerHTML = about;
485
486			}
487
488
489			function initUserDictionary () {
490
491				scayt.getNameUserDictionary(
492					function( o )
493					{
494						var dic_name = o.dname;
495						if ( dic_name )
496						{
497							get.byId( 'dic_name' ).value = dic_name;
498							display_dic_buttons( dic_buttons[1] );
499						}
500						else
501							display_dic_buttons( dic_buttons[0] );
502
503					},
504					function ()
505					{
506						get.byId( 'dic_name' ).value("");
507						dic_error_message(captions["err_dic_enable"] || "Used dictionary are unaveilable now.")
508					}
509				);
510
511				dic_success_message("");
512
513				 // ** bind event listeners
514                get.byClass("button").bindOnclick(function( ){
515
516					// get dic name
517					var dic_name = get.byId('dic_name').value ;
518					// check common dictionary rules
519					if (!dic_name) {
520						dic_error_message(" Dictionary name should not be empty. ");
521						return false;
522					}
523					//apply handler
524					window[this.id].apply( window, [this, dic_name, dic_buttons ] );
525
526					//console.info( typeof window[this.id], window[this.id].calle )
527					return false;
528				});
529
530			}
531
532			dic_create = function( el, dic_name , dic_buttons )
533			{
534				// comma separated button's ids include repeats if exists
535				var all_buttons = dic_buttons[0] + ',' + dic_buttons[1];
536
537				var err_massage = captions["err_dic_create"];
538				var suc_massage = captions["succ_dic_create"];
539				//console.info("--plugin ");
540
541				scayt.createUserDictionary(dic_name,
542					function(arg)
543						{
544							//console.info( "dic_create callback called with args" , arg );
545							hide_dic_buttons ( all_buttons );
546							display_dic_buttons ( dic_buttons[1] );
547							suc_massage = suc_massage.replace("%s" , arg.dname );
548							dic_success_message (suc_massage);
549						},
550					function(arg)
551						{
552							//console.info( "dic_create errorback called with args" , arg )
553							err_massage = err_massage.replace("%s" ,arg.dname );
554							dic_error_message ( err_massage + "( "+ (arg.message || "") +")");
555						});
556
557			};
558
559			dic_rename = function( el, dic_name , dic_buttons )
560			{
561				//
562				// try to rename dictionary
563				// @TODO: rename dict
564				//console.info ( captions["err_dic_rename"] )
565				var err_massage = captions["err_dic_rename"] || "";
566				var suc_massage = captions["succ_dic_rename"] || "";
567				scayt.renameUserDictionary(dic_name,
568					function(arg)
569						{
570							//console.info( "dic_rename callback called with args" , arg );
571							suc_massage = suc_massage.replace("%s" , arg.dname );
572							set_dic_name( dic_name );
573							dic_success_message ( suc_massage );
574						},
575					function(arg)
576						{
577							//console.info( "dic_rename errorback called with args" , arg )
578							err_massage = err_massage.replace("%s" , arg.dname  );
579							set_dic_name( dic_name );
580							dic_error_message( err_massage + "( " + ( arg.message || "" ) + " )" );
581						});
582			};
583
584			dic_delete = function ( el, dic_name , dic_buttons )
585			{
586				var all_buttons = dic_buttons[0] + ',' + dic_buttons[1];
587				var err_massage = captions["err_dic_delete"];
588				var suc_massage = captions["succ_dic_delete"];
589
590				// try to delete dictionary
591				// @TODO: delete dict
592				scayt.deleteUserDictionary(
593					function(arg)
594						{
595							//console.info( "dic_delete callback " , dic_name ,arg );
596							suc_massage = suc_massage.replace("%s" , arg.dname );
597							hide_dic_buttons ( all_buttons );
598							display_dic_buttons ( dic_buttons[0] );
599							set_dic_name( "" ); // empty input field
600							dic_success_message( suc_massage );
601						},
602					function(arg)
603						{
604							//console.info( " dic_delete errorback called with args" , arg )
605							err_massage = err_massage.replace("%s" , arg.dname );
606							dic_error_message(err_massage);
607						});
608			};
609
610			dic_restore = dialog.dic_restore || function ( el, dic_name , dic_buttons )
611			{
612				// try to restore existing dictionary
613				var all_buttons = dic_buttons[0] + ',' + dic_buttons[1];
614				var err_massage = captions["err_dic_restore"];
615				var suc_massage = captions["succ_dic_restore"];
616
617				scayt.restoreUserDictionary(dic_name,
618					function(arg)
619						{
620							//console.info( "dic_restore callback called with args" , arg );
621							suc_massage = suc_massage.replace("%s" , arg.dname );
622							hide_dic_buttons ( all_buttons );
623							display_dic_buttons(dic_buttons[1]);
624							dic_success_message( suc_massage );
625						},
626					function(arg)
627						{
628							//console.info( " dic_restore errorback called with args" , arg )
629							err_massage = err_massage.replace("%s" , arg.dname );
630							dic_error_message( err_massage );
631						});
632			};
633
634			function dic_error_message( m )
635			{
636				if ( !m )
637					return ;
638
639				get.byId('dic_message').innerHTML =  '<span class="error">' + m + '</span>' ;
640			}
641
642            function dic_success_message( m )
643            {
644				if ( !m )
645					return ;
646
647				get.byId('dic_message').innerHTML = '<span class="success">' + m + '</span>' ;
648			}
649
650			function display_dic_buttons ( sIds ){
651				sIds = new String( sIds );
652				get.forEach( sIds.split(','), function ( id,i) {
653					get.byId(id).setStyle({display:"inline"});
654				});
655			}
656			function hide_dic_buttons ( sIds ){
657				sIds = new String( sIds );
658				get.forEach( sIds.split(','), function ( id,i) {
659					get.byId(id).setStyle({display:"none"});
660				});
661			}
662			function set_dic_name ( dic_name ) {
663				get.byId('dic_name').value = dic_name;
664			}
665			function display_dic_tab () {
666				get.byId("dic_tab").style.display = "block";
667			}
668
669			function Ok()
670			{
671				// Things to do when the Ok button is clicked.
672				var c = 0;
673			    // set upp options if any was set
674			    var o = scayt_control.option();
675				//console.info(options)
676			    for ( var oN in options ) {
677
678			        if ( o[oN] != options[oN] && c == 0){
679						//console.info( "set option " )
680			            scayt_control.option( options );
681			            c++;
682			        }
683			    }
684			    //setup languge if it was change
685			    var csLang = chosed_lang.split("::")[1];
686			    if ( csLang && sLang != csLang ){
687			        scayt_control.setLang( csLang );
688					//console.info(sLang+" -> "+csLang , scayt_control)
689			        c++;
690			    }
691
692			    if ( c > 0 )  scayt_control.refresh();
693
694			    return dialog.Cancel();
695
696			}
697
698		</script>
699	</head>
700	<body style="OVERFLOW: auto" scroll="yes">
701		<div class="tab_container" id="inner_options">
702
703           <ul id="scayt_options">
704               <li class="_scayt_options">
705                   <input class="_scayt_option" type="checkbox" value="0" name="allCaps" />
706                   <label for="allCaps" id="label_allCaps"></label>
707               </li>
708               <li>
709                   <input class="_scayt_option" type="checkbox" value="0" name="ignoreDomainNames" />
710                   <label for="ignoreDomainNames" id="label_ignoreDomainNames"></label>
711               </li>
712               <li>
713                   <input class="_scayt_option" type="checkbox" value="0" name="mixedCase" />
714                   <label for="mixedCase" id="label_mixedCase"></label>
715               </li>
716               <li>
717                   <input class="_scayt_option" type="checkbox" value="0" name="mixedWithDigits" />
718                   <label for="mixedWithDigits" id="label_mixedWithDigits"></label>
719               </li>
720           </ul>
721		</div>
722		<div class="tab_container" id="inner_langs">
723
724		   <div class="lcol" id="lcolid"></div>
725           <div class="rcol" id="rcolid"></div>
726		</div>
727		<div class="tab_container" id="inner_dictionary">
728
729		   <div id="dic_message"></div>
730			<div id="_off_dic_tab" class="dictionary" >
731				<div style="padding-left:10px;">
732							<label id="dname" for="dname"></label>
733							<input type="text" size="14" maxlength="15" value="" id="dic_name" name="dic_name"/>
734						</div>
735						<div class="dic_buttons">
736							<a href="#" id="dic_create" class="button">  </a>
737							<a href="#" id="dic_delete" class="button">  </a>
738							<a href="#" id="dic_rename" class="button">  </a>
739							<a href="#" id="dic_restore" class="button">  </a>
740						</div>
741
742						<div id="dic_info"></div>
743
744			</div>
745		</div>
746		<div id="inner_about" class="tab_container">
747		   <div id="scayt_about"></div>
748		</div>
749	</body>
750</html>
751