﻿/*
 * Copyright (c) 2010 conceptio srl
 *
 * Depends:
 *	jquery.js
 */

/* 
    usato in: 
        runtime /pick/PickCap.ashx
*/

//----------------- Utility ---------------------------------------------------
function CPT_MaxZIndex() {
    var maxZ = 1000;
    $('*').each(function(){ var zindex = parseInt($(this).css('z-index'), 10); if ( !isNaN(zindex) ) maxZ = Math.max(maxZ,zindex ); });
    return maxZ;
}

function CPT_Canvas() {
    var ret = {};
    ret.bodyW = $(document).width(); //$('body').innerWidth();
    ret.bodyH = $(document).height();
    ret.windowW = $(window).width();
    ret.windowH = $(window).height();
    ret.maxW = ret.bodyW > ret.windowW ? ret.bodyW : ret.windowW;
    ret.maxH = ret.bodyH > ret.windowH ? ret.bodyH : ret.windowH;
    ret.scrollTop = $(window).scrollTop();
    return ret;
}

function CPT_Deparam(str) {
    var ret = {};
    var items = str.split('&');
    for (var i=0; i<items.length; i++) {
        var it = items[i].split('=');
        ret[it[0]]=it[1];
    }
    return ret
}




//----------------- Blanker ---------------------------------------------------
var CPT_Blanker = {};
CPT_Blanker.defaults = { body: undefined, divSopra: true, onShow: undefined, onHide: undefined, hideOnClick: false, classeBase: 'CPT_Blanker' };
CPT_Blanker.internals = { last: undefined };

CPT_Blanker.show = function(options) {
    options = jQuery.extend({}, CPT_Blanker.defaults, options); 

    var p = undefined;
    if (CPT_Blanker.internals.last) {
        p = CPT_Blanker.internals.last;
        p.css('display', 'none');
    }

    var maxZ = CPT_MaxZIndex() + 10;
    var canv = CPT_Canvas();
    var dv = $('<div class="CPT_BLANKER"> </div>');
    dv.css({'position':'absolute', 'left':'0px', 'top':'0px', 'z-index':maxZ, 'width':canv.maxW+'px', 'height':canv.maxH+'px' });
    dv.data('data',{ opt: options, prec: p });
    
    if (options.hideOnClick) dv.click(function(){ CPT_Blanker.hide(); });
    
    if (options.body) {
        dv.html(options.body);
    } else {
        var dv1 = $('<div class="' + options.classeBase + 'Sotto"> </div>');
        dv1.css({'position':'absolute', 'left':'0px', 'top':'0px', 'z-index':maxZ + 1, 'width':canv.maxW+'px', 'height':canv.maxH+'px', 'opacity': .5 });
        dv.append(dv1);
        if (options.divSopra) {
            var dv2 = $('<div class="' + options.classeBase + 'Sopra"> </div>');
            dv2.css({'position':'fixed', 'left':'0px', 'top':'0px', 'z-index':maxZ + 2, 'width':canv.windowW +'px', 'height': canv.windowH+'px' });
            dv.append(dv2);
        }
    }
    CPT_Blanker.internals.last = dv;
    $('body').append(dv);
    if (options.onShow) options.onShow(dv);
    return dv;
}

CPT_Blanker.hide = function() {
    if (CPT_Blanker.internals.last) {
        var dv = CPT_Blanker.internals.last;
        var data = dv.data('data');
        var p = data.prec;
        if (data.opt.onHide) data.opt.onHide(dv);
        dv.remove();
        if (p) p.css('display', '');
        CPT_Blanker.internals.last = p;
    }
}

CPT_Blanker.hideAll = function() {
    while (CPT_Blanker.internals.last) { CPT_Blanker.hide(); }
}



//----------------- ELBlanker -------------------------------------------------
var CPT_ElBlanker = {};
CPT_ElBlanker.defaults = { element: undefined, body: undefined, divSopra: true, onShow: undefined, onHide: undefined, hideOnClick: false, classeBase: 'CPT_Blanker' };

