Comunidad de diseño web y desarrollo en internet

Enviar mail HTML con Flash-PHP, buscador de dominio y plantillas

Este formulario se encuentra en http://www.cropcreativos.com siguiendo el enlace a pie de página lista de precios y luego en el mismo pie de página el enlace comprar aquí. Los precios y productos descritos son reales.

Con este tutorial aprenderemos paso a paso como crear un formulario con Flash y PHP enviado a nuestro servidor y al remitente en formato html con un número de identificación y la IP del que lo remite, además aprenderemos a personalizar y usar componentes para seleccionar distintas opciones que modificarán la respuesta que le llega tanto al cliente como a nosotros. Cargaremos una lista de productos desde un xml en un componente ComboBox y dependiendo de la selección se mostrarán en distintos campos, detalles como la descripción del producto y coste en distintas monedas. También haremos uso del componente CheckBox para aceptar una forma de pago y dependiendo de la selección del componente ComboBox mostrará unos CheckBox para seleccionar un plazo de pago.

Haremos uso de una galería de imágenes cortesía de Jorge Solís y que encontraréis en Flash-DB que hemos modificado para nuestro cometido.

Además haremos uso también del Whois cortesía de Dano y cuyo tutorial encontraréis aquí en Cristalab, que también hemos modificado para adaptarlo a este formulario.

Usaremos también para un mejor testeo de la dirección de correo el prototipo isMail o isEmail adaptado para usarlo directamente, mezcla del de Tonilopez, que encontraréis en After-Hours y del de Jonás Gálvez, que encontraréis en Sephiroth.

El Php recoge los datos que le pasamos desde flash, toma los campos y los coloca en una tabla html para enviárnosla a nosotros incluyendo el número de control en forma Alfanumérica y corta, para que pueda ser usado como número de Albarán y la IP del que lo envía y al mismo tiempo envía otro correo al remitente confirmando que su correo ha sido recibido, este correo también es en formato html e incluye imágenes que estarán en nuestro servidor y que el receptor para poder verlas tendrá que aceptar las imágenes en su cliente de correo y estar conectado a Internet. Una vez que Php envía los mensajes imprime en nuestro campo de texto del formulario la frase enviando, que marca el inicio del limpiado de los campos y confirma finalmente que el mensaje ya se ha enviado. El mensaje que se recibe variará dependiendo de la selección que haga el cliente y la respuesta final será diferente. Las posibles modificaciones serían, si ha seleccionado nombre de dominio, si ha seleccionado pago mensual o anual, la forma de pago que seleccione el producto que seleccione e incluso dependiendo de la selección, tendrá que aceptar unas condiciones de contrato que recibirá en la respuesta y que garantizará que acepte estas condiciones, ya que de otra forma el correo no se envía.

Empezando

Lo primero que haremos será enumerar en la siguiente imagen todos los componentes y campos del formulario y archivos a los que afecta, si es que dependieran de algún otro archivo, como ocurre con el whois de Dano, o la galería de Jorge Solís, que dependen de archivos As para ser creados.

Desglose:

Número Descripción Campo Nombre Campo Variable
1 Introducción de texto nombre nombre FirstName
2 Introducción de texto apellidos apellidos LastName
3 Introducción de texto correo correo Email
4 Texto dinámico Pesos Chilenos pesos peso
5 Introducción de texto empresa empresa Company
6 Texto dinámico Dólares USA dolares dolar
7 Introducción de texto teléfono fono Telephone
8 Texto dinámico Euros euros euro
9 Componente ComboBox de selección de producto comboplan  
10 Componente CheckBox de selección de pago por Money Bookers bookers  
11 Componente CheckBox de selección de otra forma de pago otras  
12 Componente CheckBox de selección de plazo de pago anual boxanual  
13 Componente CheckBox de selección de plazo de pago mensual boxmensual  
14 Texto dinámico de descripción del producto seleccionado planelegido descripcion
15 Texto dinámico de descripción del plazo de entrega del producto plazo entrega
16 Texto dinámico título dominio tituldominio  
17 Texto dinámico dominio elegido dominio domein
18 Texto dinámico aviso borrar dominio avisodominio  
19 Componente Botón borrar dominio seleccionado btnborrardmn  
20 Texto dinámico título plantilla plantillatit  
21 Texto dinámico plantilla seleccionada plantilla template
22 Texto dinámico aviso borrar plantilla avisoplantilla  
23 Componente Botón borrar plantilla seleccionada btnborrarplt  
24 Introducción de texto nombre de dominio itDomain  
25 Componente ComboBox de selección de tipo de dominio clTLDs  
26 Componente Botón buscar dominio btnFind  
27 Texto dinámico mensajes de la búsqueda de dominio dtMessage  
28 Texto dinámico aviso aceptar dominio avisoaceptardominio  
29 Componente Botón aceptar dominio btnaceptar  
30 Clip Botón Enviar    
31 Texto dinámico aceptar condiciones del contrato aceptacion aceptar
32 Texto dinámico título de las formas de pago formaspago  
33 Texto dinámico mensaje del estado del envío del formulario textos EmailStatus

Empezaremos por explicar la programación en flash para lo que vemos a primera vista, luego explicaremos las modificaciones en las clases danonino y las modificaciones en la galería de imágenes.

La programación en flash

A continuación mostraremos una imagen para hacernos una idea de cómo tienen que quedarnos los layers y en qué fotograma tenemos que poner nuestra programación, de esta forma podremos explicar la programación que tenemos que ir poniendo punto por punto.

En el fotograma 1 del layer Galería "1"...

stop();

En el fotograma 2 del layer Galería "2":

stop();

En el fotograma 1 del layer condiciones "3"...

pesos.text = "0"; // ponemos a cero los campos de precio
dolares.text = "0";
euros.text = "0";
planelegido.text = ""; // vaciamos los campos de descripción y plazo de entrega
plazo.text = "";
comboplan.enabled = true; // hacemos que los campos de introducción de texto se puedan seleccionar
otras.enabled = true;
bookers.enabled = true;
nombre.enabled = true;
apellidos.enabled = true;
correo.enabled = true;
empresa.enabled = true;
fono.enabled = true;

En el fotograma 2 del layer condiciones "4"...

if (buscador.itDomain.text == "")
{
        //Si el campo dominio que se encuentra dentro del clip buscador de dominios esta vacío...
        btnaceptar._visible = false;
        //Desactiva y oculta el botón aceptar dominio.
        btnaceptar.enabled = false;
}
comboplan.enabled = true;
//  al igual que antes activamos todos los componentes y campos
otras.enabled = true;
bookers.enabled = true;
nombre.enabled = true;
apellidos.enabled = true;
correo.enabled = true;
empresa.enabled = true;
fono.enabled = true;
if (boxanual._visible == true & boxmensual._visible == true & boxanual.selected == true )
{
        // miramos a ver si los checkboxes están visibles y si es así ...
        boxanual.enabled = false;
        // hacemos que el que este seleccionado no se pueda seleccionar...
        boxmensual.enabled = true;
        // y el que no está seleccionado si se pueda seleccionar.
        
} else if (boxanual._visible == true & boxmensual._visible == true & boxmensual.selected == true )
{
        // lo mismo que lo anterior pero con el checkbox mensual.
        boxanual.enabled = true;
        boxmensual.enabled = false;
}

A simple vista parece un código innecesario, pero más adelante veremos su utilidad, ya que el formulario, dependiendo de la selección que se haga, saltará a la galería de fotos desactivando todos los campos y cuando seleccionemos la plantilla en la galería, retornará a este punto para que podamos terminar de cumplimentar el formulario, y es entonces cuando necesitaremos que los componentes estén activos y se puedan seleccionar los campos de introducción de texto.

En este fotograma comentaremos la programación de los dos botones que contiene, no así, la programación de la barra de desplazamiento del texto, porque no es el objetivo de este tutorial.

Pie condiciones

El número "1" Botón cancelar

on (press){
// Si no aceptamos las condiciones nos manda al fotograma dos, del formulario y no lo manda.
gotoAndStop(2);
}

El número "2" Botón aceptar

on (press)
{
        if (bookers.selected == true)
        {
                // Si hemos seleccionado como pago bookers, declara el contenido de la variable Pago como MoneyBookers.
                var Pago = "MoneyBookers";
        } else if (otras.selected == true)
        {
                // Si la selección es otras lo mismo, esto hará que el mensaje que se manda sea uno u otro.
                var Pago = "Otras";
        }
        // Declaramos la variable del paquete seleccionado.
        var Paquete = comboplan.text;
        // Rellenamos el campo de texto de la aceptación.
        aceptacion.text = "Acepto las condiciones del contrato";
        // Y enviamos las variables al php para que las procese.
        loadVariablesNum ("mail/PedidoMail.php", "0", "POST");
        // Vaciamos los campos de estado y borrar plantilla y borrar dominio.
        EmailStatus = "";
        avisoplantilla.text = "";
        avisodominio.text = "";
        // Y ponemos en marcha la animación para que vaya al bucle en el que esperaremos a que el php nos indique que se ha enviado el mensaje.
        play ();
}
En el fotograma 3 del layer condiciones "5"...

Este fotograma corresponde al fotograma en el que situaremos la galería, que veremos más adelante, aquí nos interesa desactivar todos los componentes, para que no interfieran con la galería, podríamos simplemente poner un fotograma vacío en los campos de texto y componentes a la altura de la galería, pero como veremos más adelante, nos interesa mantenerlos como están, para que conserven los datos ya introducidos, y así ahorrarnos un buen trozo de código.

comboplan.enabled = false; //  como ya comentamos, aquí nos interesa desactivar todos los campos y componentes.
otras.enabled = false;
bookers.enabled = false; boxanual.enabled = false;
boxmensual.enabled = false;
nombre.enabled = false;
apellidos.enabled = false;
correo.enabled = false;
empresa.enabled = false;
fono.enabled = false;

En el fotograma 4 del layer condiciones "6"...

En este fotograma se encuentran las condiciones del contrato y la programación se tiene que repetir, porque como ya explicamos según el producto seleccionado pasará a un fotograma u otro y tanto en este fotograma como en el de la galería nos interesa que los elementos del escenario no interfieran al tiempo que los conservamos con los valores introducidos por el remitente.

comboplan.enabled = false;
otras.enabled = false;
bookers.enabled = false; boxanual.enabled = false;
boxmensual.enabled = false;
nombre.enabled = false;
apellidos.enabled = false;
correo.enabled = false;
empresa.enabled = false;
fono.enabled = false;

En el fotograma 5 del layer condiciones "7"...

comboplan.enabled = false;
otras.enabled = false;
bookers.enabled = false; boxanual.enabled = false;
boxmensual.enabled = false;
nombre.enabled = false;
apellidos.enabled = false;
correo.enabled = false;
empresa.enabled = false;
fono.enabled = false;

En el fotograma 1 del layer temporizado "8"...

