FontToSwf_compteur = 0;
var FontToSwf = new Class({
	Implements: Options,
	
	options: {
		onComplete: function(){
			return true;
		}
	},
	
	initialize: function(selectors,options){
		this.selectors = selectors;

		this.setOptions(options);

		// test si flash
		if(Browser.Plugins.Flash.version>=8)this.parse();
	},

	// fonction qui initialise les variables
	prepare: function (){
		this.tableau = new Array;
		this.html_replace = "";
		this.compteur = 0;
	},

	// fonction qui va parser la page à la recherche des selectors
	parse: function (){
		var _class = this;
		var dernier = false;
		
		tab_flash = this.selectors.split(',');
		
		// calcul du nombre d'elements total
		nb_tot_element = 0;
		for(j=0;j<tab_flash.length; j++){
			tab_all_elements = $(document.body).getElements(tab_flash[j]);
			nb_tot_element+=tab_all_elements.length;
		}
		
		_class.le_compteur = 0;
		for(j=0;j<tab_flash.length; j++){
			tab_all_elements = $(document.body).getElements(tab_flash[j]);
			
			// on recherche toutes les selectors
			for(i=0;i<tab_all_elements.length; i++){
				_class.le_compteur++;
				
				elem = tab_all_elements[i];
					// on initialise
					_class.prepare();
					
					// on cree un id unique
					FontToSwf_compteur++;
					ident = "FontToSwf_"+FontToSwf_compteur;
					elem.addClass("ori_"+ident);

					// on verifie si on est sur le dernier
					if(_class.le_compteur==nb_tot_element)_class.dernier = ident;

					// on clone l'element pour l'impression
					elem_sel = elem.clone(true);
					elem_sel.inject(elem,'before');
					//elem_sel.setStyle('display','none');
					elem_sel.addClass('no_screen');
					
					elem.addClass("no_print");

					// on recupere le texte et on prepare la version pour flash
					anc_txt = elem.get('html');
					
					_class.html_replace = _class.get_txt_to_flash(elem);
						
					// rassemble les elements
					if(_class.html_replace){
						balise_premiere = elem;
						tagName = balise_premiere.tagName;
								
						// on recupere les infos de la balise première
						var styles_glo = _class.get_all_styles(balise_premiere);
									
						// on recupere la taille de la balise première
						var maxwidth = balise_premiere.getSize().x.toInt();
						var maxwidth = maxwidth-styles_glo['padding-left'].toInt()-styles_glo['padding-right'].toInt();
						var maxheight = balise_premiere.getSize().y.toInt();
						var maxheight = maxheight-styles_glo['padding-top'].toInt()-styles_glo['padding-bottom'].toInt();

						// on traite l'alignement
						if(styles_glo['text-align'] && styles_glo['text-align']!="start")_class.html_replace ="<p align='"+styles_glo['text-align']+"'>"+_class.html_replace+"</p>";

						// on traite la balise propre a flash textformat
						textformat = _class.textformat(balise_premiere,_class.html_replace,styles_glo);
						if(textformat)_class.html_replace = "<textformat"+textformat+">"+_class.html_replace+"</textformat>";
					
						// on traite la font
						font = "arial";
						if(styles_glo['font-family']){
							tab_font = styles_glo['font-family'].split(",");
							if(tab_font[0])font = tab_font[0].toLowerCase();
						}
					
						// on gère le shadow
						hasShadow=false;txtShadowColor='';txtShadowX='';txtShadowY='';txtShadowBlur='';cursor='normal';original='';flexitHtmlTextOver='null';noWrap=false;
						if(styles_glo['text-shadow']!=undefined && styles_glo['text-shadow']!="none"){
							hasShadow = 'true';
							
							// on recupere la couleur
							var regex = /s*#([a-z0-9]{3,6})\s*/i ;
							var t  = styles_glo['text-shadow'].match(regex) ;
							if( t )txtShadowColor = t[1];
							
							// on recupere la liste des valeurs
							var regex = /s*(\d+)px (\d+)px (\d+)px\s*/i ;
							if(tab_val = styles_glo['text-shadow'].match(regex)){
								txtShadowX = tab_val[1];
								txtShadowY = tab_val[2];
								txtShadowBlur = tab_val[3];
							}
						}

						if(styles_glo['white-space']=="nowrap")noWrap=true;

						// on test si c'est un a, alors on change le curseur de la souris
						if(tagName=="A"){
							cursor='pointer';
							original = elem.get('html');
							_class.html_replace = "<a href='"+elem.get('href')+"'>"+_class.html_replace+"</a>";
							
							// recherche de la classe
							tableClass = elem.get('class').split(' ');
							if(tableClass[0]){
								style_over = new Fx.CSS().search('.'+tableClass[0]+':hover');	
								if(style_over){
									elem.setStyles(style_over);
									elem.set('html',anc_txt);
									flexitHtmlTextOver = _class.get_txt_to_flash(elem);
									
									// on traite l'alignement
									style_over['text-align'] = elem.getStyle('text-align');
									if(style_over['text-align'] && style_over['text-align']!="start")flexitHtmlTextOver ="<p align='"+style_over['text-align']+"'>"+flexitHtmlTextOver+"</p>";
									
									if(textformat)flexitHtmlTextOver = "<textformat"+textformat+">"+flexitHtmlTextOver+"</textformat>";
									flexitHtmlTextOver = "<a href='"+elem.get('href')+"'>"+flexitHtmlTextOver+"</a>";

									// on remet les styles par défaut
									elem.setStyles(styles_glo);
								}
							}
						}
						
						// on supprime le letter spacing de l'element
//						elem.setStyle('letter-spacing','0px');

						// on pose la balise flash			
						var le_swiff = new Swiff('/globalflexit/clients/utils/swf/flexitFlashFont.swf', {
							id: ident,
							width: maxwidth,
							height: maxheight,
							container:balise_premiere,
							params: {
								wmode: 'transparent',
								quality: 'high',
								allowScriptAccess: 'always'
							},
							vars: {
								flexitHtmlText: _class.html_replace,
								flexitHtmlTextOver: flexitHtmlTextOver,
								selectedFont:font,
								idMovie:ident,
								noWrap:noWrap,
								maxWidthText:maxwidth,
								hasShadow:hasShadow,
								txtShadowColor:txtShadowColor,
								txtShadowX:txtShadowX,
								txtShadowY:txtShadowY,
								txtShadowBlur:txtShadowBlur
							},
							callBacks: {
								resizeAfterLoad:  function(){
									// verification si c'est le dernier element de lancé
									complete = false;
									if(_class.dernier==this.id && _class.options.onComplete())complete = true;
									
									_class.resizeMe(this.id,complete);

									// on traite le hover si c'est un lien
									if(parent.tagName=="A"){
										var id_flash = this.id
										$$("a.ori_"+this.id).each(function(el){
											el.addEvent('mouseover', function(event){
												_class.change_etat(id_flash,'over');
											});
											el.addEvent('mouseout', function(event){
												_class.change_etat(id_flash,'out');
											});
										});

									}
								}
							}
						
						});
						
					}							
				}
			//)
			
		}
//		if(_class.options.onComplete())_class.options.onComplete();
	},

	// fonction qui permet de changer etat de l'element suite à une action de la sours
	change_etat: function (FlashId,etat){
		_class = this;

		if(FlashId && $(FlashId)){
			// on change son etat		
			if(etat=="over" && $(FlashId)){
				$(FlashId).JSChangeState("Over");
			} else if(etat=="out") {
				$(FlashId).JSChangeState("");
			}
		}
	},

	// on parse les styles de l'élément et on met a jour le tableau global
	parse_styles: function (element,texte){
		// on garde une copie du texte d'origine (a supprimer)
		over_texte = texte;
		
		texte = this.create_text_for_flash(element,texte);

		compteur = this.compteur;
		this.compteur++;
		
		// on stocke dans le tableau global
		this.tableau[compteur] = texte;
	
		if(texte!="")return "<flash id='"+compteur+"'>"+over_texte+"</flash>";
		else return "";
	},

	// on parse les styles pour en resortir les balises que comprends flash
	create_text_for_flash: function (element,texte){
		if(texte=="")return "";
		
		// on recupere les differents styles
		var styles = this.get_all_styles(element);

		if(styles['text-transform'])texte = this.funct_text_transform(texte,styles);
		if(styles['font-style']=="italic")texte = "<i>"+texte+"</i>";
		if(styles['text-decoration']=="underline")texte = "<u>"+texte+"</u>";
		if(styles['font-weight']=="bold")texte = "<b>"+texte+"</b>";
		if(styles['color'])texte = "<font color='"+styles['color']+"'>"+texte+"</font>";
		if(styles['font-size'])texte = "<font size='"+styles['font-size'].toInt()+"'>"+texte+"</font>";	

		// on traite le letter-spacing
		if(styles['letter-spacing'].toInt()>0)texte ="<font letterspacing='"+styles['letter-spacing'].toInt()+"'>"+texte+"</font>";

		return texte;
	},

	get_txt_to_flash: function(elem){
		_class = this;
		contenu_f = "";

		// on recupere l'html
		var contenu = elem.get('html');

		// on s'occupe des retours à la ligne
		if(Browser.Engine.trident){
			contenu = str_replace("<br>","<br>",contenu);
			contenu = str_replace("<BR>","<br>",contenu);
			contenu = str_replace("\n","<br>",contenu);
		} else {
			contenu = str_replace("<br />","\n",contenu);
			contenu = str_replace("<br>","\n",contenu);
		}
//		contenu = str_replace("\N","saut_ligne",contenu);		
//		contenu = str_replace("<BR>","joe",contenu);

		// on s'occupe des strong
		contenu = str_replace("<strong>","<b>",contenu);
		contenu = str_replace("</strong>","</b>",contenu);

		// on s'occupe des em
		contenu = str_replace("<em>","<i>",contenu);
		contenu = str_replace("</em>","</i>",contenu);
		
		elem.set('html',contenu);

		// on recherche toutes les balises contenus dans le selector
		elem.getElements('*').each(
			function (el,i){
				if(el.tagName=="BR")return;
		
				// on verifie que l'on se trouve bien sur le dernier enfant
				if(el.getElements('*').length==0){
					el.set("html","#"+_class.parse_styles(el,el.get('text'))+"#");
				}
			}
		);
		
		var contenu = elem.get('html');

		// on supprime tous les tags sauf les notres ( flash )
		contenu = strip_tags(contenu, 'flash,i,b,br');
		
		// on supprimes les doubles separateurs			
		var reg = new RegExp("##", "gi");
		contenu = contenu.replace(reg,"#");
		
		// on split l'ensemble				
		var reg = new RegExp("#", "gi");
		var tableau = contenu.split(reg);

		for (var i=0; i<tableau.length; i++){
			if(tableau[i]=="")continue;
			
			if(tableau[i].substr(0,6)!="<flash" && tableau[i].substr(0,6)!="<FLASH")tableau[i] = _class.parse_styles(elem,tableau[i]);
		
			id1 = "";
			if(tableau[i].substr(0,6)=="<flash"){
				var regex = /s*id=["|'](\d+)["|']\s*/i ;
				var tab_id  = tableau[i].match(regex) ;
				if( tab_id )id1 = tab_id[1];
			} else {
				if(tableau[i].substr(10,1).toString()>=0)id1 = tableau[i].substr(10,1);
				if(tableau[i].substr(10,2).toString()>=0)id1 = tableau[i].substr(10,2);
			}
			if( id1 )contenu_f += _class.tableau[id1];

		}

		return contenu_f;
	},

	// function qui recupere la liste des styles appliqusé à l'élément
	get_all_styles: function (element){	
		return element.getStyles('text-align','text-decoration','font-weight','font-family','text-indent','text-shadow','text-transform','font-size','color','padding-left','padding-right','padding-top','padding-bottom','letter-spacing','line-height','white-space','font-style');
	},
	
	// function qui gere le text-transform
	funct_text_transform: function (texte,styles){	
		if(styles['text-transform']=="uppercase")texte = texte.toUpperCase();
		else if(styles['text-transform']=="lowercase")texte = texte.toLowerCase();
		
		return texte;
	},
	
	// function qui gere le text-formtat
	textformat: function (element,texte,styles){	
		textformat = "";
		
		// on traite le text indent
		if(styles['text-indent'].toInt()>0){
			textformat+=" indent='"+styles['text-indent'].toInt()+"'";
			if(element)element.setStyle('text-indent','0px');
		}		
		// on traite le line height
		// alert(styles['line-height']);
		line_height = styles['line-height'].toInt();
		if(Browser.Engine.trident){
			if(line_height>0){
			//	line_height = Math.ceil((line_height*115)/86);
				
				leading = Math.ceil((line_height-styles['font-size'].toInt())-8);
			//	if(leading<0)leading = leading+8;
				textformat+=" leading='"+leading+"'";
			} else textformat+=" leading='0'";	
		} else {
			if(styles['line-height'].toInt()>0){
				leading = Math.ceil((line_height-styles['font-size'].toInt())-8);
				//if(leading<0)leading = leading+8;
				textformat+=" leading='"+leading+"'";
			} else textformat+=" leading='0'";
		}
		return textformat;
	},

	// fonction appelé par flash pour se redimentionner
	resizeMe: function(identMe,complete) {
		if(identMe && $(identMe)){
			Size = $(identMe).JSGetSize();
			if(Size[0]>0 && Size[1]>0){
				$(identMe).setAttribute("width", Size[0]);
				$(identMe).setAttribute("height", Size[1]);
			}
		}
		
		if(complete==true)_class.options.onComplete();
	}

});