CPT_ElBlanker.show = function(options) {
    options = jQuery.extend({}, CPT_Blanker.defaults, options); 

    if (options.element) {
        var maxZ = CPT_MaxZIndex() + 10;
        var w = options.element.width();
        var h = options.element.height();

        var dv = $('<div class="CPT_ELBLANKER"> </div>');
        dv.css({'position':'absolute', 'left':'0px', 'top':'0px', 'z-index':maxZ, 'width':w+'px', 'height':h+'px' });
        dv.data('data', options);

        if (options.hideOnClick) dv.click(function(){ CPT_ElBlanker.hide(options.element); });
    
        if (options.body) {
            dv.html(options.body);
        } else {
            var dv1 = $('<div class="' + options.classeBase + 'Sotto"> </div>');
            dv1.css({'position':'absolute', 'left':'0px', 'top':'0px', 'z-index':maxZ + 1, 'width':w+'px', 'height':h+'px', 'opacity': .5 });
            dv.append(dv1);
            if (options.divSopra) {
                var dv2 = $('<div class="' + options.classeBase + 'Sopra"> </div>');
                dv2.css({'position':'absolute', 'left':'0px', 'top':'0px', 'z-index':maxZ + 2, 'width':w+'px', 'height':h+'px' });
                dv.append(dv2);
            }
        }
        $(options.element).append(dv);
        if (options.onShow) options.onShow(dv);
    }
}

CPT_ElBlanker.hide = function(element) {
    if (element) {
        var dv = element.find('.CPT_ELBLANKER');
        var data = dv.data('data');
        if (data.onHide) data.onHide(dv);
        dv.remove();
    }
}


//----------------- Ajax ------------------------------------------------------
var CPT_Ajax = {};
CPT_Ajax.defaults = { 
    type: 'POST', 
    dataType: 'json',
    form: undefined, 
    url: undefined, 
    data: undefined,
    onBefore: function(options) { CPT_Blanker.show({divSopra: true}); },
    onAfter: function(options) { CPT_Blanker.hide(); },
    onError: function(options, XMLHttpRequest) { CPT_Popup.popup.openAlert({ title: 'Errore', source: 'Errore di Connessione Http<br />Status:'+  XMLHttpRequest.status +' - '+ XMLHttpRequest.statusText +'<br />'+ XMLHttpRequest.responseText }); },
    onSuccess: undefined,
    onFailure: undefined,
    onReturn: undefined
};

CPT_Ajax.execute = function(options) {
    options = jQuery.extend({}, CPT_Ajax.defaults, options); 

    if (options.form) {
        options.type = 'POST';
        options.url = options.form.attr("action");
        options.data = options.form.serialize();
    }

    if (options.onBefore) options.onBefore(options);

    $.ajax({
        type: options.type,
        url: options.url,
        data: options.data,
        dataType: options.dataType == 'json' ? 'text' : options.dataType,
        cache: false,
        success: function(data, textStatus) {
            if (data && options.dataType=='json') data = eval("(" + data + ")");
            if (options.onAfter) options.onAfter(options);
            if (options.onReturn) options.onReturn(options, data);
            if (data.esito && options.onSuccess) options.onSuccess(options, data);
            if (!data.esito && options.onFailure) options.onFailure(options, data);
        },
        error: function(XMLHttpRequest, textStatus, errorThrown) {
            if (options.onAfter) options.onAfter(options);
            if (options.onError) options.onError(options, XMLHttpRequest);
        }
    });
}



//----------------- PopUp -----------------------------------------------------
var CPT_Popup = {};