// Seleccionamos los estilos que queremos para los componentes
buscador.clTLDs.setStyle ("themeColor", "haloOrange");
buscador.clTLDs.setStyle ("fontSize", 10);
buscador.clTLDs.setStyle ("color", 0xFF9900);
buscador.btnFind.setStyle ("themeColor", "haloOrange");
buscador.btnFind.setStyle ("fontSize", 10);
buscador.btnFind.setStyle ("color", 0xFF9900);
comboplan.setStyle ("themeColor", "haloOrange");
comboplan.setStyle ("fontFamily", "verdana");
comboplan.setStyle ("fontSize", 10);
comboplan.setStyle ("color", 0xFF9900);
bookers.setStyle ("themeColor", "haloOrange");
bookers.setStyle ("fontFamily", "verdana");
bookers.setStyle ("fontSize", 10);
bookers.setStyle ("color", 0x663300);
otras.setStyle ("themeColor", "haloOrange");
otras.setStyle ("fontFamily", "verdana");
otras.setStyle ("fontSize", 10);
otras.setStyle ("color", 0x663300);
boxanual.setStyle ("themeColor", "haloOrange");
boxanual.setStyle ("fontFamily", "verdana");
boxanual.setStyle ("fontSize", 10);
boxanual.setStyle ("color", 0x663300);
boxmensual.setStyle ("themeColor", "haloOrange");
boxmensual.setStyle ("fontFamily", "verdana");
boxmensual.setStyle ("fontSize", 10);
boxmensual.setStyle ("color", 0x663300);
btnborrardmn.setStyle ("themeColor", "haloOrange");
btnborrardmn.setStyle ("fontSize", 10);
btnborrardmn.setStyle ("color", 0xFF9900);
btnborrarplt.setStyle ("themeColor", "haloOrange");
btnborrarplt.setStyle ("fontSize", 10);
btnborrarplt.setStyle ("color", 0xFF9900);
btnaceptar.setStyle ("themeColor", "haloOrange");
btnaceptar.setStyle ("fontSize", 10);
btnaceptar.setStyle ("color", 0xFF9900);
// desmarcamos desactivamos y ocultamos los checboxes porque de entrada no se mostrarán
boxanual._visible = false;
boxanual.enabled = false;
boxanual.selected = false;
boxmensual._visible = false;
boxmensual.enabled = false;
boxmensual.selected = false;
// cargamos nuestro xml de productos en nuestro combobox
productosXML = new XML ();
productosXML.ignoreWhite = true;
productosXML.onLoad = parsearXML;
productosXML.load ("productos.xml");
function parsearXML (succes)
{
        ProductosCombo = new Array ();
        for (var i = 0; i < productosXML.firstChild.childNodes.length; i ++)
        {
                ProductosCombo.addItem (
                {
                        label : productosXML.firstChild.childNodes [i].attributes.nombre, data : productosXML.firstChild.childNodes [i].attributes.valor
                });
        }
        comboplan.dataProvider = ProductosCombo
}
// Creamos un listener para que cuando seleccionemos un ítem en el combo tengamos el comportamiento que queremos.
var listenerObject : Object = new Object ();
listenerObject.change = function (eventObject : Object)
{
        // El ítem 0 del xml no contiene ningún producto y por lo tanto pondremos a 0 los precios y vaciaremos los campos.
        if (eventObject.target.value == 0)
        {
                pesos.text = "0";
                dolares.text = "0";
                euros.text = "0";
                planelegido.text = "";
                plazo.text = "";
        }
        // Los ítems 1,2,3,7,8,9 del xml son productos que se pueden pagar anualmente o mensualmente, así que activaremos y mostraremos los checkboxes, seleccionaremos por defecto el pago anual y crearemos dos variables globales con el precio anual y el mensual para que puedan ser usadas por los checkboxes al seleccionarse.
        if (eventObject.target.value == 1 || eventObject.target.value == 2 || eventObject.target.value == 3 || eventObject.target.value == 7 || eventObject.target.value == 8 || eventObject.target.value == 9)
        {
                _global.peso = productosXML.firstChild.childNodes [eventObject.target.value].attributes.pesos;
                _global.dolar = productosXML.firstChild.childNodes [eventObject.target.value].attributes.dolares;
                _global.euro = productosXML.firstChild.childNodes [eventObject.target.value].attributes.euros;
                _global.pesomes = productosXML.firstChild.childNodes [eventObject.target.value].attributes.pesosmes;
                _global.dolarmes = productosXML.firstChild.childNodes [eventObject.target.value].attributes.dolaresmes;
                _global.euromes = productosXML.firstChild.childNodes [eventObject.target.value].attributes.eurosmes;
                boxanual._visible = true;
                boxanual.enabled = false;
                boxmensual._visible = true;
                boxmensual.enabled = true;
                boxanual.selected = true;
                boxmensual.selected = false;
                formaspago.text = "Forma y plazo de pago"; 
        }
        // Y crearemos otra condición con el resto de los ítems para que oculte y desactive los checkboxes anual y mensual.
        if (eventObject.target.value == 0 || eventObject.target.value == 4 || eventObject.target.value == 5 || eventObject.target.value == 6 || eventObject.target.value == 10 || eventObject.target.value == 11 || eventObject.target.value == 12 || eventObject.target.value == 13 || eventObject.target.value == 14 || eventObject.target.value == 15 || eventObject.target.value == 16 || eventObject.target.value == 17 || eventObject.target.value == 18 || eventObject.target.value == 19 || eventObject.target.value == 20 || eventObject.target.value == 21 || eventObject.target.value == 22 || eventObject.target.value == 23 || eventObject.target.value == 24 || eventObject.target.value == 25 || eventObject.target.value == 26 || eventObject.target.value == 27 || eventObject.target.value == 28 || eventObject.target.value == 29 || eventObject.target.value == 30 || eventObject.target.value == 31 || eventObject.target.value == 32 || eventObject.target.value == 33 || eventObject.target.value == 34 )
        {
                boxanual._visible = false;
                boxanual.enabled = false;
                boxanual.selected = false;
                boxmensual._visible = false;
                boxmensual.enabled = false;
                boxmensual.selected = false;
                formaspago.text = "Forma de pago"; 
        }
        // Los ítems 7,8,9 del xml contiene página web, por lo tanto mostraremos el título Plantilla y enviaremos la animación al fotograma 3, donde se encuentra la galería, para que el cliente pueda seleccionar la plantilla que desee.
        if (eventObject.target.value == 7 & plantilla.text == "" || eventObject.target.value == 8 & plantilla.text == "" || eventObject.target.value == 9 & plantilla.text == "" )
        {
                plantillatit.text = "Plantilla";
                gotoAndStop (3);
                // lo mandamos al fotograma 3 donde esta la galería para seleccionar una plantilla.
                
        }
        // Si los ítems no son los mencionados anteriormente, borramos el título de Plantilla, borramos el campo de plantilla seleccionada y ocultamos y desactivamos el botón borrar plantilla
        if (eventObject.target.value != 7 & plantilla.text != "" || eventObject.target.value != 8 & plantilla.text != "" || eventObject.target.value != 9 & plantilla.text != "" )
        {
                plantillatit.text = "";
                plantilla.text = "";
                btnborrarplt._visible = false;
                btnborrarplt.enabled = false;
        }
        // Al margen de la selección, siempre que se varíe la selección del combobox, los campos de precios, descripción del producto y plazo de entrega.
        pesos.text = productosXML.firstChild.childNodes [eventObject.target.value].attributes.pesos;
        dolares.text = productosXML.firstChild.childNodes [eventObject.target.value].attributes.dolares;
        euros.text = productosXML.firstChild.childNodes [eventObject.target.value].attributes.euros;
        planelegido.text = productosXML.firstChild.childNodes [eventObject.target.value].attributes.descripcion;
        plazo.text = productosXML.firstChild.childNodes [eventObject.target.value].attributes.plazo;
        // si se selecciona el ítem 4
        if (eventObject.target.value == 4)
        {
                // Miramos a ver si el campo de dominio está vacio
                if ( ! domein.length)
                {
                        // Si lo esta mostramos el clip que contiene el buscador Whois así como los botones y campos que lo componen, mostrándolos y activándolos y seleccionando el primer ítem del combobox dominio del buscador.
                        buscador._visible = true;
                        buscador.btnFind._visible = true;
                        buscador.btnFind.enabled = true;
                        buscador.clTLDs.enabled = true;
                        buscador.itDomain.enabled = true;
                        buscador.clTLDs.selectedIndex = buscador.clTLDs.length - 6;
                        // Si el campo dominio no esta vacío y el campo del mensaje nos dice que no se encuentra registrado, mostramos el botón aceptar dominio para que si lo desea el usuario acepte ese dominio y pase los datos al formulario general como dominio seleccionado.
                        if ( ! buscador.itDomain.indexOf ("") & buscador.dtMessage.text == "Dominio no registrado.")
                        {
                                btnaceptar._visible = true;
                                btnaceptar.enabled = true;
                        } else 
                        {
                                // De lo contrario ocultamos los botones de aceptación de dominio, ya que o no se ha introducido dominio alguno, o el dominio introducido se encuentra registrado.
                                btnaceptar._visible = false;
                                btnaceptar.enabled = false;
                        }
                }
                // Lo mismo que con el ítem 4
                
        } else if (eventObject.target.value == 5)
        {
                if ( ! domein.length)
                {
                        buscador._visible = true;
                        buscador.btnFind._visible = true;
                        buscador.btnFind.enabled = true;
                        buscador.clTLDs.enabled = true;
                        buscador.itDomain.enabled = true;
                        buscador.clTLDs.selectedIndex = buscador.clTLDs.length - 6;
                        if ( ! buscador.itDomain.indexOf ("") & buscador.dtMessage.text == "Dominio no registrado.")
                        {
                                btnaceptar._visible = true;
                                btnaceptar.enabled = true;
                        } else 
                        {
                                btnaceptar._visible = false;
                                btnaceptar.enabled = false;
                        }
                }
                // Lo mismo que con el ítem 4
                
        } else if (eventObject.target.value == 6)
        {
                if ( ! domein.length)
                {
                        buscador._visible = true;
                        buscador.btnFind._visible = true;
                        buscador.btnFind.enabled = true;
                        buscador.clTLDs.enabled = true;
                        buscador.itDomain.enabled = true;
                        buscador.clTLDs.selectedIndex = buscador.clTLDs.length - 6;
                        if ( ! buscador.itDomain.indexOf ("") & buscador.dtMessage.text == "Dominio no registrado.")
                        {
                                btnaceptar._visible = true;
                                btnaceptar.enabled = true;
                        } else 
                        {
                                btnaceptar._visible = false;
                                btnaceptar.enabled = false;
                        }
                }
                // Lo mismo que con el ítem 4
                
        } else if (eventObject.target.value == 7)
        {
                if ( ! domein.length)
                {
                        buscador._visible = true;
                        buscador.btnFind._visible = true;
                        buscador.btnFind.enabled = true;
                        buscador.clTLDs.enabled = true;
                        buscador.itDomain.enabled = true;
                        buscador.clTLDs.selectedIndex = buscador.clTLDs.length - 6;
                        if ( ! buscador.itDomain.indexOf ("") & buscador.dtMessage.text == "Dominio no registrado.")
                        {
                                btnaceptar._visible = true;
                                btnaceptar.enabled = true;
                        } else 
                        {
                                btnaceptar._visible = false;
                                btnaceptar.enabled = false;
                        }
                }
                // Lo mismo que con el ítem 4
                
        } else if (eventObject.target.value == 8)
        {
                if ( ! domein.length)
                {
                        buscador._visible = true;
                        buscador.btnFind._visible = true;
                        buscador.btnFind.enabled = true;
                        buscador.clTLDs.enabled = true;
                        buscador.itDomain.enabled = true;
                        buscador.clTLDs.selectedIndex = buscador.clTLDs.length - 6;
                        if ( ! buscador.itDomain.indexOf ("") & buscador.dtMessage.text == "Dominio no registrado.")
                        {
                                btnaceptar._visible = true;
                                btnaceptar.enabled = true;
                        } else 
                        {
                                btnaceptar._visible = false;
                                btnaceptar.enabled = false;
                        }
                }
                // Lo mismo que con el ítem 4
                
        } else if (eventObject.target.value == 9)
        {
                if ( ! domein.length)
                {
                        buscador._visible = true;
                        buscador.btnFind._visible = true;
                        buscador.btnFind.enabled = true;
                        buscador.clTLDs.enabled = true;
                        buscador.itDomain.enabled = true;
                        buscador.clTLDs.selectedIndex = buscador.clTLDs.length - 6;
                        if ( ! buscador.itDomain.indexOf ("") & buscador.dtMessage.text == "Dominio no registrado.")
                        {
                                btnaceptar._visible = true;
                                btnaceptar.enabled = true;
                        } else 
                        {
                                btnaceptar._visible = false;
                                btnaceptar.enabled = false;
                        }
                }
                // Lo mismo que con el ítem 4
                
        } else if (eventObject.target.value == 10)
        {
                if ( ! domein.length)
                {
                        buscador._visible = true;
                        buscador.btnFind._visible = true;
                        buscador.btnFind.enabled = true;
                        buscador.clTLDs.enabled = true;
                        buscador.itDomain.enabled = true;
                        buscador.clTLDs.selectedIndex = buscador.clTLDs.length - 6;
                        if ( ! buscador.itDomain.indexOf ("") & buscador.dtMessage.text == "Dominio no registrado.")
                        {
                                btnaceptar._visible = true;
                                btnaceptar.enabled = true;
                        } else 
                        {
                                btnaceptar._visible = false;
                                btnaceptar.enabled = false;
                        }
                }
        } else 
        {
                // En caso contrario, borramos el campo del dominio, el título, ocultamos el buscador de dominios y desactivamos y ocultamos todas las funciones relacionadas con el buscador de dominios.
                tituldominio.text = "";
                dominio.text = "";
                buscador._visible = false;
                buscador.btnFind._visible = false;
                buscador.btnFind.enabled = false;
                buscador.clTLDs.enabled = false;
                buscador.itDomain.enabled = false;
                btnaceptar._visible = false;
                btnaceptar.enabled = false;
                btnborrardmn._visible = false;
                btnborrardmn.enabled = false;
        }
};
// Como comentamos al principio adjudicamos el listener del evento cambiar al combobox de selección de productos.
comboplan.addEventListener ("change", listenerObject);

En el fotograma 2 del layer temporizado "9"...

La programación de este fotograma es casi idéntica a la anterior, aunque varían algunas partes, como desactivar los checkboxes de pago mensual y pago anual, y cargar el xml que ya lo tenemos cargado, este fotograma lo usaremos al regresar de la selección de la plantilla en la galería, donde no nos interesa ni vaciar los campos ni desactivar los que estén activos.

// Seleccionamos los estilos que queremos para los componentes
buscador.clTLDs.setStyle ("themeColor", "haloOrange");
buscador.clTLDs.setStyle ("fontSize", 10);
buscador.clTLDs.setStyle ("color", 0xFF9900);
buscador.btnFind.setStyle ("themeColor", "haloOrange");
buscador.btnFind.setStyle ("fontSize", 10);
buscador.btnFind.setStyle ("color", 0xFF9900);
comboplan.setStyle ("themeColor", "haloOrange");
comboplan.setStyle ("fontFamily", "verdana");
comboplan.setStyle ("fontSize", 10);
comboplan.setStyle ("color", 0xFF9900);
bookers.setStyle ("themeColor", "haloOrange");
bookers.setStyle ("fontFamily", "verdana");
bookers.setStyle ("fontSize", 10);
bookers.setStyle ("color", 0x663300);
otras.setStyle ("themeColor", "haloOrange");
otras.setStyle ("fontFamily", "verdana");
otras.setStyle ("fontSize", 10);
otras.setStyle ("color", 0x663300);
boxanual.setStyle ("themeColor", "haloOrange");
boxanual.setStyle ("fontFamily", "verdana");
boxanual.setStyle ("fontSize", 10);
boxanual.setStyle ("color", 0x663300);
boxmensual.setStyle ("themeColor", "haloOrange");
boxmensual.setStyle ("fontFamily", "verdana");
boxmensual.setStyle ("fontSize", 10);
boxmensual.setStyle ("color", 0x663300);
btnborrardmn.setStyle ("themeColor", "haloOrange");
btnborrardmn.setStyle ("fontSize", 10);
btnborrardmn.setStyle ("color", 0xFF9900);
btnborrarplt.setStyle ("themeColor", "haloOrange");
btnborrarplt.setStyle ("fontSize", 10);
btnborrarplt.setStyle ("color", 0xFF9900);
btnaceptar.setStyle ("themeColor", "haloOrange");
btnaceptar.setStyle ("fontSize", 10);
btnaceptar.setStyle ("color", 0xFF9900);
// Nos aseguramos de que el listener continúe activo en caso de retornar a este keyframe, el resto de la programación es exactamente igual al fotograma anterior.
var listenerObject : Object = new Object ();
listenerObject.change = function (eventObject : Object)
{
        if (eventObject.target.value == 0)
        {
                pesos.text = "0";
                dolares.text = "0";
                euros.text = "0";
                planelegido.text = "";
                plazo.text = "";
        }
        if (eventObject.target.value == 1 || eventObject.target.value == 2 || eventObject.target.value == 3 || eventObject.target.value == 7 || eventObject.target.value == 8 || eventObject.target.value == 9)
        {
                _global.peso = productosXML.firstChild.childNodes [eventObject.target.value].attributes.pesos;
                _global.dolar = productosXML.firstChild.childNodes [eventObject.target.value].attributes.dolares;
                _global.euro = productosXML.firstChild.childNodes [eventObject.target.value].attributes.euros;
                _global.pesomes = productosXML.firstChild.childNodes [eventObject.target.value].attributes.pesosmes;
                _global.dolarmes = productosXML.firstChild.childNodes [eventObject.target.value].attributes.dolaresmes;
                _global.euromes = productosXML.firstChild.childNodes [eventObject.target.value].attributes.eurosmes;
                boxanual._visible = true;
                boxanual.enabled = false;
                boxmensual._visible = true;
                boxmensual.enabled = true;
                boxanual.selected = true;
                boxmensual.selected = false;
                formaspago.text = "Forma y plazo de pago"; 
        }
        if (eventObject.target.value == 0 || eventObject.target.value == 4 || eventObject.target.value == 5 || eventObject.target.value == 6 || eventObject.target.value == 10 || eventObject.target.value == 11 || eventObject.target.value == 12 || eventObject.target.value == 13 || eventObject.target.value == 14 || eventObject.target.value == 15 || eventObject.target.value == 16 || eventObject.target.value == 17 || eventObject.target.value == 18 || eventObject.target.value == 19 || eventObject.target.value == 20 || eventObject.target.value == 21 || eventObject.target.value == 22 || eventObject.target.value == 23 || eventObject.target.value == 24 || eventObject.target.value == 25 || eventObject.target.value == 26 || eventObject.target.value == 27 || eventObject.target.value == 28 || eventObject.target.value == 29 || eventObject.target.value == 30 || eventObject.target.value == 31 || eventObject.target.value == 32 || eventObject.target.value == 33 || eventObject.target.value == 34 )
        {
                boxanual._visible = false;
                boxanual.enabled = false;
                boxanual.selected = false;
                boxmensual._visible = false;
                boxmensual.enabled = false;
                boxmensual.selected = false;
                formaspago.text = "Forma de pago"; 
        }
        if (eventObject.target.value == 7 & plantilla.text == "" || eventObject.target.value == 8 & plantilla.text == "" || eventObject.target.value == 9 & plantilla.text == "" )
        {
                plantillatit.text = "Plantilla";
                gotoAndStop (3);
        }
        if (eventObject.target.value != 7 & plantilla.text != "" || eventObject.target.value != 8 & plantilla.text != "" || eventObject.target.value != 9 & plantilla.text != "" )
        {
                plantillatit.text = "";
                plantilla.text = "";
                btnborrarplt._visible = false;
                btnborrarplt.enabled = false;
        }
        pesos.text = productosXML.firstChild.childNodes [eventObject.target.value].attributes.pesos;
        dolares.text = productosXML.firstChild.childNodes [eventObject.target.value].attributes.dolares;
        euros.text = productosXML.firstChild.childNodes [eventObject.target.value].attributes.euros;
        planelegido.text = productosXML.firstChild.childNodes [eventObject.target.value].attributes.descripcion;
        plazo.text = productosXML.firstChild.childNodes [eventObject.target.value].attributes.plazo;
        if (eventObject.target.value == 4)
        {
                if ( ! domein.length)
                {
                        buscador._visible = true;
                        buscador.btnFind._visible = true;
                        buscador.btnFind.enabled = true;
                        buscador.clTLDs.enabled = true;
                        buscador.itDomain.enabled = true;
                        buscador.clTLDs.selectedIndex = buscador.clTLDs.length - 6;
                        if ( ! buscador.itDomain.indexOf ("") & buscador.dtMessage.text == "Dominio no registrado.")
                        {
                                btnaceptar._visible = true;
                                btnaceptar.enabled = true;
                        } else 
                        {
                                btnaceptar._visible = false;
                                btnaceptar.enabled = false;
                        }
                }
        } else if (eventObject.target.value == 5)
        {
                if ( ! domein.length)
                {
                        buscador._visible = true;
                        buscador.btnFind._visible = true;
                        buscador.btnFind.enabled = true;
                        buscador.clTLDs.enabled = true;
                        buscador.itDomain.enabled = true;
                        buscador.clTLDs.selectedIndex = buscador.clTLDs.length - 6;
                        if ( ! buscador.itDomain.indexOf ("") & buscador.dtMessage.text == "Dominio no registrado.")
                        {
                                btnaceptar._visible = true;
                                btnaceptar.enabled = true;
                        } else 
                        {
                                btnaceptar._visible = false;
                                btnaceptar.enabled = false;
                        }
                }
        } else if (eventObject.target.value == 6)
        {
                if ( ! domein.length)
                {
                        buscador._visible = true;
                        buscador.btnFind._visible = true;
                        buscador.btnFind.enabled = true;
                        buscador.clTLDs.enabled = true;
                        buscador.itDomain.enabled = true;
                        buscador.clTLDs.selectedIndex = buscador.clTLDs.length - 6;
                        if ( ! buscador.itDomain.indexOf ("") & buscador.dtMessage.text == "Dominio no registrado.")
                        {
                                btnaceptar._visible = true;
                                btnaceptar.enabled = true;
                        } else 
                        {
                                btnaceptar._visible = false;
                                btnaceptar.enabled = false;
                        }
                }
        } else if (eventObject.target.value == 7)
        {
                if ( ! domein.length)
                {
                        buscador._visible = true;
                        buscador.btnFind._visible = true;
                        buscador.btnFind.enabled = true;
                        buscador.clTLDs.enabled = true;
                        buscador.itDomain.enabled = true;
                        buscador.clTLDs.selectedIndex = buscador.clTLDs.length - 6;
                        if ( ! buscador.itDomain.indexOf ("") & buscador.dtMessage.text == "Dominio no registrado.")
                        {
                                btnaceptar._visible = true;
                                btnaceptar.enabled = true;
                        } else 
                        {
                                btnaceptar._visible = false;
                                btnaceptar.enabled = false;
                        }
                }
        } else if (eventObject.target.value == 8)
        {
                if ( ! domein.length)
                {
                        buscador._visible = true;
                        buscador.btnFind._visible = true;
                        buscador.btnFind.enabled = true;
                        buscador.clTLDs.enabled = true;
                        buscador.itDomain.enabled = true;
                        buscador.clTLDs.selectedIndex = buscador.clTLDs.length - 6;
                        if ( ! buscador.itDomain.indexOf ("") & buscador.dtMessage.text == "Dominio no registrado.")
                        {
                                btnaceptar._visible = true;
                                btnaceptar.enabled = true;
                        } else 
                        {
                                btnaceptar._visible = false;
                                btnaceptar.enabled = false;
                        }
                }
        } else if (eventObject.target.value == 9)
        {
                if ( ! domein.length)
                {
                        buscador._visible = true;
                        buscador.btnFind._visible = true;
                        buscador.btnFind.enabled = true;
                        buscador.clTLDs.enabled = true;
                        buscador.itDomain.enabled = true;
                        buscador.clTLDs.selectedIndex = buscador.clTLDs.length - 6;
                        if ( ! buscador.itDomain.indexOf ("") & buscador.dtMessage.text == "Dominio no registrado.")
                        {
                                btnaceptar._visible = true;
                                btnaceptar.enabled = true;
                        } else 
                        {
                                btnaceptar._visible = false;
                                btnaceptar.enabled = false;
                        }
                }
        } else if (eventObject.target.value == 10)
        {
                if ( ! domein.length)
                {
                        buscador._visible = true;
                        buscador.btnFind._visible = true;
                        buscador.btnFind.enabled = true;
                        buscador.clTLDs.enabled = true;
                        buscador.itDomain.enabled = true;
                        buscador.clTLDs.selectedIndex = buscador.clTLDs.length - 6;
                        if ( ! buscador.itDomain.indexOf ("") & buscador.dtMessage.text == "Dominio no registrado.")
                        {
                                btnaceptar._visible = true;
                                btnaceptar.enabled = true;
                        } else 
                        {
                                btnaceptar._visible = false;
                                btnaceptar.enabled = false;
                        }
                }
        } else 
        {
                tituldominio.text = "";
                dominio.text = "";
                buscador._visible = false;
                buscador.btnFind._visible = false;
                buscador.btnFind.enabled = false;
                buscador.clTLDs.enabled = false;
                buscador.itDomain.enabled = false;
                btnaceptar._visible = false;
                btnaceptar.enabled = false;
                btnborrardmn._visible = false;
                btnborrardmn.enabled = false;
        }
};
comboplan.addEventListener ("change", listenerObject);
// Esta redundancia de código es para asegurarnos en caso de retorno a este keyframe, ya que el código que corresponde a esta acción y que está dentro del listener, sólo funciona al seleccionar un ítem de la lista del combobox productos.
if ( ! domein.length)
{
        btnborrardmn._visible = false;
        btnborrardmn.enabled = false;
}

