var preguntas = new obj_listapregs();

//PREGUNTA 0
preguntas.creapregta("¿Como editar los programas JavaScript?");
preguntas.crearespta(0, 
"Los programas en JavaScript son interpretados, no compilados, por lo que sólo "+
"necesitas un editor de textos, el mismo que uses para crear páginas web. Si para "+
"esto usas un editor HTML seguro que posee una opción para escribir el código "+
"directamente, úsala para escribir tus scripts. Existen editores HTML que facilitan "+
" esta tarea como puede ser Dreamweaver.");
preguntas.crearespta(0, 
"Existen algunos editores específicos para facilitar la escritura de programas Javascript. "+
"Dos buenos ejemplos de ellos son los señalados en la sección de recursos: NetObjectBuilder "+
"y Scriblet."); 
preguntas.crearespta(0,
'Con el Wordpad de Windows va muy bien. No hay que olvidar guardar en modo de texto y con '+
'la extensión .html. Yo me olvidaría de esos fantásticos editores que existen... a veces '+
'quedan algunas cosas algo imprecisas.');

//PREGUNTA 1
preguntas.creapregta("¿Como se pueden depurar los programas escritos en Javascript?");
preguntas.crearespta(1, 
"Los exploradores avisan cuando aparecen errores, este es uno de los poquísimos casos en que "+
"Netscape se comporta mejor que MSIExplorer. Pero ambos te orientan sobre donde se encuentra "+
"el error. Puedes usar las ventanas alert para colocar puntos de parada en tus scripts, estas "+
"<b>alerts</b> te servirán para informarte sobre valores de variables del programa.");

preguntas.crearespta(1, 
"Si usas Microsoft Internet Explorer existe un debugger que abre el "+
"programa causante del error indicando la línea donde se ha producido. Puedes encontrarlo en "+
"<a href='http://msdn.microsoft.com/scripting/' target='_blank'>Microsoft</a>. También Netscape posee un depurador "+
"que puedes encontrar en <a href='http://developer.netscape.com' target='_blank'>Netscape</a>");

//PREGUNTA 2
preguntas.creapregta("¿Cómo puedo crear una rutina para que se me procese un formulario y "+
"me lo mande a una dirección de correo?")
preguntas.crearespta(2, 
"Si necesitas procesar los datos antes de enviarlos el método es bien sencillo. Asignas "+
"al atributo <b>action</b> del FORMulario el valor \"mailto:\" seguido de la dirección de "+
"correo del destinatario y pones el evento <b>onsubmit = \"return procesar()\"</b> donde "+
"<b>procesar</b> es la función que tu defines para procesar los campos del formulario, si "+
"esta función devuelve <b>true</b> el formulario se enviará si devuelve false el "+
"formulario no se envía. Pon también el atributo <b>enctype =\"text/plain\"</b> de esta "+
"forma los datos irán en el cuerpo del mensaje en lugar de como datos adjuntos y por último "+
"pones el atributo <b>method = \"POST\"</b>. Por supuesto debes poner un botón tipo <b>submit</b>.") 

//PREGUNTA 3
preguntas.creapregta("¿Cuando se carga una página, cómo puedo hacer desaparecer las barras de herramientas, de menú y estado de manera automática con JavaScript?")
preguntas.crearespta(3, 
'El objeto window posee el método open para abrir una nueva ventana, posee tres '+
'argumentos: el primero es la dirección de la página que se mostrará en la '+
'nueva ventana, el segundo es el nombre del nuevo objeto ventana creado y el tercero, '+
'opcional, controla las propiedades de la nueva ventana. Así para crear una ventana '+
'limpia se puede usar la sentencia siguiente<br>'+
'<b>window.open("url.htm", "nom", "Menubar=no")</b>'); 
//PREGUNTA 4
preguntas.creapregta('¿Cómo puedo hacer que al entrar en una página que tarda un poco en ser cargada aparezca un único texto que diga \"Cargando...\" y '+
'una vez se haya cargado nos muestre el contenido de dicha página?');
preguntas.crearespta(4,
'Lo mas simple es crear un <b>DIV</b> con el mensaje Cargando página, espere por favor o similar'+
'Este DIV se situa inmediatamente despues de la etiqueta <b>BODY</b>, llevará un atributo ID y tendrá '+
'posicionamiento absoluto. Luego en la etiqueta <b>BODY</b> se coloca un evento <b>onLoad</b> que '+
'ponga en <b>hidden</b> el atributo <b>visibility</b> del mensaje.<br><br>'+
'&lt;DIV id="msgCarga" style="position: absolute; <br>'+
'left:200px; top=300px; visibility:visible"&gt;<br>'+
'Cargando página...&lt;/DIV&gt<br><br>'+
' El estilo también puede definirse en una sección <b>style</b> y asignárselo en el atributo <b>class</b>.'+
'<br>La etiqueta <b>BODY</b> quedará:<br><br>'+
'&lt;BODY onLoad="finCarga()"&gt;<br><br>'+
'La función finCarga() estará previamente definida en la sección <b>HEAD</b> como:<br>'+
'<b>function finCarga()</b><br>'+
'{<br>'+
' if (navigator.appName!= "Netscape")<br>'+
'   document.all["msgCarga"].style.visibility="hidden"<br>'+
' else<br>'+
'	document.layers["msgCarga"].visibility = "hidden"<br>'+
'}');