CPT_Popup.popup = function ( element, replaceelement, insertinelement, options, buttons ){
    var self = this;
    this.element = element;
    this.replaceelement = replaceelement;
    this.insertinelement = insertinelement;
    this.buttons = buttons;
    this.options = options;
    if (options.result) this.result = options.result;
    this.element.data('cptpopup', this );
           
    if ( options.windowClass ) this.element.addClass(options.windowClass);

    this.close = function( result ){
        var self = this;
        if ( result ) this.result = jQuery.extend( {}, this.result, result );
        if ( self.options.onClose ) if ( self.options.onClose( self )==false ) return false;
        self.options.closeAnim( self, function(){ 
                var jqel = self.element;
                if ( self.options.windowClass ) jqel.removeClass(self.options.windowClass);
                jqel.removeData('cptpopup');
                jqel.remove();
         } );
        return true;
    }//close

    this.load = function( loadoptions ){
        var self = this;
        CPT_ElBlanker.show({'element': this.element});

        CPT_Ajax.execute({
            'loadoptions': loadoptions,
            type: loadoptions.type, 
            url: loadoptions.url, 
            dataType: 'html',
            data: loadoptions.data,
            onBefore: undefined,
            onAfter: undefined,
            onReturn: function(options, data) {
                self.location = options.loadoptions.url; // REDIRECT?
                if ( data ) {
                    if( self.replaceelement ) self.replaceelement.replaceWith(data); 
                    else self.insertinelement.html(data); 
                }
                CPT_ElBlanker.hide({'element': self.element});
                if (options.loadoptions.callback) options.loadoptions.callback( self );

            },
            onError: function(options, XMLHttpRequest) {
                CPT_ElBlanker.hide({'element': self.element});
                CPT_Ajax.defaults.onError(options, XMLHttpRequest);
            }
        });
        return true;
    }//load
    
    this.reload = function(){ this.navigate(this.location) }
    
    this.navigate = function( url, callback ){
        return this.load({ type:'GET', 'url': url, 'callback': callback  });
    }//navigate

    this.submit = function( callback ){
        var form = this.element.find("form");
        return this.load({ type:'POST', 'url': form.attr("action"), 'data': form.serialize(), 'callback': callback  });
    }//submit

    this.submitEx = function( form, el, callback ){
        self.replaceelement = undefined;
        self.insertinelement = el;
        return this.load({ type:'POST', 'url': form.attr("action"), 'data': form.serialize(), 'callback': callback  });
    }//submit

};//CPT_Popup.popup
        
CPT_Popup.popup.popupDefaults = { 
        location: undefined,
        title: '',
        position: [ 'center', 'center', '90%', '90%' ],
        modal: true, 
        result: { abort: true },
        source: undefined,
        openAnim: function( popup, callback ){ 
            if ( popup.options.modal ) CPT_Blanker.show(popup.options.blankerDefaults);   
            var maxZ = CPT_MaxZIndex() + 10;
            popup.element.css('z-index', maxZ)
            popup.element.show(); 
            if(callback) callback(popup) 
        },
        closeAnim: function( popup, callback ){ 
            if ( popup.options.modal ) { CPT_Blanker.hide(); }
            popup.element.hide(); 
            if(callback) callback(popup) 
        },
        onOpen: undefined,
        onClose: undefined,
        windowClass: undefined,
        buttons: false,
        blankerDefaults: { body: undefined, divSopra: false, onShow: undefined, onHide: undefined, hideOnClick: false, classeBase: 'CPT_Blanker' }
    };

CPT_Popup.popup.alertDefaults = jQuery.extend({}, CPT_Popup.popup.popupDefaults, {
        position: [ 'center', 'center', '350', '160' ],
        onOpen: function(s) {
            var hc = s.element.find('.CPT_CONTENT').innerHeight() - s.element.find('.CPT_PopButtons').innerHeight();
            s.element.find('.CPT_Alert').css('height', hc+'px');
        }
    });


CPT_Popup.popup.openAlert = function( options ){
    options = jQuery.extend({}, CPT_Popup.popup.alertDefaults, options);
    options.source = '<div class="CPT_Alert">' + options.source + "</div>" + '<div class="CPT_PopButtons"><a href="javascript:void(0)" class="CPT_Button" onclick="CPT_Popup.popup.popupOf(this).close()">Ok</a></div>';
    CPT_Popup.popup.open( options );
}