En el fotograma 1 del layer whois "10"...

Aquí nos aseguraremos que al repetir el envío o empezar el formulario se ocultan y desactivan los campos que sólo se ven dependiendo de la selección que hace el remitente.

//Ponemos todos los campos suplementarios y botones a cero y desactivados. Recordemos que estos campos sólo se activarán y verán dependiendo de la selección de producto que haga el usuario.buscador._visible = false;buscador.btnFind._visible = false;
buscador.btnFind.enabled = false;
buscador.clTLDs.enabled = false;
buscador.itDomain.enabled = false;
btnaceptar._visible = false;
btnaceptar.enabled = false;
btnborrardmn._visible = false;
btnborrardmn.enabled = false;
btnborrarplt._visible = false;
btnborrarplt.enabled = false;

En el fotograma 1 y 2 del layer buttons marcado como objeto "30", en la primera imagen del tutorial tenemos en botón enviar...

Esta parte la vimos en el anterior tutorial, formulario flah y php con envío en html, que encontrareís aquí mismo en cristalab.

La función IsMail o IsEmail como ya menciono son de Tonilopez, que encontrareís en After-Hours y del de Jonás Gálvez, que encontrareís en Sephiroth. De Jonás Gálvez no he logrado encontrar sus referencias, sólo en Sephiroth. Está adaptada por  Crop Creativos , para poder ser usada directamente desde el botón de envío sin tener que cargar la clase de forma externa e invocarla.

on (release)
{
        // Basado en el prototipo IsEmail de Jonás Gálvez e IsMail de Tonilopez. Recodificado por CropCreativos.
        var partes = Email.split ("@");

        // Dividimos la dirección de correo usando como referencia la arroba y la convertimos en variable para poder analizarla después.
        var usuario = partes [0];
        var dominio = partes [1];

        // Caracteres que no se pueden usar jamás en una dirección de correo.
        var caracteresProhibidos = new Array ("º", "ª", "!", "#", "$", "%", "&", "¬", "/", "(", ")", "=", "?", "¿", "¡", ",", ";", ":", "[", "]", "{", "}", "á", "é", "í", "ó", "ú", "Á", "É", "Í", "Ó", "Ú");

        var numCaracteresProhibidos = 0;
        var partes_dominio = dominio.split (".");

        // Partimos la segunda parte del email, para diferenciar el dominio de la extensión de dominio.
        var extension = partes_dominio [partes_dominio.length - 1];

        // Declaramos la variable de la extensión para poder analizarla más tarde.
        // Declaramos que k es igual a 0 y que si es menos que la matriz de caracteres prohibidos, siga sumándole hasta igualar la matriz, así podemos usar el valor K como comprobante de la matriz de caracteres prohibidos.
        for (var k = 0; k < caracteresProhibidos.length; k ++)

        {
                if (usuario.indexOf (caracteresProhibidos [k]) != - 1)

                {
                        numCaracteresProhibidos ++;

                }
        }
        // Si el campo nombre está vacío indica en el cuadro de estado que introduzca un nombre.

        if ( ! FirstName.length)
        {
                EmailStatus = "Introduzca su nombre antes del envío";

                // Lo mismo para apellido.
                

        } else if ( ! LastName.length)
        {

                EmailStatus = "Introduzca sus Apellidos antes del envío";
                // Si el campo de correo está vacío o no definido pide que introduzca una dirección válida.

                
        } else if ( ! Email.length || Email == "" || Email == null || Email == "null" || Email == undefined || Email == "undefined")

        {
                EmailStatus = "Porfavor introduzca una dirección de correo";
                // Mira que la cadena no contenga mas de una arroba y un punto al menos.

                
        } else if ( ! Email.length || Email.indexOf ("@") == - 1 || Email.indexOf ("@") != Email.lastIndexOf ("@") || Email.indexOf (".") == - 1)

        {
                EmailStatus = "Porfavor introduzca una dirección de correo válida";
                // Las cadenas de usuario en los correos no pueden contener menos de tres caracteres.

                
        } else if (usuario.length < 3)

        {
                EmailStatus = "La cadena del usuario de correo es demasiado corta";
        } else if (dominio.indexOf (".") == - 1 || dominio.length < 1)

        {
                EmailStatus = "El nombre de dominio del correo no parece válido";
                // Mira que la cadena no tenga los caracteres prohibidos que hemos declarado antes.

                
        } else if (numCaracteresProhibidos > 0)

        {
                EmailStatus = "No se admiten ese tipo de caracteres en la dirección de correo";
                // Las extensiones de dominio no pueden ser menores de dos y mayores de cuatro (.com, .biz, .us, .org, .info, .es, .cl, etc).

                
        } else if (extension.length < 2 || extension.length > 4)

        {
                EmailStatus = "La extensión del dominio del correo no es correcto";
                // El campo del teléfono también es obligatorio.

                
        } else if ( ! Telephone.length)

        {
                EmailStatus = "Es necesario un teléfono de contacto";
                // Si no se ha seleccionado ningún producto pide que se seleccione.

                
        } else if (comboplan.value == 0)

        {
                EmailStatus = "Seleccione el plan que desea contratar";
                // Si se selecciona uno de los planes en los que se incluye el nombre de dominio y no se ha buscado el dominio, o aceptado la búsqueda lo indica.

                
        } else if (comboplan.value == 4 & ! domein.length || comboplan.value == 5 & ! domein.length || comboplan.value == 6 & ! domein.length || comboplan.value == 7 & ! domein.length || comboplan.value == 8 & ! domein.length || comboplan.value == 9 & ! domein.length || comboplan.value == 10 & ! domein.length)

        {
                // No es una falta de ortografía usar domein, en vez de dominio o domain, ya que dominio está siendo utilizado en la identificación de la cadena del mail y domain es una palabra reservada por la programación de flash.
                EmailStatus = "Use el buscador de dominios, si no está registrado, use el botón aceptar, para confirmarlo.";

                // La forma de pago es obligatoria, según la forma de pago seleccionada.
                

        } else if (bookers.selected == false & otras.selected == false)

        {
                EmailStatus = "Seleccione una forma de pago";
        } else 

        {
                // Miramos a ver qué forma de pago se ha seleccionado, declaramos la variable que le corresponda, ya que el php en función de la forma de pago enviará un correo u otro.
                if (bookers.selected == true)

                {
                        var Pago = "MoneyBookers";

                } else if (otras.selected == true)

                {
                        var Pago = "Otras";

                }
                // Si el producto lo permite mira a ver qué plazo de pago se ha seleccionado, determina la variable que le corresponde y el formulario incluirá una u otra opción, en las dos modalidades de respuesta.

                if (boxanual.selected == true)
                {

                        var Plazopago = "anual";

                } else if (boxmensual.selected == true)

                {
                        var Plazopago = "mensual";

                }
                // Declaramos como variable el tipo de paquete que se ha seleccionado, ya que se incluirá en los formularios que se mandan una descripción del producto seleccionado, para que el cliente tenga claro lo que compra.

                var Paquete = comboplan.text;
                // Si se seleccionan cualquiera de las modalidades que incluyen hosting, obligamos al comprador a que se lea, o al menos acepte las condiciones del contrato, que además serán enviadas en su formulario de compra, si no las acepta no se cumple el envío.

                if (comboplan.value == 1 || comboplan.value == 2 || comboplan.value == 3 || comboplan.value == 4 || comboplan.value == 5 || comboplan.value == 6 || comboplan.value == 7 || comboplan.value == 8 || comboplan.value == 9)

                {
                        EmailStatus = "Tiene que aceptar las condiciones del contrato.";

                        gotoAndStop (4);
                } else 

                {
                        // Si todo está correcto enviamos las variables al php, vaciamos el cuadro de estado y lo mandamos al fotograma 5 saltándonos la galería y las condiciones del contrato, y lo enviamos al bucle de los fotogramas 21 y 22 de el layer acciones, en espera de la respuesta del php para confirmar el envío del correo y finalizar la animación.

                        loadVariablesNum ("mail/PedidoMail.php", "0", "POST");

                        EmailStatus = "";
                        gotoAndPlay (5);

                }
        }
}

En el fotograma 21 del layer acciones "11"...

{if (textos.text == "Enviando") {//Si el php imprime Enviando en el cuadro EmailStatus.
tempor.play();//Pone en marcha la animación de las flechitas.
stop();//Y se para.
} else {//Si no.
play;//Continúa.
}
}

En el fotograma 22 del layer acciones "12"...

{if (textos.text == "Enviando") {//Si el php imprime Enviando en el cuadro EmailStatus.
tempor.play();//Pone en marcha la animación de las flechitas.
stop();//Y se para.
} else {//Si no.
gotoAndPlay(21);//Regresa al fotograma anterior y continua comprobando.
}
}

En los fotogramas 23 y 24 del layer acciones"13" y "14" nada más que contienen un simple stop();, y en el layer Buttons un botón repetir con la siguiente programación...

on (release)
{
        EmailStatus = "";
        FirstName = "";
        LastName = "";
        Email = "";
        Company = "";
        Telephone = "";
        entrega = "";
        descripcion = "";
        peso = "0";
        dolar = "0";
        euro = "0";
        bookers.selected = false;
        otras.selected = false;
        tituldominio.text = "";
        dominio.text = "";
        plantillatit.text = "";
        plantilla.text = "";
        aceptacion.text = "";
        gotoAndStop (1)
}

Ahora veremos las modificaciones realizadas en el clip buscador que lo encontraremos en los fotogramas 1 y 2 del layer whois, este clip contiene el buscador de información de dominios, Whois cortesía de Dano y cuyo tutorial encontraréis aquí en Cristalab. Nos limitaremos a comentar los cambios efectuados para las necesidades de este formulario.

Tenemos que tener claro que este buscador no es 100% efectivo, a efectos de que aunque a veces diga, "No match for" o cualquier otra definición, lo que puede es que no esté en la base de datos, a la que se está consultando, aunque a nosotros de momento no nos ha fallado, podría existir algún caso en el que determine que no está registrado pero que a la hora de ir a registrarlo si que lo esté.

Las modificaciones afectan al clip, principalmente, y a la clase whois.as, así como al php tlds.php, el resto permanece igual.

En cuanto al clip sustituiremos el área de texto taDomainData por avisoaceptardominio marcado en la primera imagen con el número "28" y le hemos añadido un botón aceptar dominio marcado en la primera imagen con el número "29", vamos a ver primero las modificaciones en whois.as

import Danonino.FRemoting;
import mx.controls.TextInput;
import mx.controls.ComboBox;
import mx.utils.Delegate;
class Danonino.WhoIs extends MovieClip
{
        static var slGatewayURL = "/amfphp/gateway.php";
        var slWhoIS : FRemoting;
        var itDomain;
        var btnFind;
        var clTLDs;
        var dtMessage;
        // Declaramos el campo de aviso para que acepten el dominio.
        var avisoaceptardominio;
        function WhoIs ()
        {
                itDomain.restrict = "0-9A-Za-z\\-";
                slWhoIS = new FRemoting (slGatewayURL, "Danonino.WhoIs");
                slWhoIS.events._parent = this;
                slWhoIS.events.onGetTLDs = function (data )
                {
                        var llTLDs : Array = data;
                        for (var i in llTLDs)
                        {
                                llTLDs [i]["label"] = llTLDs [i]["tld"];
                                llTLDs [i]["data"] = llTLDs [i]["nic"];
                                delete llTLDs [i]["tld"]
                        }
                        clTLDs.dataProvider = llTLDs;
                        dtMessage.text = "Listo, introduzca su nombre de dominio";
                        btnFind._visible = true;
                }
                slWhoIS.process ("getTLDs");
                dtMessage.text = "Cargando dominios...";
                btnFind.onRelease = Delegate.create (this, find);
        }
        function onCreate ()
        {
                btnFind._visible = false;
        }
        function find ()
        {
                if (itDomain.text.length > 0)
                {
                        var DomainName : String = itDomain.text + clTLDs.selectedItem.label;
                        slWhoIS.events.onFind = function (data)
                        {
                                // Ya que no usamos el campo de resultados de la búsqueda, convertimos los datos recibidos a cadena de texto para poder trabajar con ella.
                                var cadena = data.toString ();
                                btnFind._visible = true;
                                // Si la cadena recibida contiene algo parecido a NOT FOUND, lo interpreta como que el dominio no existe.
                                if (cadena.indexOf ("NOT FOUND") != - 1)
                                {
                                        dtMessage.text = "Dominio no registrado.";
                                        // En el campo de mensaje avisa de que le dominio no está registrado.
                                        avisoaceptardominio.text = "Si desea adquirir este dominio presione aceptar";
                                        // Muestra el aviso para que el usuario acepte el dominio si es que lo desea.
                                        _parent.btnaceptar._visible = true;
                                        // Para eso muestra el botón aceptar.
                                        _parent.btnaceptar.enabled = true;
                                        // Y lo activa.
                                        // Igual que el anterior, pero la cadena sería No match for.
                                        
                                } else if (cadena.indexOf ("No match for") != - 1)
                                {
                                        dtMessage.text = "Dominio no registrado.";
                                        avisoaceptardominio.text = "Si desea adquirir este dominio presione aceptar";
                                        _parent.btnaceptar._visible = true;
                                        _parent.btnaceptar.enabled = true;
                                        // Aquí la cadena es Not found.
                                        
                                } else if (cadena.indexOf ("Not found:") != - 1)
                                {
                                        dtMessage.text = "Dominio no registrado.";
                                        avisoaceptardominio.text = "Si desea adquirir este dominio presione aceptar";
                                        _parent.btnaceptar._visible = true;
                                        _parent.btnaceptar.enabled = true;
                                        // La cadena es no existe.
                                        
                                } else if (cadena.indexOf ("no existe") != - 1)
                                {
                                        dtMessage.text = "Dominio no registrado.";
                                        avisoaceptardominio.text = "Si desea adquirir este dominio presione aceptar";
                                        _parent.btnaceptar._visible = true;
                                        _parent.btnaceptar.enabled = true;
                                        // Esta cadena la repetimos porque la respuesta puede estar escrita en mayúsculas, aunque podríamos escribir un código para que ignore mayúsculas y minúsculas.
                                        
                                } else if (cadena.indexOf ("NO MATCH FOR") != - 1)
                                {
                                        dtMessage.text = "Dominio no registrado.";
                                        avisoaceptardominio.text = "Si desea adquirir este dominio presione aceptar";
                                        _parent.btnaceptar._visible = true;
                                        _parent.btnaceptar.enabled = true;
                                }else
                                {
                                        // Si no se da ninguno de los casos anteriores, entiende que el dominio existe.
                                        dtMessage.text = "Dominio registrado.";
                                        // Lo indica en el mensaje.
                                        avisoaceptardominio.text = "";
                                        // Oculta el aviso aceptar dominio.
                                        _parent.btnaceptar._visible = false;
                                        // Oculta el botón aceptar dominio.
                                        _parent.btnaceptar.enabled = false;
                                        // Y lo desactiva.
                                        
                                }
                        }
                        dtMessage.text = "Leyendo información!";
                        slWhoIS.process ("find", [DomainName, clTLDs.selectedItem.data]);
                        btnFind._visible = false;
                }else
                {
                        dtMessage.text = "Introduzca un nombre de dominio";
                }
        }
}

