function XTContent(id, tkn, saveAction){
    var myObject = this;
    myObject.initialize(id, tkn, saveAction);
    return myObject;
}

XTContent.prototype = {

    initialize: function(id, tkn, saveAction){
        this.alphanumericID = id;
        this.token = tkn;
        this.saveChangesActionURL = saveAction;
        var jDiv = jQuery('#' + this.alphanumericID);

        jDiv.bind('dblclick', this.enableContentEditable);

        var em = jDiv[0];
        jQuery.data(em, 'self', this);

    },
    disableContentEditable: function(theButton){
        var div = theButton.parent();
        theButton.parent().find('.xt-cancel').remove();
        theButton.remove();
        var contentEditable = div.find('.xt-content-editable');
        contentEditable.toggleClass('active');
        contentEditable.attr('contenteditable', false);
        div.css('paddingTop', 0);
        div.bind('dblclick', this.enableContentEditable);
        contentEditable.find('a').unbind('click', this.disableLinks);
    },
    disableLinks: function(e){
        e.preventDefault();
        e.stopImmediatePropagation();
        return false;
    },
    saveButton: function(){
        var j = jQuery('<a/>');
        j.bind('click', this.saveChangesAction);
        j.addClass('xt-button');
        j.addClass('xt-save');
        j.html('<span>Registra</span>');
        return j;
    },
    cancelButton: function(){
        var j = jQuery('<a/>');
        j.addClass('xt-button');
        j.addClass('xt-cancel');
        j.html('<span>Annulla</span>');
        j.bind('click', this.revertAction);
        return j;
    },
    revertAction: function(e){
        var button = jQuery(this).parent().find('a.xt-save');
        var buttonEl = button[0];
        var obj = jQuery.data(buttonEl, 'json');
        var myObject = jQuery.data(buttonEl, 'self');
        var ref = jQuery.data(buttonEl, 'reference');
        ref.html(obj.theContent);

        myObject.disableContentEditable(button);
    },
    saveChangesAction: function(e){
        var jQueryObject = jQuery(this);

        e.preventDefault();
        var r = jQuery.data(this, 'reference');
        var c = r.html();
        var myObject = jQuery.data(this, 'self');
        var obj = jQuery.data(this, 'json');
        var action = jQuery.data(this, 'action');
        var token = jQuery.data(this, 'token');

        obj.theContent = c;

        jQuery.ajax({
            type: 'POST',
            url: action,
            data: {
                'json': obj.toString(),
                'token': token
            },
            success: function(data){
                window.status = data;
                myObject.disableContentEditable(jQueryObject);
            },
            error: function(){
                alert('Error!');
                myObject.disableContentEditable(jQueryObject);
            }
        });
    },
    enableContentEditable: function(e){
        var jDiv = jQuery(this);
        var myObject = jQuery.data(this, 'self');
        e.stopImmediatePropagation();
        var contentEditable = jDiv.find('.xt-content-editable');
        contentEditable.toggleClass('active');


        var html = contentEditable.html();
        contentEditable.attr('contenteditable', true);
        var idXTContainer = jDiv.attr('rel');
        var jsonObj = {
            idXTContainer: idXTContainer,
            theContent: html,
            theContentSerialized: function(){
                var v = this.theContent.replace(/"/g, '\\"');
                v = v.replace(/\n/g, '');
                v = v.replace(/\r/g, '');
                return v;
            },
            toString: function(){
                var id = parseInt(this.idXTContainer);
                return '{"idXTContainer": ' + id + ' ,"theContent": "' + this.theContentSerialized() + '" }'
            }
        };
        var sb = myObject.saveButton();
        var saveButtonElement = sb[0];

        jDiv.css('paddingTop', 22);
        jQuery.data(saveButtonElement, 'self', myObject);
        jQuery.data(saveButtonElement, 'reference', contentEditable);
        jQuery.data(saveButtonElement, 'json', jsonObj);
        jQuery.data(saveButtonElement, 'token', myObject.token);
        jQuery.data(saveButtonElement, 'action', myObject.saveChangesActionURL);



        jDiv.css('position', 'relative');
        jDiv.append(sb);
        jDiv.append(myObject.cancelButton());
        jDiv.unbind('dblclick');
        contentEditable.trigger('select');
        contentEditable.find('a').bind('click', myObject.disableLinks);
        return false;
    }
}