//PREGUNTA 5
preguntas.creapregta('¿ Como puedo utilizar el atributo "src" en la etiqueta &lt;script&gt;'+
' ya que quiero enlazar un codigo javascript escrito en un archivo .txt ?');
preguntas.crearespta(5,
'El método es muy sencillo basta con lo siguiente:<br>'+
'&lt;scr'+'ipt language="JavaScript" src="programa.js"&gt;<br>&lt;/script&gt<br>'+
'En el atributo src irá la dirección URL del archivo de programa. Los ficheros Javascript '+
'son ficheros de texto pero es conveniente usar la extensión '+
'js en el nombre, pues Windows los asocia como fichero de programa Javascript');

//PREGUNTA 6
preguntas.creapregta('En la página de entrada de JavaScriptDesdeCero hay unos botones de '+
'navegación que muestran al frente un cuadro descripitivo del respectivo '+
'vínculo cuando se pasa el mouse. Quisiera saber cómo se logra esto y cómo puedo '+
' aprender a hacerlo.');
preguntas.crearespta(6,
'Primero crea la capa que vaya a contener el texto a mostrar, llamémosla textoExpl '+
'Luego en el elemento del índice se asigna a un evento onMouseover una función que ponga esa '+
'capa en visible y al evento onMouseout otra que la oculte.<br> '+
'Por capa se entiende un elemento DIV con atributo ID y un estilo CSS con posicionamiento '+
'absoluto. Ejemplo:<br><br>'+
'&lt;style&gt;<br>'+
'.capa {position:absolute; visibility:hidden; <br>left:100px; top: 200px}<br>'+
'&lt;/style&gt;<br><br> '+
'function verCapa(capa)<br>{<br>document.all[capa].style.visibility="visible";<br>}<br>'+
'function cerCapa(capa)<br>{<br>document.all[capa].style.visibility="hidden";<br>}<br>'+
'El código HTML para un elemento del índice es: <br> '+
'&lt;a href="destino.htm" <br>onMouseOver="verCapa(\' textoExpl \')"<br>'+
'onMouseout="cerCapa(\' textoExpl \')"&gt;<br> '+
'El texto del enlace&lt/a&gt<br><br>'+
'Por último la capa será: <br>'+
'&ltDIV ID="textoExpl" class="capa"&gt;<br>Explicación a mostrar<br>&lt;/DIV&gt;<br>'
)
//PREGUNTA 7
preguntas.creapregta('¿como logro el efecto de que cuando muevo las barras de dezplazamiento '+
'parece que el fondo se queda estatico y lo unico que se mueve es el texto e imagenes?');
preguntas.crearespta(7,
'No es que parezca es que el fondo permanece fijo. Existen dos opciones: HTML y estilos CSS. '+
'El método HTML consiste en añadir el atributo <b>bgproperties</b> con el valor <b>fixed</b>, '+
'en la etiqueta BODY, que quedaría como sigue:<br>'+
'&lt;body background="mifondo.gif" bgproperties="fixed"&gt;<br><br>'+
'El segundo método es crear una clase de estilo CSS o redefinir la clase body, algo así:<br>'+
'&lt;style type="text/css"&gt;<br>'+
'.fondofijo {  background: url(mifondo.gif) fixed}<br>'+
'&lt;/style&gt;<br>'+
'&lt;body class="fondofijo"&gt;<br>'+
'Aqui seguirá la página Web...<br>'
)
//PREGUNTA 8
preguntas.creapregta('quiero presentar varias imagenes que se esten cambiando con cierta '+
'frecuencia y cada una de ellas que tenga un hipervinculo hacia una página específica. '+
'¿cómo puedo lograrlo?');
preguntas.crearespta(8,
'Un método es usar varias capas DIV ocultas y un evento temporizador que vaya activando '+
'cada capa y ocultando las demas. Aquí va un ejemplo con un par de imágenes:<br>'+
'&lt;style type="text/css"&gt;<br>'+
'.capa { position:absolute; visibility:hidden; left: 100px; top: 100px}<br>'+
'&lt;/style&gt;<br>'+
'Con esto definimos una capa con posicionamineto absoluto en la página. Y ahora dentro '+
'del cuerpo de la página metemos las capas con el contenido que desees<br>'+
'&lt;div id="capa0" class="capa"&gt;&lt;a href="ref1.htm"&gt;<br>'+
'&lt;img src="imagen.jpg&gt;&lt;/a&gt;&lt;/div&gt;<br>'+
'&lt;div id="capa1" class="capa"&gt;&lt;a href="ref1.htm"&gt;<br>'+
'&lt;img src="imagen.jpg&gt;&lt;/a&gt;&lt;/div&gt;<br>'+
'En la sección HEAD ponemos el script que alterna las capas:<br>'+
'&lt;script language="javascript"&gt;<br>'+
'var capaAct = 0;<br>'+
'var capas = new Array();<br>'+
'capas[0] = "capa0"<br>'+
'capas[1] = "capa1"<br>'+
'function verCapa()<br>'+
'{document.all[capas[capaAct]].style.visibility = "hidden"<br>'+
'capaAct++<br>'+
'if (capaAct >= capas.length) capaAct = 0;<br>'+
'document.all[capas[capaAct]].style.visibility = "visible"<br>}<br>'+
'function iniciaTemp()<br>'+
'{ setInterval(verCapa, 1000);}<br>'+
'El temporizador repite la función verCapa cada 1000 msec.Por último la función '+
'comenzará a funcionar cuando se carga la página<br>'+
'&lt;body onLoad="inicaTemp()"&gt;<br>'
);
//PREGUNTA 9
preguntas.creapregta('¿Como puedo hacer para que mis links se subrayen al poner el ratón '+
'encima, o simplemente para que no aparezcan subrayados?');
preguntas.crearespta(9, 
'Usando los eventos onMouseOver para poner el subrayado y onMouseOut para eliminar el '+
'subrayado. Es bien fácil, en la sección Head pones el código Javascript<br>'+
'&lt;script language="JavaScript"&gt;<br>'+
'function subRayar(elem, sn)<br>'+
'{<br>'+
'if (sn)<br>'+
'    elem.style.textDecoration="underline"<br>'+
' else<br>'+
'	elem.style.textDecoration="none"<br>'+
' }	<br>'+
'En el cuerpo de la página colocamos el enlace con los eventos correspondientes<br>'+
'&lt;a href="destino.htm" <br>'+
'id="enl1" style="text-decoration: none" <br>'+
'onMouseover="subRayar(this,true)" <br>'+
'onMouseOut="subRayar(this,false)"&gt;<br>'+
'El texto del enlace&lt;/a&gt;<br>'+
'Y listo.')
//PREGUNTA 10
preguntas.creapregta('¿Como logro hacer que cuando pase el ratón sobre una imagen '+
'ésta se cambie por otra?');
preguntas.crearespta(10, 
'Usando los eventos onMouseOver para poner la nueva imagen y onMouseOut para '+
'reponer la original. En la sección Head pones el código Javascript<br>'+
'&lt;script language="JavaScript"&gt;<br>'+
'function nuevaImg(imagen, archivo)<br>'+
'{<br>'+
'document.images[imagen].src = archivo;<br>'+
' }	<br>'+
'En el cuerpo de la página colocamos el enlace con los eventos correspondientes<br>'+
'&lt;a href="#" onclick="return false" <br>'+
'onMouseover="nuevaImg(\'imagen\',\'origen1.gif\')" <br>'+
'onMouseOut="nuevaImg(\'imagen\',\'origen0.gif\')"&gt;<br>'+
'&lt;img name="imagen" src="origen0.gif" width="20" height="20" <br>'+
'border="0"&gt;&lt;/a&gt;<br>'+
'Ojo, si quieres que el enlace funcione elimina todo el evento <b>onclick</b>. ¿Por qué '+
'este absurdo enlace nulo? es necesario para que funcione en Netscape (!¡). Si sólo lo '+
'quieres para IExplorer y no quieres enlace elimínalo y pon los eventos onmouseover y '+
' onmouseout a la imagen, como ves IExplorer es mucho mas sencillo.')
//PREGUNTA 11
preguntas.creapregta('Quisiera que me ayuden para obtener un script que me permita crear '+
'dos casillas.. y un boton "ENVIAR" cuya funcion sea enviar los datos rellenados a un '+
'e-mail.. y al mismo tiempo cargar una pàgina de agradecimiento.');
preguntas.crearespta(11, 
'Mira la pregunta numero 3 para enivar un formulario procesado.<br>'+
'En cuanto a la página de agradecimiento debemos emplar un pequeño truco pues <b>submit</b> '+
'tan sólo es capaz de enviar el formulario. El truco es usar el método <b>setTimeout</b> '+
'con el primer atributo igual a window.location="gracias.htm" y el segundo atributo lo '+
'bastante corto para que actúe mientras se envía el formulario:<br>'+
'window.setTimeout("window.location=\'gracias.htm\'", 10)<br>'+
'Esta sentencia irá colocada en la rutina de procesado del formulario.');
//PREGUNTA 12
preguntas.creapregta('¿Cómo puedo modificar a través una variable (que dependa de un '+
'dato devuelto por una cookie, nombre de un usuario X, por ejemplo), el valor de una '+
' etiqueta hidden de un formulario, es decir, el atributo value="variable"?');
preguntas.crearespta(12, 
'Una vez leído el valor del cookie basta con hacer una sencilla asignación:<br> '+
'     document.forms.nombreformulario.nombrecampo.value = valor_del_cookie; <br>'+
'Por ejemplo la siguiente rutina lee los valores de los cookies y los almacena en un '+
'array indexado por nombres. Partimos de que la página guardó los siguientes pares '+
'nombre=valor en el cookie<br>'+
' nombre = juanito; <br>'+
' pais = colombia; <br>'+
' sexo = varon; <br>'+ 
'con los expires correspondientes.<br>' +
'Definimos la funcion de lectura del cookie que devuelve una matriz indexada por el '+
'nombre de cada pareja nombre=valor<br>'+
'function leerCookies()<br>'+
'{<br>'+
'var listaCookies = document.cookie.split("; ");<br>'+
'var arrayCookies = new Array();<br>'+
'var parNomVal;<br>'+
'for (var i = 0; i < listaCookies.length; i++)<br>'+
'   {<br>'+
'	parNomVal = listaCookies[i].split("=");<br>'+
'   arrayCookies[unescape(parNomVal[0])]=unescape(parNomVal[1]);<br>'+
'   }<br>'+
'return arrayCookies;<br>}<br>'+
'Ahora definimos una función para ser llamada por el evento <b>onsubmit</b> del '+
'formulario. Suponiendo que el atributo name del formulario es formul1 y el campo hidden '+
'se llama oculto la función sería la siguiente<br>'+
'function procesar()<br>'+
'{<br>'+
'var cookies=leerCookies();<br>'+
'document.forms.formul1.oculto.value= <br>'+'cookies["nombre"];<br>'+
'return true<br>'+
'}<br>'+
'Esta función puede aprovecharse para comprobar que el formulario está correctamente relleno '+
'como se dice en la respuesta a la pregunta 3.<br>'+
'Con esto debería funcionar.');
//PREGUNTA 13
preguntas.creapregta('Tengo 5 sitios en una intranet, Sitio1, sitio 2, etc. '+
'ahora bien necesito que cada uno tenga un boton de volver al sitio de donde ingrese.' +
'Ejemplo: Estoy en Sitio 1 y voy al 2, lo navego y quiero volver al 1. '+
'Si estoy en Sitio 2 cuando entre en el 3 pase lo mismo y así con todos. Poder volver '+
'desde donde haya ingresado. Ya que no puedo generar 5 botones que contenga cada uno '+
'el link que va a cada Sitio, solo tiene que ser un boton el que me permita volver desde '+
'donde ingrese');
preguntas.crearespta(13, 
'Simplemente pones un link en el que substituyes el destino (href) por una llamada al '+
'método <b>back</b> del objeto <h>history</b> del explorador. Algo así:<br>'+
'&lt;a href="javascript:history.back(1)"&gt;<br>Texto o imagen del enlace<br>&lt;/a&gt;<br>'+
'Si pones esto en tu <b>Sitio1</b> y llegas a él desde el <b>sitio2</b>, este link te '+
'devolverá al <b>sitio2</b>, y si llegas desde el <b>sitio3</b> pues te devolverá al '+
'<b>sitio3</b>. Añádelo a todas los sitios y podrás ir y regresar de uno a otro con '+
'un sólo botón.');
//PREGUNTA 14
preguntas.creapregta('Estoy haciendo una página web en la que indico las sucursales de '+
'una determinada franquica. Utilizo una página con marcos en la cual el formulario con '+
'un menú desplegable con todas las provincias en las que se encuentras dichas sucursales '+
'se encuentra en la parte de arriba. Mi pregunta es como puedo hacer que al seleccionar '+
'una provincia del menu desplegable,las tiendas de dicha provincia me salgan en el marco '+
'de abajo. Gracias.');
preguntas.crearespta(14, 
"Tan sólo es necesario asignar a la propiedad location la nueva dirección pero en el frame "+
"de destino. Esta función se ejecuta en el momento de hacer una selección en el menú "+
"desplegable. Este sería el código Javascript a colocar en el <b>frame superior</b>:<br><br>"+
"function cambiaPag(lista, destino){ <br>"+
" var ind = lista.selectedIndex<br>"+
" destino.location= lista.options[ind].value;<br>}<br>"+
"En la misma página, la del frame superior irá el elemento form con el menú desplegable:<br>"+
"&lt;form name=&quot;form1&quot;&gt;<br>"+
"&lt;select name=&quot;menu1&quot; <br>"+
"onChange=&quot;cambiaPag(this,parent.frames['frameInf'])&quot;&gt;<br>"+
"&lt;option value=&quot;origen1.htm&quot; selected&gt;<br>Página 1&lt;/option&gt;<br>"+
"&lt;option value=&quot;origen2.htm&quot;&gt;<br>P&aacute;gina 2&lt;/option&gt;<br>"+
"&lt;/select&gt;<br>"+
"&lt;/form&gt;<br>"+
"El código HTML correspondiente a la página que contiene ambos frames será algo así como<br>"+
"<br>&lt;frameset rows=&quot;*,341&quot; frameborder=&quot;NO&quot; border=&quot;0&quot; "+ 
"framespacing=&quot;0&quot; cols=&quot;*&quot;&gt; <br>"+
"&lt;frame name=&quot;frameMenu&quot; <br>src=&quot;superior.htm&quot;&gt;<br>"+
"&lt;frame name=&quot;frameInf&quot; scrolling=&quot;NO&quot; noresize<br> src=&quot;origen1.htm&quot;&gt;<br>"+
"&lt;/frameset&gt;<br>"+
"superior.htm es la página del frame superior con el form y la función javascript<br>"+
"origen1.htm es la página del elemento seleccionado por defecto en el menú. Si quieres mas "+
"basta con añadir opciones al menú. ");
//PREGUNTA 15
preguntas.creapregta('¿Como evitar que un visitante vote mas de una vez en una encuesta?');
preguntas.crearespta(15, 
"Lo ideal es una aplicación CGI pero también con Javascript puede hacerse algo. La clave "+
"está en las cookies que permiten almacenar información en el ordenador del visitante "+
"No es un método válido  al cien por cien pues el visitante puede borrar sus cookies. "+
"Recuerda que las cookies no son peligrosas en absoluto para el visitante.<br>"+
'Como el código es un poco largo para este espacio este <b><a href="cookies.zip">'+
"enlace</a></b> te permitirá descargar en formato zip (menos de 2Kb) un ejemplo de uso.");
//PREGUNTA 16
preguntas.creapregta('¿Como puedo pasar parametros entre diferentes paginas?');
preguntas.crearespta(16, 
"Muy sencillo: usando las propiedades del objeto <b>location</b> en la ventana destino. "+
"Una dirección URL tiene la estrucutra típica siguiente<br>"+
" &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"+
"<b>protocolo:\/\/host:port\/pathname?search#hash</b><br>"+
"cada una de esas partes es una propiedad del objeto <b>location</b>. En esta caso la propiedad "+
"<b>search</b> es la utilizada para pasar parámetros (es la misma que se usa en los CGI). Basta "+
"con asignar a <b>location.href</b> la URL seguida de ?valor, valor sería el parametro a pasar. "+
"En este ejemplo se muestra como hacerlo:<br><br>"+
"Enlace con parámetros tomados de un formulario:<br>"+
"&lt;form name=\"form1\" method=\"post\" <br>"+
"action=\"javascript:saltar('paginadestino.htm',document.forms.form1.texto.value)\"&gt;<br>"+
"  &lt;input type=\"text\" name=\"texto\"&gt;<br>"+
"  &lt;input type=\"submit\" name=\"Submit\" value=\"Submit\"&gt;<br>"+
"  &lt;/form&gt;<br>"+
"<br>Al pulsar el botón de este formulario se llama a la dirección indicada seguida del valor "+
"escrito en el campo texto.<br>"+
"El código javascript de la función es de lo mas simple:<br><br>"+
"function saltar(direc, param)<br>"+
"{<br>location.href=direc+'?'+param;<br>}<br><br>"+
"Esto se podría haber hecho en línea (action=\"javascript:location.href=...\") pero es "+
"preferible usar una función por si se desea comprobar el texto o cualquier otra cosa. "+
"La página destino deberá leer el valor de la siguiente forma<br><br>"+
"function leerParam()<br>"+
"{<br>var param=unescape(location.search).substring(1);<br>}<br>"+
"<br>La función unescape traduce a ASCII los códigos de la cadena y se usa substring porque "+
"search incluye el símbolo ? usado como separador.");
//PREGUNTA 17
preguntas.creapregta('Como podría hacer para que al poner una imagen como fondo de una '+
'página no se me repita hasta completar dicha página. Gracias.');
preguntas.crearespta(17,
'Tan sólo debes crear un estilo CSS con la propiedad repeat del background en el valor '+
'apropiado. La definición del estilo, que va en la sección HEAD de la página o linkado a '+
'un fichero externo, es:<br><br>'+
'&lt;style&gt;<br>'+
'<b>.</b>fondofijo{<br>'+
'	background-image: url(simbolos/fondo.jpg);<br>'+
'	background-repeat: no-repeat;<br>'+
'	}<br>'+
'&lt;/style&gt;<br><br>'+
'Si quieres que se repita en vertical pones <b>repeat-y</b>, y si quieres que se repita en '+
'horizontal pones <b>repeat-x</b>. Luego asignas al atributo <b>class</b> de <b>body</b> '+
'este estilo:<br>'+
'&lt;body class="fondofijo"&gt;<br>'+
'Aunque también puedes redefinir la etiqueta body en lugar de <b>.</b>fondofijo, en este caso '+
'no es necesario que coloques el atributo class.');
//PREGUNTA 18
preguntas.creapregta('¿Cómo puedo hacer que mediante un click en una imagen se cambie el '+
'fondo y los colores de las letras? es para dar la oportunidad para que el lector elija el '+
'color de fondo y letra: por ejemplo fondo negro letras blancas; fondo plomo claro '+
'letras negras');
preguntas.crearespta(18,
'El script deberá actuar sobre las propiedades <b>bgColor</b> y <b>fgColor</b> del '+
'<b>document</b>. Si usas una imagen coloca un evento <b>onClick</b> que llame a la '+
'función encargada de cambiar esos argumentos. La función puede ser: <br><br>'+
'function cambiaColor(fondos, letras)<br>'+
'{<br> document.bgColor = fondos;<br>'+
' document.fgColor = letras;<br>}<br>'+
'Y la imagen será algo así como:<br><br>'+
'&lt;image src="cambiar.gif" onclick="cambiaColor(\'blue\',\'yellow\')"&gt;<br><br>'+
'Para los colores puedes usar nombres o cadenas hexadecimales (000000 al FFFFFF). '+
'Estos cambios sólo funcionan en IExplorer 4+, Netscape apenas permite cambios '+
'tras cargar la página. <br>'+
'En la página de ejemplos tienes otra forma de hacer esto mismo pero usando un formulario.'); 
//PREGUNTA 19
preguntas.creapregta('Pretendo crear una página comercial, en la que enseño los productos y '+
'luego me envian un formulario con lo que les interesa. Quisiera que los clientes picaran en '+
'la imagen del producto, y que el nombre, precio y referencia del mismo se escribiera en el '+
'formulario con sólo hacerlo. O sea, que al final el cliente despues de picar los productos '+
'que quiere comprar, vea la lista de lo que ha picado en forma de formulario, con todo prepa'+
'rado para dar a "enviar" y que no tenga que hacer nada mas.'); 
preguntas.crearespta(19,
'La gestión de una cesta de la compra se realiza habitualmente mediante programas CGI, que '+
'dan un amplio abanico de posibilidades, no obstante Javascript también permite esa '+
'gestión para tiendas online no demasiado grandes. Una solución es el uso de las cookies. '+
'Esta solución se compone de dos páginas llamémoslas tienda y pedido. La primera es la usada '+
'para presentar los artículos y permitir que el visitante escoja la cantidad que desee de '+
'cada uno. Cada vez que el visitante anota una cantidad se crea una cookie con el par '+
'idarticulo=cantidad. Las rutinas Javascript de esta página se reducen pues a crear cookies, '+
'contendrá ademas un botón o enlace para mostrar la segunda página, la del pedido.<br>'+
'La segunda página presentará el formulario con los artículos elegidos por el visitante y un '+
'botón enviar. La parte del formulario se creará dinámicamente usando rutinas Javascript que irán leyendo '+
'las cookies y escribiendo los datos de cada artículo anotado en ellas. Estos datos se '+
'extraen de una lista creada previamente con información como la descripción, referencia '+
'y precio.<br>'+
'<b>Página tienda.htm</b>, para cada artículo tendremos un campo de formulario:<br><br>'+
'  &lt;img src="imagen.jpg" width="20" height="20" align="absmiddle"&gt; <br>'+
'  &lt;input type="text" name="cantidad1" size="3" value="1"&gt;<br>'+
'  &lt;input type="button" name="articulo1" value="Anotar"<br>'+
'  onclick="creaCookie(this.name, document.forms.articulos.cantidad1.value)"&gt;<br><br>'+
'Ojo con esto: el nombre del botón es el identificador del artículo elegido y el que se '+
'anotará en el cookie en una forma similar a esta cadena: <b>"articulo1=5"</b><br> '+
'<b>Página pedido.htm</b>, esta página contiene un objeto javascript para los artículos '+
'cuyo constructor será algo así<br>'+
'function objArticulo(nombre, refer, valor)<br>'+
'{<br>this.nombre = nombre;<br>'+
'  this.refer = refer<br>'+
'  this.valor = valor;<br>'+
' this.cant = 0;<br>}<br><br>'+
'Luego creamos una lista de instancias para los artículos ofrecidos de la forma<br>'+
'tienda = new Array() //la lista de articulos <br>'+
'tienda["articulo1"]= new objArticulo("El articulo num1",  "Ref001", 2500)<br>'+
'Vemos que los elementos de la lista se refieren por el identificador usado en la página '+
'tienda. El resto es fácil: con cada artículo leemos el correspondiente cookie y si existe '+
'se anota mediante document.write los campos de formulario con los datos del mismo. Para '+
'el articulo de identificador articulo1 haremos un leerCookie("articulo1"), si existe y '+
'se han pedido alguno usamos un document.write para escribir en esta página pedido los '+
'datos de ese artículo: nombre, referencia, cantidad pedida, precio...<br>'+
'for (elem in tienda)<br>'+
'{ dato = leerCookie(elem);<br>'+
' if (dato >0)<br>'+
'&nbsp;&nbsp;&nbsp;document.write(tienda[elem].nombre)<br>}<br>'+
'De la misma manera se escriben los datos en campos ocultos de un formulario al que se añade '+
'un botón enviar como ya se explica en la pregunta 3 de esta página.<br>'+
'En esquema este es el método para abordar este problema, pero si alguien quiere verlo en '+
'funcionamiento tan sólo debe pasar por '+
'<a href="../casos/cestacompra/tienda.htm" target="_blank"><b>aquí para verlo.</b></a> <br>'+
'En esa dirección existe un fichero zip con los códigos Javascript y HTML.<br><br>');
//PREGUNTA 20
preguntas.creapregta('¿Como se puede hacer aparecer en la ventana un párrafo cuyo '+
'identificador es tecleado por el visitante en un campo de un formulario?'); 
preguntas.crearespta(20,
'Para esto tienes, en IExplorer, el método <b>scrollIntoView(arriba)</b>, donde arriba es un '+
'que indica si queremos que el objeto al que se aplica aparezca en el borde superior de la '+
'pantalla (true, por defecto) o en la inferior (false). En este ejemplo usamos un párrafo '+
'cuyo identificador id es Jordan<br>'+
'&lt;p id="Jordan"&gt;Aquí irá el texto contenido en este párrafo&lt;/p&gt;<br>'+
'Podemos añadir mas párrafos con diferentes identficadores. Ahora colocamos un formulario<br>'+
'&lt;form name="form1" method="post" action=""&gt;<br>'+
'  &lt;input type="text" name="buscador"&gt;<br>'+
'  &lt;input type="button" name="Buscar" value="Buscar"<br> '+
'  onclick="mostrar(parentElement.buscador.value)"&gt;<br>'+
'  &lt;/form&gt;<br>'+
'El objeto parentElement lo usamos aquí para referirnos al elemento que contiene al botón, '+
'o sea al formulario. Al picar sobre ese botón se llama a la función <b>mostrar()</b> con '+
'el valor del campo de texto como argumento. La función sería la siguiente:<br>'+
'function mostrar(arg)<br>'+
'{<br>if (document.all[arg])<br>document.all[arg].scrollIntoView(true)<br>else<br>'+
'	alert("Palabra inexistente")<br>}<br>'+
'Como es habitual en el tema de buscadores es aconsejable no distinguir entre mayúsculas'+
'y minúsuclas, para ello transforma la palabra clave a, por ejemplo, minúsculas usando el '+
'método de string toLowerCase(), y por supuesto poniendo los id todos en minúsculas.<br>'+ 
'Este método es aplicable a prácticamente todos los elementos de las páginas HTML y es exclu'+
'sivo del DOM de Microsoft');
//PREGUNTA 21
preguntas.creapregta('¿Como calcular el número de caracteres de una cadena?'); 
preguntas.crearespta(21,
'Un pregunta de Javascript puro. La cadena es un objeto <b>String</b> y una de sus propiedades'+
'es precisamente la propiedad <b>length</b> que contiene su longitud.<br>'+
'O sea si el siguiente código escribirá el valor <b>16</b><br><pre>'+
'   var cadena ="Hola buenos días"<br>'+
'   document.write(cadena.length);</pre>'+
'La sección dedicada a los <b><a href="../jsobjetos/obj_string.htm">Strings</a></b> contiene los '+
'métodos y propiedades de este objeto');