Los avisos que recibe y en base a los cuales da la respuesta de no registrado, van en función del buscador de dominios que usemos, por ejemplo, whois.internic.com no da la misma respuesta en caso de no encontrar información sobre la petición que hemos realizado, que whois.pir.org, así que si quisiéramos modificar nuestro whois con un buscador que no esté incluído sería recomendable que mirásemos la respuesta que nos da en caso de no encontrar datos y lo incorporásemos a nuestro whois.as, para que lo tenga en cuenta como un dominio no registrado.

PhP tlds.php

<?php
function getArrayOfTlds(){
$alTLD[0]["tld"] = ".com";
$alTLD[0]["nic"] = "whois.internic.com";
//
$alTLD[1]["tld"] = ".net";
$alTLD[1]["nic"] = "whois.internic.net";
//
$alTLD[2]["tld"] = ".us";
$alTLD[2]["nic"] = "whois.nic.us";
//
$alTLD[3]["tld"] = ".org";
$alTLD[3]["nic"] = "whois.pir.org";
//
$alTLD[4]["tld"] = ".info";
$alTLD[4]["nic"] = "whois.afilias.info";
//
$alTLD[5]["tld"] = ".biz";
$alTLD[5]["nic"] = "whois.neulevel.biz";
//
return $alTLD;
}
?>

El botón aceptar dominio, que se encuentra fuera del clip buscador y marcado en la primera imagen con el número "29", contiene la siguiente programación:

Existe una pequeña diferencia a la hora de programar, entre un componente botón y un clip botón, y es que el componente botón, a parte de que no admite on(release), si tienes que hacer referencia a cualquier clip, campo de texto o componente que esté a su lado, tiene que ser con un _parent delante, porque si no, no lo localiza.

on (click){
_parent.avisodominio.text = "Si desea otro dominio borrelo"; // Muestra el aviso para borrar el dominio en la animación del formulario. _parent.tituldominio.text = "Dominio"; // Muestra el título del dominio.
_parent.dominio.text = "www."+_parent.buscador.itDomain.text+_parent.buscador.clTLDs.text; // Toma todos los datos del buscador y los pasa al campo de texto del buscador en el formulario, de esta forma queda esta variable adjunta al resto de variables del formulario, para remitirla, o borrarla y repetir el proceso de búsqueda de dominio. _parent.domein = "www."+_parent.buscador.itDomain.text+_parent.buscador.clTLDs.text;
_parent.buscador._visible = false;// Oculta el clip buscador de dominios.
_parent.buscador.avisoaceptardominio.text = "";// Borra el campo de aceptar el dominio, porque ya se ha aceptado.
_parent.buscador.btnFind._visible = false;// Desactiva y oculta todos los componentes del buscador de dominios.
_parent.buscador.btnFind.enabled = false;
_parent.buscador.clTLDs.enabled = false;
_parent.buscador.itDomain.enabled = false;
_parent.btnaceptar._visible = false;
_parent.btnaceptar.enabled = false;
_parent.btnborrardmn._visible = true;// Muestra y activa el botón borrar dominio, por si el usuario no lo desea y quiere repetir la búsqueda de dominio.
_parent.btnborrardmn.enabled = true;
}

El botón borrar dominio marcado con el número "19", que se encuentra fuera del clip buscador ...

Este borra el campo dominio en el formulario y muestra y activa de nuevo el buscador de dominios.

on (click)
{
        _parent.avisodominio.text = "";
        // Limpia los campos de dominio del formulario.
        _parent.tituldominio.text = "";
        _parent.dominio.text = "";
        _parent.buscador._visible = true;
        // Muestra el clip buscador de dominios.
        _parent.buscador.btnFind._visible = true;
        // Activa y muestra todos los componentes del buscador de dominios.
        _parent.buscador.btnFind.enabled = true;
        _parent.buscador.clTLDs.enabled = true;
        _parent.buscador.itDomain.enabled = true;
        _parent.btnaceptar._visible = true;
        _parent.btnaceptar.enabled = true;
        _parent.buscador.clTLDs.selectedIndex = _parent.buscador.clTLDs.length - 6;
        // Pone el selector de extensión de dominio en el primero de la lista.
        // Miramos a ver si la anterior búsqueda estaba registrada, si es así oculta y desactiva el botón aceptar dominio, de lo contrario lo muestra y activa.
        if ( ! _parent.buscador.itDomain.length & dtMessage.text == "Dominio registrado.")
        {
                _parent.btnaceptar._visible = false;
                _parent.btnaceptar.enabled = false;
        }else
        {
                _parent.btnaceptar._visible = true;
                _parent.btnaceptar.enabled = true;
        }
        _parent.btnborrardmn._visible = false;
        // Oculta y desactiva el botón borrar dominio, ya que ha sido esa la selección que acaba de hacerse.
        _parent.btnborrardmn.enabled = false;
}

Y siguiendo el orden cronológico de la animación, las modificaciones realizadas en la galería en el fotograma 3 del layer galería donde encontrarmos un clip llamado plantilla, dentro esta la galería de cortesía de Jorge Solís y que encontraréis en Flash-DB.

Aquí no vamos a extendernos explicando cómo funciona la galería, para eso está el enlace que hemos puesto encima de la imagen, que esté sobre estas líneas. Sólo diremos que hemos modificado el nombre de la clase Holder a AHolder , cambiándola en el clip que carga las clases y también las clases afectadas, que están dentro de la carpeta As/XmlIcons, todas llevan una A mayúscula delante, y dentro de cada clase las referencias a las demás clases están también cambiadas, lógicamente, para que al compilarlo funcione todo. Esto lo hemos hecho por la sencilla razón de que también usamos la galería en otro apartado del sitio y por lo tanto nos interesaba que no afectase el cambio de código y no interfirieran el uso normal de la galería, con el uso de la galería para el formulario.

En la imagen superior vemos los campos de texto "1" y "2" de nombres output y avisooutput respectivamente, la función del campo de texto dinámico "1" cuando las imágenes se muestran en formato de icono es mostrar el numero de iconos, y cuando se selecciona un icono muestra el número de plantilla. El campo "2" muestra los avisos, en formato de icono avisa de que se seleccione el icono que desee para verlo ampliado y cuando se amplia invita al usuario a hacer clic sobre la imagen para seleccionarla como plantilla. El clip marcado como "3" es el encargado de cargar las clases que conforman la galería. Para un mayor conocimiento sobre esta una galería de imágenes cortesía de Jorge Solís y que encontraréis en Flash-DB.

La galería muestra 15 iconos pequeños en tres hileras, si es que hay al menos 16 iconos por cada galería, si no, los muestra en tamaño medio, el tercer tamaño, el mas grande lo usaremos para la imagen que será enviado con el formulario de compra al cliente, para que pueda ver la plantilla que ha seleccionado más detalladamente junto con el resto de datos para que tenga bien claro qué ha comprado.

Sólo explicaré las modificaciones realizadas en los archivos AHolder.as y AXmlIcons.as que es donde se encuentran las modificaciones más importantes, el resto de modificaciones son dirigidas a la modificación de los nombres (recordemos que le hemos puesto una A mayúscula a todos los archivos que podían afectar al funcionamiento de ambas galerías), y que podréis ver bajando el zip del tutorial y mirando dentro de cada archivo As que contenga una A mayúscula al principio de su nombre.

El código de AHolder.as y AXmlIcons.as es una creación de Jorge Solís y que encontrareis en Flash-DB, modificado por  Crop Creativos , para poder usarlo en este formulario.

AS Aholder.as

import As.myColor
// La clase myColor no se ha tenido que modificar ni tan siquiera en el nombre, ya que no hace referencia a otras clases ni afecta al comportamiento entre ambas galerías, por lo que es compartible.
// Dentro de la carpeta As/XmlIcons encontraremos el resto de clases modificadas, básicamente renombradas para que no interfieran en la galería normal, la que no usamos en el formulario.
class AHolder extends MovieClip
{
        private var speed : Number = 20 //speed to resize image
        private var hw : Number = 100 //heigth and size of icons
        private var maxHeight : Number = 300 //Max available heigth on Stage
        private var maxWidth : Number = 450 //Max available width on Stage
        private var foto : MovieClip //container for loading big photos
        private var preload : MovieClip //preloader movieClip
        private var back : MovieClip //back to perform transitions between one image and another
        private var pic : MovieClip //holder to load icons
        private var mColor : As.myColor //brigth fadein/out method
        private var cmMenu : ContextMenu //rigth click to save
        private var icons : MovieClip //holder to load icons
        /**
        * Constructor
        */
        // La función real es Holder, pero se modificó para poder usar la galería en dos partes sin que afecte el comportamiento que tendrá la galería de selección de plantillas en la galería simple.
        function AHolder ()
        {
                preload._visible = false //hides preload
                //build the context menu to save image
                // Para desactivar esta función bastará con poner en el fla la instrucción Stage.showMenu = false;
                cmMenu = new ContextMenu ()
                cmMenu.customItems.push (new ContextMenuItem ("Abrir en una ventana nueva", saveImage));
                cmMenu.hideBuiltInItems ()
        }
        /*Public functions*/
        /**
        *  Load big images
        *  @param who name of the image
        */
        public function loadImage (who : String) : Void 
        {
                //Create container just once for loading big photos
                if ( ! foto) foto = this._parent.createEmptyMovieClip ("foto", 1)
                // Aquí pondremos la url absoluta, semiabsoluta o relativa, donde encontrara las imágenes de tamaño medio, que es la que muestra al seleccionar un pic.
                foto.loadMovie ("multimedia/imagen/plantillas/orig/" + who)
                foto._visible = false
                preload._visible = true
                //preloading
                this.onEnterFrame = function ()
                {
                        var perc = Math.round (foto.getBytesLoaded () / foto.getBytesTotal () * 100);
                        preload.barra._width = perc
                        foto._visible = false
                        if (perc >= 100 && foto.getBytesLoaded () > 1 && foto._width > 1)
                        {
                                delete this.onEnterFrame
                                preload._visible = false
                                var dim = checkSize (foto._width, foto._height)
                                resize (dim.w, dim.h)
                                //assign contextMenu
                                foto.menu = cmMenu
                                //Saves image name for contextMenu
                                foto.image = who
                                foto.onPress = function ()
                                {
                                        //getURL("javascript:NewWindow=window.open('media/imagen/plantillas/big/show.php?File="+who+"','newWin','width=500,height=400,left=200,top=200,toolbar=No,location=No,scrollbars=No,status=No,resizable=No,fullscreen=No');  NewWindow.focus();      void(0);");
                                        //trace (who);
                                        //Como las galerías no están completas usamos una  imagen llamada Próximamente para todas las casillas que quedan libres, ya que no nos  interesa tener menos de 16 imágenes por pantalla, si no, lo mostraría en vez de  en clips, en imágenes de tamaño medio y de una en una lo que haría tedioso la selección  de plantilla.
                                        if (who == "Proximamente.jpg")
                                        {
                                                _parent.output.text = "Seleccione una plantilla disponible.";
                                                // Así que si se selecciona esta imagen predeterminada para todos y que no es una plantilla, avisará en el fla de que se seleccione una plantilla disponible.
                                                
                                        }else
                                        {
                                                var my_str : String = who;
                                                var my_array : Array = my_str.split (".");
                                                for (var i = 0; i < my_array.length; i ++)
                                                {
                                                        // Aquí quitamos la extensión de archivo a la  plantilla seleccionada.
                                                        //trace(my_array[i]);
                                                        
                                                }
                                                //trace(targetPath(this));
                                                // Y pasamos su valor al cuadro de texto plantilla
                                                _parent._parent.plantilla.text = my_array [0];
                                                _parent._parent.plantillatit.text = "Plantilla";
                                                _parent._parent.avisoplantilla.text = "Si desea otra plantilla use el botón borrar";
                                                _parent._parent.btnborrarplt._visible = true;
                                                _parent._parent.btnborrarplt.enabled = true;
                                                _parent._parent.prevFrame ();
                                        }
                                        // Ponemos el título del cuadro plantilla, y mostramos el aviso para seleccionar otra plantilla y activamos el botón borrar
                                        // Luego retornamos al fotograma anterior, para continuar con el formulario.
                                        
                                }
                        }
                }
        }
        /**
        *  transition between previous and next image
        *  @param who name of the image
        */
        public function change (who : String) : Void
        {
                foto._visible = false
                if (back._width >= hw && back._height >= hw)
                {
                        var distx = back._width - hw
                        var disty = back._height - hw
                        var stepx = int (distx / speed)
                        var stepy = int (disty / speed)
                        if (stepx < 1)
                        {
                                //steps too small
                                back._width = hw
                                back._height = hw
                                loadImage (who)
                                return
                        }
                        this.onEnterFrame = function () : Void
                        {
                                back._width -= stepx
                                back._height -= stepy
                                if (back._width <= hw)
                                {
                                        back._width = hw
                                        back._height = hw
                                        delete this.onEnterFrame
                                        loadImage (who)
                                }
                        }
                } 
                else loadImage (who)
        }
        /**
        *  Load icons
        *  @param caller is a reference to the class calling this method, because this method is recursive
        *  @param image is the name of the image to load
        */
        public function loadIcons (caller : Object, image : String) : Void
        {
                pic.loadMovie ("multimedia/imagen/plantillas/pics/" + image)
                // En ésta ruta se encuentran las imágenes pequeñas (pics).
                pic._visible = false
                preload._visible = true
                this ["nr"] = caller.getModel ().getPos ()
                //preloader
                this.onEnterFrame = function ()
                {
                        var perc = Math.round (pic.getBytesLoaded () / pic.getBytesTotal () * 100);
                        preload.barra._width = perc
                        pic._visible = false
                        if (perc >= 100 and pic.getBytesLoaded () > 1 && pic._width > 1)
                        {
                                preload._visible = false
                                pic._visible = true
                                //position on center, pics are resized to match one side (heigth or width) of initAHolder
                                var w = pic._width
                                var h = pic._height
                                var cx = (w != hw) ?int ((hw - w) / 2) : 0;
                                var cy = (h != hw) ?int ((hw - h) / 2) : 0;
                                pic._x += cx;
                                pic._y += cy
                                // Color brigthness
                                this.b = 12
                                this.cant = 50
                                this.mColor = new As.myColor (pic)
                                this.mColor.setBrightOffset (this.cant)
                                //overwrite onEnterFrame
                                this.onEnterFrame = function ()
                                {
                                        this.mColor.setBrightOffset (this.cant -= this.b)
                                        if (this.cant <= 10)
                                        {
                                                //set rollOver, RollOut, Press
                                                this.onRollOver = function ()
                                                {
                                                        this.mColor.setBrightOffset (50)
                                                }
                                                this.onRollOut = function ()
                                                {
                                                        this.mColor.setBrightOffset (3)
                                                }
                                                this.onPress = function ()
                                                {
                                                        this._parent.controller.changeView ("single")
                                                        this._parent.controller.loadPhoto (this.nr)
                                                        this._parent.icons._visible = true
                                                        this._parent.icons.enabled = true
                                                }
                                                delete this.onEnterFrame
                                                var model = caller.getModel ()
                                                if (model.hasNext ())
                                                {
                                                        model.next ()
                                                        caller.showIcons ()
                                                } else 
                                                {
                                                        //Last item in model
                                                        this._parent.pag.reset ()
                                                        var last = model.getCantItems ()
                                                        var first = (last % caller.getIconsPerPage () != 0) ?caller.getIconsPerPage () * Math.floor (last / caller.getIconsPerPage ()) + 1 : caller.getIconsPerPage () * Math.floor (last / caller.getIconsPerPage () - 1) + 1
                                                        this._parent.output.text = first + " de " + last + " de un total de " + last
                                                        //Esta modificación muestra un aviso debajo de la  barra de la galería, el cuadro de texto marcado con el número dos en la imagen  que está encima.
                                                        this._parent.avisooutput.text = "Haga clic sobre el icono que desee ver ampliado";
                                                        this._parent.controller.loadPhoto (first)
                                                }
                                        }
                                }
                        }
                }
        }
        /*Private functions */
        /**
        *  Saves images to disk
        *  @param mc is the MovieClip holding image to save
        */
        private function saveImage (mc : MovieClip)
        {
                //Open in an HTML window is the safest way
                //Esta clase la modifiqué para que abriera el swf en  un html creado por show.php, si alguien esta interesado en ver el código del  php puede escribirme a info@cropcreativos.com, pero no lo incluyo porque no  viene al caso para este tutorial.
                mc.getURL ("javascript:NewWindow=window.open('multimedia/imagen/plantillas/orig/show.php?File=" + mc.image + "','newWin','width=" + (mc._width + 20) + ",height=" + (mc._height + 20) + ",left=200,top=200,toolbar=No,location=No,scrollbars=No,status=No,resizable=No,fullscreen=No');  NewWindow.focus();      void(0);");
        }
        /**
        *  Checkif the size of image overpass max limits
        *  @param w width of the image
        *  @param h heigth of the image
        */
        private function checkSize (w : Number, h : Number) : Object
        {
                if (h <= maxHeight && w <= maxWidth)
                {
                        return 
                        {
                                h : h, w : w
                        }
                } else 
                {
                        //recalculate dimensions, overpass boundaries
                        var orientation = (w > h) ?"w" : "h"
                        if (orientation == "h")
                        {
                                var per = int ((maxHeight * 100) / h)
                                var newWidth = int ((w * per) / 100)
                                return 
                                {
                                        h : maxHeight, w : newWidth
                                }
                        } else 
                        {
                                var per = int ((maxWidth * 100) / w)
                                var newHeight = int ((h * per) / 100)
                                return 
                                {
                                        h : newHeight, w : maxWidth
                                }
                        }
                }
        }
        /**
        *  Resize background in the transition routine between one image and another
        *  @param w width of the image
        *  @param h heigth of the image
        */
        private function resize (w : Number, h : Number) : Void
        {
                var c = 0
                var stepx = int (w / speed)
                var stepy = int (h / speed)
                this.onEnterFrame = function ()
                {
                        back._width += stepx
                        back._height += stepy
                        if (back._width >= w)
                        {
                                back._width = w
                                back._height = h
                                var p = back.getBounds (_parent)
                                foto._x = p.xMin
                                foto._y = p.yMin
                                //Match photo size with background size
                                foto._width = back._width
                                foto._height = back._height
                                foto._visible = true
                                var b = 1, cant = 50
                                mColor = new As.myColor (foto)
                                mColor.setBrightOffset (cant)
                                //overwrites onEnterFrame
                                this.onEnterFrame = function ()
                                {
                                        mColor.setBrightOffset (cant -= b)
                                        if (cant <= 0)
                                        {
                                                delete this.onEnterFrame
                                        }
                                }
                        }
                }
        }
}

