| Interactive.Core=function(){
    
}
Interactive.Util={
    ocuped:false,
    checkCondition:function(cond,cookie){
        var sidesOr=cond.split(' or ');
        
        
        for (var i=0,cant=sidesOr.length;i<cant;i++){
            var sidesAnd=sidesOr[i].split(' and ');
            var res=true;
            
            for (var j=0,cant2=sidesAnd.length;j<cant2;j++){
                var item=sidesAnd[j].trim();
                if(item.charAt(0)==='!'){
                    if(cookie.tutoriales[item]==undefined)
                        res=true;
                    else
                        res=false;
                }else{
                    if(cookie.tutoriales[item]==undefined)
                        res=false;
                    else
                        res=true;
                }
            }
            if(res)
                return true;
        }
        return false;
//        cookie.tutoriales[name]!=undefined
    }
}
Interactive.Core.prototype={
    constructor:Interactive.Core,
    stack:new Array(),
    destroyed:false,
    call:function(text){
        
        if(this.active==false)
            return;
        this.global=$('<div></div>');
        this.auth=$('<div></div>');
        this.close=$('<div></div>');
        this.cont=$('<div></div>');
        this.global.append(this.auth);
        this.global.append(this.cont);
        this.global.append(this.close);
        this.global.css({
            position:'fixed',
            'zIndex':'10000000'
        });
        this.cont.css({
            background:'black',
            padding:'10px',
            float:'left',
            color:'white',
            marginLeft:'5px'
        });
        this.close.css({
            background:'darkred',
            padding:'3px',
            width:'25px',
            height:'25px',
            marginTop:'-10px',
            
            position:'relative',
            textAlign:'center',
            float:'left',
            color:'white',
            marginLeft:'-10px'
        });
        this.close.html('<b>X</b>');
        this.close.css('cursor','pointer');
        
        this.auth.append('<img src="" width="70">')
        this.auth.css({
            float:'left'
        });
        this.global.hide();
        $('body').append(this.global);
        
        
        this.loadMsg(text);
    },
    loadMsg:function(name){
        var me=this;
        $.getJSON(this.url, { name: name },function(data){
            if(me.destroyed===false){
                if(data.waitSeconds)
                    me.clearWait=setTimeout(function(){
                        var val=$.cookie('Interact2_'+Raptor.getUser());
                        var obj=$.parseJSON(val);
                        obj.tutoriales[name]=0;
                        $.cookie('Interact2_'+Raptor.getUser(),null,{path:'/'});
                        
                        $.cookie('Interact2_'+Raptor.getUser(),InteractiveCookie.encode(obj),{expires: 30,path:'/'});
                        me.show(data);
                    },data.waitSeconds*1000);
                else{
                    var val=$.cookie('Interact2_'+Raptor.getUser());
                    var obj=$.parseJSON(val);
                    
                    obj.tutoriales[name]=0;
                    $.cookie('Interact2_'+Raptor.getUser(),null,{path:'/'});
                    
                    $.cookie('Interact2_'+Raptor.getUser(),InteractiveCookie.encode(obj),{expires: 30,path:'/'});
                    me.show(data);
                }
            }
        });
    },
    show:function(data){
        this.textData=$(data.text);
        if(!data.found && data.found===false)
            return;
        
        this.cont.append(this.textData);
        if(data.author.name)
            this.cont.append('<b style="font-size:12px">'+data.author.name+'</b><br>');
        if(data.author.reference)
            this.cont.append('<b style="font-size:10px">'+data.author.reference+'</b><br>');
        this.cont.append('<img class="rapt-interactive" style="float:right" src="" width="60">');
        this.cont.find('.rapt-interactive').attr('src',Raptor.getBundleResource('Raptor/img/logo-int.png'));
        if(data.pointer){
            this.pointer=this.getPointer(data.pointer);
            $('body').append(this.pointer);
        }
        this.cont.append(this.footer());
        this.counterAttr=this.counter();
        this.cont.append(this.control());
        this.cont.append(this.counterAttr);
        
        this.cont.css(data.style);
        this.auth.find('img').attr('src',Raptor.getBundleResource(data.author.img));
        this.global.css(data.position);
        this.global.fadeIn();
        var global=this.global;
        var pointer=this.pointer;
        this.data=data;
        var me=this;
        this.close.click(function(){
            clearTimeout(me.clear);
            clearInterval(me.clearCounter);
            
            me.global.fadeOut('slow',function(){
                me.global.remove();
                if(data.next){
                    
                    Interactive.show(data.next);
                }
                if(me.pointer)
                    me.pointer.remove();
            });
        });
         this.textData.hover( 
            function () { 
                me.global.animate( { opacity:0.3 }, { queue:false, duration:500 } ) 
            },  
            function () { 
                me.global.animate( { opacity:1 }, { queue:false, duration:500 } ) 
            } 
          );
        this.count=data.seconds;
        this.play();
    },
    setRoot:function(url){
        this.url=url;
    },
    destroy:function(){
       var global=this.global;
       var me=this;
       me.destroyed=true;
       clearTimeout(me.clear);
       clearInterval(me.clearCounter);
       clearTimeout(me.clearWait);
       if(this.pointer)
               this.pointer.remove();
       this.global.hide(function(){
                global.remove();
//                if(me.data.next)
//                    me.call(me.data.next)
       });
    },
    footer:function(){
        var foot=$('<b>No quiero más ayuda</b>');
        foot.css('marginTop','5px');
        foot.css('float','right');
        foot.css('cursor','pointer');
        
        var me=this;
        foot.click(function(){
            clearTimeout(me.clear);
            clearInterval(me.clearCounter);
            me.active=false;
            $.cookie('Interact2_'+Raptor.getUser(),null,{path:'/'});
            $.cookie('Interact2_'+Raptor.getUser(),'{"reject":true,"tutoriales":{"interactive":"This is interactive"}}',{expires: 30,path:'/'});
            if(me.pointer)
                me.pointer.remove();
            me.global.fadeOut('slow',function(){
                me.global.remove();
            });
        });
        return foot;
    },
    counter:function(){
        var foot=$('<b></b>');
        foot.css('marginTop','5px');
        foot.css('float','left');
        foot.css('cursor','pointer');
        
        return foot;
    },
    control:function(){
        var foot=$('<b></b>');
        foot.append('<img src="" width="20">');
        foot.find('img').attr('src',Raptor.getBundleResource('Raptor/img/interactive/player_pause.png'));
        foot.css('marginTop','5px');
        foot.css('marginRight','5px');
        foot.css('float','left');
        foot.css('cursor','pointer');
        this.state=true;
        var me=this;
        foot.click(function(){
            if(me.state){
               me.pause();
               me.state=false;
               foot.find('img').attr('src',Raptor.getBundleResource("Raptor/img/interactive/player_play.png"));
            }else{
               me.play();
               me.state=true;
               foot.find('img').attr('src',Raptor.getBundleResource('Raptor/img/interactive/player_pause.png'));
            }
        })
        return foot;
    },
    getPointer:function(selector){
         var pointer=$('<img alt="aqui">');
         pointer.attr('src',Raptor.getBundleResource('Raptor/img/pointer.gif'));
         var ref=$(selector.selector);
         if(ref.size()==0)
             return pointer;
         
         ref=$($(selector.selector).get(0));
         
         var x=0;
         var y=0;
         var transform='rotate(0deg)';
         if(selector.arrow=='left'){
             y=(ref.height()/2+34/2)*-1;
             x=ref.width()/2;
             transform='rotate(270deg)';
         }
         if(selector.arrow=='right'){
             y=(ref.height()/2+34/2)*-1;
             x=(ref.width()/2+25)*-1;
             transform='rotate(90deg)';
         }
         if(selector.arrow=='down'){
             y=(ref.height()+50)*-1;
             transform='rotate(180deg)';
         }
         var position='absolute';
         
         pointer.css({
             position:'absolute',
             zIndex:'1000000',
             transform: transform,
             top:ref.offset().top+ref.height()+y,
             left:ref.offset().left+(ref.width()/2)+x
         });
         return pointer;
    },
    play:function(){
        var data=this.data;
        var me=this;
        this.clear=setTimeout(function(){
            clearTimeout(me.clear);
            clearInterval(me.clearCounter);
            
            me.global.fadeOut('slow',function(){
                me.global.remove();
                if(data.next){
                    
                    Interactive.show(data.next);
                }
                if(me.pointer)
                    me.pointer.remove();
            });
        },this.count*1000);
        this.counterAttr.html("("+this.count+" Seg)");
        
        this.clearCounter=setInterval(function(){
            me.count--;
            me.counterAttr.html("("+me.count+" Seg)");
        },1000)
    },
    pause:function(){
        clearTimeout(this.clear);
        clearInterval(this.clearCounter);
    }
}
jQuery.cookie = function(name, value, options) {
    if (typeof value != 'undefined') { // name and value given, set cookie
        options = options || {};
        if (value === null) {
            value = '';
            options.expires = -1;
        }
        var expires = '';
        if (options.expires && (typeof options.expires == 'number' || options.expires.toUTCString)) {
            var date;
            if (typeof options.expires == 'number') {
                date = new Date();
                date.setTime(date.getTime() + (options.expires * 24 * 60 * 60 * 1000));
            } else {
                date = options.expires;
            }
            expires = '; expires=' + date.toUTCString(); // use expires attribute, max-age is not supported by IE
        }
        // CAUTION: Needed to parenthesize options.path and options.domain
        // in the following expressions, otherwise they evaluate to undefined
        // in the packed version for some reason...
        var path = options.path ? '; path=' + (options.path) : '';
        var domain = options.domain ? '; domain=' + (options.domain) : '';
        var secure = options.secure ? '; secure' : '';
        document.cookie = [name, '=', encodeURIComponent(value), expires, path, domain, secure].join('');
    } else { // only name given, get cookie
        var cookieValue = null;
        if (document.cookie && document.cookie != '') {
            var cookies = document.cookie.split(';');
            for (var i = 0; i < cookies.length; i++) {
                var cookie = jQuery.trim(cookies[i]);
                // Does this cookie string begin with the name we want?
                if (cookie.substring(0, name.length + 1) == (name + '=')) {
                    cookieValue = decodeURIComponent(cookie.substring(name.length + 1));
                    break;
                }
            }
        }
        return cookieValue;
    }
};
InteractiveCookie = {};
InteractiveCookie.JSON = (new (function() {
    var me = this,
            encodingFunction,
            decodingFunction,
            useNative = null,
            useHasOwn = !!{}.hasOwnProperty,
            isNative = function() {
        if (useNative === null) {
            useNative = InteractiveCookie.USE_NATIVE_JSON && window.JSON && JSON.toString() == '[object JSON]';
        }
        return useNative;
    },
            pad = function(n) {
        return n < 10 ? "0" + n : n;
    },
            doDecode = function(json) {
        return eval("(" + json + ')');
    },
            doEncode = function(o, newline) {
        // http://jsperf.com/is-undefined
        if (o === null || o === undefined) {
            return "null";
        } else if (InteractiveCookie.isDate(o)) {
            return InteractiveCookie.JSON.encodeDate(o);
        } else if (InteractiveCookie.isString(o)) {
            return InteractiveCookie.JSON.encodeString(o);
        } else if (typeof o == "number") {
            //don't use isNumber here, since finite checks happen inside isNumber
            return isFinite(o) ? String(o) : "null";
        } else if (InteractiveCookie.isBoolean(o)) {
            return String(o);
        }
        // Allow custom zerialization by adding a toJSON method to any object type.
        // Date/String have a toJSON in some environments, so check these first.
        else if (o.toJSON) {
            return o.toJSON();
        } else if (InteractiveCookie.isArray(o)) {
            return encodeArray(o, newline);
        } else if (InteractiveCookie.isObject(o)) {
            return encodeObject(o, newline);
        } else if (typeof o === "function") {
            return "null";
        }
        return 'undefined';
    },
            m = {
        "\b": '\\b',
        "\t": '\\t',
        "\n": '\\n',
        "\f": '\\f',
        "\r": '\\r',
        '"': '\\"',
        "\\": '\\\\',
        '\x0b': '\\u000b' //ie doesn't handle \v
    },
    charToReplace = /[\\\"\x00-\x1f\x7f-\uffff]/g,
            encodeString = function(s) {
        return '"' + s.replace(charToReplace, function(a) {
            var c = m[a];
            return typeof c === 'string' ? c : '\\u' + ('0000' + a.charCodeAt(0).toString(16)).slice(-4);
        }) + '"';
    },
            //<debug>
            encodeArrayPretty = function(o, newline) {
        var len = o.length,
                cnewline = newline + '   ',
                sep = ',' + cnewline,
                a = ["[", cnewline], // Note newline in case there are no members
                i;
        for (i = 0; i < len; i += 1) {
            a.push(InteractiveCookie.JSON.encodeValue(o[i], cnewline), sep);
        }
        // Overwrite trailing comma (or empty string)
        a[a.length - 1] = newline + ']';
        return a.join('');
    },
            encodeObjectPretty = function(o, newline) {
        var cnewline = newline + '   ',
                sep = ',' + cnewline,
                a = ["{", cnewline], // Note newline in case there are no members
                i, val;
        for (i in o) {
            val = o[i];
            if (!useHasOwn || o.hasOwnProperty(i)) {
                // To match JSON.stringify, we shouldn't encode functions or undefined
                if (typeof val === 'function' || val === undefined) {
                    continue;
                }
                a.push(InteractiveCookie.JSON.encodeValue(i) + ': ' + InteractiveCookie.JSON.encodeValue(val, cnewline), sep);
            }
        }
        // Overwrite trailing comma (or empty string)
        a[a.length - 1] = newline + '}';
        return a.join('');
    },
            //</debug>
            encodeArray = function(o, newline) {
        //<debug>
        if (newline) {
            return encodeArrayPretty(o, newline);
        }
        //</debug>
        var a = ["[", ""], // Note empty string in case there are no serializable members.
                len = o.length,
                i;
        for (i = 0; i < len; i += 1) {
            a.push(InteractiveCookie.JSON.encodeValue(o[i]), ',');
        }
        // Overwrite trailing comma (or empty string)
        a[a.length - 1] = ']';
        return a.join("");
    },
            encodeObject = function(o, newline) {
        //<debug>
        if (newline) {
            return encodeObjectPretty(o, newline);
        }
        //</debug>
        var a = ["{", ""], // Note empty string in case there are no serializable members.
                i, val;
        for (i in o) {
            val = o[i];
            if (!useHasOwn || o.hasOwnProperty(i)) {
                // To match JSON.stringify, we shouldn't encode functions or undefined
                if (typeof val === 'function' || val === undefined) {
                    continue;
                }
                a.push(InteractiveCookie.JSON.encodeValue(i), ":", InteractiveCookie.JSON.encodeValue(val), ',');
            }
        }
        // Overwrite trailing comma (or empty string)
        a[a.length - 1] = '}';
        return a.join("");
    };
    /**
     * Encodes a String. This returns the actual string which is inserted into the JSON string as the literal
     * expression. **The returned value includes enclosing double quotation marks.**
     *
     * To override this:
     *
     *     Ext.JSON.encodeString = function(s) {
     *         return 'Foo' + s;
     *     };
     *
     * @param {String} s The String to encode
     * @return {String} The string literal to use in a JSON string.
     * @method
     */
    me.encodeString = encodeString;
    /**
     * The function which {@link #encode} uses to encode all javascript values to their JSON representations
     * when {@link Ext#USE_NATIVE_JSON} is `false`.
     * 
     * This is made public so that it can be replaced with a custom implementation.
     *
     * @param {Object} o Any javascript value to be converted to its JSON representation
     * @return {String} The JSON representation of the passed value.
     * @method
     */
    me.encodeValue = doEncode;
    /**
     * Encodes a Date. This returns the actual string which is inserted into the JSON string as the literal
     * expression. **The returned value includes enclosing double quotation marks.**
     *
     * The default return format is `"yyyy-mm-ddThh:mm:ss"`.
     *
     * To override this:
     *
     *     Ext.JSON.encodeDate = function(d) {
     *         return Ext.Date.format(d, '"Y-m-d"');
     *     };
     *
     * @param {Date} d The Date to encode
     * @return {String} The string literal to use in a JSON string.
     */
    me.encodeDate = function(o) {
        return '"' + o.getFullYear() + "-"
                + pad(o.getMonth() + 1) + "-"
                + pad(o.getDate()) + "T"
                + pad(o.getHours()) + ":"
                + pad(o.getMinutes()) + ":"
                + pad(o.getSeconds()) + '"';
    };
    /**
     * Encodes an Object, Array or other value.
     * 
     * If the environment's native JSON encoding is not being used ({@link Ext#USE_NATIVE_JSON} is not set,
     * or the environment does not support it), then ExtJS's encoding will be used. This allows the developer
     * to add a `toJSON` method to their classes which need serializing to return a valid JSON representation
     * of the object.
     * 
     * @param {Object} o The variable to encode
     * @return {String} The JSON string
     */
    me.encode = function(o) {
        if (!encodingFunction) {
            // setup encoding function on first access
            encodingFunction = isNative() ? JSON.stringify : me.encodeValue;
        }
        return encodingFunction(o);
    };
    /**
     * Decodes (parses) a JSON string to an object. If the JSON is invalid, this function throws
     * a SyntaxError unless the safe option is set.
     *
     * @param {String} json The JSON string
     * @param {Boolean} [safe=false] True to return null, false to throw an exception if the JSON is invalid.
     * @return {Object} The resulting object
     */
    me.decode = function(json, safe) {
        if (!decodingFunction) {
            // setup decoding function on first access
            decodingFunction = isNative() ? JSON.parse : doDecode;
        }
        try {
            return decodingFunction(json);
        } catch (e) {
            if (safe === true) {
                return null;
            }
        }
    };
})());
/**
 * Shorthand for {@link Ext.JSON#encode}
 * @member Ext
 * @method encode
 * @inheritdoc Ext.JSON#encode
 */
InteractiveCookie.encode = InteractiveCookie.JSON.encode;
/**
 * Shorthand for {@link Ext.JSON#decode}
 * @member Ext
 * @method decode
 * @inheritdoc Ext.JSON#decode
 */
InteractiveCookie.decode = InteractiveCookie.JSON.decode;
// @tag extras,core
// @require ../lang/Error.js
// @define Ext.JSON
/**
 * Modified version of [Douglas Crockford's JSON.js][dc] that doesn't
 * mess with the Object prototype.
 *
 * [dc]: http://www.json.org/js.html
 *
 * @singleton
 */
InteractiveCookie.isDate = function(value) {
    return toString.call(value) === '[object Date]';
}
InteractiveCookie.isString = function(value) {
    return typeof value === 'string';
}
InteractiveCookie.isBoolean = function(value) {
    return typeof value === 'boolean';
}
InteractiveCookie.isArray = function(value) {
    return toString.call(value) === '[object Array]';
}
InteractiveCookie.isObject = (toString.call(null) === '[object Object]') ?
        function(value) {
            // check ownerDocument here as well to exclude DOM nodes
            return value !== null && value !== undefined && toString.call(value) === '[object Object]' && value.ownerDocument === undefined;
        } :
        function(value) {
            return toString.call(value) === '[object Object]';
        }
 |