//PREGUNTA 22
preguntas.creapregta('¿Como hacer que automáticamente mi página llame un código javas'+
'cript u otro diferente dependiendo de la resolución del monitor con la que el '+
'navegante entre en ella?'); 
preguntas.crearespta(22,
'El objeto <b>screen</b> dependiente del objeto <b>window</b> te da información acerca de la pantalla del '+
'navegador usado para visitar la página:<br><br>'+
'<b>window.screen.width</b> te da la resolución horizontal<br>'+
'<b>window.screen.height</b> te da la resolución vertical<br>'+
'<b>window.screen.colorDepth</b> te da la resolución de color<br><br>'+
'Te basta una sentencia if para comprobar la resolución y llamar a la función que quieras.');

//PREGUNTA 23
preguntas.creapregta('¿Como pueden sumarse dos campos de un formulario?');
preguntas.crearespta(23,
'Los campos de texto de los formularios son eso, campos de texto lo que en Javascript '+
'se traduce en una cadena de caracteres, un objeto <b>string</b>. Lógicamente si sumamos '+
'los contenidos de dos campos de texto lo que estamos haciendo es concatenar strings. Así '+
'si en los campos de un formulario escribimos "8" y "7" la <i>suma</i> nos dará "87". Para '+
'sumar estos valores primero debemos convertirlos a números usando para ello la función de '+
'Javascript <b>parseInt( )</b>. En un formulario la suma sería algo así como:<br>'+
'&nbsp;&nbsp;parseInt(form1.valor1.value)+parseInt(form1.valor2.value)<br>'+
'asumiendo que en ese formulario existan dos campos tipo text llamados valor1 y valor2.');

