Spiga.com.mx

About me...

Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Phasellus rutrum elit et nunc. Phasellus tincidunt pede in nibh. Maecenas eget ligula non dui nonummy venenatis.Donec turpis. Sed mattis, diam quis fermentum dapibus, ante libero consequat felis, sed laoreet nibh mi in elit. Phasellus massa massa, commodo nonummy, rutrum sit amet, consequat pulvinar, eros. Nullam sit amet massa. Sed lobortis orci vehicula tellus.

In hac habitasse platea dictumst. Sed blandit diam in leo. Pellentesque sollicitudin tortor sit amet dui. Fusce vehicula purus suscipit nunc. Curabitur felis tortor, varius ac, placerat nec, vestibulum sed, est. Pellentesque fermentum. Suspendisse egestas. Nulla id mi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Maecenas eu augue. Nullam eu ipsum.

Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Pellentesque ac lorem ac tortor fermentum molestie. Nunc suscipit erat non mi. Nullam dui dolor, tincidunt at, venenatis ut, bibendum in, purus. Fusce pretium ullamcorper nisl.

Crear un Tunel SSH para Firefox No comments Posted: 27.5.2008 | By: zetta

Cada dia me vuelvo mas desconfiado con esto de estar enviando información a internet, y con esto de utilizar la laptop en cualquier red (de hecho ahorita me encontré con una linksys abierta que me dejó conectarme a internet) como que me da cosa estar navegando y enviando datos a lo loco =P

Es por eso que para poder navegar de una manera mas segura creo un tunel hacia ctrl-zetta.com y al firefox lo conecto atravéz de un “proxy” que no es mas que la conexión ssh que tengo habilitada, y pues asi sin mas ahora en lugar de YO “dar la cara” ahora la da el server jejeje.

Como le hacemos??

Es algo muy sencillo, primero que nada tenemos que conectarnos via SSH con nuestro servidor como lo hariamos usualmente

  1. $ssh -l mysuername -D 9999 -C myserver.com

Con el parámetro D especificamos un puerto por donde estaremos enviando el tráfico (y como va encriptado.. pues ya no preocupa, bueno ya no me preocupa mucho jejeje) el parámetro C es solo para comprimir

Teniendo esta conexión creada ya tenemos listo nuestro “proxy” ya solo nos falta decirle a Firefox que se conecte a él.

Nos vamos a Edit->Preferences->Advanced->Network->Settings (lo siento tengo instalado firefox en inglés)

Seleccionamos configuración manual de proxy y ahi en SOCKS Host: ponemos localhost y el puerto que hayamos seleccionado en la conexion ssh, para este ejemplo seria 9999

Seleccionamos Socks vs (deberia estarlo por default) y

No Proxy for: localhost, 127.0.0.1 (que tambien por default viene, o en la mia asi venia jeje)

Y ya!!!! ve a Whats my Ip para que veas que tu IP ahora ya no es tu IP =P

Para no tener que andar cambiando las preferencias del firefox a cada rato instalen esta extensión

SwitchProxy Tool 1.4.1


Tags: , , , , , , ,

Dividir archivos en Linux No comments Posted: 20.5.2008 | By: zetta

Hay una aplicación muy buena para dividir archivos muy grandes en pequeñas partes, muy útil si queremos subir un archivo muy grande por ejemplo en Rapidshare =).

  1. zetta@ctrl-zetta.com:~$  split -b [tamaño en bytes] archivo.tgz

y para unirlos simplemente concatenamos nuestros archivos con el siempre util cat por ejemplo

  1. zetta@ctrl-zetta.com:~$  cat archivo.tgz.0 archivo.tgz.1  archivo.tgz.2 >  archivo.tgz

Tags:

wordpress plugin.codecolorer.mod(spoiler) 4 comments Posted: 25.10.2007 | By: zetta

Hace un par de díias un amigo me dijo que la página se comenzaba a ver muy fea y cada vez se entendia menos, pues se veia código por todas partes, me sugirió crear spoilers en los cuadros de có para que ya no se vea tan feo, he aqui lo que hice

Primero que nada estaba utilizando el plugin de codecolorer hay que buscar el archivo codecolorer.php y modificar algunas lineas

