ContentLocker = Class.create();

// default timeout
ContentLocker.timeout = 60*10;
Object.extend(ContentLocker.prototype, {
    
    initialize: function(cid) {
        this.cid = cid;
        //this.timeout = arguments[1] ? arguments[1] : ContentLocker.timeout;
        this.timeout = ContentLocker.timeout;
        this.timer = null;
        this.alertsec = 60*3;
        this.timeoutSec = null;
        this.setrefreshtimeout = 60*10;
    },
    
    saveField: function(cdid,fieldname,fieldvalue,strip)
    {
        if (strip)
        {
            fieldvalue = fieldvalue.stripTags();
        }

        clearTimeout(this.timer);
        var url  = absCorrect + 'icms/content/ajax_savecd.html';
        var pars =  "content.id="+ this.cid +
                    "&content.action=saveContentData,checkIn"+
                    "&content.contentdata["+ fieldname +"]="+ encodespecial(fieldvalue) +
                    "&content.checkOutInfo_cdid=id";
        
        var myAjax = new Ajax.Request(	url, 
                                        {method: 'post',
                                         parameters: pars,
                                         asynchronous: false,
                                         onFailure: this.alert404_request
                                        }
                                      );
        if(myAjax.transport.responseXML.getElementsByTagName('state')[0].childNodes[0].nodeValue == '1')
        {
            return true;
        }
        else
        {
            return false;
        }
    },
    
    readField: function(cdid, fieldname, Options, strip)
    {
		onTimeout = Options['onTimeout'] ? Options['onTimeout'] : null;
        if(Options['lock'] === true)
        {
            var requestFile = "ajax_getcd_lock.html";
            this.locked = true;
        }
        else
        {
            // untested !!            
            var requestFile = "ajax_getcd.html";
            this.locked = false;
        }
        
        var url  = absCorrect + 'icms/content/' + requestFile;
        var pars = "content.id="+ this.cid; // + "&content.checkout_timeout="+this.timeout;

        var myAjax = new Ajax.Request(url, 
                                        {method: 'post',
                                         parameters: pars,
                                         asynchronous: false,
                                         onFailure: this.alert404_request
                                        }
                                      );
        if(Options['lock'] === true)
        {
            if(myAjax.transport.responseXML.getElementsByTagName('checkout_state')[0].childNodes[0].nodeValue != '1')
            {
                return false
            }
            this.starttimer();
        }

        if(fieldname.indexOf(',') > 0)
        {
            /*
            ..nice try :(
            var fields = fieldname.split(',');
            var myret = {};
            for ( var a = 0; a < fields.length ; a++)
            {
                myAjax.transport.responseXML.getElementsByTagName(fieldname)[0].childNodes[0].nodeValue;
                myret.{fields[a]} = 
            }
            */
        }
        else
        {

			var fieldvalue = myAjax.transport.responseXML.getElementsByTagName(fieldname)[0].childNodes[0].nodeValue;

			if (strip)
            {
                fieldvalue = fieldvalue.stripTags();
            }
            return fieldvalue;
        }
        
    
    },

    getCurrentState: function() {
        var url  = absCorrect + 'icms/content/ajax_isEditable.html';
        var pars = "content.cdid="+ this.cid;
        var myAjax = new Ajax.Request(	url, 
                                        {method: 'get',
                                        parameters: pars,
                                        asynchronous: false,
                                        onFailure: this.alert404_request
                                        }
                                      );

        if (myAjax.transport.responseText == '1') {
            return true;
        } else {
            return false;
        }
    },
    
    checkOut: function() {
        this.timeout  = arguments[0] ? arguments[0] : this.timeout;
        this.callback = arguments[1] ? arguments[1] : Prototype.emptyFunction;
        
        // timer starten
        var url  = absCorrect + 'icms/content/ajax_checkOut.html';
        var pars = "content.cdid="+ this.cid +"&content.checkout_timeout="+this.timeout;
        
        var myAjax = new Ajax.Request(	url, 
                                        {method: 'get',
                                        parameters: pars,
                                        asynchronous: false,
                                        onFailure: this.alert404_out
                                        }
                                      );

        if (myAjax.transport.responseText == '1') {

            this.starttimer();
            return true;
        } else {
            alert("Der Textbaustein konnte nicht gesperrt werden.");
            return false;
        }
    },
    
    starttimer: function() {
        // confirm ja/nein
        // nein: this.callback() + this.checkIn();
        
        var d = new Date;
        var starttime = d.getTime()/1000;
        var flstart = typeof(arguments[0]) !== 'undefined' ? arguments[0] : true;
            
        if(flstart == false)
        {
            if(confirm("Der Textbaustein wird in "+ parseInt((this.alertsec/60) + 0.5) +" Minuten entsperrt.\nSie können den Textbaustein mit OK für weitere "+ parseInt((this.setrefreshtimeout/60) + 0.5) +" Minuten sperren.\n\nDiese Anfrage muss innerhalb von "+ parseInt((this.alertsec/60) + 0.5) +" Minuten beantwortet werden!"))
            {
                var d = new Date;
                var requestTime = d.getTime()/1000;
    
                if((starttime + (this.alertsec)) < requestTime)
                {
                    alert("Der Textbaustein wurde bereits entsperrt.\nDieser Textbaustein sollte nicht mehr gespeichert werden, da er in der Zwischenzeit ev. von einem anderen Benutzer verwendet worden ist!");
                }
                this.timeout = this.setrefreshtimeout;
                this.checkOut();
                return true;
            }
            else
            {
                var checkintime = this.timeoutSec - starttime;
                if(checkintime > 0)
                {
                    this.timer = window.setTimeout(function() {this.alertCheckOut(false);}.bind(this), checkintime*1000);
                }
                else
                {
                    this.alertCheckOut();
                }
                return false;			
            }
        }
        else
        {
            this.timeoutSec = (starttime + this.timeout);
            this.timer = setTimeout(function() {this.starttimer(false);}.bind(this), (this.timeout - this.alertsec) * 1000);
        }
    },
    
    checkIn: function() {
        // timer starten
        var url  = absCorrect + "icms/content/ajax_checkIn.html";
        var pars = "content.cdid="+ this.cid;
        
        var myAjax = new Ajax.Request(	url, 
                                        {method: 'get',
                                        parameters: pars,
                                        asynchronous: false,
                                        onFailure: this.alert404_in
                                        }
                                      );
        this.timeout = clearTimeout(this.timer);
        if (myAjax.transport.responseText == '1') {
            return true;
        } else {
            return false;
        }
        return true;
    },
    
    alertCheckOut: function ()
    {
        alert("Der Textbaustein wurde entsperrt!\nDamit Ihre Änderungen nicht verlohren gehen, sollten Sie \nden Textbaustein so schnell wie möglich speichern!\n\nDie Speicherung der Daten kann nicht garantiert werden.");
    },
    alert404_out: function ()
    {
        alert("Es ist ein Fehler beim Verbindungsaufbau aufgetaucht.\nDer Textbaustein konnte nicht gesperrt werden!");
    },
    alert404_in: function ()
    {
        alert("Es ist ein Fehler beim Verbindungsaufbau aufgetaucht.\nDer Textbaustein konnte nicht entgesperrt werden!");
    },
    alert404_request: function ()
    {
        alert("Es ist ein Fehler beim Verbindungsaufbau aufgetaucht.");
    }
});

/*
 JS Escape Unicode Characters as %u2004, this Section replace all Unicode Char. with HTML Conform &#3323; Values 05.01.2006 (db)
*/

function encodespecial(fieldvalue)
{
    fieldvalue = escape(fieldvalue);
    
    var matches = fieldvalue.match(/%u([0-9a-f]{4})/gim);
    if (matches) {
        for (var i = 0; i < matches.length; i++) {
            var number = matches[i].match(/([0-9a-f]{4})/gim);
            fieldvalue = fieldvalue.replace(/%u([0-9a-f]{4})/im, escape('&#' + parseInt(number[0], 16) + ';'));
        }
    }
    fieldvalue = fieldvalue.replace(/\+/mg, '%2B');
    return fieldvalue;
}