//PREGUNTA 24
preguntas.creapregta('¿Como puedo lograr que la sentencia write escriba los numeros con '+
'los separadores de miles (1.234.567 en lugar de 1234567)?');
preguntas.crearespta(24,
'Javascript no posee ningún método para formatear las salidas, pero podemos crear una '+
'función que si lo haga. En este caso usamos la siguiente:<br><br>'+
'function formatMiles(numero)<br>'+
'{<br>'+
'numero=numero+"";<br>'+
'var largo = numero.length;<br>'+
'var cad= "";<br>'+
'//Nos aseguramos que no existen caracteres no numéricos<br>'+
'if (parseInt(numero)+"" == numero)<br>'+
'{<br>'+
'while (largo>3)<br>'+
'&nbsp;&nbsp;{<br>'+
'&nbsp;&nbsp;cad = "."+numero.substr(largo-3, 3)+cad;<br>'+
'&nbsp;&nbsp;numero = numero.substr(0, largo-3);<br>'+
'&nbsp;&nbsp;alert(cad+" - "+numero);<br>'+
'&nbsp;&nbsp;largo=numero.length;<br>'+
'&nbsp;&nbsp;}<br>'+
'&nbsp;&nbsp;if (numero.length>0)<br>'+
'&nbsp;&nbsp;&nbsp;&nbsp;cad = numero+cad<br>'+
'&nbsp;&nbsp;}<br>'+
'return cad;<br>'+
'}<br><br>'+
'Esta función recibe como argumento una cadena o un número, lo primero que hace es '+
'convertir el argumento a un string por si no lo era. Luego hace lo que haríamos nosotros'+
'a mano: ir agrupando de tres en tres los dígitos y poniendo los puntos de miles<br>'+
'Un ejemplo de uso podría ser:<br>'+
'&nbsp;&nbsp;document.write(formatMiles(235679))<br>'+
'La cadena escrita será 235.679');
 