Los números de línea son un estimado

  1. //declaramos una varibale al inicio de la clase //->linea 75
  2. var $uniqueId = 0;
  3.  
  4. //dentro de la funcion init()  //linea ->
  5. $this->uniqueId = time();
  6.  
  7. ///modifique la funcion addContainer()  y ahora quedo asi
  8.  
  9. function addContainer($html, $options, $num_lines) {
  10. if($num_lines > $options['lines'])
  11. $style = ' style="height:' . ($options['lines'] * $options['line_height']) . 'px; visibility: hidden;  display: none; "';
  12. elseif($num_lines == 1)
  13. $style = ' style="height:' . intval(2.5 * $options['line_height']) . 'px; visibility: hidden; display: none; "';
  14. else
  15. $style = ' style=" visibility: hidden; display: none; " ';
  16. $this->uniqueId++;
  17.  
  18. $result = '
  19. <p class="spoiler"><a onclick="spoiler(\''.$this-&gt;uniqueId.'\'); return false;" href="#">Mostrar/Ocultar código '.$options['lang'].'</a>';
  20. $result .= '
  21. <div id="'.$this-&gt;uniqueId.'" class="codecolorer-container ' . $options['lang'] . '">' . $html . '</div>
  22. ';
  23.  
  24. return $result;
  25. }

La funcion de javascript para que se muestren los bloques

  1. function spoiler(a){
  2. var tar = document.getElementById(a);
  3. if( tar.style.visibility == 'hidden' ){
  4. tar.style.visibility = 'visible';
  5. tar.style.display = 'block';
  6. }else{
  7. tar.style.visibility = 'hidden';
  8. tar.style.display = 'none';
  9. }
  10. return;
  11. }

