package;

// flash - compilation conditionnel uniquement si la cible est un fichier swf
#if flash
import flash.ui.ContextMenuItem;
import flash.ui.ContextMenu;
import flash.events.ContextMenuEvent;
import flash.net.URLRequest;
#end

// nme
import nme.display.StageAlign;
import nme.display.StageQuality;
import nme.display.StageScaleMode;

import nme.text.TextFieldAutoSize;
import nme.text.TextFieldType;


import nme.Assets;
import nme.media.Sound;

import nme.display.Sprite;
import nme.text.TextField;
import nme.text.TextFormat;

import nme.events.Event;
import nme.Lib;
import nme.display.Stage;



/**
 * Auteur : Matthieu
 * http://www.haxe-facile.com/
 *
 * Les commandes raccourcis haXe NME de Sublime Text 2 :
 * 
 * Ctrl+Shift+B pour créer automatiquement un fichier hxml
 * Ctrl+Enter pour lancer la compilation
 * 
 * Ctrl+I sur le nom d'une classe pour l'importer automatiquement dans le code
 * Ctrl+Shift+L pour installer une librairie via haxelib
 *
 * Utiliser haXe NME :
 * 
 * Ctrl+Shift+B pour choisir la cible NME
 * Ctrl+Enter pour lancer la compilation
 * 
 */
class Main extends Sprite 
{	
	private var oTextInput:TextField;// le texte saisit par l'utilisateur
	private var oTextSpeed:TextField;// vitesse de défilement en ms
	private var oTextDefilUtils : TextMove;// objet pour le défilement du texte

	// le menu contextuel de flash
	#if flash
	private var oMenu : ContextMenu;
    #end

    private var aLinkMenu : Array<Dynamic>;

	private var field:TextField;
	private var field2:TextField;
	private var field3:TextField;


	/**
	 * Point d'entrée de l'application.
	 * 
	 */
	public static function main()
	{
		trace("Start application !");

		// lancement de l'appli
		Lib.current.addChild ( new Main () );
	}
	
	   
	/**
	 * Constructeur.
	 * @param mcRoot : le sprite de l'application
	 *
	 */
	public function new()
	{
		super ();

		initialize();
		buildDisplay();
	}
	

	/**
	 * Init de l'application
	 * 
	 */
	private function initialize ():Void
	{
		var stage : Stage = Lib.current.stage;
		stage.align = StageAlign.TOP_LEFT;
		stage.scaleMode = StageScaleMode.NO_SCALE;


		// le menu contextuel pour flash
		#if flash // compilation conditionnel uniquement si la cible est un fichier swf
		aLinkMenu = new Array();
		oMenu = new ContextMenu();
		oMenu.hideBuiltInItems();
		addItem("Méthode haXe Facile", "http://www.formation-haxe.com");
		addItem("Création haXe-Facile.com", "http://www.haxe-facile.com");
		Lib.current.contextMenu = oMenu;
		oMenu = null;
		#end
	}

	#if flash
	/**
	 * Enregistre un nouveau lien dans le menu contextuel de flash.
	 * 
	 */
	private function addItem(label : String, sUrl : String) : Void
	{
		var item : ContextMenuItem = new ContextMenuItem(label);
		item.addEventListener(ContextMenuEvent.MENU_ITEM_SELECT, _onItemSelectedHandler);
		oMenu.customItems.push(item);
		
		// création d'un objet
		var oDataLinK:Dynamic<String>;
		oDataLinK = {label:label, url : sUrl};
		aLinkMenu.push(oDataLinK);
	}
	

	/**
	 * Appel du lien.
	 * 
	 */
	private function _onItemSelectedHandler(event : Event) : Void
	{
		var oLinkMenu:ContextMenuItem = cast(event.target, ContextMenuItem);// cast de event.target en object ContextMenuItem

		for (value in aLinkMenu)
		{
			if(oLinkMenu.caption == value.label)
			{
				flash.Lib.getURL(new flash.net.URLRequest(value.url),"_blank");// appel de l'url
				break;// sortie de la boucle for
			}
		}
		
	}
	#end