//PREGUNTA 25
preguntas.creapregta('¿Como logro que con los botones (como los de esta ventana -borrar, '+
'enviar. cerrar-) actuen como hiperligas, es decir, que cada botón me lleve una página '+ 'diferente (boton1 a liga 1, botón 2 a liga 2, etc)?');
preguntas.crearespta(25,
'Para que un botón haga el efecto de un hipervículo basta con asignarle a us evento onclick'+
'una instruccion Javascript que asigna a la propiedad location.href la dirección URL a la '+
'que desees que apunte. Es decir algo así como:<br><br>'+
'&lt;form name="form1" method="post" action=""&gt;<br>'+
'&lt;input type="button" name="Boton1" value="Dirección1" '+
'onclick="location.href=\'ira1.htm\'"&gt;<br>'+
'&lt;input type="button" name="Boton2" value="Otra dirección"'+
'onclick="location.href=\'ira2.htm\'"&gt;<br>'+
'&lt;/form&gt;<br><br>'+
'Así de sencillo.');
//PREGUNTA 26
preguntas.creapregta('¿Como puedo hacer para que pulsando un botón en un frame me cargue una url en otro frame diferente?');
preguntas.crearespta(26,
'Basta con asignarle el nombre del frame al atributo target del hipervínculo. Algo así '+
'como:<br><br>'+
'&lt;a href= "pagina.htm" target="marcoderecho"&gt;Ir a la página&lt;/a&gt;<br><br>'+
'Si quieres hacerlo usando Javascript debes usar la propiedad <b>parent</b> que devuelve la ventana propietaria de todos los frames. A continuaciónle asignas al frame destino el URL que quieres que se muestre:<br><br>:'+
'parent.frames["Marcoppal"].location="pagina.htm";<br><br>'+
'En esta sencilla instrucción Marcoppal es el nombre del marco donde deseas que se muestre la página. Esta instrucción como es lógico deberá estar en el marco del enlace<br>'+
'Otra pregunta relacionada con este tema es la <a href="javascript:botonIra(16)">15</a>.');
//PREGUNTA 27
preguntas.creapregta('¿Cómo puedo bloquear con JavaScript un campo de texto en un formulario de forma que no pueda ser modificado el valor que contiene?')
preguntas.crearespta(27,
'Una forma muy simple es asignarle <b>this.blur()</b> al evento <b>onfocus</b> del control del cuadro de texto que no quieras que se modifique. Es decir dentro del elemento form el cuadro'+
'de texto en cuestión será:<br><br>'+
'&lt;textarea name=&quot;campo&quot; rows=&quot;15&quot; cols=&quot;60&quot; '+
'onfocus=&quot;this.blur()&quot;&gt;<br>Esto no se puede modificar<br>'+
'&lt;/textarea&gt;<br><br>'+
'resto del elemento <b>form</b>. El evento <b>onfocus</b> se activa cuando se selecciona el '+
'elemento (posee el foco), mientras que el método <b>blur()</b> fuerza a qe el elemento pierda '+
'el foco.<br>');
//PREGUNTA 28
preguntas.creapregta('¿Cómo puedo combinar la pregunta no. 3 de tal forma que en el cuerpo del mensaje del email los campos y las entradas me lleguen formateadas separadas por comas,  por ejemplo:<br>'+
'Campo NOMBRE de tipo TEXT<br>'+
'Campo APELLIDOS de tipo TEXT, el formato que quisiera es:<br>'+
'NOMBRE,JORGE<BR>'+
'APELLIDOS,LOPEZ PEREZ<BR>&nbsp;');
preguntas.crearespta(28,
'Pues de entrada es necesario eliminar el atributo <b>enctype</b> del elemento <b>FORM</b> de la página, de esta manera el cuerpo del mensaje queda en blanco y los datos irán en un attachment (que en este caso no nos sirve de nada), será la rutina del evento <b>onsubmit</b> la que se encargue de construir el cuerpo con el formato que desees. Por ejemplo si el formulario fuera el que sigue:<br><br>'+
'&lt;form name="form1" method="post" action="mailto:p@j.com" <br>'+
'onsubmit = "return procesar(this)" &gt;<br>'+
'&lt;input type="text" name="Campo1"&gt;<br>'+
'&lt;input type="text" name="Campo2"&gt;<br>'+
'&lt;input type="submit" name="Submit" value="Submit"&gt;<br>'+
'&lt;input type="reset" name="Submit2" value="Reset"&gt;<br>'+
'&lt;/form&gt;<br><br>'+
'La función procesar podría ser algo sí como:<br><br>'+
'function procesar(formul)<br>'+
'{<br>'+
'var cuerpo="";<br>'+
'var ind = 0;<br>'+
'var rc = "%0d%0a";<br>'+
'for(ind=0; ind<formul.elements.length-2;ind++)<br>'+
'&nbsp;&nbsp;&nbsp;cuerpo += formul.elements[ind].name+","formul.elements[ind].value+rc;<br>'+
'formul.action +="?Subject=datos&Body="+cuerpo;<br>'+
'return true<br>'+
'}<br><br>'+
'En esta ejemplo se ha colocado la cadena "datos" para el Subject (Asunto) del mensaje, pero por supuesto puede colocarse cualquier otra valor. El siguiente atributo colocado es el correspondiente a Body, o sea el cuerpo del mensaje construido por la propia función'+
'<br>Y eso es todo, fácil.'); 
//PREGUNTA 29
preguntas.creapregta('¿Como se usan los campos ocultos en los formularios?');
preguntas.crearespta(29,'Un campo oculto es un campo que el autor de la página introduce en '+
'un formulario con un <b>valor</b> que usará al procesar la respuesta. Por ejemplo, en estas '+
'páginas un campo oculto puede diferenciar un formulario para preguntas del formulario para '+ 
'respuestas. Ambos van a la misma dirección email, ese campo oculto se usa para darle valor '+
'al subject (asunto) del mensaje. Un filtro en el lector de correo puede separar los '+ 
'mensajes de respuestas de los de preguntas. Un programa CGI haría cosas por el estilo.<br>'+
'Su uso es similar al de cualquier otro campo del formulario. Por ejemplo<br>:'+
'&lt;form name=&quot;form1&quot; method="post"<br>'+
'onsubmit"return procesar(this)"&gt;<br>'+
'&lt;input type="password" name="nombre"&gt;<br>'+
'&lt;input type="hidden" name="micampo" value="oculto"&gt;<br>'+
'&lt;input type="submit" name="Submit" value="enviar"&gt;<br>'+
'&lt;/form&gt;<br>'+
'La instrucción <b>document.forms.form1.micampo.value</b> me devolvería <b>oculto</b>, lo '+
'mismo que <b>document.forms.form1.nombre.value</b> me devolvería el valor escrito en el '+
'campo de texto <b>nombre</b><br>&nbsp;')