y para que no se vea tan mal el link un poquito de css

  1. .spoiler a, .spoiler a:link, .spoiler a:visited{ color: #FFF; }
  2. .spoiler a:hover{ color: #EEE; }

La idea era hacerlo con mootools, pero despues me dio un poco de pereza jeje


Tags: , , , , , , , , ,

function validMail.php 3 comments Posted: 8.10.2007 | By: zetta

Muchas veces tengo que comprobar si un correo que escriben en algun formulario es un correo válido, algunas otras veces esto se complica pues algunas expresiones regulares pueden ser fácilmente engañadas con un a@a.a, con esta función podemos verificar mas a fondo si este es un correo real.

  1. /*
  2. validMail():Boolean
  3. @email -&gt; string: email a comparar
  4. @validate -&gt; Boolean: conectarse al servidor a buscar dicho usuario
  5. */
  6. function validMail($email,$validate = false) {
  7. if (!eregi("^[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z]{2,3})$", $email))
  8. return false;
  9. if ($validate){
  10. list ( $Username, $Domain ) = split ("@",$email);
  11. if (getmxrr($Domain, $MXHost))
  12. $ConnectAddress = $MXHost[0];
  13. else
  14. $ConnectAddress = $Domain;
  15. $Connect = fsockopen( $ConnectAddress, 25 );
  16. if ($Connect) {
  17. if (ereg("^220", $Out = fgets($Connect, 1024))) {
  18. fputs ($Connect, "HELO $HTTP_HOST\r\n");
  19. $Out = fgets ( $Connect, 1024 );
  20. fputs ($Connect, "MAIL FROM: &lt;{$email}&gt;\r\n");
  21. $From = fgets ( $Connect, 1024 );
  22. fputs ($Connect, "RCPT TO: &lt;{$email}&gt;\r\n");
  23. $To = fgets ($Connect, 1024);
  24. fputs ($Connect, "QUIT\r\n");
  25. fclose($Connect);
  26. if (!ereg ("^250", $From) || !ereg ( "^250", $To )) {
  27. return false;
  28. }
  29. }else{
  30. return false;
  31. }
  32. }else{
  33. return false;
  34. }
  35. }
  36. return true;
  37. }
  38.  
  39. ?&gt;

Tags: , , , , ,

javascript slideShow con Scriptaculous 2 comments Posted: 27.7.2007 | By: zetta

Hace tiempo que hice un script con script.aculo.us y php para crear un SlideShow

Aqui puedes ver el Demo

Ademáas del framework de scriptaculous necesitamos este codigo

zetta.js

  1. if(!Array.prototype.push){
  2. Array.prototype.pushfunction(){
  3. var i;
  4. for(i=0; j=arguments[i]; i++) this[this.length] = j;
  5. return this.length;
  6. };
  7. };
  8. Effect.BlindRight = function(element) {
  9. element = $(element);
  10. element.makeClipping();
  11. return new Effect.Scale(element, 0,
  12. Object.extend({ scaleContent: true,
  13. scaleY: false,
  14. restoreAfterFinish: true,
  15. afterFinishInternal: function(effect) {
  16. effect.element.hide();
  17. effect.element.undoClipping();
  18. }
  19. }, arguments[1] || {})
  20. );
  21. };
  22. Effect.BlindLeft = function(element) {
  23. element = $(element);
  24. var elementDimensions = element.getDimensions();
  25. return new Effect.Scale(element, 100,
  26. Object.extend({ scaleContent: true,
  27. scaleY: false,
  28. scaleFrom: 0,
  29. scaleMode: {originalHeight: elementDimensions.height, originalWidth: elementDimensions.width},
  30. restoreAfterFinish: true,
  31. afterSetup: function(effect) {
  32. effect.element.makeClipping();
  33. effect.element.setStyle({width: '0px'});
  34. effect.element.show();
  35. },
  36. afterFinishInternal: function(effect) {
  37. effect.element.undoClipping();
  38. }
  39. }, arguments[1] || {})
  40. );
  41. };
  42. Effect.Jump = function(element) {
  43. element = $(element);
  44. var oldStyle = {
  45. top: element.getStyle('top'),
  46. left: element.getStyle('left') };
  47. return new Effect.Move(element,
  48. { y:  20, x: 0, duration: 0.05, afterFinishInternal: function(effect) {
  49. new Effect.Move(effect.element,
  50. { y: -40, x: 0, duration: 0.1,  afterFinishInternal: function(effect) {
  51. new Effect.Move(effect.element,
  52. { y:  40, x: 0, duration: 0.1,  afterFinishInternal: function(effect) {
  53. new Effect.Move(effect.element,
  54. { y: -40, x: 0, duration: 0.1,  afterFinishInternal: function(effect) {
  55. new Effect.Move(effect.element,
  56. { y:  40, x: 0, duration: 0.1,  afterFinishInternal: function(effect) {
  57. new Effect.Move(effect.element,
  58. { y: -20, x: 0, duration: 0.05, afterFinishInternal: function(effect) {
  59. effect.element.undoPositioned();
  60. effect.element.setStyle(oldStyle);
  61. }}) }}) }}) }}) }}) }});
  62. };
  63. Object.extend(Element, {
  64. getWidth: function(element) {
  65. element = $(element);
  66. return element.offsetWidth;
  67. },
  68. setWidth: function(element,w) {
  69. element = $(element);
  70. element.style.width = w +"px";
  71. },
  72. setHeight: function(element,h) {
  73. element = $(element);
  74. element.style.height = h +"px";
  75. },
  76. setTop: function(element,t) {
  77. element = $(element);
  78. element.style.top = t +"px";
  79. },
  80. setSrc: function(element,src) {
  81. element = $(element);
  82. element.src = src;
  83. },
  84. setHref: function(element,href) {
  85. element = $(element);
  86. element.href = href;
  87. },
  88. setInnerHTML: function(element,content) {
  89. element = $(element);
  90. element.innerHTML = content;
  91. }
  92. });
  93.  
  94. var zetta = {
  95. identifier : {},
  96. type : {},
  97. inplaced : Array(),
  98. load : function(){
  99. imagenes = document.getElementsByTagName('img');
  100. for (var a = 0; (elemento = imagenes[a]); a++) {
  101. if (elemento.className.match("transition")){
  102. var settings = elemento.className;
  103. elemento.setAttribute("settings",settings);
  104. elemento.className = null;
  105. dupNode = elemento.cloneNode(true);
  106. padre = elemento.parentNode;
  107. var tDiv = document.createElement("div");
  108. tDiv.appendChild(dupNode);
  109. padre.replaceChild(tDiv, elemento);
  110. tDiv.setAttribute("width",dupNode.getAttribute("width"));
  111. tDiv.setAttribute("height",dupNode.getAttribute("height"));
  112. tDiv.style.display = "inline";
  113. //alert(settings);
  114. //var time = settings.split("_");
  115. //time = time[4];
  116. setTimeout("zetta.transition('"+dupNode.id+"');",(( time = settings.split("_")[4] )*1000)+(a*132));
  117. }
  118. }
  119. },
  120. transition : function(target){
  121. to = document.getElementById(target);
  122. if(to == null)
  123. return false;
  124. target = ($(target));
  125. var u = 'transition/transition.php?target=' + target.id + "&amp;url=" + target.src.replace('http://','') + "&amp;settings=" + target.getAttribute("settings");
  126. uno = new  Ajax.Request( u ,{ onComplete : function (){ eval(uno.transport.responseText); } })
  127. },
  128. _transition : function(element,img,effect,time){
  129. var daTime = time
  130. var daEffect = effect
  131. imgPreloader = new Image();
  132. imgPreloader.onload=function(){
  133. var ran =  Math.round(3*Math.random());
  134. i = (daEffect == "jump") ? 0 :( (daEffect == "shake") ? 1 :( (daEffect == "pulsate") ? 2 :( (daEffect == "fade") ? 3 :( ran ) ) ) );
  135. switch (i){
  136. case 0:
  137. Effect.Jump(element);
  138. setTimeout("zetta._conditional('"+element+"',\"Element.setSrc('"+element+"', '"+img+"');\");",500);
  139. break;
  140. case 1:
  141. Effect.Shake(element);
  142. setTimeout("zetta._conditional('"+element+"',\"Element.setSrc('"+element+"', '"+img+"');\");",500);
  143. break;
  144. case 2:
  145. Effect.Pulsate(element, {duration : 1.0});
  146. setTimeout("zetta._conditional('"+element+"',\"Element.setSrc('"+element+"', '"+img+"');\");",1000);
  147. break;
  148. default:
  149. Effect.Fade(element);
  150. setTimeout("zetta._conditional('"+element+"',\"Element.setSrc('"+element+"', '"+img+"');\");",1200);
  151. setTimeout("zetta._conditional('"+element+"',\"Effect.Appear('"+element+"');\");",1215);
  152. }
  153. setTimeout("zetta._conditional('"+element+"',\"zetta.transition('"+element+"');\");",(time*1172));
  154. }
  155. imgPreloader.src = img;
  156. },
  157. _conditional : function(target,code){
  158. to = document.getElementById(target);
  159. if(to == null)
  160. return false;
  161. eval(code);
  162. }
  163. };
  164. window.onload = zetta.load;

y un php:

  1. function ext($file_name){
  2. ereg("(.+)\.(.+)", basename($file_name), $regs);
  3. return strtolower($regs[2]);
  4. }
  5. if($_GET['target'] and $_GET['settings'] and $_GET['url']){
  6.  
  7. $var = explode("_", $_GET['settings']);
  8. $im = array();
  9. if ($gestor = opendir("{$var[1]}/")) {
  10. while (false !== ($archivo = readdir($gestor))) {
  11. if ($archivo != "." &amp;&amp; $archivo != ".." and ( ext($archivo) == "png" or ext($archivo) == "jpg" or ext($archivo) == "gif")) {
  12. $im[] = rawurlencode($archivo);
  13. }
  14. }
  15. closedir($gestor);
  16. }
  17. $ims = array_merge($im,$im);
  18.  
  19. if($var[2] == "random"){
  20. shuffle($im);
  21. $d = current($im);
  22. }else{
  23. $oldFile = explode("/", $_GET['url']);
  24. $oldFile = $oldFile[count($oldFile)-1];
  25. for($i=0; $i
  26. if($ims[$i] == $oldFile){
  27. $d = $ims[$i+1];
  28. break;
  29. }
  30. }
  31.  
  32. }
  33.  
  34. $img = "transition/{$var[1]}/{$d}";
  35. echo  "zetta._transition('{$_GET['target']}','{$img}','{$var[3]}',{$var[4]})";
  36.  
  37. }
  38. ?&gt;

Para utilizar en tu header coloca esto

  1. <script src="js/prototype.js" type="text/javascript"></script>
  2.  <script src="js/scriptaculous.js" type="text/javascript"></script>

y para mandar llamar solo pon una imagen con clase (class) “transition_
Ejemplo

  1. <img id="h1D7ugF5RL" class="transition_stewie_linear_random_2" src="transition/stewie/st1.jpg" alt="Demo Imagen" width="150" height="170" />
  2.  
  3. class="transition_[folder]_[mode]_[effect]_[wait]"
  4.  
  5. folder:String    // folder donde estan las imagenes
  6.  
  7. mode:String      // modo de busqueda de las imagenes
  8. random
  9. linear
  10.  
  11. effect:String   // efecto al hacer la transicion
  12. jump
  13. shake
  14. pulsate
  15. fade
  16. random
  17.  
  18. wait:Number  //tiempo de espera entre los cambios en segundos

A mi se me hace que pesa mucho, pero espero pronto hacer una version mas ligera con mootols

Descargar transition.zip


Tags:

sudo que insulta No comments Posted: 25.7.2007 | By: zetta

Todas las personas que desarrollamos cualquier tipo de aplicación tenemos que pensar en los mensajes de los diferentes errores que suceden (en lo personal soy muy pelado). Los desarrolladores de sudo no se quedan atrá porque este programita también te insulta cuando no pones bien tu contraseña de administrador, aunque esta opción viene desactivada por default, para activarla debes

  • Ejecutar: sudo visudo
  • Encuentra la linea que comienza con Defaults
  • Añade ,insults y guarda
  • Reinicia tu sesión y ejecuta sudo de nuevo pero equivocate
screenshot1.png

Tags: , ,

Juego con Prototype No comments Posted: 24.7.2007 | By: zetta

Michal Wallace escribió un tutorial paso a paso de como crear un juego con el famoso framework Prototype

brickslayer.png

Tags: , , , , , ,

Primer Meme No comments Posted: 23.7.2007 | By: zetta

Leyendo el blog de Mauricio Caballero encontré este meme… respondamos

  • ¿Cuanto tiempo llevas blogueando?
    Lo he intentado varias veces, nunca he pasado de un par de meses
  • ¿Como te enteraste de la existencia de los blogs y te animaste a participar?
    No recuerdo, creo que por culpa de Mauricio
  • Dime cinco blogs que sigas a a diario o con mucha frecuencia.
  • ¿Eres lector anónimo de algún blog?
    De muchisimos no acabaria
  • ¿Algunos autores que te despierten especial simpatía?
    Cualquier autor que le guste compartir sus conocimientos
  • ¿Con que cinco blogueros te irias de borrachera?
    Con todos los que les guste el pisto
  • ¿Con que tres blogueros pasarías una noche de locura sexual?
    x_X
  • ¿Te has enamorado alguna vez de algún blogger?
    nah!
  • ¿Estas satisfecho (a) con tu blog?No! x.x nunca!
  • Elige entre tres y cinco blogueros para que contesten a estas preguntas en sus blogs.
    Todos los que estan mencionados arriba (y que no lo hayan hecho)

Tags: , , , ,

class flash.Window.as Beta One comment Posted: 20.7.2007 | By: zetta

(Either JavaScript is not active or you are using an old version of Adobe Flash Player. Please install the newest Flash Player.)

Window v.alpha

Clase Window.as

  1. import mx.utils.Delegate;
  2. import mx.transitions.Tween;
  3. import mx.transitions.easing.Regular;
  4. class Window {
  5. var width:Number;
  6. var height:Number;
  7. var home:MovieClip;
  8. var im:MovieClip;
  9. function Window(home:MovieClip,width:Number, height:Number) {
  10. this.width = width;
  11. this.height = height;
  12. this.home = home;
  13. }
  14. public function draw(x:Number,y:Number,params:Object):Void{
  15. var num:Number = home.getNextHighestDepth();
  16. this.im = this.home.attachMovie("window","customWindow"+num,num);
  17. this.im._y = y;
  18. this.im._x = x;
  19. this.im.bar._width = this.width;
  20. if(params.showbar == false) this.im.bar._visible = false;
  21. this.im.content._width = this.width;
  22. this.im.content._height = this.height;
  23. if(params.draggable != false){
  24. this.im.bar.onPress =  Delegate.create (this, startDrag);
  25. this.im.bar.onRelease = Delegate.create(this,stopDrag);
  26. this.im.bar.onReleaseOutside = Delegate.create(this,stopDrag);
  27. }
  28. this.im.content.onPress =  Delegate.create (this, top);
  29. if((params.forceDrag == true &amp;&amp; params.showbar == false) || (params.allDraggable == true)){
  30. this.im.content.onPress =  Delegate.create (this, startDrag);
  31. this.im.content.onRelease = Delegate.create(this,stopDrag);
  32. this.im.content.onReleaseOutside = Delegate.create(this,stopDrag);
  33. }
  34. }
  35. private function top():Void{
  36. this.im.swapDepths(this.home.getNextHighestDepth());
  37. }
  38. private function startDrag():Void{
  39. this.setProperty(this.im.content,"_alpha", 25, .5);
  40. this.top();
  41. this.im.startDrag(false);
  42. }
  43. private function stopDrag():Void{
  44. this.setProperty(this.im.content,"_alpha", 100, .5);
  45. this.im.stopDrag();
  46. }
  47. private function setProperty(target:MovieClip,property:String,value:Number,time:Number):Void{
  48. var set:Tween = new Tween(target, property, Regular.easeOut, target[property], value, time, true);
  49. }
  50. public function get xny():Object{
  51. return {x : this.im._x, y : this.im._y};
  52. }
  53. public function addContent(add:MovieClip):Void{
  54. //todo
  55. }
  56. }

Uso

  1. var w1:Window = new Window(target:MovieClip,width:Number,height:Number);
  2. w1.draw(x:Number,y:Number);

Donde:

  • target => Donde se construira la ventana
  • width => Ancho de la ventanta
  • height => Alto de la ventana

Métodos

  • draw:VoidDibuja la ventana en las coordenadas especificadas

Propiedades

  • xny
  • Devuelve un objeto con las coordenadas actuales de la ventana

Descargar windowBeta.zip


Tags: , , , , , , , , ,

class flash.scrollPane.as 8 comments Posted: 17.7.2007 | By: zetta

(Either JavaScript is not active or you are using an old version of Adobe Flash Player. Please install the newest Flash Player.)

Pane v1.3

  1. Multiples instancias
  2. Integración con la rueda del ratón (al parecer no funciona en MacOs X)

Clase Pane.as

  1. import mx.utils.Delegate;
  2. class Pane {
  3.     var mask: MovieClip,
  4.         sc1: MovieClip,
  5.         sc2: MovieClip,
  6.         origin: MovieClip,
  7.         sBar: MovieClip,
  8.         Target: MovieClip;
  9.     var sTotal: Number,
  10.         top: Number,
  11.         h: Number,
  12.         w: Number;
  13.     var ml: Object;
  14.     var delayer: Number;
  15.     function Pane(clip, width, height, pos) {
  16.         delayer = 0;
  17.         ml = new Object();
  18.         Mouse.addListener(ml);
  19.         this.origin = clip;
  20.         this.w = width;
  21.         this.h = height;
  22.         mask = clip._parent.createEmptyMovieClip("masking_" + clip._name, clip._parent.getNextHighestDepth());
  23.         mask._x = clip._x;
  24.         mask._y = clip._y;
  25.         mask.lineStyle(1, 0x000000, 100, true, "none", "round", "miter", 1);
  26.         mask.beginFill(0x000000);
  27.         mask.moveTo(0, 0);
  28.         mask.lineTo(width, 0);
  29.         mask.lineTo(width, height);
  30.         mask.lineTo(0, height);
  31.         mask.moveTo(0, 0);
  32.         clip.setMask(mask);
  33.         sc1 = clip._parent.attachMovie("paneScrollButon", "sc1_" + clip._name, clip._parent.getNextHighestDepth());
  34.         sc1._x = (pos == "left") ? Math.ceil(clip._x - sc1._width) : Math.ceil(clip._x + width);
  35.         sc1._y = Math.ceil(clip._y);
  36.         sc1.onPress = function() {
  37.             var nombre: MovieClip = this._parent["sBar_" + this._name.substr(4, this._name.length)];
  38.             nombre.onEnterFrame = track;
  39.             this.onEnterFrame = function() {
  40.                 if (nombre._y > nombre._top) {
  41.                     nombre._y -= 10;
  42.                 } else {
  43.                     nombre._y = nombre._top;
  44.                 }
  45.             };
  46.         };
  47.         sc1.onRelease = sc1.onReleaseOutside = function() {
  48.             delete this.onEnterFrame;
  49.         };
  50.         sc2 = clip._parent.attachMovie("paneScrollButon2", "sc2_" + clip._name, clip._parent.getNextHighestDepth());
  51.         sc2._x = (pos == "left") ? Math.ceil(clip._x - sc1._width) : Math.ceil(clip._x + width);
  52.         sc2._y = Math.ceil((clip._y + height) - sc1._height);
  53.         sc2.onPress = function() {
  54.             var nombre: MovieClip = this._parent["sBar_" + this._name.substr(4, this._name.length)];
  55.             nombre.onEnterFrame = track;
  56.             this.onEnterFrame = function() {
  57.                 if (nombre._y < nombre._bottom) {
  58.                     nombre._y += 10;
  59.                 } else {
  60.                     nombre._y = nombre._bottom;
  61.                 }
  62.             };
  63.         };
  64.         sc2.onRelease = sc1.onReleaseOutside = function() {
  65.             delete this.onEnterFrame;
  66.         };
  67.         sTotal = clip.sTotal = Math.ceil(sc2._y - (sc1._y + sc1._height));
  68.         sBar = clip._parent.attachMovie("paneScrollBar", "sBar_" + clip._name, clip._parent.getNextHighestDepth());
  69.         sBar.Target = clip;
  70.         sBar._x = Math.ceil(sc1._x);
  71.         sBar._y = Math.ceil(sc1._y + sc1._height);
  72.         sBar._height = (((height * 100) / clip._height) / 100) * height;;
  73.         sBar.onRelease = sBar.onReleaseOutside = function() {
  74.             this.isPressed = false;
  75.             this.stopDrag();
  76.         };
  77.         var left: Number = Math.ceil(sc1._x);
  78.         var top: Number = Math.ceil(sc1._y + sc1._height + 1);
  79.         var bottom: Number = Math.ceil((sc1._y + sTotal + sc1._height) - (sBar._height) - 1);
  80.         sBar._top = top;
  81.         sBar._left = left;
  82.         sBar._bottom = bottom;
  83.         sBar.delayer = 0;
  84.         sBar.isPressed = false;
  85.         sBar.onPress = function() {
  86.             this.startDrag(false, this._left, this._top, this._left, this._bottom);
  87.             this.onEnterFrame = track;
  88.             this.delayer = 0;
  89.             this.isPressed = true;
  90.         };
  91.         function track() {
  92.             var percent: Number = Math.round((this._y - this._top) * 100) / (this._bottom - this._top);
  93.             var nombre: MovieClip = this._parent[this._name.substr(5, this._name.length)];
  94.             var mask: MovieClip = nombre._parent["masking_" + nombre._name];
  95.             var diff: Number = nombre._height - mask._height;
  96.             var newVal = ( - ((diff * percent) / 100)) + mask._y;
  97.             nombre._y += (newVal - nombre._y) * 0.4;
  98.             this.delayer = this.isPressed == false ? this.delayer + 1 : this.delayer;
  99.             if (this.delayer == 10) {
  100.                 delete this.onEnterFrame
  101.             }
  102.         }
  103.         ml.onMouseWheel = Delegate.create(this, wheel);
  104.     }
  105.     private function _track() {
  106.         var percent: Number = Math.round((sBar._y - sBar._top) * 100) / (sBar._bottom - sBar._top);
  107.         var diff: Number = origin._height - mask._height;
  108.         var newVal = ( - ((diff * percent) / 100)) + mask._y;
  109.         origin._y += (newVal - origin._y) * 0.4;
  110.         delayer++;
  111.         if (delayer == 10) {
  112.             delete sBar.onEnterFrame
  113.         }
  114.     }
  115.     private function wheel(delta) {
  116.         var ob: MovieClip = this.origin._parent;
  117.         var obj: MovieClip = this.mask;
  118.         if (ob._xmouse > = obj._x && ob._xmouse < = obj._x + this.w && ob._ymouse > = obj.