AS AXmlIcons.as

import As.util. *
import As.mvc. *
// Las tres clases siguientes se han modificado al igual que ésta para que no interfirieran en las galerías.
import As.XmlIcons.APhotoModelXml
import As.XmlIcons.APhotoViewIcons
import As.XmlIcons.APhotoControllerIcons
//Position interface elements
this.attachMovie ("flecha", "back", - 100, 
{
        _x : 25, _y : 12, _xscale : 40, _yscale : 40
})
this.attachMovie ("flecha", "forward", - 99, 
{
        _x : 473, _y : 12, _xscale : 40, _yscale : 40, _rotation : 180
})
this.attachMovie ("iconos", "icons", - 498, 
{
        _x : 51, _y : 2, _xscale : 80, _yscale : 80
})
this.attachMovie ("paginas", "pag", - 96, 
{
        _x : 6, _y : 328
})
//Combobox with AS1 arquitecture, less heavy :)
//Aquí definiremos las categorías que aparecerán en  el combo selector de galería.
this.attachMovie ("FComboBoxSymbol", "cats", - 95, 
{
        _x : 315, _y : 5
})
cats.addItem ("Alimentos y Bebidas", 1)
cats.addItem ("Animales y Mascotas", 2)
cats.addItem ("Arquitectura y Construcción", 3)
cats.addItem ("Arte y Fotografía", 4)
cats.addItem ("Automóviles", 5)
cats.addItem ("Bodas", 6)
cats.addItem ("Cafés y Restaurant", 7)
cats.addItem ("Deportes", 8)
cats.addItem ("Educación", 9)
cats.addItem ("Empresa", 10)
cats.addItem ("Entretenimiento", 11)
cats.addItem ("Especiales", 12)
cats.addItem ("Florerías", 13)
cats.addItem ("Hoteles", 14)
cats.addItem ("Infantiles", 15)
cats.addItem ("Inmobiliarias", 16)
cats.addItem ("Joyerías", 17)
cats.addItem ("Medicina", 18)
cats.addItem ("Muebles y Decoración", 19)
cats.addItem ("Música", 20)
cats.addItem ("Personales", 21)
cats.addItem ("Profesionales", 22)
cats.addItem ("Salud y Belleza", 23)
cats.addItem ("Tecnología", 24)
cats.addItem ("Tiendas en línea", 25)
cats.addItem ("Turismo", 26)
cats.setSize (150);
cats.setChangeHandler ("filter")
function filter (comp)
{
        controller.setFilter (comp)
}
//end of UI elements
// Tenemos que tener cuidado de modificar correctamente las funciones y clases.
model = new APhotoModelXml ()
controller = new APhotoControllerIcons (model, this)
view = new APhotoViewIcons (model, controller, this)
controller.setView (view)
pag.setController (controller)
model.addObserver (view)
model.addObserver (pag)
model.addObserver (controller)
//Buttons handlers
back.onPress = function ()
{
        controller.backward ()
}
forward.onPress = function ()
{
        controller.forward ()
}
icons.onPress = function ()
{
        this._visible = false
        controller.icons ("current")
        this.enabled = false
        this.gotoAndStop (1)
}
icons.onRollOver = function ()
{
        this.gotoAndPlay (2)
}
icons.onRollOut = function ()
{
        this.gotoAndStop (1)
}
icons._visible = false
back._visible = false
//Load inital data
// Aquí le indicaremos dónde encontrar el xml usado  para definir las galerías.
model.loadData ("multimedia/imagen/plantillas.xml")
a = setInterval (function ()
{
        var b = view.setupIcons (3, 5);
        if (b)
        {
                model.filter (1)
                view.setState ("icons")
                controller.icons ("current")
                clearInterval (a);
        }
}, 1000)
stop ();

El fotograma 20 de layer temporizado tenemos un clip con una animación, que tiene por nombre en sus propiedades "tempor", de unas flechitas girando, al que se llama como vemos en la programación de arriba, en el bucle comprendido entre los fotogramas 21 y 22 marcados con los números "11" y "12" cuando el php imprime la palabra "Enviando" en el cuadro de texto dinámico cuya variable es "EmailStatus" y que contiene la siguiente programación:

En el fotograma 1 punto "1" un stop();, en el fotograma 2 punto "2", _parent.FirstName = ""; _parent.LastName = ""; , en el fotograma 16 punto "3", _parent.Email = ""; _parent.peso = "0";, en el fotograma 31 punto "4", _parent.Company = ""; _parent.dolar = "0"; _parent.formaspago.text = "Forma de pago"; en el fotograma 46 punto "5", _parent.comboplan.enabled = true ; _parent.Telephone = ""; _parent.euro = "0" ; _parent.bookers.selected = false ; _parent.boxanual.selected = false ; _parent.boxanual._visible = false ; _parent.boxanual.enabled = false ; , en el fotograma 61 punto "6", _parent.boxmensual.selected = false ; _parent.boxmensual._visible = false ; _parent.boxmensual.enabled = false ; _parent.otras.selected = false ; , en el fotograma 76 punto "7", _parent.descripcion = ""; ,de esta forma con cada giro que dan las flechas se van borrando los campos uno a uno, y para finalizar, en el fotograma 92, punto "8", la siguiente programación.

stop ();
_parent.entrega = ""; 
_parent.tituldominio.text = ""; 
_parent.dominio.text = ""; 
_parent.domein = ""; 
_parent.plantillatit.text = ""; 
_parent.plantilla.text = ""; 
_parent.template = ""; 
_parent.aceptacion.text = ""; 
_parent.EmailStatus = "Su mensaje ha sido enviado. Gracias por contactar con nosotros"; 
_parent.gotoAndStop (24); 
gotoAndStop (1);

Los XML

Haremos un pequeño resumen de los dos xml que usamos para este formulario, uno es productos.xml donde irán los datos de todos los productos que queremos cargar en nuestro componente combobox, el otro es plantillas.xml que es el que usaremos para la carga de la galería de imágenes, este último se encuentra en la carpeta multimedia/imagen. Para el que desée profundizar más en el tema de los xml su estructura, etc. aquí mismo en Cristalab, en el tutorial de Xml en flash encontrará más información.

XML Productos.xml

<productos>
<paquete valor="0" nombre="Seleccione un producto" descripcion=" " plazo=" " pesos="0" dolares="0" euros="0"/>
<paquete valor="1" nombre="Básico" descripcion="Alojamiento Web con Espacio en disco 5 Gb. Transferencia/mes 50 Gb, subdomínios 20,domínios aparcados 40, domínios addons 5, ftp ilimitado, buzones de correo ilimitados, servidor pop smtp imap, bases de datos Mysql y Postgree ilimitadas, setup gratuito, dns anonimo, CGI/perl, php4.x, SSI, cronjobs, Imagemagik, Frontpage extensions, GD libs, Cpanel, Herramientas de correo, panel de control y Estadísticas, Backups Instáneos, Soporte 24/7, Funcionamiento 99.5% Garantizado." plazo="1 día tras el pago." pesos="16.000" dolares="29" euros="23" pesosmes="1.987" dolaresmes="3,70" eurosmes="2,9"/> </productos>

Sólo mostraremos dos nodos hijos, aunque el xml trae más nodos, pero para mostrar el ejemplo serán suficientes. El primer Nodo hijo (ChildNode), corresponde al que se muestra cuando se carga el combobox, tenemos que tener mucho cuidado, ya que si dejamos algún valor de nodo vacío dará error, así que tendremos que al menos dar un espacio en blanco (usando la barra espaciadora). Como podemos ver en el atributo plazo, en el valor del nodo, las comillas están separadas por un espacio en blanco y lo mismo ocurre con el atributo plazo.

El segundo nodo hijo (ChildNode), vemos que contiene más atributos, correspondientes al pago mensual o anual en las tres monedas, otros productos no tienen estos atributos, porque el pago se hace a contra entrega.

XML Plantillas.xml

<gallery>
<photo title="Alimentos y Bebidas 001" src="ALI0001.jpg" cat="1"/>
<photo title="En Construcción" src="Proximamente.jpg" cat="1"/> </gallery>

Este es más simple, el atributo cat corresponde a la categoría, si hemos puesto siete categorías (catálogos) en el archivo AXmlIcons.as, en nuestro selector de plantilla, tendremos hasta 7, y es cat el qué indica que grupo de imágenes corresponde a cada categoría, ya que las etiquetas de nodo hijo (ChidNode) es phot y es igual para todas las imágenes. El atributo src se corresponde al nombre del archivo a cargar, y el título es lo que se mostrará en la cabecera de la galería en el campo de texto dinámico llamado output, marcado con el "1" en la imagen de la galería. La etiqueta gallery corresponde al primer nodo (FirstChild).

Con esto ya hemos terminado de programar nuestro formulario flash, ahora sólo nos resta preparar nuestro php.

PROGRAMANDO NUESTRO PHP

El archivo php tomará las variables que le pasemos desde flash, las colocará en una tabla en formato html y en un mensaje enviado al remitente, también en formato html añadiéndole la fecha la IP desde donde se mandó un número de control y además usaremos algunas de las variables que le pasamos para personalizar el correo de confirmación, como el nombre del que lo manda.

Todo el código está comentado así que no necesita de más explicaciones:

PHP PedidoMail.php