	/**
	 * Création de l'affichage.
	 * 
	 */
	private function buildDisplay():Void
	{
		// création de champs textes de type input
		oTextInput = this.addText("Renseignez le texte qui défile :", 0x006f77);
		oTextInput.x = 20;
		oTextInput.y = 20;
		oTextInput.addEventListener (Event.CHANGE, onTextFieldInputChange);
		this.addChild(oTextInput);


		oTextSpeed = this.addText("Vitesse de défilement (en ms)", 0x006f77);
		oTextSpeed.x = oTextInput.x;
		oTextSpeed.y = oTextInput.y + oTextInput.height + 12;
		oTextSpeed.addEventListener (Event.CHANGE, onTextFieldSpeedChange);
		this.addChild(oTextSpeed);

		// contient le texte avec l'effet
		var container = new Sprite();
		this.addChild(container);

		oTextDefilUtils = new TextMove();// création d'un objet avec effet sur une chaine de caractères
		oTextDefilUtils.x = 10;
		oTextDefilUtils.y = oTextSpeed.y + oTextSpeed.height + 12; 	
		container.addChild(oTextDefilUtils);

		// lance l'affichage du texte
		oTextDefilUtils.setSpeed(36);
		oTextDefilUtils.startDefil( "Bienvenue sur haXe Facile !" );
	}


	/**
	 * Mise à jour du défilement du texte à chaque mise à jour par l'utilisateur. 
	 * 
	 * @return {[type]} [description]
	 */
	private function onTextFieldInputChange(event : Event):Void
	{
		oTextDefilUtils.startDefil( oTextInput.text );
	}


	/**
	 * Mise à jour de la vitese de défilement du texte à chaque mise à jour par l'utilisateur. 
	 * 
	 * @return {[type]} [description]
	 */
	private function onTextFieldSpeedChange(event : Event):Void
	{
		var iSpeed:Int = Std.parseInt(oTextSpeed.text);

		if( iSpeed > 0 )
		{
			oTextDefilUtils.setSpeed( iSpeed );
			oTextDefilUtils.startDefil( oTextInput.text );
		}
	}


	/**
	 * Création d'un champ texte.
	 * 
	 */ 
	private function addText(sValue:String, iColor:Int=0x000000, iSize:Int=13) : TextField
	{
		var oTxtField:TextField = new TextField();
		oTxtField.width = 430;
		oTxtField.height = 40; 

		//setlocale(LC_ALL,"French");
  
		/* propriete par defaut du TextField */
		// active les polices embarquées
	    // Indique si le champ texte est multiligne.
		// Indique si le champ texte a un remplissage d'arrière-plan.
		// couleur de l'arriere-plan.
	    // wordWrap : indique si le champ texte comporte un retour à la ligne.
	    // autoSize : Commande le dimensionnement et l'alignement automatique du champ texte.
	    // Indique si le champ texte est selectionnable.
		// type de champ texte ("dynamic", "input")
		//oTxtField.embedFonts = true;
		//oTxtField.multiline = true;
		oTxtField.background = false;
		oTxtField.backgroundColor = 0x00C5DF;
		//oTxtField.wordWrap = true;
		oTxtField.autoSize = TextFieldAutoSize.LEFT;
		oTxtField.border = true;
		oTxtField.borderColor = 0x00C5DF;
		oTxtField.selectable = true;
		oTxtField.type = TextFieldType.INPUT;

		/* definis les proprietes par defaut du TextFormat */
		var oTextFormat:TextFormat = new TextFormat();
		oTextFormat.font = "Arial";
		oTextFormat.size = iSize;
		oTextFormat.color = iColor;
		oTxtField.defaultTextFormat = oTextFormat;
 
		oTxtField.text = sValue;// assigne le texte à afficher

		return oTxtField;	  
	}


}