CPT_Popup.popup.open = function( options ){
    options = jQuery.extend({}, CPT_Popup.popup.popupDefaults, options);
    var element = $('<div class="CPT_POPUP"/>').appendTo(document.body).hide();

    if ( options.position ){
        var w = element.width();
        if ( options.position[2] ){
            w = options.position[2];
            if ( w.lastIndexOf('%')>-1 ) {
                w = $(window).width() / 100 * parseInt(w.substr(0,w.length-1));
            } else w = parseInt(w);
        }
        var h = element.height();
        if ( options.position[3] ){
            h = options.position[3];
            if ( h.lastIndexOf('%')>-1 ) {
                h = $(window).height() / 100 * parseInt(h.substr(0,h.length-1));
            } else h = parseInt(h);
        }
        var left = options.position[0];
        var top = options.position[1];
        /*
        if ( left=='center' ) left = $(window).width()/2 - w/2 + $(window).scrollLeft();                        
        if ( left<0 ) left = 0;
        if ( top=='center' ) top = $(window).height()/2 - h/2 + $(window).scrollTop();
        if ( top<0 ) top = 0;
        element.css({ 'position': 'absolute', 'left': left, 'top': top, 'width': w+'px', 'height': h+'px' });
        */
        if ( left=='center' ) left = $(window).width()/2 - w/2;                        
        if ( left<0 ) left = 0;
        if ( top=='center' ) top = $(window).height()/2 - h/2;
        if ( top<0 ) top = 0;
        element.css({ 'position': 'fixed', 'left': left, 'top': top, 'width': w+'px', 'height': h+'px' });
    }  
    
    if (options.title.length>0) element.append('<div class="CPT_CAPTION" >'+ options.title +'<div><a href="javascript:void(0)" onclick="CPT_Popup.popup.popupOf(this).close()"><span>X</span></a></div></div>');
    var insertinelement = $('<div class="CPT_CONTENT"> </div>');
    element.append(insertinelement);
    var buttons = undefined;
    if (options.buttons) {
        buttons = $('<div class="CPT_BUTTONS"><a href="javascript:void(0)" onclick="CPT_Popup.popup.popupOf(this).close()"><span>Chiudi</span></a></div>');
        element.append(buttons);
    }

    var self = new CPT_Popup.popup(element, undefined, insertinelement, options, buttons);

    options.openAnim( self, 
        function (s) {
            var ch = s.element.height() - 16;
            if (s.options.title.length>0) ch = ch - s.element.find('.CPT_CAPTION').innerHeight();
            
            if ( s.buttons ) {
                var hbt = s.buttons.innerHeight();
                ch = ch - hbt + 2;
            } 
            s.insertinelement.css({ 'margin': '8px', 'height': ch + 'px' });
            if ( s.options.location ){
                s.load({ type:s.options.type, url: s.options.location, data: s.options.data, callback: s.options.onOpen });
            } else {
                var data = options.source;
                if( s.replaceelement ) s.replaceelement.replaceWith(data); 
                else s.insertinelement.html(data); 
                if ( s.options.onOpen ) s.options.onOpen(s);
            }
        }
    );
       
    return self;
}//open

CPT_Popup.popup.popupOf = function( element ){
    if ( jQuery(element).hasClass('.CPT_POPUP') ){
        return jQuery(element).data('cptpopup');
    } else {
        var w = jQuery(element).closest('.CPT_POPUP');
        return w.length ? w.data('cptpopup') : null;
    }
}//popupOf

CPT_Popup.popup.documentHeight = function() {
    var winH = $(window).height();
    var bodyH = $('body').height();
    var y = winH>bodyH ? winH : bodyH;
    return y + 'px'
}




// -------------- componenti -----------------------------------------------------------

function CPT_BuildUrlComponente( componentepide, arguments ){
    var url = Ambiente.RTBase + '/RenderComponente.ashx?ADM___pw='+Ambiente.FilePaginaIde+'&ADM___wysiwyg='+(Ambiente.InEditor ? 1 : 0)+'&ADM___cp='+componentepide;
    if( arguments ){
        $.each(arguments, function(name, value) {
            url += ('&'+ name+'='+value);//'TODO  ci vorrebbe un escape ?!?
        });
    }
    return url;
}


function CPT_ReloadCompAjax( el, url, callback ){
  CPT_Ajax.execute({
    dataType: 'html',
    url: url, 
    onBefore: function(options) { CPT_ElBlanker.show({element: el }); },
    onAfter: function(options) { },
    onReturn: function(options, data) { 
      el.replaceWith(data); 
      if (callback) callback(el);
    }
  });
} 