<?php
/**
*  @ Copyright (©) 2005 Crop Chile
*  @ EMail form Php
*  @ info@crocreativos.com
*
*  Este script es gratuito, proporcionado por:
*  Crop Chile
*  Estudio de diseño
*  @ I + D En comunicación
*  @ http://www.cropcreativos.com
*
* Puede usarlo par distribuirlo libremente. No para su venta
*
* Puede usarlo bajo su propia responsabilidad con fines personales o
* comerciales.
* Crop Chile NO GARANTIZA, NI SE RESPONSABILIZA de los errores que
* pudieran derivarse de su uso, o un uso indebido de este script
* para SPAM o cualquier otra actividad delictiva.
*
* Tan sólo pedimos que no eliminen esta cabecera de comentarios del script
* para usarlo.
*
* Para que este script funcione correctamente su servidor tiene que
* autorizar el uso de la función mail de PHP.
*
* En caso de que el mail se envíe con los campos vacíos,
* solicite al webmaster de su servidor que ponga la función
* @ global_register del archivo php.ini en ON.
*
* Este script envía dos correos, uno de confirmación al remitente
* en formato html y otro para control de recepción también en formato
* html y como una tabla muy fácil de leer. En ambos incluye un número de
* control y la IP desde donde se mandó.
*/
{
        //Si la variable template de las plantillas está vacía.
        if (empty ($template))
        {
                //La tabla que nos remite a nosotros no aparecerá la columna de la plantilla con los datos.
                $plantimagenpic = '';
                //Y en el html que enviamos al cliente no se mostrará ninguna imagen grande.
                $plantimagenbig = '';
        }else
        {
                //En caso contrario en el html que recibimos nos mostrará una columna con una imagen en pequeño de la plantilla seleccionada y su correspondiente código.
                $plantimagenpic = '<tr><td width="80" height="60" align="left" valign="middle" bgcolor="#CCCCCC"><p><font face="Georgia, Times New Roman, Times, serif"><font size="-2"><font face="Verdana, Arial, Helvetica, sans-serif">Plantilla :</font></font></font></p></td><td width="470" height="60" align="left" valign="middle" bgcolor="#B7B0AA"><img src="http://www.tusitio.tudominio/multimedia/imagen/plantillas/pics/'.$template.'.jpg" alt="Plantilla" width="100" height="60" longdesc="Plantilla seleccionada por el cliente" /></td></tr><tr><td width="80" height="20" align="left" valign="middle" bgcolor="#CCCCCC"><p><font size="-2" face="Verdana, Arial, Helvetica, sans-serif">Codigo:</font></p></td><td width="470" height="20" align="left" valign="middle" bgcolor="#B7B0AA"><p><font color="#333333"><font face="Verdana, Arial, Helvetica, sans-serif"><font size="-2">'.$template.'</font></font></font></p></td></tr>';
                // Y en el correo que le mandará al cliente lo mismo, una imagen grande de la plantilla que seleccionó y su correspondiente código.
                $plantimagenbig = '<tr height="15"><td height="15" colspan="3" bgcolor="#999999"><div align="center"><font size="1" color="#FFFFFF" face="Verdana, Arial, Helvetica, sans-serif">Plantilla seleccionada '.$template.'</font></div></td></tr><tr height="15"><td height="15" colspan="3" bgcolor="#999999"><div align="center"><img src="http://www.tusitio.tudominio/multimedia/imagen/big/'.$template.'.jpg" alt="Plantilla" width="500" height="400" longdesc="Plantilla seleccionada por el cliente" /></div></td></tr>';
        }
        // Lo mismo con el plazo de pago, si está vacío no se mostrarán las consecuentes filas correspondientes al pago.
        if (empty ($Plazopago))
        {
                $esfilaapago = '';
                $filaapago = '';
        }else
        {
                // En caso contrario en nuestro html nos mostrará una fila con el plazo de pago seleccionado.
                $esfilaapago = '<tr><td width="80" height="20" align="left" valign="top" bgcolor="#CCCCCC"><p><font face="Georgia, Times New Roman, Times, serif"><font size="-2"><font face="Verdana, Arial, Helvetica, sans-serif">Plazo:</font></font></font></p></td><td width="470" height="20" align="left" valign="top" bgcolor="#B7B0AA"><p><font color="#333333"><font face="Verdana, Arial, Helvetica, sans-serif"><font size="-2">Pago '.$Plazopago.'</font></font></font></p></td></tr>';
                // Y en el html que mandamos al cliente también.
                $filaapago = '<tr height="18"><td height="15" colspan="3" align="left" valign="middle"><font color="#333333" size="-2" face="Verdana, Arial, Helvetica, sans-serif"><strong>Plazo de pago: </strong>'.$Plazopago.'</font></td></tr>';
        }
        if (empty ($domein))
        {
                $dominiotab = '';
                $dominio = '';
        }else
        {
                $dominiotab = '<tr><td width="80" height="20" align="left" valign="middle" bgcolor="#CCCCCC"> <p><font face="Verdana, Arial, Helvetica, sans-serif"><font size="-2">Dominio:</font></font></p></td><td width="470" height="20" align="left" valign="middle" bgcolor="#B7B0AA"><p><font color="#333333"><font face="Verdana, Arial, Helvetica, sans-serif"><font size="-2">'.$domein.'</font></font></font></p></td></tr>';
                $dominio = '<tr height="18"><td height="15" colspan="3" align="left" valign="middle"><font color="#333333" size="-2" face="Verdana, Arial, Helvetica, sans-serif"><strong>Dominio elegido: </strong>'.$domein.'</font></td></tr>';
        }
        if (empty ($Company))
        {
                //Si el pedido lo hace un particular, el firmante de las condiciones sería un particular.
                $firmante = '<font color="#333333" size="-2" face="Verdana, Arial, Helvetica, sans-serif">Yo <strong>'.$FirstName.' '.$LastName.'</strong>, en mi representaci&oacute;n y nombre, declaro haber leído, entendido y aceptado las condiciones de este contrato.</font>';
        }else
        {
                //Si el pedido lo hace una empresa, se supone que el que hace el pedido es un representante autorizado de la empresa.
                $firmante = '<font color="#333333" size="-2" face="Verdana, Arial, Helvetica, sans-serif">Yo <strong>'.$FirstName.' '.$LastName.'</strong>, como representante autorizado de la empresa <strong>'.$Company.'</strong>, declaro haber leído, entendido y aceptado las condiciones de este contrato.</font>';
        }
        //Si no son  necesarias las condiciones del contrato en el producto seleccionado no se envían,  de lo contrario se envían junto con la aceptación del que realizó el pedido.
        if (empty ($aceptar))
        {
                $condiciones = '';
        }else
        {
                $condiciones = '
                <table width="550">
                <tr>
                <td height="9" bgcolor="#999999"><div align="center"><font size="2" color="#FFFFFF" face="Verdana, Arial, Helvetica, sans-serif">Condiciones del contrato</font></div></td>
                </tr>
                <tr>
                <td>        <p><font face="verdana" color="#FFFFFF" size="-2"><strong>PRIMERO</strong></font>
                <font face="verdana" color="#333333" size="-3">El Cliente  conviene en contratar, con <strong>Crop</strong> el servicio de Web Hosting, bajo la  modalidad que se se&ntilde;ala en la <u>cl&aacute;usula 2&deg; del Presente</u>, el cual le  permitir&aacute;, contar con un sitio, en los servidores de <strong>Crop</strong>. Los usuarios podr&aacute;n visitarlo o acceder a &eacute;l a trav&eacute;s de la red de internet.</font>
                </p>
                <p><strong><font face="verdana" color="#FFFFFF" size="-2">SEGUNDO</font></strong>
                <font face="verdana" color="#333333" size="-3">Al contratar  los servicios de <strong>Crop</strong>, el cliente declara cumplir con la mayor&iacute;a de edad  establecida por la ley chilena. De este modo, <strong>Crop</strong> se reserva el derecho  de admitir y caducar cuentas de clientes que no cumplan con dicha condici&oacute;n,  as&iacute; como tambi&eacute;n de toda persona que ingrese cualquier informaci&oacute;n falsa en  nuestros registros de inscripci&oacute;n. El Servicio de WebHosting se prestar&aacute; en la  modalidad acordada en el presente contrato.</font>
                </p>
                <p><strong><font face="verdana" color="#FFFFFF" size="-2">TERCERO</font></strong>
                <font face="verdana" color="#333333" size="-3">No ser&aacute; responsabilidad, de <b>Crop</b>, las siguientes condiciones registradas en el o los organismos reguladores:
                
                <ul><menu><li> Dominio Existe.</li></menu>
                <menu><li> Dominio en Publicaci&oacute;n.</li></menu>
                <menu><li> Dominio con cualquier otro tipo de restricci&oacute;n, dentro de los 30 d&iacute;as en publicaci&oacute;n.</li></menu><menu><li> En el evento que el dominio solicitado sea rechazado por el organismo regulador,el
                cliente deber&aacute; se&ntilde;alar el nuevo dominio que pretende registrar.
                </li></menu></ul>
                </font>
                </p>
                <p><strong><font face="verdana" color="#FFFFFF" size="-2">CUARTO</font></strong>
                <font face="verdana" color="#333333" size="-3"><b>Crop</b>, no se hace responsable ante los siguientes eventos :
                <ul><menu><li> Cortes del Suministro El&eacute;ctricos provocados por las compa&ntilde;&iacute;as el&eacute;ctricas.</li></menu>
                <menu><li> Terremotos, que impidan dar un servicio &oacute;ptimo o completo.</li></menu>
                <menu><li> Incendios en nuestras dependencias ajenas a nuestra responsabilidad.</li></menu>
                <menu><li> Cortes de enlaces internacionales o Nacionales, proporcionadas por empresas
                proveedoras de Internet.</li></menu>
                <menu><li> Mal Uso de las cuentas de acceso.</li></menu>
                <menu><li> <b>Crop</b> obliga a sus clientes por seguridad a tener un respaldo de toda la
                informaci&oacute;n que mantengan en nuestros servidores.</li></menu>
                <menu><li> Atentados de Hackers a Nuestros Sistemas.</li></menu>
                <menu><li> Demora del Clientes en el cambio de DNS para la Activaci&oacute;n del Servicio de
                dominios.</li></menu>
                <menu><li> Demora en el Traspaso de los DNS de la Empresa anterior a nuestra Empresa.</li></menu></ul>
                /font>
                </p>
                <p><strong><font face="verdana" color="#FFFFFF" size="-2">QUINTO </font></strong><font face="verdana" color="#333333" size="-3"><b>Crop</b>, se compromete, ante cualquier evento, distinto a los detallados en el <u>Art&iacute;culo Cuarto</u>, a proporcionar, un servicio &oacute;ptimo, y estable, as&iacute; como en un plazo de 48 Horas, dar soluci&oacute;n a los contratiempos o problemas, que sean de nuestra responsabilidad.</font>              </p>
                <p><strong><font face="verdana" color="#FFFFFF" size="-2">SEXTO </font></strong><font face="verdana" color="#333333" size="-3"><b>Crop</b>, no tendr&aacute; responsabilidad alguna por el contenido de la informaci&oacute;n que el <b>CLIENTE</b>, coloque o haga residir en el sitio del servidor de <b>Crop</b>, utilizado en virtud del presente. <b>Crop</b> proh&iacute;be residir archivos de tipo mp3, RealAudio, Vqf, Avi, wma o similares, y cualquier otro formato audio visual que este protegido por las leyes de propiedad intelectual a excepci&oacute;n que sea de propiedad del cliente. Tambi&eacute;n es prohibido, el contenido pornogr&aacute;fico en cualquiera de sus formatos. No obstante lo anterior <b>Crop</b>, podr&aacute; poner t&eacute;rmino, al presente servicio y en cualquier momento si a su juicio, la informaci&oacute;n puesta en su servidor, por el cliente, atenta contra la ley, la moral o las buenas costumbres, o afecta a terceras personas.</font>      </p>
                <p><strong><font face="verdana" color="#FFFFFF" size="-2">SEPTIMO</font></strong>
                <font face="verdana" color="#333333" size="-3">Est&aacute; totalmente prohibido el uso de las cuentas para las siguientes funciones:
                <ul><menu><li> Ocupar la cuenta como sistema de respaldo de informaci&oacute;n. Siendo permitida s&oacute;lo la que concierna al funcionamiento del sitio.
                </li></menu>
                <menu><li> Ocupar las cuentas para usar cualquier tipo de SOFTWARE IRC, BOT, BOUNCERS y
                similares. Tambi&eacute;n en funci&oacute;n de servidor (IRCD).</li></menu>
                <menu><li> Compilar o hacer correr cualquier tipo de programa o software de tipo hacker, nuke, exploit, o cualquier programa que atente contra el buen funcionamiento tanto como el
                de nuestros servidores como el de terceros.
                </li></menu>
                <menu><li> Residir sharewares, demos, betas, alfas u otros programas protegidos por las leyes de
                propiedad intelectual.</li></menu>
                <menu><li> Tambi&eacute;n est&aacute; estrictamente prohibido residir archivos de tipo crackers, seriales, y
                similares.</li></menu>
                <menu><li> Residir archivos de tipo mame, romz, emuladores y similares.</li></menu>
                <menu><li> Guardar juegos muds, juegos, juegos telnet, parches para juegos u otros.</li></menu>
                <menu><li> Publicar informaci&oacute;n que de alguna forma atente contra la imagen de <b>Crop</b> y sus
                proveedores de servicios o imputen a dichas empresas cualquier tipo de calumnias
                o similares.</li></menu>
                <menu><li> Hacer uso de nuestros servidores para realizar REAL STREAMING , SHOUTCAST, y
                sistemas similares.</li></menu></ul>El no respetar tanto la presente cl&aacute;usula, como la anterior (<u>Sexta cl&aacute;usula</u>), son razones para la cancelaci&oacute;n inmediata de la cuenta del cliente, sin previo aviso o notificaci&oacute;n alguna por parte de <b>Crop</b>.
                </font>
                </p>
                <p><strong><font face="verdana" color="#FFFFFF" size="-2">OCTAVO </font></strong><font face="verdana" color="#333333" size="-3">Las condiciones comerciales del presente servicio podr&aacute;n ser modificadas por <b>Crop</b>, previa notificaci&oacute;n al cliente con una anticipaci&oacute;n de al menos 30 d&iacute;as a la vigencia de las nuevas condiciones, para tal efecto se utilizar&aacute;, el correo electr&oacute;nico del cliente, fax o carta. El Cliente, en caso de no aceptar las nuevas condiciones comerciales del presente servicio podr&aacute; ponerle t&eacute;rmino al mismo, comunicando su intenci&oacute;n en tal sentido a <b>Crop</b>, antes de la entrada en vigencia de las nuevas condiciones sin costo alguno para &eacute;l, de lo contrario se entender&aacute;n &eacute;stas aceptadas por el cliente.</font></p>
                <p><strong><font face="verdana" color="#FFFFFF" size="-2">NOVENO </font></strong><font face="verdana" color="#333333" size="-3"><b>EL CLIENTE</b>, contrata el servicio de <b>WEBHOSTING</b>, y se obliga a pagar a <b>Crop</b>, con antelaci&oacute;n la tarifa se&ntilde;alada, para la modalidad del servicio contratado. En el caso de renovaci&oacute;n de el servicio, tendr&aacute; de plazo hasta un d&iacute;a antes de la finalizaci&oacute;n del plazo contratado.</font>        </p>
                <p><strong><font face="verdana" color="#FFFFFF" size="-2">DECIMO </font></strong><font face="verdana" color="#333333" size="-3"><b>Crop</b>, facturar&aacute; al cliente, el servicio contratado, por per&iacute;odos anuales anticipados y ya pagados, previa presentaci&oacute;n de documento, n&uacute;mero de ingreso, o transacci&oacute;n que demuestre dicho pago. En Caso de Mora o simple retardo en el pago del servicio contratado <b>Crop</b> suspender&aacute; dicho servicio. La reposici&oacute;n del servicio se har&aacute; una vez que se paguen todos los cargos pendientes y adeudados por el cliente. Si el cliente no ha solucionado su condici&oacute;n de mora pasado 10 d&iacute;as desde la primera factura morosa, <b>Crop</b> tiene el derecho a caducar la cuenta y eliminar los datos del cliente, en los cuales se incluyen: Bases de datos, Casillas de correo, p&aacute;ginas Web y cualquier informaci&oacute;n que el cliente est&eacute; haciendo residir en los servidores de <b>Crop</b>.</font></p>
                <p><strong><font face="verdana" color="#FFFFFF" size="-2">DECIMO PRIMERO </font></strong><font face="verdana" color="#333333" size="-3">El presente servicio tendr&aacute; una duraci&oacute;n anual, el cliente podr&aacute; poner termino al contrato previamente notificando v&iacute;a correo tradicional o e-mail de sus intenciones. No Obstante lo anterior, <b>Crop</b> no realizar&aacute; devoluciones de dinero a aquellos clientes, que hubieron cancelado en forma anticipada y que deseen ponerle t&eacute;rmino a dicho contrato con anticipaci&oacute;n al t&eacute;rmino de los per&iacute;odos cancelados, a excepci&oacute;n de que <b>Crop</b>, no cumpla con un servicio &oacute;ptimo, y que sea exclusivamente de su responsabilidad tal como se estipula en este contrato (<u>QUINTA CLAUSULA DEL PRESENTE</u>).</font></p>
                <p><strong><font face="verdana" color="#FFFFFF" size="-2">DECIMO SEGUNDO </font></strong><font face="verdana" color="#333333" size="-3"><b>Crop</b> de forma voluntaria, avisar&aacute; al cliente de la finalizaci&oacute;n del contrato para su renovaci&oacute;n, aunque <b>Crop</b> no contempla como obligatorio avisar al cliente de la finalizaci&oacute;n del contrato.</font></p>
                <p><strong><font face="verdana" color="#FFFFFF" size="-2">DECIMO TERCERO </font></strong><font size="-3" color="#333333" face="Verdana, Arial, Helvetica, sans-serif"><b>Crop</b>, dispone que sus servicios, deben ser pagados en cualquiera de las modalidades ofrecidas en nuestro formulario de pedidos, ya sea a trav&eacute;s <b>Moneybookers</b> desde cualquier pa&iacute;s y en cualquier moneda igualando el cambio a los precios se&ntilde;alados, o en el caso de Chile tambi&eacute;n puede ser dep&oacute;sito o transferencia bancaria; si prefiere esta opci&oacute;n, tras hacer su pedido, uno de nuestros ejecutivos contactar&aacute; con usted, para entregarle toda la informaci&oacute;n necesaria, sobre la cuenta en que debe hacer el abono. Una vez hecho el pago, debe enviarnos un correo electr&oacute;nico a pagos@tusitio.tudominio con la imagen del dep&oacute;sito o el n&uacute;mero de operaci&oacute;n en caso de haber hecho una transferencia bancaria o haber usado Moneybookers, adjuntando tambi&eacute;n el n&uacute;mero de albar&aacute;n del servicio que est&aacute; pagando y los datos de quien est&aacute; contratando el servicio y ser&aacute; nuestro contacto en adelante, para todo lo que haga referencia al plan contratado (nombre completo, e-mail y tel&eacute;fono de contacto).</font></p>
                <p><strong><font face="verdana" color="#FFFFFF" size="-2">ANEXO 1. (Sobre SPAM). </font></strong><font face="verdana" color="#333333" size="-3"><b>Crop</b> entiende como spam lo siguiente:<br />
                Spam es el acto de enviar correos MASIVOS o NO solicitados a cualquier tipo de destinatario, contenga este en su cuerpo opciones para ser removido o no, este mensaje ser&aacute; considerado <b>SPAM</b>. Lo anteriormente se&ntilde;alado tiene como resultante una molestia para los usuarios que d&iacute;a a d&iacute;a tienen que leer y bajar correos no solicitados. Por lo tanto, <b>Crop</b> tiene estrictamente prohibido el hacer spam desde cualquier cuenta de correo alojada en sus servidores. El no respetar esta norma, significar&aacute; el cierre inmediato de la cuenta de correo, con previa advertencia al cliente. Si este persistiese en su acci&oacute;n con otras cuentas de correo alojadas en los servidores que vende <b>Crop</b>, se pondr&aacute; t&eacute;rmino inmediato al presente contrato.
                </font></p>
                <p><strong><font face="verdana" color="#FFFFFF" size="-2">ANEXO 2. (Sobre lenguajes de programaci&oacute;n PHP, PERL y otros). </font></strong><font face="verdana" color="#333333" size="-3">Es deber de <b>Crop</b> velar por el bienestar de sus sistemas y la seguridad de &eacute;stos. Por lo tanto, cualquier tipo de actualizaci&oacute;n a los sistemas, que <b>Crop</b> considere necesaria, ser&aacute; hecha y anunciada con una semana de anticipaci&oacute;n en el sitio Web de este. <b>Crop</b> se exime de cualquier tipo de responsabilidad sobre los cambios que estas herramientas de desarrollo tengan en sus actualizaciones, y el efecto que &eacute;stas puedan tener en los sitios de los clientes. De esta forma, ser&aacute; responsabilidad del cliente, informarse sobre los cambios que dichas herramientas tengan, a modo de tener sus sitios con un c&oacute;digo actualizado. De esta forma, el cliente da por entendido que <b>Crop</b> no se responsabiliza sobre los cambios que las herramientas de desarrollo tengan en el futuro y que &eacute;ste no actualizar&aacute; ni cambiar&aacute; c&oacute;digos de sus clientes. </font></p>
                <p><strong><font face="verdana" color="#FFFFFF" size="-2">ANEXO 3. (Sobre el tr&aacute;fico ilimitado)</font></strong>
                <font face="verdana" color="#333333" size="-3"><b>Crop</b> brindar&aacute; tr&aacute;fico ilimitado para los planes que corresponda, siempre que:<br />
                
                <ul>
                <menu><li> El sitio o herramientas del cliente no ocupen los recursos del servidor de tal modo que no permitan el funcionamiento normal de &eacute;ste.
                </li></menu>
                <menu><li> El sitio o herramientas del cliente no ocupen el ancho de banda dispuesto para el
                servidor de tal forma de que impida el funcionamiento normal de &eacute;ste.
                </li></menu>
                <menu><li> Cualquier sitio que cumpla con cualquiera de los dos puntos reci&eacute;n nombrados no
                calificar&aacute; para un servidor virtual de hospedaje Web (Web Hosting), teniendo el cliente
                que considerar la contrataci&oacute;n de un plan superior como lo ser&iacute;a un servidor dedicado
                para dicho sitio o dominio.
                </li></menu></ul>
                </font>
                </p>
                <p><strong><font face="verdana" color="#FFFFFF" size="-2">ANEXO 4. (Sobre alojamiento de sitios Web). </font></strong><font face="verdana" color="#333333" size="-3"><b>Crop</b> no permite alojar m&aacute;s de un sitio Web por cada cuenta contratada, vale decir, cada dominio hospedado en nuestros sistemas debe de tener un contrato de hospedaje Web (Web Hosting). Se exime de esto los planes multidominios, reseller, semi-dedicados y Servidores Dedicados.</font>    </p>
                <p><strong><font face="verdana" color="#FFFFFF" size="-2">ANEXO 5. (Sobre Script Instalados). </font></strong><font face="verdana" color="#333333" size="-3">Es responsabilidad del cliente mantener actualizados sus script de distribuici&oacute;n gratuita como PHP-Nuke, PHPBB entre otros. Si el funcionamiento de un script como estos o similar pone en riesgo el buen funcionamiento de nuestros servidores, el servicio ser&aacute; suspendido sin previo aviso y si es necesario eliminando el script que cause los problemas. Si el cliente persiste en la instalaci&oacute;n de script y no realiza la actualizaci&oacute;n de seguridad <b>Crop</b> podr&aacute; poner t&eacute;rmino a su contrato sin previo aviso. Esta condici&oacute;n no es vigente para los script que se instalen por medio de Fant&aacute;stico en Nuestro Panel de Control. </font>      </p><p>'.$firmante.'</p></td>
                </tr>
                </table>
                ';
        } //Esta función creara un código alfanumérico distinto  para cada envío que será usado como número de albarán.
        function GetID ($x)
        {
                $characters = array ("A", "B", "C", "D", "E", "F", "G", "H", "J", "K", "L", "M", "N", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z", "2", "3", "4", "5", "6", "7", "8", "9");
                shuffle ($characters);
                for (; strlen ($ReqID) < $x)
                {
                        $ReqID . = $characters [mt_rand (0, count ($characters))];
                }
                return $ReqID;
        }
        $ReqID . = GetID (3);
        $ReqID . = "-";
        $ReqID . = GetID (4);
        $ReqID . = "-";
        $ReqID . = GetID (3);
        $boundary = $ReqID;
        //$boundary = md5(time().rand(1,100));
        $fecha = date ("d-M-y H:i");
        $relato = $descripcion;
        //Esta tabla html es la que recibimos nosotros.
        $content = '
        <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
        <html xmlns="http://www.w3.org/1999/xhtml">
        <head>
        <title>Albar&aacute;n de compras.</title>
        <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
        <style type="text/css" media="print">
        .ImprimirNo { display:none; }
        </style>
        </head>
        <body link="#666666" vlink="#FFFFFF" alink="#CC0033">
        <table width="550" height="300" border="0" align="center">
        <tr>
        <th width="550" height="200"> <table width="550" height="300" border="0">
        <tr>
        <td width="550" height="20" align="center" valign="middle" bgcolor="#666666">
        <p align="left"><font color="#FFFFFF" size="-2" face="Verdana, Arial, Helvetica, sans-serif"><strong>Albar&aacute;n N&ordm;:</strong></font><font color="#FFFFFF" size="-2" face="Verdana, Arial, Helvetica, sans-serif"> '.$boundary.'. </font><font color="#FFFFFF" size="-2" face="Verdana, Arial, Helvetica, sans-serif"><strong>Fecha: </strong></font><font color="#FFFFFF" size="-3" face="Verdana, Arial, Helvetica, sans-serif">'.$fecha.'</font></p></td>
        </tr>
        <tr>
        <th width="550" height="280"><table width="550" height="344" border="0">
        <tr>
        <td width="80" height="20" align="left" valign="middle" bgcolor="#CCCCCC">
        <p><font size="-2" face="Verdana, Arial, Helvetica, sans-serif">Nombre:</font></p></td>
        <td width="470" height="20" align="left" valign="middle" bgcolor="#B7B0AA">
        <p><font color="#333333"><font face="Verdana, Arial, Helvetica, sans-serif"><font size="-2">'.$FirstName.'</font></font></font></p></td>
        </tr>
        <tr>
        <td width="80" height="20" align="left" valign="middle" bgcolor="#CCCCCC">
        <p><font size="-2" face="Verdana, Arial, Helvetica, sans-serif">Apellidos:</font></p></td>
        <td width="470" height="20" align="left" valign="middle" bgcolor="#B7B0AA">
        <p><font color="#333333"><font face="Verdana, Arial, Helvetica, sans-serif"><font size="-2">'.$LastName.'</font></font></font></p></td>
        </tr>
        <tr>
        <td width="80" height="20" align="left" valign="middle" bgcolor="#CCCCCC">
        <p><font face="Verdana, Arial, Helvetica, sans-serif"><font size="-2">Empresa:</font></font></p></td>
        <td width="470" height="20" align="left" valign="middle" bgcolor="#B7B0AA">
        <p><font color="#333333"><font face="Verdana, Arial, Helvetica, sans-serif"><font size="-2">'.$Company.'</font></font></font></p></td>
        </tr>
        <tr>
        <td width="80" height="20" align="left" valign="middle" bgcolor="#CCCCCC">
        <p><font face="Georgia, Times New Roman, Times, serif"><font size="-2"><font face="Verdana, Arial, Helvetica, sans-serif">Correo:</font></font></font></p></td>
        <td width="470" height="20" align="left" valign="middle" bgcolor="#B7B0AA">
        <p><font color="#333333"><font face="Verdana, Arial, Helvetica, sans-serif"><font size="-2"><a href="mailto:'.$Email.'">'.$Email.'</a></font></font></font></p></td>
        </tr>
        <tr>
        <td width="80" height="20" align="left" valign="top" bgcolor="#CCCCCC">
        <p><font face="Georgia, Times New Roman, Times, serif"><font size="-2"><font face="Verdana, Arial, Helvetica, sans-serif">Telefono:</font></font></font></p></td>
        <td width="470" height="20" align="left" valign="top" bgcolor="#B7B0AA">
        <p><font color="#333333"><font face="Verdana, Arial, Helvetica, sans-serif"><font size="-2">'.$Telephone.'</font></font></font></p></td>
        </tr>
        <tr>
        <td width="80" height="80" align="left" valign="top" bgcolor="#CCCCCC">
        <p><font face="Georgia, Times New Roman, Times, serif"><font size="-2"><font face="Verdana, Arial, Helvetica, sans-serif">Paquete:</font></font></font></p></td>
        <td width="470" height="80" align="left" valign="top" bgcolor="#B7B0AA">
        <p><font color="#FFFFFF" size="-2" face="Verdana, Arial, Helvetica, sans-serif"><b>Producto:</b></font><font color="#333333" size="-3" face="Verdana, Arial, Helvetica, sans-serif"> '.$Paquete.'. </font><font color="#FFFFFF" size="-3" face="Verdana, Arial, Helvetica, sans-serif"><b>Descripci&oacute;n:</b></font><font color="#333333" size="-3" face="Verdana, Arial, Helvetica, sans-serif"> '.$relato.'.</font></p></td>
        </tr>
        <!--Esta variable insertará una tabla si la variable domein no está vacía, caso contrario no modificará la tabla ni insertará nada-->
        '.$dominiotab.'
        <tr>
        <td width="80" height="20" align="left" valign="top" bgcolor="#CCCCCC">
        <p><font face="Georgia, Times New Roman, Times, serif"><font size="-2"><font face="Verdana, Arial, Helvetica, sans-serif">Pago:</font></font></font></p></td>
        <td width="470" height="20" align="left" valign="top" bgcolor="#B7B0AA">
        <p><font color="#333333"><font face="Verdana, Arial, Helvetica, sans-serif"><font size="-2">'.$Pago.'</font></font></font></p></td>
        </tr>
        <!--Lo mismo que la anterior pero con el plazo de pago, recordemos que esta variable es aplicable a algunos productos, ya que otros se cobran al finalizar el trabajo-->
        '.$esfilaapago.'
        <tr>
        <td width="80" height="20" align="left" valign="top" bgcolor="#CCCCCC">
        <p><font face="Georgia, Times New Roman, Times, serif"><font size="-2"><font face="Verdana, Arial, Helvetica, sans-serif">Pesos:</font></font></font></p></td>
        <td width="470" height="20" align="left" valign="top" bgcolor="#B7B0AA">
        <p><font color="#333333"><font face="Verdana, Arial, Helvetica, sans-serif"><font size="-2">'.$peso.'</font></font></font></p></td>
        </tr>
        <tr>
        <td width="80" height="20" align="left" valign="top" bgcolor="#CCCCCC">
        <p><font face="Georgia, Times New Roman, Times, serif"><font size="-2"><font face="Verdana, Arial, Helvetica, sans-serif">Dolares USA:</font></font></font></p></td>
        <td width="470" height="20" align="left" valign="top" bgcolor="#B7B0AA">
        <p><font color="#333333"><font face="Verdana, Arial, Helvetica, sans-serif"><font size="-2">'.$dolar.'</font></font></font></p></td>
        </tr>
        <tr>
        <td width="80" height="20" align="left" valign="top" bgcolor="#CCCCCC">
        <p><font face="Georgia, Times New Roman, Times, serif"><font size="-2"><font face="Verdana, Arial, Helvetica, sans-serif">Euros:</font></font></font></p></td>
        <td width="470" height="20" align="left" valign="top" bgcolor="#B7B0AA">
        <p><font color="#333333"><font face="Verdana, Arial, Helvetica, sans-serif"><font size="-2">'.$euro.'</font></font></font></p></td>
        </tr>
        <tr>
        <td width="80" height="20" align="left" valign="top" bgcolor="#CCCCCC">
        <p><font face="Georgia, Times New Roman, Times, serif"><font size="-2"><font face="Verdana, Arial, Helvetica, sans-serif">Entrega:</font></font></font></p></td>
        <td width="470" height="20" align="left" valign="top" bgcolor="#B7B0AA">
        <p><font color="#333333"><font face="Verdana, Arial, Helvetica, sans-serif"><font size="-2">'.$entrega.'</font></font></font></p></td>
        </tr>
        <!--Si el producto seleccionado incluye la selección de  una plantilla, nos mostrará una fila con el código de la plantilla seleccionada  y una imagen en pequeño de la misma-->
        '.$plantimagenpic.'
        <tr>
        <td width="80" height="20" align="left" valign="middle" bgcolor="#CCCCCC">
        <p><font face="Georgia, Times New Roman, Times, serif"><font size="-2"><font face="Verdana, Arial, Helvetica, sans-serif">Fecha:</font></font></font></p></td>
        <td width="470" height="20" align="left" valign="middle" bgcolor="#B7B0AA">
        <p><font color="#333333"><font face="Verdana, Arial, Helvetica, sans-serif"><font size="-2">'.$fecha.'</font></font></font></p></td>
        </tr>
        <tr>
        <td width="80" height="20" align="left" valign="middle" bgcolor="#CCCCCC">
        <p><font face="Georgia, Times New Roman, Times, serif"><font size="-2"><font face="Verdana, Arial, Helvetica, sans-serif">IP:</font></font></font></p></td>
        <td width="470" height="20" align="left" valign="middle" bgcolor="#B7B0AA">
        <p><font color="#333333"><font face="Verdana, Arial, Helvetica, sans-serif"><font size="-2">'.$REMOTE_ADDR.'</font></font></font></p></td>
        </tr>
        <tr>
        <td width="80" height="20" align="left" valign="middle" bgcolor="#CCCCCC">
        <p><font face="Georgia, Times New Roman, Times, serif"><font size="-2" face="Verdana, Arial, Helvetica, sans-serif">Serie:</font></font></p></td>
        <td width="470" height="20" align="left" valign="middle" bgcolor="#B7B0AA">
        <p><font color="#333333"><font face="Verdana, Arial, Helvetica, sans-serif"><font size="-2">'.$boundary.'</font></font></font></p></td>
        </tr>
        </table></th>
        </tr>
        </table> </th>
        </tr>
        </table>
        </body>
        </html>
        ';
        mail ('buzon@tuservidor.tudomino', 'Formulario de compra Nº:'.$boundary.'', $content, "MIME-Version: 1.0\nContent-type: text/html; charset=UTF-8\nFrom: $FirstName < $Email >");
        /**
        *Este html es el que recibe el cliente si selecciona como forma de pago moneybookers.
        *Usamos la función mail indicando que envíe el correo a nuestro servidor para control
        *con el título Formulario de contacto el contenido html y tipo de texto UTF-8 para que
        *los símbolos introducidos en los campos de flash sean legibles
        *para terminar le damos el nombre del remitente puesto en el formulario y su dirección de correo.
        *de aquí sólo se tiene que cambiar buzon@tuservidor.tudomino y poner el correo donde se
        *desean recibir los formularios, respetando los entrecomillados.
        *es importante que pongas una dirección de correo válida en lugar de buzon@tuservidor.tudomino,
        *si no el script podría no enviar el correo.
        */
        $mensajea = '
        <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
        <html xmlns="http://www.w3.org/1999/xhtml">
        <head>
        <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
        <title>Albar&aacute;n de compras.</title>
        <style type="text/css">
        <!--
        body {
        background-color: #B7B0AA;
        }
        .Estilo5 { color: #333333; font-family: Verdana, Arial, Helvetica, sans-serif }
        a:link {
        color: #5a5a5a;
        text-decoration: none;
        }
        a:visited {
        color: #666666;
        text-decoration: none;
        }
        a:active {
        color: #996666;
        text-decoration: none;
        }
        .Estilo6 {color: #996666}
        a {
        font-family: Verdana, Arial, Helvetica, sans-serif;
        }
        a:hover {
        text-decoration: underline;
        }
        .Estilo7 {
        font-family: Verdana, Arial, Helvetica, sans-serif;
        font-size: 12px;
        color: #333333;
        }
        .Estilo9 {font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 10px; color: #333333; }
        -->
        </style>
        <style type="text/css" media="print">
        .ImprimirNo { display:none; }
        </style>
        </head>
        <body>
        <table width="550" height="377" border="0" align="center">
        <tr>
        <td width="209" height="69" rowspan="3" bgcolor="#999999"><img src="http://www.tusitio.tudominio/multimedia/imagen/logocrop.gif" alt="Crop Estudio Creativo" width="209" height="69" longdesc="Crop Estudio Creativo. I + D En comunicaci&oacute;n" /></td>
        <td width="341" height="4" colspan="2" align="left" valign="top" bgcolor="#999999"></td>
        </tr>
        <tr>
        <th width="341" height="61" align="center" valign="middle" nowrap="nowrap" bgcolor="#B7B0AA"><div class="Estilo5" align="center">
        &nbsp;<font size="4">&nbsp;Confirmaci&oacute;n de pedido</font></div></th>
        </tr>
        <tr>
        <td width="341" height="4" colspan="2" align="left" valign="top" bgcolor="#999999"></td>
        </tr>
        <tr>                                                                                                                                                                                          <!--Usamos la variable del campo nombre para responder al cliente de forma amistosa -->
        <td width="550" height="274" colspan="2" align="left" valign="top"><p><span class="Estilo6"><font size="1" face="Verdana, Arial, Helvetica, sans-serif"><b>'.$FirstName.'</b>,
        gracias por su pedido.</font></span><br>
        <font size="1" color="#333333" face="Verdana, Arial, Helvetica, sans-serif">Su
        correo ha sido recibido y ser&aacute; atendido con la mayor brevedad
        posible.<br>
        Este correo confirma su pedido efectuado desde nuestro formulario
        de compras. </font></p>
        <table width="550" border="0" cellspacing="2" cellpadding="0">
        <tr height="15">
        <td width="372" bgcolor="#999999"><div align="left"><font size="1" color="#333333" face="Verdana, Arial, Helvetica, sans-serif">Albar&aacute;n N&ordm;:</font> <font size="-3" color="#333333" face="Verdana, Arial, Helvetica, sans-serif">'.$boundary.'.&nbsp;&nbsp;</font><font size="1" color="#333333" face="Verdana, Arial, Helvetica, sans-serif">Fecha:</font> <font size="-3" color="#333333" face="Verdana, Arial, Helvetica, sans-serif">'.$fecha.'.</font></div></td>
        <td height="15" colspan="2" bgcolor="#999999"><div align="center"><font size="1" color="#333333" face="Verdana, Arial, Helvetica, sans-serif">Precio</font></div></td>
        </tr>
        <tr height="15">
        <td width="372" rowspan="3" align="left" valign="top"><div align="left"><font size="1" color="#333333" face="Verdana, Arial, Helvetica, sans-serif"><b>Producto:</b> '.$Paquete.'. </font><font size="-3" color="#333333" face="Verdana, Arial, Helvetica, sans-serif"><b>Descripci&oacute;n:</b> '.$relato.'.</font></div></td>
        <td width="82" height="15" bgcolor="#CCCCCC"><font size="1" color="#333333" face="Verdana, Arial, Helvetica, sans-serif">Pesos Chilenos</font></td>
        <td width="88"><div align="right"><font size="1" color="#996666" face="Verdana, Arial, Helvetica, sans-serif">$ '.$peso.'</font></div></td>
        </tr>
        <tr height="15">
        <td width="82" height="12" bgcolor="#CCCCCC"><font size="1" color="#333333" face="Verdana, Arial, Helvetica, sans-serif">Euros</font></td>
        <td width="88"><div align="right"><font size="1" color="#996666" face="Verdana, Arial, Helvetica, sans-serif">'.$euro.'</font><font size="1" color="#996666" face="Verdana, Arial, Helvetica, sans-serif"> &euro;</font></div></td>
        </tr>
        <tr height="18">
        <td width="82" height="18" bgcolor="#CCCCCC"><font size="1" color="#333333" face="Verdana, Arial, Helvetica, sans-serif">D&oacute;lares</font></td>
        <td width="88"><div align="right"><font size="1" color="#996666" face="Verdana, Arial, Helvetica, sans-serif">US$ '.$dolar.' </font></div></td>
        </tr>
        <!--Aquí es donde incluiremos el dominio seleccionado y la forma de pago si es que el producto seleccionado por el cliente trae estas opciones-->
        '.$dominio.'
        '.$filaapago.'
        <tr height="18">
        <td height="15" colspan="2" align="left" valign="middle"><div align="left"><span class="Estilo9">Plazo de entrega: '.$entrega.'</span></div>
        </td>
        <td height="15" align="left" valign="top"><a href="https://www.moneybookers.com/app/?rid=1951932" target="_blank"><img src="http://www.moneybookers.com/images/banners/88_en_interpayments.gif" alt="MoneyBookers" width=88 height=31 border=0 style="border-width: 1px; border-color: #8B8583;"></a></td>
        </tr>
        <!--Aquí vendría la imagen en grande de la plantilla seleccionada por el cliente -->
        '.$plantimagenbig.'
        </table>
        <font size="1" color="#333333" face="Verdana, Arial, Helvetica, sans-serif">Si no tiene cuenta en Money Bookers siga <a href="https://www.moneybookers.com/app/?rid=1951932" target="_blank">este enlace.</a> <br />
        Si ya tiene cuenta en MoneyBookers, entre en su cuenta y realice un ingreso, a la cuenta de correo de <a href="mailto:pagos@tudominio.tusitio">pagos@tusitio.tudominio</a>.<br />Por <b>'.$dolar.'</b> dolares USA, o por <b>$ '.$peso.'</b> Pesos Chilenos, o por <b>'.$euro.'</b> Euros.<br>
        </font><font size="1" color="#333333" face="Verdana, Arial, Helvetica, sans-serif">Una vez realizado el pago tendr&aacute; su producto en el plazo estipulado en nuestras listas.</font><font color="#333333"><br>
        </font><font size="1" color="#333333" face="Verdana, Arial, Helvetica, sans-serif">Si
        recibe este correo por accidente, por favor, comun&iacute;quelo a
        nuestro <a href="mailto:webmaster@tusitio.tudominio">Administrador</a> de red.            <br>
        Si lo desea puede hacerlo a trav&eacute;s de nuestro <a href="http://www.tusitio.tudominio">formulario</a>
        de contacto.</font><font color="#333333"><br>
        </font><font size="1" color="#333333" face="Verdana, Arial, Helvetica, sans-serif">Este
        formulario ha sido enviado el '.$fecha.'.<br>
        Desde la IP: '.$REMOTE_ADDR.' <br><!--Usaremos el código aleatorio como número de albarán de compra, y las condiciones del contrato las mostrará si el cliente selecciona cualquiera de los productos que requieran de las condiciones del contrato -->
        Albar&aacute;n de compra N&ordm;: '.$boundary.'</font>'.$condiciones.'</td>
        </tr>
        <tr bgcolor="#999999">
        <td height="10" colspan="2" align="left" valign="middle"><table width="550" height="8">
        <tr>
        <td width="375" align="left" valign="middle"><font color="#333333" size="1" face="Verdana, Arial, Helvetica, sans-serif">&copy; Crop Estudio Creativo. I + D en comunicaci&oacute;n.</font></td>
        <td width="175" align="right" valign="middle"><a href="http://www.tusitio.tudominio"><font color="#FFFFFF" size="1" face="Verdana, Arial, Helvetica, sans-serif">http://www.tusitio.tudominio</font></a></td>
        </tr>
        </table></td>
        </tr>
        </table>
        </body>
        </html>
        ';
        //Este html es el que recibe el cliente si selecciona como forma de pago otras.
        $mensajeb = '
        <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
        <html xmlns="http://www.w3.org/1999/xhtml">
        <head>
        <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
        <title>Albar&aacute;n de compras.</title>
        <style type="text/css">
        <!--
        body {
        background-color: #B7B0AA;
        }
        .Estilo5 { color: #333; font-family: Verdana, Arial, Helvetica, sans-serif }
        a:link {
        color: #5a5a5a;
        text-decoration: none;
        }
        a:visited {
        color: #666666;
        text-decoration: none;
        }
        a:active {
        color: #996666;
        text-decoration: none;
        }
        .Estilo6 {color: #996666}
        a {
        font-family: Verdana, Arial, Helvetica, sans-serif;
        }
        a:hover {
        text-decoration: underline;
        }
        .Estilo9 {font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 10px; color: #333333; }
        -->
        </style>
        <style type="text/css" media="print">
        .ImprimirNo { display:none; }
        </style>
        </head>
        <body>
        <table width="550" height="377" border="0" align="center">
        <tr>
        <td width="209" height="69" rowspan="3" bgcolor="#999999"><img src="http://www.tusitio.tudominio/multimedia/imagen/logocrop.gif" alt="Crop Estudio Creativo" width="209" height="69" longdesc="Crop Estudio Creativo. I + D En comunicaci&oacute;n" /></td>
        <td width="341" height="4" colspan="2" align="left" valign="top" bgcolor="#999999"></td>
        </tr>
        <tr>
        <th width="341" height="61" align="center" valign="middle" nowrap="nowrap" bgcolor="#B7B0AA"><div class="Estilo5" align="center">
        &nbsp;<font size="4">&nbsp;Confirmaci&oacute;n de pedido</font></div></th>
        </tr>
        <tr>
        <td width="341" height="4" colspan="2" align="left" valign="top" bgcolor="#999999"></td>
        </tr>
        <tr>                                                                                                                                                                                          <!--Usamos la variable del campo nombre para responder al cliente de forma amistosa -->
        <td width="550" height="274" colspan="2" align="left" valign="top"><p><span class="Estilo6"><font size="1" face="Verdana, Arial, Helvetica, sans-serif"><b>'.$FirstName.'</b>,
        gracias por su pedido.</font></span><br>
        <font size="1" color="#333333" face="Verdana, Arial, Helvetica, sans-serif">Su
        correo ha sido recibido y ser&aacute; atendido con la mayor brevedad
        posible.<br>
        Este correo confirma su pedido efectuado desde nuestro formulario
        de compras. </font></p>
        <table width="550" border="0" cellspacing="2" cellpadding="0">
        <tr height="15">
        <td width="372" bgcolor="#999999"><div align="left"><font size="1" color="#333333" face="Verdana, Arial, Helvetica, sans-serif">Albar&aacute;n N&ordm;:</font> <font size="-3" color="#333333" face="Verdana, Arial, Helvetica, sans-serif">'.$boundary.'.&nbsp;&nbsp;</font><font size="1" color="#333333" face="Verdana, Arial, Helvetica, sans-serif">Fecha:</font> <font size="-3" color="#333333" face="Verdana, Arial, Helvetica, sans-serif">'.$fecha.'.</font></div></td>
        <td height="15" colspan="2" bgcolor="#999999"><div align="center"><font size="1" color="#333333" face="Verdana, Arial, Helvetica, sans-serif">Precio</font></div></td>
        </tr>
        <tr height="15">
        <td width="372" rowspan="3" align="left" valign="top"><div align="left"><font size="1" color="#333333" face="Verdana, Arial, Helvetica, sans-serif"><b>Producto:</b> '.$Paquete.'. </font><font size="-3" color="#333333" face="Verdana, Arial, Helvetica, sans-serif"><b>Descripci&oacute;n:</b> '.$relato.'.</font></div></td>
        <td width="82" height="15" bgcolor="#CCCCCC"><font size="1" color="#333333" face="Verdana, Arial, Helvetica, sans-serif">Pesos Chilenos</font></td>
        <td width="88"><div align="right"><font size="1" color="#996666" face="Verdana, Arial, Helvetica, sans-serif">$ '.$peso.'</font></div></td>
        </tr>
        <tr height="15">
        <td width="82" height="12" bgcolor="#CCCCCC"><font size="1" color="#333333" face="Verdana, Arial, Helvetica, sans-serif">Euros</font></td>
        <td width="88"><div align="right"><font size="1" color="#996666" face="Verdana, Arial, Helvetica, sans-serif">'.$euro.'</font><font size="1" color="#996666" face="Verdana, Arial, Helvetica, sans-serif"> &euro;</font></div></td>
        </tr>
        <tr height="18">
        <td width="82" height="18" bgcolor="#CCCCCC"><font size="1" color="#333333" face="Verdana, Arial, Helvetica, sans-serif">D&oacute;lares</font></td>
        <td width="88"><div align="right"><font size="1" color="#996666" face="Verdana, Arial, Helvetica, sans-serif">US$ '.$dolar.' </font></div></td>
        </tr>
        <!--Igual que en la anterior plantilla aquí figuraran el nombre de dominio y el plazo de pago seleccionado por el cliente si procediera -->
        '.$dominio.'
        '.$filaapago.'
        <tr height="18">
        <td height="15" colspan="3" align="left" valign="middle"><div align="left"><span class="Estilo9">Plazo de entrega: '.$entrega.'</span></div>
        </td>
        </tr>
        <!--Y aquí la imagen y descripción de la plantilla -->
        '.$plantimagenbig.'
        </table>
        <font size="1" color="#333333" face="Verdana, Arial, Helvetica, sans-serif">Un comercial de nuestra compa&ntilde;&iacute;a contactar&aacute; con usted para ultimar los detalles de pago y formalizar el pedido. <br>
        </font><font size="1" color="#333333" face="Verdana, Arial, Helvetica, sans-serif">Una vez realizado el pago tendr&aacute; su producto en el plazo estipulado en nuestras listas.</font><font color="#333333"><br>
        </font><font size="1" color="#333333" face="Verdana, Arial, Helvetica, sans-serif">Si
        recibe este correo por accidente, por favor, comun&iacute;quelo a
        nuestro <a href="mailto:webmaster@tusito.tudominio">Administrador</a> de red.            <br>
        Si lo desea puede hacerlo a trav&eacute;s de nuestro <a href="http://www.tusitio.tudominio">formulario</a>
        de contacto.</font><font color="#333333"><br>
        </font><font size="1" color="#333333" face="Verdana, Arial, Helvetica, sans-serif">Este
        formulario ha sido enviado el '.$fecha.'.<br>
        Desde la IP: '.$REMOTE_ADDR.' <br> <!--Usaremos el código aleatorio como número de albarán de compra, y las condiciones del contrato las mostrará si el cliente selecciona cualquiera de los productos que requieran de las condiciones del contrato -->
        Albar&aacute;n de compra N&ordm;: '.$boundary.'</font>'.$condiciones.'</td>
        </tr>
        <tr bgcolor="#999999">
        <td height="10" colspan="2" align="left" valign="middle"><table width="550" height="8">
        <tr>
        <td width="375" align="left" valign="middle"><font color="#333333" size="1" face="Verdana, Arial, Helvetica, sans-serif">&copy; Crop Estudio Creativo. I + D en comunicaci&oacute;n.</font></td>
        <td width="175" align="right" valign="middle"><a href="http://www.tusitio.tudominio"><font color="#FFFFFF" size="1" face="Verdana, Arial, Helvetica, sans-serif">http://www.tusitio.tudominio</font></a></td>
        </tr>
        </table></td>
        </tr>
        </table>
        </body>
        </html>
        ';
        /**
        *de este html podemos hacernos uno a nuestro gusto y reemplazarlo
        *desde la etiqueta de apertura html hasta la de cierre respetando la comilla
        *simple de apertura y la comilla simple de cierre y el punto y coma.
        *Podremos reutilizar '.$Nombre.', para personalizar el mail así como
        *la IP, la fecha y por supuesto el número de serie.
        *Para poder usar el nombre la ip la fecha o el número de serie se tienen que
        * @ poner '. .', o sea abrir con comilla simple y punto y cerrar con punto y comilla simple.
        * @ así en todos los casos '.$fecha.'
        *De las líneas que están debajo de ésta tendremos que cambiar
        *tubuzon@tuservidor.tudominio por la dirección de correo de tu servidor.
        */
        $cabeceras = 'MIME-Version: 1.0' ."\r\n";
        $cabeceras . = 'Content-type: text/html; charset=UTF-8' ."\r\n";
        $cabeceras . = 'From: Crop Creativos < buzon@tuservidor.tudomino >' ."\r\n";
        //Si la forma de pago seleccionada es moneybookers se enviará el primer mensaje, etiquetado como variable mensajea.
        if (stristr ($Pago, 'Otras') === FALSE)
        {
                mail ("$FirstName < $Email >", "Su pedido ha sido recibido", $mensajea, $cabeceras);
        }else
        {
                //Si la forma seleccionada es otras enviará el mensajeb.
                mail ("$FirstName < $Email >", "Su pedido ha sido recibido", $mensajeb, $cabeceras);
        }
}
/**
*es importante que pongas una dirección de correo válida en lugar de buzon@tuservidor.tudomino,
*si no el script podría no enviar el correo.
*Y finalmente le enviamos a nuestro formulario flash la palabra que pondrá en marcha
*la animación que ira borrando los campos de texto y confirmará nuestro envío
*dejándonos en el botón repetir por si deseamos mandar otro.
*De aquí sólo tenemos que tener en cuenta en qué nivel o dentro de qué clip hemos
*puesto nuestro formulario y cambiar la ruta si fuera preciso.
*Si cambiamos la palabra Enviando por otra lo tendremos que indicar en el sensor
*de nuestro formulario flash
*Y por ultimo tendremos que tener en cuenta dónde se carga nuestro formulario en
*nuestro servidor y dónde ponemos este php para que lo encuentre al pasarle las
*variables desde flash.
*/
Print "_level0.formulariopedido.EmailStatus=Enviando";
?>

¿Cómo funciona el formulario? :

Básicamente este formulario gira en torno a la selección del producto en el componente combobox (menú desplegable) . Si se selecciona cualquiera de los paquetes completos, que además incluyen sitio Web realizado en flash, automáticamente, el formulario salta al fotograma 3 donde se encuentra la galería de imágenes cortesía de Jorge Solís, modificado para seleccionar plantilla, en principio al llegar a este fotograma todos los campos y botones se desactivan, y los ocultamos usando un fondo, podríamos usar código para hacerlos invisibles, pero así nos lo ahorramos. Al llegar a la galería las plantillas se muestran como iconos, y bajo la cabecera, un mensaje invita al usuario a seleccionar un icono para verlo más detalladamente, al hacer clic sobre el icono, éste se aumenta ocupando el espacio delimitado por la galería y el mensaje cambia, invitando al usuario a hacer clic sobre la imagen para seleccionar esa plantilla.

Al hacerlo, retorna al fotograma dos donde se reactivan todos los campos, botones y además aparece el campo de la plantilla, con su título, la plantilla seleccionada un aviso presionar botón borrar para seleccionar una nueva plantilla y el botón borrar. Si pulsamos el botón borrar nos envía directamente a la galería de nuevo.

Los paquetes completos además incluyen nombre de dominio, con lo que nos aparecerá al pie del formulario, el buscador Whois cortesía de Dano, modificado para que nos indique si el dominio está disponible o no. Si está disponible nos muestra un mensaje donde nos indica que presionemos el botón aceptar para seleccionar el dominio que hemos introducido, en caso contrario indica que el dominio está ocupado y no muestra el botón aceptar. Al usar el botón aceptar, pasa el nombre de dominio al formulario, mostrando el título dominio, el dominio seleccionado completo un botón borrar y un aviso, para que usemos el botón borrar si deseamos otro dominio, además oculta el buscador y desactiva campos y botones. Al usar el botón borrar, borra el dominio y muestra y activa de nuevo el buscador de dominios.

Al seleccionar cualquier producto de la lista desplegable, en el formulario muestra las características del paquete seleccionado y su precio en Pesos Chilenos, Dólares USA, y Euros, y dependiendo del producto seleccionado si está permitido el pago mensual, muestra dos componente checkbox, uno para precio anual y otro mensual, cuyos valores al seleccionarlos en el combobox los convertimos en variables globales para que puedan ser usados, ya que al seleccionar mes o anual los valores cambian en los campos de monedas.

Cuando vamos a hacer el envío en el botón enviar tenemos una programación que comprueba que todos los campos obligatorios estén rellenos y además mira la selección que hemos realizado por si hubiera alguna otra opción que mostrar. Si alguno de los productos seleccionados incluye el aceptar las condiciones del contrato, antes de mandar el email nos envía al fotograma 5 donde se encuentran las condiciones del contrato y dos botones aceptar y cancelar, si usamos cancelar, nos manda al fotograma dos y en el cuadro de texto de estado nos indica que tenemos que aceptar las condiciones del contrato de otra forma no mandará el formulario, así que si presionamos de nuevo enviar nos manda a las condiciones. Si aceptamos las condiciones en el propio botón aceptar está el código para enviar los datos al formulario, antes mira a ver qué forma de pago está seleccionada, ya que si seleccionamos Moneybookers, el correo que nos envía es distinto al que mandaríamos seleccionando otras formas de pago.

¿Qué necesito para compilarlo?.

Tal y como está ahora, está programado para que al extraer el zip en una carpeta ya se encuentre todo lo necesario para que se compile. No olvidemos cambiar en el php las direcciones de correo y url por las de nuestro servidor para que nos envíe a nosotros la respuesta, y además de configurar los html con las direcciones absolutas a donde tengamos las imágenes en nuestro servidor que incluyamos en nuestro formulario de respuesta.

¿Que necesito para que funcione en el servidor?.

En el servidor, tal y como está ahora, en nuestro home (en algunos casos se muestra como la carpeta public_html o carpeta www), tendremos que tener instalado amfphp y dentro de la carpeta services las clases de dano. En public_html subiremos todas las carpetas menos la de Danonino, ya que las clases As quedarán compiladas, no obstante si que tendremos que subir los archivos as de la galería. Nuestro formulario swf se tiene que cargar en el mismo nivel de los archivos y carpetas del formulario, si queremos cambiar las ubicaciones tendremos que mirar cuidadosamente el fla el php y todos los archivos as que se incluyen en este zip.

El proximo tutorial, con permiso de Freddie, será como hacer el envio del formulario con AMFPHP, lo que quiere decir que no necesitaremos tener activada la opción GLOBAL_REGISTER en ON y se podra enviar desde cualquier servidor que admita php, algo que muchos de vosotros me pedíais.

¿Sabes SQL? ¿No-SQL? Aprende MySQL, PostgreSQL, MongoDB, Redis y más con el Curso Profesional de Bases de Datos que empieza el martes, en vivo.

Descargar Archivo

Publica tu comentario

El autor de este artículo ha cerrado los comentarios. Si tienes preguntas o comentarios, puedes hacerlos en el foro

Entra al foro y participa en la discusión

o puedes...

¿Estás registrado en Cristalab y quieres
publicar tu URL y avatar?

¿No estás registrado aún pero quieres hacerlo antes de publicar tu comentario?

Registrate