/*
 * we: Web Environment
 */

// FLAGS (usar como jQuery.WE_XXXXX_XXX)
jQuery.WE_NO_RESIZABLE = 0x1;
jQuery.WE_NO_DRAGGABLE = 0x2;
jQuery.WE_NO_CLOSEABLE = 0x4;
jQuery.WE_NO_HISTORY =   0x8;
jQuery.WE_MAXIMIZABLE = 0x10;

jQuery.DEBUG = false;

jQuery.ajaxSetup({cache: false});

// Crear estructura base del space
jQuery(function(){
    // Lo ocultamos todo para que no se vea las cosas feas mientras no ha terminado de cargar.
    jQuery(document.body).css('visibility','hidden');
	$('#barranavegacion').css('visibility','hidden');
});

// Lo volvemos a mostrar todo.
jQuery(document.body).bind('weReady',function(){jQuery(document.body).css('visibility','visible');});


jQuery.weMaxzIndex=1;
jQuery.fn.weBringToFront = function(){
	//if (jQuery.weActiveWindow)
	//	$(jQuery.weActiveWindow.panel).trigger("weBlur");
	jQuery.weActiveWindow = this;
	//$(jQuery.weActiveWindow.panel).trigger('weFocus');
    jQuery(this).css('zIndex', jQuery.weMaxzIndex++);
};

jQuery.weMaxDialogZIndex=1000000;

jQuery.fn.weBringDialogToFront = function(){
    jQuery(this).css('zIndex', jQuery.weMaxDialogZIndex++);
};

jQuery.fn.weCheckWindowInSpace = function(){
    var bottomMargin=60;
    var jthis=jQuery(this);

	if (!jQuery.browser.msie) {
		jthis.animate(
			{opacity:1},
			{duration:1000,complete:function(){jthis.children(".ui-dialog-content").trigger('inplace');}
		});
	}

	if (jthis.hasClass("we-window_theme-hidden")) {
		jthis.children(".ui-dialog-content").trigger('inplace');
		return;
	}

    var thisTop = jthis.offset().top;
    var thisLeft = jthis.offset().left;
    var thisWidth = jthis.width();
    var thisHeight = jthis.height();


    var bodyWidth = jQuery(document.body).width();
    var bodyHeight = jQuery(document.body).height();

    var animation = {};

    // Nos salimos por arriba
    if (thisTop < 0)
        animation.top = '0px';

    // No salimos por la izquierda
    if (thisLeft < 0)
       animation.left = '0px';

    // Nos salimos por abajo
    if (thisTop + thisHeight > bodyHeight-bottomMargin)
        // no vamos a dejar que la ventana se salga por arriba, en todo caso y si no cabe, que se salga por debajo, ya que allí es ta la barra de arrastre.
        if (thisHeight < bodyHeight-bottomMargin)
           animation.top = (bodyHeight - bottomMargin - thisHeight) + "px";
        else if (thisTop > 0)
            animation.top = '0px';

    // Nos salimos por la derecha
    if (thisLeft + thisWidth > bodyWidth)
        if (thisWidth < bodyWidth)
            animation.left = (bodyWidth - thisWidth) + "px";
        else if (thisLeft > 0)
            animation.left = '0px';

    // No cabemos a lo alto
    if (thisHeight > bodyHeight - bottomMargin)
		animation.height = bodyHeight - bottomMargin + "px";

    // No cabemos a lo ancho
    if (thisWidth > bodyWidth)
        animation.width = bodyWidth + "px";

	//var huboefecto=false;
    for (var i in animation) {
        // Esto solo se ejcuta si el objeto no está vacio.
	    jthis.animate(
            animation, {
                queue:false,
                duration:500
                /*complete:function() {
                    jthis.children(".ui-dialog-content").trigger('inplace');
                }*/
        });
		//huboefecto = true;
        break;
    }

	//if (!huboefecto)
	//	jthis.children(".ui-dialog-content").trigger('inplace');
	

	//jthis.fadeIn("slow",function(){jthis.children(".ui-dialog-content").trigger('inplace');});
};

jQuery.hiddenBarra = function() {
	$("#barranavegacion").attr("","");
	$("#barranavegacion").attr("","");
	bottomMargin=0;
}

jQuery.fn.weApplyWindowProperties = function(options){
    var jventana=jQuery(this);
    var ventana=jventana[0];
	var jpanel = $(ventana.panel);
    if (options.width)
        jventana.width(options.width);
    if (options.height)
        jventana.height(options.height);
    if (jventana.height()<options.minHeight)
        jventana.height(options.minHeight);
    if (jventana.width()<options.minWidth)
        jventana.width(options.minWidth);

    jventana.css({
        position:'absolute',
        overflow:'hidden',
        left:options.left+'px',
        top:options.top+'px'
    });

    if (ventana.panel.weOptions.flags==undefined)
        ventana.panel.weOptions.flags=0;

    if (!(ventana.panel.weOptions.flags & jQuery.WE_NO_DRAGGABLE))
        jventana.draggable({
            start:function(){
				jQuery.fn.weBringToFront.call(this);
				var coverDiv = $('<div></div>');
				coverDiv.css({
					position:'absolute',
					top:0,
					left:0,
					right:0,
					bottom:0,
					background:'transparent',
					zIndex:'999999999',
					cursor:'move'
				});
				this.coverDiv = coverDiv;
				$(this).append(coverDiv);
			},
            handle:'.ui-widget-header',
            stop:function(){
				jQuery.fn.weCheckWindowInSpace.call(this);
				this.coverDiv.remove();
			}
        });

    jventana.resizable({
        minWidth:options.minWidth,
        maxWidth:options.maxWidth,
        minHeight:options.minHeight,
        maxHeight:options.maxHeight,
        handles: 'e, s, w, se, sw',
		//resize:function(){
		//	jQuery(this).trigger('resize');
		//	jQuery(this).find("*").trigger('resize');
		//},
		start:function(){
			jQuery(this).weBringToFront();
			if (!jQuery.browser.msie)
				jQuery(this).css('opacity',.5);
			this.ocultados = jQuery('.we-window-content', this).children(':visible').css('visibility','hidden');
		},
        stop:function(){
			if (!jQuery.browser.msie)
				jQuery(this).css('opacity',1);
			//this.ocultados.fadeIn('medium');
            this.ocultados.css('visibility','visible');
            jQuery(this).weCheckWindowInSpace();
            jQuery(this).children('.contenedor').css('height',(jQuery(this).height()-50)+'px');
			setTimeout(function(){jQuery(this).trigger('resize');},10);
			setTimeout(function(){jQuery(this).find("*").trigger('resize');},50);
        }
    });

	if (ventana.panel.weOptions.flags & jQuery.WE_NO_RESIZABLE) {
        jventana.children('.ui-resizable-handle').css('cursor','default');
        jventana.children('.ui-resizable-handle').removeData("resizable").unbind();
    }
    
    jventana.bind('mousedown',jQuery.fn.weBringToFront);
    jventana.weBringToFront();

    jventana.find('.we-generated.we-close-button').click(function(){
        ventana.close();
    });
    jventana.find('.we-generated.we-maximize-button').click(function(){
		if (!ventana.isMaximized)
			jventana.weWindowResize(10000,10000);
		else
			jventana.weWindowResize(ventana.preMaximizeWidth, ventana.preMaximizedHeight);
		ventana.preMaximizeWidth = ventana.offsetWidth;
		ventana.preMaximizedHeight = ventana.offsetHeight;
		ventana.isMaximized = !ventana.isMaximized;
    });

	if (!(ventana.panel.weOptions.flags & jQuery.WE_NO_HISTORY)) {
		jventana.find('.we-generated.we-back-button').click(function(){
			ventana.history.pop();
			var h = ventana.history.pop();
			if (h!=undefined)
				jQuery(ventana.panel).weLoad(h.appUrl, h.queryString, h.requestMethod);
			if (ventana.history.length<=1)
				jQuery(this).hide();
		});
	}

    ventana.close = function() {
        var jventana=jQuery(this);
        jventana.children(".we-window-content").triggerHandler("weClose");
        jventana.unbind();
        jventana.remove();
        jQuery.weSpace.removeWindow(this);
    }

	jventana.hover(function() {
		jpanel.trigger("weFocus");
		//this.style.backgroundColor="green";
	}, function() {
		jpanel.trigger("weBlur");
		//this.style.backgroundColor="transparent";
	})

	// el wecheckwindowinspace tiene que estar al final, ya que dispara eventos que pueden requerir de la funcion ventana.close();
    jventana.weCheckWindowInSpace();
};

jQuery.fn.weWindowResize = function(width, height) {
	if (this.panel && this.panel.weOptions.style == "hidden")
		return;
	var bottomMargin = 60;
	var jthis = jQuery(this);
	var thisTop = jthis.offset().top;
    var thisLeft = jthis.offset().left;
    var thisWidth = width;
    var thisHeight = height;


    var bodyWidth = jQuery(document.body).width();
    var bodyHeight = jQuery(document.body).height();

    var animation = {};
	animation.width=width;
	animation.height=height;

    // Nos salimos por arriba
    if (thisTop < 0)
        animation.top = '0px';

    // No salimos por la izquierda
    if (thisLeft < 0)
        animation.left = '0px';

    // Nos salimos por abajo
    if (thisTop + thisHeight > bodyHeight-bottomMargin)
        // no vamos a dejar que la ventana se salga por arriba, en todo caso y si no cabe, que se salga por debajo, ya que allí es ta la barra de arrastre.
        if (thisHeight < bodyHeight-bottomMargin)
            animation.top = (bodyHeight - bottomMargin - thisHeight) + "px";
        else if (thisTop > 0)
            animation.top = '0px';

    // Nos salimos por la derecha
    if (thisLeft + thisWidth > bodyWidth)
        if (thisWidth < bodyWidth)
            animation.left = (bodyWidth - thisWidth) + "px";
        else if (thisLeft > 0)
            animation.left = '0px';

    // No cabemos a lo alto
    if (thisHeight > bodyHeight - bottomMargin)
        animation.height = bodyHeight - bottomMargin + "px";

    // No cabemos a lo ancho
    if (thisWidth > bodyWidth)
        animation.width = bodyWidth + "px";

	jQuery(this).animate(
		animation,
		{
			queue:false,
			duration:1000
		}
	);

}

jQuery.fn.weWindowResizeSinDock = function(width, height) {
	if (this.panel && this.panel.weOptions.style == "hidden")
		return;
	var bottomMargin = 0;
	var jthis = jQuery(this);
	var thisTop = jthis.offset().top;
    var thisLeft = jthis.offset().left;
    var thisWidth = width;
    var thisHeight = height;


    var bodyWidth = jQuery(document.body).width();
    var bodyHeight = jQuery(document.body).height();

    var animation = {};
	animation.width=width;
	animation.height=height;

    // Nos salimos por arriba
    if (thisTop < 0)
        animation.top = '0px';

    // No salimos por la izquierda
    if (thisLeft < 0)
        animation.left = '0px';

    // Nos salimos por abajo
    if (thisTop + thisHeight > bodyHeight-bottomMargin)
        // no vamos a dejar que la ventana se salga por arriba, en todo caso y si no cabe, que se salga por debajo, ya que allí es ta la barra de arrastre.
        if (thisHeight < bodyHeight-bottomMargin)
            animation.top = (bodyHeight - bottomMargin - thisHeight) + "px";
        else if (thisTop > 0)
            animation.top = '0px';

    // Nos salimos por la derecha
    if (thisLeft + thisWidth > bodyWidth)
        if (thisWidth < bodyWidth)
            animation.left = (bodyWidth - thisWidth) + "px";
        else if (thisLeft > 0)
            animation.left = '0px';

    // No cabemos a lo alto
    if (thisHeight > bodyHeight - bottomMargin)
        animation.height = bodyHeight - bottomMargin + "px";

    // No cabemos a lo ancho
    if (thisWidth > bodyWidth)
        animation.width = bodyWidth + "px";

	jQuery(this).animate(
		animation,
		{
			queue:false,
			duration:1000
		}
	);

}

jQuery.fn.trim= function trim (txt) {
	return txt.replace(/^\\s+/g,'').replace(/\\s+$/g,'');
};

// Esto hace quelos formularios vayan por ajax
jQuery.fn.weCaptureForms = function(){
    var jthis = jQuery(this);
	var i=0,j=0;
    jthis.find('form.we-form-capture').each(function(){		
		
        var form=jQuery(this);
		if (jQuery.DEBUG) console.log("Capture Forms "+j+++" form="+form+" ID="+form.attr("id"));
        var currOnSumbit=this.onsubmit;
        this.onsubmit=function(){return false;};
/*
		for(var instanceName in CKEDITOR.instances) {
		   if (jQuery.DEBUG) console.log( "recogiendo CKEDITOR %s",instanceName );
		}
*/

/*
		var $textareas = $(this).find("textarea.ckeditor").each(function() {
			if (jQuery.DEBUG) console.log("textarea %s",i++);
			var editorID=$(this).attr("id");
			var toolbar = $(this).attr('toolbar');
			toolbar = toolbar?toolbar:"Basico";
			if (jQuery.DEBUG) console.log("toolbar=%s",toolbar);
			
			var config = {
				toolbar:toolbar,
				width:  $(this).css("width"),
				height: $(this).css("height")
			};
			if (jQuery.DEBUG) console.log("editor ID=%s",editorID);
			var o = CKEDITOR.instances[editorID];
			if (o) {
				if (jQuery.DEBUG) console.log("ya existe editor ID=%s",editorID);
				CKEDITOR.remove(editorID);
				//delete CKEDITOR.instances[editorID];
			} 
			if (jQuery.DEBUG) console.log("creando editor ID=%s",editorID);
			CKEDITOR.replace(editorID,config);
			//CKEDITOR.instances[editorID].focus();
		});
			/*
		*/

 
        form.submit(function(){
			if (jQuery.DEBUG) console.log("En function submit de capture FORMS");
			var jlform=this;
			var $textareas = form.find("textarea.ckeditor");
			if ($textareas.length) {
				$textareas.each(function() {
					var o = CKEDITOR.instances[$(this).attr("id")];
					if (o) {
						o.fire("saveSnapshot");
						var txt=o.getData();
						var id=o.name;
						if (jQuery.DEBUG) console.log("id "+id);
						var posfixId=id.slice(9);
						if (jQuery.DEBUG) console.log("posfixId "+posfixId);
						id="#cke_contenido"+posfixId;
						if (jQuery.DEBUG) console.log("id "+id);

						var maxChars="infinito";
						var minChars=0;
						var txtminChars,txtmaxChars;
						var msgID='#mensajea';

						if ($(this).attr("msgID")) {msgID=$(this).attr("msgID");} else msgID="#mensajea";
						if ($(this).attr("maxChars")) {maxChars=parseInt($(this).attr("maxChars"), 10);} else maxChars="infinito";
						if ($(this).attr("minChars")) {minChars=parseInt($(this).attr("minChars"), 10)} else minChars=1;
						if ($(this).attr("txtminChars")) {txtminChars=$(this).attr("txtminChars");} else txtminChars='Es necesario escribir la respuesta';
						if ($(this).attr("txtmaxChars")) {txtmaxChars=$(this).attr("txtmaxChars");} else txtmaxChars='Texto demasiado largo';

						var longitud=txt.length;
						txtminChars=txtminChars.replace("#lon#", longitud);
						txtmaxChars=txtmaxChars.replace("#lon#", longitud);
						var diagL='<div class="we-standar-wrap"><img src="recursos/imagenes/pictos/eventos.png" style="float:left;margin-left:5px;margin-right:20px;"/><h2 style="margin-left:85px;padding-top:15px;">'+txtmaxChars+'</h2></div>';
						var diagC='<div class="we-standar-wrap"><img src="recursos/imagenes/pictos/eventos.png" style="float:left;margin-left:5px;margin-right:20px;"/><h2 style="margin-left:85px;padding-top:15px;">'+txtminChars+'</h2></div>';

						if (jQuery.DEBUG) console.log("maxChars:"+maxChars+" minChars:"+minChars);
						var diag;
						if (jQuery.DEBUG) console.log("txt.lenght:"+txt.length);

						if (minChars>0) {
							if (jQuery.DEBUG) console.log(" minChars mayor que 0:");
							if (jQuery.trim(txt)=='') {
								if (msgID=='dialog') {
									diag=$.weDialog(diagC,{height:200});
									setTimeout(function(){diag.close();},4000);
									$('#cke_contenido'+posfixId).css('border','1px solid red');
									$('#cke_contenido'+posfixId).focus();
									return false;
								}
								$(msgID+posfixId).html(txtminChars);
								$('#cke_contenido'+posfixId).css('border','1px solid red');
								$('#cke_contenido'+posfixId).focus();
								return false;
							}
							txt=txt.slice(txt.indexOf('<p>')+3,txt.lastIndexOf('</p'));
							if (jQuery.trim(txt)=='') {
								if (msgID=='dialog') {
									diag=$.weDialog(diagC,{height:200});
									setTimeout(function(){diag.close();},4000);
									$('#cke_contenido'+posfixId).css('border','1px solid red');
									$('#cke_contenido'+posfixId).focus();
									return false;
								}
								$(msgID+posfixId).html(txtminChars);
								$('#cke_contenido'+posfixId).css('border','1px solid red');
								$('#cke_contenido'+posfixId).focus();
								return false;
							}
							if (minChars>txt.length) {
								if (msgID=='dialog') {
									diag=$.weDialog(diagC,{height:200});
									setTimeout(function(){diag.close();},4000);
									$('#cke_contenido'+posfixId).css('border','1px solid red');
									$('#cke_contenido'+posfixId).focus();
									return false;
								}
								$(msgID+posfixId).html(txtminChars);
								$('#cke_contenido'+posfixId).css('border','1px solid red');
								$('#cke_contenido'+posfixId).focus();
								return false;
							}

						}
						if (maxChars!="infinito" && maxChars<txt.length) {
							if (jQuery.DEBUG) console.log("maxChars: en condicion");
							if (msgID=='dialog') {
								diag=$.weDialog(diagL,{height:200});
								setTimeout(function(){diag.close();},4000);
								$('#cke_contenido'+posfixId).css('border','1px solid red');
								$('#cke_contenido'+posfixId).focus();
								return false;
							}
							$(msgID+posfixId).html(txtmaxChars);
							$('#cke_contenido'+posfixId).css('border','1px solid red');
							$('#cke_contenido'+posfixId).focus();
							return false;
						}
						o.setData(txt, function () {
							o.execCommand('revisarlinks');
							if (jQuery.DEBUG) console.log("despues de revisar links");
							o.updateElement();
							if (jQuery.DEBUG) console.log("despues de update");
							if (currOnSumbit) {
								if (jQuery.DEBUG) console.log("en currOn");
								var resp=currOnSumbit.call(jlform);
								if (resp!=undefined && resp==false) {
									if (jQuery.DEBUG) console.log("resp false");
									return false;
								}
							}							 
							var params=jQuery(jlform).getFormValues();
							var url = jlform.action;
							if (url.indexOf("NOOP")!=-1) return false;
							var requestMethod = jlform.method.toUpperCase()||"POST";							
							var weTarget = jQuery(jlform).attr("weTarget");

							if (jlform.target=="_blank")
								jQuery.weWindow(url, params, {}, requestMethod); 
							else if (weTarget != undefined) {
								jQuery(weTarget).weLoad(url, params, requestMethod);
							} else {
								jthis.weLoad(url, params, requestMethod);
							}
							return false;
						});
					}
					return false;
				});
			} else {
				if (currOnSumbit) {
					var resp=currOnSumbit.call(this);
					if (resp!=undefined && resp==false) return false;
				}
				var params=jQuery(this).getFormValues();

				var url = this.action;
				if (url.indexOf("NOOP")!=-1) return false;

				var requestMethod = this.method.toUpperCase()||"POST";

				var weTarget = jQuery(this).attr("weTarget");

				if (this.target=="_blank")
					jQuery.weWindow(url, params, {}, requestMethod); // weWindow(i_appUrl, i_queryString, i_options, i_requestMethod);
				else if (weTarget != undefined) {
					jQuery(weTarget).weLoad(url, params, requestMethod);
				} else {
					jthis.weLoad(url, params, requestMethod);
				}
				return false;
			}
			return false;
        })	
    });

};

jQuery.weLoadCount = 0;

$(function() {
	jQuery(document.body).append('<div id="weLoadingDiv" style="position:absolute;z-index:2000000000;top:0;right:0;display:none;"><img src="recursos/loading.gif" style="margin:5px;" /></div>');
	$("#weLoadingDiv").ajaxStart(function(){$(this).show()});
	$("#weLoadingDiv").ajaxStop(function(){$(this).hide()});
	$("#weLoadingDiv").ajaxError(function(){$(this).hide()});
});

jQuery.fn.weLoad = function(appUrlA, queryStringA, requestMethodA, successCallback) {
	var ventana;
	if (this[0]) ventana = this[0].ventana;
	var appUrl = appUrlA;
	var queryString = queryStringA;
	var requestMethod = requestMethodA;

    if (requestMethod==undefined)
        requestMethod="GET";

	if (appUrl.indexOf("?")!=-1) {
		appUrl = appUrl.split("?",2);
		queryString = appUrl[1];
		appUrl = appUrl[0];
	}

	if (ventana && requestMethod!="POST") {
		//JL
		jQuery(".we-generated.we-back-button",ventana).show();
		ventana.history.push({
			appUrl:appUrl,
			queryString: requestMethod.toUpperCase() != "POST" ? queryString : "",
			requestMethod: requestMethod.toUpperCase() != "POST" ? requestMethod:"GET",
			target:this
		});

	}

    var jthis = jQuery(this);
	// El loadId sirve para asegurarse de que la última llamada al weLoad sea la que se muestre.
	var loadId = new Date().getTime()+"."+Math.random();
	if (jthis.data("loadId")) {
		try {
			jthis.data("request").abort();
		} catch (e) {}
	}
	var Cadena=appUrl.split("/");
	var lonCad=Cadena.length;
	var orden=Cadena[lonCad-1];
	
	jthis.data("loadId",loadId);

    var request = jQuery.ajax({
        url:appUrl,
		async: true,
        data:jQuery.weAddMetaDataToQueryString(queryString),
        type:requestMethod,
        error:jQuery.weAjaxError,
		complete:function(){
			var panel = jthis[0];
			if (panel) $(panel).trigger("weCargado");
		},
        success:function(data){
			if (loadId!=jthis.data("loadId")) return;
			jthis.data("loadId",undefined);
			var panel = jthis[0];
            jthis.unbind();
            jthis.weHtml(data);
			if (panel.ventana) {
				var title = panel.weOptions.title;
				if (title)
					jQuery(".ui-dialog-title",ventana).html(title);
				panel.weStatus.appUrl = appUrl;
				panel.weStatus.requestMethod = (requestMethod != "POST") ? requestMethod : "GET";
				panel.weStatus.queryString = (queryString != "POST") ? queryString : {};
			}
			successCallback && successCallback.apply(jthis.get(0),[data]);
        }
    });
	jthis.data("request", request);

}

jQuery.fn.weCaptureAllLinks = function() {
    var jthis = jQuery(this);
    jthis.find('a').click(function(e){
        this.blur();
		var weTarget = jQuery(this).attr("weTarget");
        if (this.target == '_blank')
            jQuery.weWindow(this.href, "", {});
        else if (this.target == '_xblank')
            jQuery.waiWindow(this.href, "", {}, method);
		else if (weTarget)
			jQuery(weTarget).weLoad(this.href, "", "GET");
		else
            jthis.weLoad(this.href, "", "GET");

        return false;
    });
    jthis.find('a:not(.we-link-capture)').find('a:not(.txtjl_no_capture)').each(function(){
        this.target='_blank';
    });
}

jQuery.fn.weCaptureLinks = function() {
    var jthis = jQuery(this);
    jthis.find('a.we-link-capture').click(function(e){
		var method = $(this).attr("method")||"GET";
        this.blur();
		var weTarget = jQuery(this).attr("weTarget");
        if (this.target == '_blank')
            jQuery.weWindow(this.href, "", {}, method);
        else if (this.target == '_xblank')
            jQuery.waiWindow(this.href, "", {}, method);
		else if (weTarget)
			jQuery(weTarget).weLoad(this.href, "", method);
		else
            jthis.weLoad(this.href, "", method);

        return false;
    });
	//jthis.find('a.txjl_no_capture').each(function(){return true;} );
    jthis.find('a:not(.we-link-capture)' ).find('a:not(.txtjl_no_capture)').each(function(){
		var enlace = this.href.replace(window.location.href,'');
        if (enlace.indexOf('#')!=0)
			this.target='_blank';
    });
}

jQuery.fn.weEnableWidgets = function(){
    var jthis = jQuery(this);
    var lenguaSize=25;
    // panels
    jQuery('.we-widget-panels',this).each(function(count){
        var panelContainer = jQuery(this);

		if (jQuery.browser.msie) {
			var h=panelContainer.parent().height();
			panelContainer.height(h);
			panelContainer.bind("resize",function(){
				var h = panelContainer.parent().height();
				panelContainer.height(h);
			});
		}

        var panels = panelContainer.children('.we-widget-panel');
        panels.wrapInner('<div class="we-content-inner"></div>').wrapInner('<div class="we-content-outer"></div>').append(
            '<div class="we-left"></div>'
            +'<div class="we-right"></div>'
            +'<div class="we-bottom-left"></div>'
            +'<div class="we-bottom-center"></div>'
            +'<div class="we-bottom-right"></div>'
        );
        panels.each(function(i){
            this.wePos=i;
			var jpanel = jQuery(this);
            jpanel.css({
				bottom:(panels.length-i-1)*lenguaSize+"px",
				zIndex:panels.length-i
			});
            jpanel.children('.we-content-outer').children('.we-content-inner').css('top',(i)*lenguaSize+5+"px");
            jpanel.click(function(){
                var thisPos=this.wePos;
                panels.each(function(j){
					var pj = jQuery(this);
                    switch(j<thisPos) {
                        case true:
							pj.height(jQuery(this).height());
							pj.css('bottom','auto');
							//jQuery(this).height(lenguaSize+"px");
							pj.animate( {height:lenguaSize*(this.wePos+1)+"px"}, 1000 );
							break;
                        default:
							pj.css("bottom",(pj.parent().height()-pj.height())+"px");
							pj.css('height','auto');
							pj.animate( {bottom:(panels.length-j-1)*lenguaSize+"px"}, 1000 );
							//pj.css('bottom',(panels.length-j-1)*lenguaSize+"px");
							break;
					}
                });
            });
        });
    });

	// we-widget-fieldset
	jQuery('.we-widget-fieldset',this).wrapInner('<div class="we-widget-fieldset-cc"></div>');
	jQuery('.we-widget-fieldset',this).prepend('\
		<div class="we-widget-fieldset-nw"></div>\n\
		<div class="we-widget-fieldset-n"></div>\n\
		<div class="we-widget-fieldset-ne"></div>\n\
		<div class="we-widget-fieldset-w"></div>\n\
		<div class="we-widget-fieldset-c"></div>\n\
		<div class="we-widget-fieldset-e"></div>\n\
		<div class="we-widget-fieldset-sw"></div>\n\
		<div class="we-widget-fieldset-s"></div>\n\
		<div class="we-widget-fieldset-se"></div>\n\
	');

	// we-widget-barra
	jQuery('.we-widget-barra',this).prepend('<div class="we-widget-barra-e"></div>');
};

// Valores predeterminados para las ventanas
jQuery.weWindowDefaults = {
    width:400,
    height:300,
    title:''
};

jQuery.weAjaxError = function (XMLHttpRequest, textStatus, errorThrown, responseContainer) {
     //alert("Error cargando '"+this.url+"'"
       //  +"\n--------\n"+XMLHttpRequest.status+":"+XMLHttpRequest.statusText
        // +"\n--------\n"+textStatus
        // +"\n--------\n"+errorThrown
     //);
	if (jQuery.DEBUG) console.log("Ajax Error XML: %s, text: %s throw: %s",XMLHttpRequest.statusText,textStatus,errorThrown);
	$("#weLoadingDiv").hide();
     if (responseContainer!=undefined) {
         responseContainer.weHtml(XMLHttpRequest.responseText);
     }
};

var weSpace = function(json){
    //this.idSpace = window.idSpace; // json.idSpace es siempre 0
    this.idSpace = json.idSpace;
    this.themeURL = json.themeURL;
    this.backgroundURL = json.backgroundURL;
    this.backgroundColor = json.backgroundColor;
    this.tipo=json.tipo;
    this.idusuario=json.idusuario;
    this.idgrupo=json.idgrupo;
    this.windowList = [];
    this.dockIcons = [];
    this.windowIndex = 0;
};

weSpace.prototype = weSpace;

weSpace.prototype.addWindow = function(ventana) {
    ventana.weSpaceIndex = this.windowIndex++;
    this.windowList.push(ventana);
};

weSpace.prototype.removeWindow = function(ventana) {
    var i;
    for (i=0; i<this.windowList.length; i++) {
        if (this.windowList[i]==ventana) {			
			var $editors = jQuery(ventana).find("textarea.ckeditor");
			if ($editors.length) {
				$editors.each(function() {
					var editorID = $(this).attr("id");
					var o = CKEDITOR.instances[editorID];
//					if (o) CKEDITOR.remove(editorID);//{o.destroy();}
					if (o) delete CKEDITOR.instances[editorID];//{o.destroy();}
				});
			}
            this.windowList.splice(i, 1);
        }
    }
};

weSpace.prototype.addDockIcon = function(dockIconRef) {
	for (var i = 0; i<this.dockIcons.length; i++)
		if (this.dockIcons[i].attr("appURL") == dockIconRef.attr("appURL"))
			this.dockIcons.splice(i,1);
	
    dockIconRef.get(0).weSpaceIndex = this.dockIcons.length;
    this.dockIcons.push(dockIconRef);
};

weSpace.prototype.clearDock = function() {
	this.dockIcons = [];
}

weSpace.prototype.serialize = function() {
	var ventana;
	var jventana;
	
    var i;
    var resp = {
        idSpace:this.idSpace,
        themeURL:this.themeURL,
        backgroundURL:this.backgroundURL,
        backgroundColor:this.backgroundColor,
        tipo:this.tipo,
        idusuario:this.idusuario,
        idgrupo:this.idgrupo,
        docks:[],
        aplicaciones:[]
    };

    /*
	for (i=0; i<this.dockIcons.length; i++) {
        var curIco=this.dockIcons[i];
		if (curIco.parent().html()) // Solo si todavia estamos en el dom
			resp.docks.push({
				appName:curIco.get(0).weStatus.appName,
				appURL:curIco.get(0).weStatus.appURL,
				iconURL:curIco.get(0).weStatus.iconURL
			})
    }
	*/
	// Para mejorar la funcionalidad la informacion del dock la tomamos escaneando el html del dock.
	jQuery(".we-dock .we-dock-icon").each(function(){
		var jthis=jQuery(this);
		resp.docks.push({
			appName:jthis.attr("appName"),
			appURL:jthis.attr("appURL"),
			iconURL:jthis.attr("iconURL").replace(/.*\//,"")
		});
	});

    // Primero agrupamos las ventanas por aplicaciones
    var tmpApps=[];
    for (i=0; i<this.windowList.length; i++) {
        ventana=this.windowList[i];
		jventana = jQuery(ventana);
        var appName = ventana.weStatus.appName
        if (tmpApps[appName] == undefined)
            tmpApps[appName] = [];
        tmpApps[appName].push(ventana);
    }
    for (i in tmpApps) {
        var currApp=tmpApps[i];
        var app={
            appName:i,
            ventanas:[]
        };
        for (var j=0; j<currApp.length; j++) {
            ventana = currApp[j];
            jventana = jQuery(ventana);

            // Si la ventana ha sido destruida del dom no procesamos.
            if (!jventana.parent().html())
                continue;
            
            var ventanaContent = jventana.children(".ui-widget-content").get(0);
			var qs = ventanaContent.weStatus.queryString;
			if (jQuery.DEBUG) console.log("QUERY STRING SERIAKIZE:"+qs);

		//	\"faction\":\"reply\"

			var rm = ventanaContent.weStatus.requestMethod;

			if (rm=="POST") {
				rm="GET";
				qs="";
			}

			// Nos aseguramos de que enviamos las propiedades de la ventana aunque la ventana del navegador ya no exista.
			var top = ventana.offsetTop || parseInt(ventana.style.top);
			var left = ventana.offsetLeft || parseInt(ventana.style.left);
			var width = ventana.offsetWidth || parseInt(ventana.style.width);
			var height = ventana.offsetHeight || parseInt(ventana.style.height);
			
            app.ventanas.push({
                "appUrl":ventanaContent.weStatus.appUrl,
                "appStatus":qs?qs:"",
				"requestMethod":rm,
                "queryString":qs?qs:"",
                "title":jventana.children('.ui-widget-header').children('.ui-dialog-title').html(),
                "top":top,
                "left":left,
                "width":width,
                "height":height,
                "estilo":ventanaContent.weStatus.estilo,
                "tipo":"",
                "iconURL":"",
				"zindex":jventana.css('zIndex')
            });
        }
        resp.aplicaciones.push(app);
    }

    resp = jQuery.compactJSON(resp);
    return resp;
};

weSpace.prototype.save = function() {
    jQuery.ajax({
        async:false,
        url:window.spaceUrl,
        data:jQuery.weAddMetaDataToQueryString({
			idSpace:this.idSpace,
			json:this.serialize()
		}),
        type:"POST",
        dataType:"text/html",
        error:jQuery.weAjaxError,
        success:function(response){
            // No hacemos nasa
        }
    });
};

weSpace.prototype.checkUnique = function(target) {
    var i;
    var targetUnique = target.weOptions.unique;
    if (targetUnique)
        for (i=0; i<this.windowList.length; i++) {
            var ventana = this.windowList[i];
			var jventana = jQuery(ventana);
            if (ventana.unique == targetUnique) {
                jventana.weActivate();
                return true;
            }
        }
    return false;
};

weSpace.prototype.busMessage = function(rid, action, widget, idGrupo, idUsuario, idSpace, idPropietario, contexto) {
	var data = {
		rid:rid,
		action:action,
		widget:widget,
		idGrupo:idGrupo,
		idUsuario:idUsuario,
		idSpace:idSpace,
		idPropietario:idPropietario,
		contexto:contexto
	};
	if (data.widget=="SISTEMA") {
		if (data.action=="SAVE") {
			if (data.idUsuario==0) return;
			var panel = panel;
			//$.weSpace.save();
		}
		if (data.action=="ADIOS") {
			if (data.idUsuario==0) return;
			$.event.trigger("logout");
			var panel = panel;
			//$.weSpace.save();
			setTimeout(function(){location.href="logout";},500);
			if (window.idGrupo) window.close();
		}
	} else jQuery.event.trigger("busMessage", data);
};

jQuery.fn.weExtendHtml = function() {
    var elm=jQuery(this);    
}

jQuery.fn.weExtensions = function() {
    var elm = jQuery(this);
    elm.weCaptureForms();
    elm.weCaptureLinks();

    elm.weEnableWidgets();

	/*
	CKEDITOR.replaceAll( function(textarea, config) {
		if (textarea.className=="text") return false;
		if (textarea.id=="summary") return false;
	//configuration????
		return true;
	});
	
*/
	elm.find('textarea.ckeditor').each(function() {
		var editorID = $(this).attr("id");
		var obj=CKEDITOR.instances[editorID];
		if (obj) {
			CKEDITOR.remove(obj);
			obj.destroy();
			obj= null;
		}
		var toolbar = $(this).attr('toolbar');
		toolbar = toolbar?toolbar:"Basico";
		var config = {
			toolbar:toolbar,
			width:  $(this).css("width"),
			height: $(this).css("height")
		};
		CKEDITOR.replace(editorID,config);		
	});
	

};

jQuery.fn.weHtml = function(html, appUrl, estilo, queryString){
	var uniqueId=new Date().getTime();
    var newHtml=jQuery('<div id="'+uniqueId+'" class="ui-dialog-content ui-widget-content">'+html+'</div>');
    var panel=jQuery(this).get(0);
    
    var elm=jQuery(this);
	// extraemos los <script> y los eliminamos para controlar cuando se ejecutan
    var codigo = newHtml.find("script:last");
    newHtml.find("script").remove();

    elm.html(newHtml.html());

    if (!panel.weOptions)
        panel.weOptions={};

    // A todos los elementos del dom les creamos la variable panel.
    elm.find('*').each(function(){this.panel=panel;});

    //eval(codigo.html());

	if (panel.weOptions.id)
		elm.attr("id", panel.weOptions.id);

    // capturar formularios, enlaces, activar fck y otros;
    elm.weExtensions();

	eval(codigo.html());

    // weSpace!
    panel.weStatus = {};
    panel.weStatus.appUrl = appUrl;
    panel.weStatus.estilo = panel.weOptions.style;
    panel.weStatus.queryString = queryString;

    elm.trigger('render');
    elm.trigger('inplace');
};

jQuery.weWindowColors = ["blanco", "calabaza", "cielo", "crema", "gris_oscuro", "hierba", "lechuga", "lila", "limon", "mar", "naranja", "pistacho", "sangre", "tomate", "turquesa","verde1","verde2","verde3"];


// Función de creación y carga de las ventanas
jQuery.weWindow = function(i_appUrl, i_queryString, i_options, i_requestMethod, i_successCallback) {
    var appUrl=i_appUrl;
	var queryString = i_queryString;
    var methodOptions=i_options||{};
    var requestMethod = i_requestMethod?i_requestMethod:"GET";
	var successCallback = i_successCallback;
    jQuery.ajax({
        url:appUrl,
        data:jQuery.weAddMetaDataToQueryString(queryString),
        type:requestMethod,
        dataType:"text/html",
        error:jQuery.weAjaxError,
        success:function(data){
            // Id único para las ventanas... de momento no es necesario
			var uniqueId=new Date().getTime();
            var elm = jQuery('<div id="'+uniqueId+'" class="we-window-content ui-dialog-content ui-widget-content">'+data+'</div>');
            // extraemos los <script> y los eliminamos para controlar cuando se ejecutan
            var codigo = elm.find("script:last");
            elm.find("script").remove();

            // Asignamos a panel el div que acabamos de crear para que este a mano de la función eval.
            var panel = elm.get(0);

            // A todos los elementos del dom les creamos la variable panel.
            elm.find('*').each(function(){this.panel=panel;});

            panel.weOptions={};

            // Ejecutamos el código que nos ha mandado el servidor
            eval(codigo.html());

			if (panel.weOptions.id)
				elm.attr("id", panel.weOptions.id);

            // Si solo puede haber una ventana abierta, vamos a ver si ya está abierta.
            if (jQuery.weSpace.checkUnique(panel)) {
				$(panel).unbind();
                return;
			}

            var estiloVentana = 'we-window_theme-'+(panel.weOptions.style?panel.weOptions.style:'default');
			var colorVentana = 'we-color-'+( panel.weOptions.color || "gris_oscuro");//jQuery.weWindowColors[Math.floor(Math.random()*jQuery.weWindowColors.length)] );

            var dragStyle="ui-draggable";
            if (panel.weOptions.flags & jQuery.WE_NO_DRAGGABLE)
                dragStyle="";

            var jventana = jQuery(
                '<div class="we-window '+estiloVentana+' '+colorVentana+' ui-widget ui-widget-content ui-resizable '+dragStyle+'">'
                    +'<div class="ui-dialog-titlebar ui-widget-header ui-helper-clearfix">'
                        +'<span class="we-barra-top-right"></span>'
                        +(panel.weOptions.flags & jQuery.WE_NO_HISTORY?'':'<span class="we-generated we-back-button we-back-button-inactive" style="display:none;"></span>')
                        +'<span class="ui-dialog-title">'+panel.weOptions.title+'</span>'
                        +'<span class="we-generated we-maximize-button"></span>'
                        +'<span class="we-generated we-close-button"></span>'
                    +'</div>'
                +'</div>'
            );
			var ventana = jventana.get(0);

			if (typeof successCallback == "function")
				successCallback.apply(window,[ventana]);

			if (!jQuery.browser.msie)
				jventana.css("opacity","0");
            if (panel.weOptions.flags & jQuery.WE_NO_CLOSEABLE)
                jventana.find('.we-generated.we-close-button').remove();
            if (!(panel.weOptions.flags & jQuery.WE_MAXIMIZABLE))
                jventana.find('.we-generated.we-maximize-button').remove();

            jventana.append(elm);


            ventana.unique = panel.weOptions.unique;

			ventana.history = [{appUrl:appUrl,queryString:queryString,requestMethod:requestMethod}];

            // Damos acceso a la ventana desde el panel
            panel.ventana = ventana;
			panel.jventana = jventana;
            ventana.panel = panel;

			var options = {};
            /* methodOptions: opciones pasadas al llamar a la funcion de abrir ventana
             * panel.weOptions: opciones que nos ha mandado el servidor
             * options: opciones predeterminadas de las ventanas
             *
             * methodOptions manda sobre panel.weOptions y éste, a su vez, manda sobre options.
            */
            jQuery.extend(options, jQuery.weWindowDefaults, panel.weOptions, methodOptions);
			options.left = options.left!=undefined ? options.left : Math.random()*(jQuery(document).width()-options.width);
			options.top = options.top!=undefined ? options.top : Math.random()*(jQuery(document).height()-options.height-20);

			if (options.barButtons) {
				var barButtons = options.barButtons;
				for (var i = 0; i < barButtons.length; i++) {
					var barButton = barButtons[i];
					var button = $('<span></span>');
					button.addClass('we-custom-button');
					if (barButton.classes) {
						for (var j = 0; j < barButton.classes.length; j++) {
							button.addClass(barButton.classes[i]);
						}
					}
					button.html(barButton.html);
					button.click(barButton.action);
					jventana.find('.ui-dialog-titlebar').prepend(button);
				}
			}
			//javascript:var a = $.weWindow('iframe.jsp?url=http://www.google.com/&title=Google&width=600&height=400');


			if (estiloVentana == "we-window_theme-hidden")
				options.top=-10000;

            // Abrimos la ventana
            jventana.appendTo(jQuery('#escritorio'));
            jventana.weApplyWindowProperties(options);

            elm.weExtensions();

            // weSpace!
            ventana.weStatus = {};
            ventana.weStatus.appName = methodOptions.appName;
            panel.weStatus = {};
            panel.weStatus.appUrl = appUrl;
            panel.weStatus.estilo = panel.weOptions.style;
            panel.weStatus.queryString = queryString;
            jQuery.weSpace.addWindow(ventana);

			if (options.zIndex) {
				jQuery.weMaxzIndex = Math.max(jQuery.weMaxzIndex, options.zIndex);
				jventana.css('zIndex',options.zIndex);
			}

			// Esto es para prevenir un bug del internet explorer que hace que cuando se cargan elementos de la cache el renderizado sea una cagada.
			if (jQuery.browser.msie) jventana.animate({width:jventana.width(), height:jventana.height()}, {queue:false, duration:1});

            elm.trigger('render');
			$(panel).trigger("weBlur");

        }
    });
};


jQuery.weWindowSpace = function(i_appUrl, i_queryString, i_options, i_requestMethod, i_successCallback) {
    var appUrl=i_appUrl;
	var queryString = i_queryString;
    var methodOptions=i_options||{};
    var requestMethod = i_requestMethod?i_requestMethod:"GET";
	var successCallback = i_successCallback;
    jQuery.ajax({
        url:appUrl,
        data:jQuery.weAddMetaDataToQueryString(queryString),
        type:requestMethod,
        dataType:"text/html",
        error:jQuery.weAjaxError,
        success:function(data){
            // Id único para las ventanas... de momento no es necesario
			var uniqueId=new Date().getTime();
            var elm = jQuery('<div id="'+uniqueId+'" class="we-window-content ui-dialog-content ui-widget-content">'+data+'</div>');
            // extraemos los <script> y los eliminamos para controlar cuando se ejecutan
            var codigo = elm.find("script:last");
            elm.find("script").remove();

            // Asignamos a panel el div que acabamos de crear para que este a mano de la función eval.
            var panel = elm.get(0);

            // A todos los elementos del dom les creamos la variable panel.
            elm.find('*').each(function(){this.panel=panel;});

            panel.weOptions={};

            // Ejecutamos el código que nos ha mandado el servidor
            eval(codigo.html());

			if (panel.weOptions.id)
				elm.attr("id", panel.weOptions.id);

            // Si solo puede haber una ventana abierta, vamos a ver si ya está abierta.
            if (jQuery.weSpace.checkUnique(panel)) {
				$(panel).unbind();
                return;
			}

            var estiloVentana = 'we-window_theme-'+(panel.weOptions.style?panel.weOptions.style:'default');
			var colorVentana = 'we-color-'+( panel.weOptions.color || "gris_oscuro");//jQuery.weWindowColors[Math.floor(Math.random()*jQuery.weWindowColors.length)] );

            var dragStyle="ui-draggable";
            if (panel.weOptions.flags & jQuery.WE_NO_DRAGGABLE)
                dragStyle="";

            var jventana = jQuery(
                '<div class="we-window '+estiloVentana+' '+colorVentana+' ui-widget ui-widget-content ui-resizable '+dragStyle+'">'
                    +'<div class="ui-dialog-titlebar ui-widget-header ui-helper-clearfix">'
                        +'<span class="we-barra-top-right"></span>'
                        +(panel.weOptions.flags & jQuery.WE_NO_HISTORY?'':'<span class="we-generated we-back-button we-back-button-inactive" style="display:none;"></span>')
                        +'<span class="ui-dialog-title">'+panel.weOptions.title+'</span>'
                        +'<span class="we-generated we-maximize-button"></span>'
                        +'<span class="we-generated we-close-button"></span>'
                    +'</div>'
                +'</div>'
            );
			var ventana = jventana.get(0);

			if (typeof successCallback == "function")
				successCallback.apply(window,[ventana]);

			if (!jQuery.browser.msie)
				jventana.css("opacity","0");
            if (panel.weOptions.flags & jQuery.WE_NO_CLOSEABLE)
                jventana.find('.we-generated.we-close-button').remove();
            if (!(panel.weOptions.flags & jQuery.WE_MAXIMIZABLE))
                jventana.find('.we-generated.we-maximize-button').remove();

            jventana.append(elm);


            ventana.unique = panel.weOptions.unique;

			ventana.history = [{appUrl:appUrl,queryString:queryString,requestMethod:requestMethod}];

            // Damos acceso a la ventana desde el panel
            panel.ventana = ventana;
			panel.jventana = jventana;
            ventana.panel = panel;

			var options = {};
            /* methodOptions: opciones pasadas al llamar a la funcion de abrir ventana
             * panel.weOptions: opciones que nos ha mandado el servidor
             * options: opciones predeterminadas de las ventanas
             *
             * methodOptions manda sobre panel.weOptions y éste, a su vez, manda sobre options.
            */
            jQuery.extend(options, jQuery.weWindowDefaults, panel.weOptions, methodOptions);
			options.left = options.left!=undefined ? options.left : Math.random()*(jQuery(document).width()-options.width);
			options.top = options.top!=undefined ? options.top : Math.random()*(jQuery(document).height()-options.height-20);

			if (options.barButtons) {
				var barButtons = options.barButtons;
				for (var i = 0; i < barButtons.length; i++) {
					var barButton = barButtons[i];
					var button = $('<span></span>');
					button.addClass('we-custom-button');
					if (barButton.classes) {
						for (var j = 0; j < barButton.classes.length; j++) {
							button.addClass(barButton.classes[i]);
						}
					}
					button.html(barButton.html);
					button.click(barButton.action);
					jventana.find('.ui-dialog-titlebar').prepend(button);
				}
			}
			//javascript:var a = $.weWindow('iframe.jsp?url=http://www.google.com/&title=Google&width=600&height=400');


			if (estiloVentana == "we-window_theme-hidden")
				options.top=-10000;

            // Abrimos la ventana
            jventana.appendTo(jQuery('#escritorio'));
            jventana.weApplyWindowProperties(options);

            elm.weExtensions();

            // weSpace!
            ventana.weStatus = {};
            ventana.weStatus.appName = methodOptions.appName;
            panel.weStatus = {};
            panel.weStatus.appUrl = appUrl;
            panel.weStatus.estilo = panel.weOptions.style;
            panel.weStatus.queryString = queryString;
            jQuery.weSpace.addWindow(ventana);

			if (options.zIndex) {
				jQuery.weMaxzIndex = Math.max(jQuery.weMaxzIndex, options.zIndex);
				jventana.css('zIndex',options.zIndex);
			}

			// Esto es para prevenir un bug del internet explorer que hace que cuando se cargan elementos de la cache el renderizado sea una cagada.
			if (jQuery.browser.msie) jventana.animate({width:jventana.width(), height:jventana.height()}, {queue:false, duration:1});

            elm.trigger('render');
			$(panel).trigger("weBlur");

        }
    });
};



jQuery.fn.weActivate = function() {
    var jthis = jQuery(this);
    jthis.weBringToFront();
    jthis.children('.ui-dialog-content').trigger('weActivate');
}

// Esta es la función que usamos para definir aplicaciones
jQuery.weApp = function(appName, iconURL, appURL) {
    // Creamos el icono
    var newIcon = jQuery('<img src="recursos/imagenes/Iconos/dock/'+iconURL+'" class="we-button we-dock-icon" appName="'+appName+'" appURL="'+appURL+'"/>');
    jQuery('#barranavegacion').append(newIcon);

    // weSpace!
    newIcon[0].weStatus = {};
    newIcon[0].weStatus.appName = appName;
    newIcon[0].weStatus.appURL = appURL;
    newIcon[0].weStatus.iconURL = iconURL;
    jQuery.weSpace.addDockIcon(newIcon);
};

jQuery.fn.weTooltip = function(text) {
	var jthis = $(this);
    var tooltip;
    var tooltipPositioner;
    // Creamos el tooltip
    tooltip=jQuery('<div class="we-dock-tooltip">'+text+'</div>');
    tooltip.css('position','absolute');
    tooltip.css('zIndex','999999999');
    tooltip.css('top','-10000px');
    tooltipPositioner=function(e) {
        var offset=jthis.offset();
        tooltip.css('left',offset.left+jthis.width()/2-tooltip.width()/2+'px');
        tooltip.css('top',(offset.top-tooltip.height()-15)+'px');
    }
    tooltip.appendTo(jQuery(document.body));

	var intervalTooltip;
    jthis.hover(
		function(){
			clearInterval(intervalTooltip);
            intervalTooltip = setInterval (function() {
				tooltipPositioner();
			},1000/25);
        },
        function(){
            //jQuery(document).unbind('mousemove',tooltipPositioner);
			clearInterval(intervalTooltip);
            tooltip.css('top','-10000px');
    });
	jthis.bind("click",
		function(){
            //jQuery(document).unbind('mousemove',tooltipPositioner);
			clearInterval(intervalTooltip);
            tooltip.css('top','-10000px');
	});
}

jQuery.fn.weMakeAppButton = function(){
    var icon = jQuery(this);

    icon.get(0).weStatus = {};
    icon.get(0).weStatus.appName = icon.attr("appName");
    icon.get(0).weStatus.appURL = icon.attr("appURL");
	var src = icon.get(0).src;
	src = src.replace(/.*\//,"");
    icon.get(0).weStatus.iconURL = src;

	icon.attr("iconURL", icon.attr("src"));

	icon.removeAttr("title");

    jQuery.weSpace.addDockIcon(icon);

	icon.weTooltip(icon.attr('appName'));


    // Creamos el icono
    icon.css('cursor','pointer');
    icon.click(function(){
		// Dragged es true cuando el icono está siendo movido, así que no queremos abrir la aplicación.
		if (this.dragged==true) {
			this.dragged=false;
			return;
		}
		
        jQuery.weWindow(icon.attr('appUrl'),{},{appName:icon.title});
    });

}

jQuery.weBackground = function(background) {
	if (background.indexOf('#')!=-1) {
		jQuery.weSpace.backgroundURL = '';
		jQuery.weSpace.backgroundColor = background;
	} else {
		jQuery.weSpace.backgroundURL = background;
	}
	if (jQuery.weSpace.backgroundColor == undefined || jQuery.weSpace.backgroundColor == 'null')
		jQuery.weSpace.backgroundColor = 'transparent';

	var data = jQuery.weSpace;

	var vp = "center"
	if (data.backgroundURL.indexOf("BOTTOM")!=-1) vp = "bottom"
	else if (data.backgroundURL.indexOf("TOP")!=-1) vp = "top";

	var hp = "center"
	if (data.backgroundURL.indexOf("RIGHT")!=-1) hp = "right"
	else if (data.backgroundURL.indexOf("LEFT")!=-1) hp = "left";

	try {
			jQuery(document.body).css('background', data.backgroundColor + ' url('+data.backgroundURL+') no-repeat '+hp+' '+vp);
	} catch (e) {
			jQuery(document.body).css('background', 'transparent url('+data.backgroundURL+') no-repeat '+hp+' '+vp);
	}
}

// Esto genera el estado inicial

$.cambiaLink = function(apps,s1,s2,s3) {
	if (apps.indexOf("\""+s1+"\":\""+s2+"\"")>=0) {apps=apps.replace(s2,s3);} //por si se ha enviado por JSON
	if (apps.indexOf(s1+"="+s2)>=0) {apps= apps.replace(s2,s3);} // por si se ha enviado por GET
	return apps;
}

$.cambiaLinks = function(aplicacion) {

	var queryString=aplicacion.queryString;
	var appStatus=aplicacion.appStatus;
	var appUrl=aplicacion.appUrl;

	if (appUrl) {
		if (appUrl.indexOf("foro")>=0) {
			if (appStatus) {
				//foros
				appStatus=$.cambiaLink(appStatus,"faction","nuevof","portada");
				appStatus=$.cambiaLink(appStatus,"faction","guardarf","portada");
				appStatus=$.cambiaLink(appStatus,"faction","eliminarf","portada");
				appStatus=$.cambiaLink(appStatus,"faction","editarf","portada");
				//hilos
				appStatus=$.cambiaLink(appStatus,"faction","nuevae","verf");
				appStatus=$.cambiaLink(appStatus,"faction","guardare","vere");
				appStatus=$.cambiaLink(appStatus,"faction","eliminare","verf");
				appStatus=$.cambiaLink(appStatus,"faction","editare","vere");
				//respuestas
				appStatus=$.cambiaLink(appStatus,"faction","nuevos","vere");
				appStatus=$.cambiaLink(appStatus,"faction","guardarr","vere");
				appStatus=$.cambiaLink(appStatus,"faction","eliminarr","vere");
				appStatus=$.cambiaLink(appStatus,"faction","editarr","vere");
				//comunes hilos y respuestas
				appStatus=$.cambiaLink(appStatus,"faction","publicar","vere");
				appStatus=$.cambiaLink(appStatus,"faction","despublicar","vere");
				appStatus=$.cambiaLink(appStatus,"faction","novisto","vere");
				appStatus=$.cambiaLink(appStatus,"faction","visto","vere");
			}
			if (queryString){
				//foros
				queryString=$.cambiaLink(queryString,"faction","nuevof","portada");
				queryString=$.cambiaLink(queryString,"faction","guardarf","portada");
				queryString=$.cambiaLink(queryString,"faction","eliminarf","portada");
				queryString=$.cambiaLink(queryString,"faction","editarf","portada");
				//hilos
				queryString=$.cambiaLink(queryString,"faction","nuevae","verf");
				queryString=$.cambiaLink(queryString,"faction","guardare","vere");
				queryString=$.cambiaLink(queryString,"faction","eliminare","verf");
				queryString=$.cambiaLink(queryString,"faction","editare","vere");
				//respuestas
				queryString=$.cambiaLink(queryString,"faction","nuevos","vere");
				queryString=$.cambiaLink(queryString,"faction","guardarr","vere");
				queryString=$.cambiaLink(queryString,"faction","eliminarr","vere");
				queryString=$.cambiaLink(queryString,"faction","editarr","vere");
				//comunes hilos y respuestas
				queryString=$.cambiaLink(queryString,"faction","publicar","vere");
				queryString=$.cambiaLink(queryString,"faction","despublicar","vere");
				queryString=$.cambiaLink(queryString,"faction","novisto","vere");
				queryString=$.cambiaLink(queryString,"faction","visto","vere");
			}
		}
		if (appUrl.indexOf("weblog")>=0) {		
			if (appStatus) {
				//blogs
				appStatus=$.cambiaLink(appStatus,"faction","nuevob","portada");
				appStatus=$.cambiaLink(appStatus,"faction","guardarb","portada");
				appStatus=$.cambiaLink(appStatus,"faction","eliminarb","portada");
				appStatus=$.cambiaLink(appStatus,"faction","editarb","portada");
				//articulos
				appStatus=$.cambiaLink(appStatus,"faction","nuevoa","verb");
				appStatus=$.cambiaLink(appStatus,"faction","abrirb","verb");
				appStatus=$.cambiaLink(appStatus,"faction","guardara","verb");
				appStatus=$.cambiaLink(appStatus,"faction","eliminara","portada");
				appStatus=$.cambiaLink(appStatus,"faction","publicara","verb");
				appStatus=$.cambiaLink(appStatus,"faction","despublicara","verb");
				appStatus=$.cambiaLink(appStatus,"faction","moderara","verb");
				//respuestas
				appStatus=$.cambiaLink(appStatus,"faction","reply","verb");
				appStatus=$.cambiaLink(appStatus,"faction","guardarb","verb");
				appStatus=$.cambiaLink(appStatus,"faction","publicarr","verb");
				appStatus=$.cambiaLink(appStatus,"faction","despublicarr","verb");
				appStatus=$.cambiaLink(appStatus,"faction","moderarc","verb");

				//comunes articulos y respuestas
				appStatus=$.cambiaLink(appStatus,"faction","visto","abrira");
				appStatus=$.cambiaLink(appStatus,"faction","novisto","abrira");

			}
			if (queryString) {
				//blogs
				queryString=$.cambiaLink(queryString,"faction","nuevob","portada");
				queryString=$.cambiaLink(queryString,"faction","guardarb","portada");
				queryString=$.cambiaLink(queryString,"faction","eliminarb","portada");
				queryString=$.cambiaLink(queryString,"faction","editarb","portada");
				//articulos
				queryString=$.cambiaLink(queryString,"faction","nuevoa","verb");
				queryString=$.cambiaLink(queryString,"faction","abrirb","verb");
				queryString=$.cambiaLink(queryString,"faction","guardara","verb");
				queryString=$.cambiaLink(queryString,"faction","eliminara","portada");
				queryString=$.cambiaLink(queryString,"faction","publicara","verb");
				queryString=$.cambiaLink(queryString,"faction","despublicara","verb");
				queryString=$.cambiaLink(queryString,"faction","moderara","verb");
				//respuestas
				queryString=$.cambiaLink(queryString,"faction","reply","verb");
				queryString=$.cambiaLink(queryString,"faction","guardarb","verb");
				queryString=$.cambiaLink(queryString,"faction","publicarr","verb");
				queryString=$.cambiaLink(queryString,"faction","despublicarr","verb");
				queryString=$.cambiaLink(queryString,"faction","moderarc","verb");

				//comunes articulos y respuestas
				queryString=$.cambiaLink(queryString,"faction","visto","verb");
				queryString=$.cambiaLink(queryString,"faction","novisto","verb");
			}
		}
		if (appUrl.indexOf("weWiki")>=0) {
			
			if (appStatus) {
				if (jQuery.DEBUG) console.log("cambialinks appStatus");
				//wikis
				appStatus=$.cambiaLink(appStatus,"faction","nuevaw","portada");
				appStatus=$.cambiaLink(appStatus,"faction","abrirw","portada");
				appStatus=$.cambiaLink(appStatus,"faction","guardarw","portada");
				appStatus=$.cambiaLink(appStatus,"faction","eliminarw","portada");
				//articulos
				appStatus=$.cambiaLink(appStatus,"faction","abrira","listara");
				appStatus=$.cambiaLink(appStatus,"faction","nuevoa","listara");
				appStatus=$.cambiaLink(appStatus,"faction","guardara","listara");
				appStatus=$.cambiaLink(appStatus,"faction","eliminara","listara");
				//revisiones
				appStatus=$.cambiaLink(appStatus,"faction","abrirr","revisionesa");
				appStatus=$.cambiaLink(appStatus,"faction","nuevor","revisionesa");
				appStatus=$.cambiaLink(appStatus,"faction","guardarr","verw");
				appStatus=$.cambiaLink(appStatus,"faction","eliminarr","revisionesa");
				appStatus=$.cambiaLink(appStatus,"faction","publicarr","revisionesa");
				//menus
				appStatus=$.cambiaLink(appStatus,"faction","nuevom","listarm");
				appStatus=$.cambiaLink(appStatus,"faction","abrirm","listarm");
				appStatus=$.cambiaLink(appStatus,"faction","guardarm","listarm");
				appStatus=$.cambiaLink(appStatus,"faction","eliminarm","listarm");

			}
			if (queryString){
				if (jQuery.DEBUG) console.log("cambialinks queryString");
				//wikis
				queryString=$.cambiaLink(queryString,"faction","nuevaw","portada");
				queryString=$.cambiaLink(queryString,"faction","abrirw","portada");
				queryString=$.cambiaLink(queryString,"faction","guardarw","portada");
				queryString=$.cambiaLink(queryString,"faction","eliminarw","portada");
				//articulos
				queryString=$.cambiaLink(queryString,"faction","abrira","listara");
				queryString=$.cambiaLink(queryString,"faction","nuevoa","listara");
				queryString=$.cambiaLink(queryString,"faction","guardara","listara");
				queryString=$.cambiaLink(queryString,"faction","eliminara","listara");
				//revisiones
				queryString=$.cambiaLink(queryString,"faction","abrirr","revisionesa");
				queryString=$.cambiaLink(queryString,"faction","nuevor","revisionesa");
				queryString=$.cambiaLink(queryString,"faction","guardarr","verw");
				queryString=$.cambiaLink(queryString,"faction","eliminarr","revisionesa");
				queryString=$.cambiaLink(queryString,"faction","publicarr","revisionesa");
				//menus
				queryString=$.cambiaLink(queryString,"faction","nuevom","listarm");
				queryString=$.cambiaLink(queryString,"faction","abrirm","listarm");
				queryString=$.cambiaLink(queryString,"faction","guardarm","listarm");
				queryString=$.cambiaLink(queryString,"faction","eliminarm","listarm");
			}			
		}

	}

	aplicacion.appStatus=appStatus;
	aplicacion.queryString=queryString;

	return aplicacion;
}


jQuery(function(){
	jQuery.ajax({
		url:window.spaceUrl,
		data:jQuery.weAddMetaDataToQueryString({}),
		type:"GET",
		dataType:"json",
		error:jQuery.weAjaxError,
		success:function(data){
			// weSpace! creamos el weSpace una vez tenemos el json
			jQuery.weSpace = new weSpace(data);

			var i;
			// Space
			if (data.backgroundColor == undefined || data.backgroundColor == 'null')
				data.backgroundColor = 'transparent';

			var vp = "center"
			var hp = "center"
			if (data.backgroundURL.indexOf("BOTTOM")!=-1)
				vp = "bottom"
			else if (data.backgroundURL.indexOf("TOP")!=-1)
				vp = "top";

			if (data.backgroundURL.indexOf("RIGHT")!=-1)
				hp = "right"
			else if (data.backgroundURL.indexOf("LEFT")!=-1)
				hp = "left";

			try {
				jQuery(document.body).css('background', data.backgroundColor + ' url('+data.backgroundURL+') no-repeat '+hp+' '+vp);
			} catch (e) {
				jQuery(document.body).css('background', 'transparent url('+data.backgroundURL+') no-repeat '+hp+' '+vp);
			}

			// Dock
			for (i=0; i<data.docks.length; i++) {
				var curIco = data.docks[i];
				jQuery.weApp(curIco.appName, curIco.iconURL, curIco.appURL);
			}

			// Ventanas
			var weManagerLoaded = false;
			for (i=0; i<data.aplicaciones.length; i++) {
				var curApp = data.aplicaciones[i];
				for (var j=0; j<curApp.ventanas.length;j++) {
					var currWindow = curApp.ventanas[j];
					weManagerLoaded = weManagerLoaded || currWindow.appUrl == "weManager.jsp";

					currWindow=$.cambiaLinks(currWindow);

					var options={
						width:currWindow.width,
						height:currWindow.height,
						title:currWindow.title,
						style:currWindow.estilo,
						appStatus:currWindow.appStatus,
						type:currWindow.tipo,
						left:currWindow.left,
						top:currWindow.top,
						appName:curApp.appName,
						zIndex:currWindow.zindex
						//,iconUrl:currWindow.iconURL
					}
					if (currWindow.queryString) {
						var qs = currWindow.queryString;
						try {
							// Si es un objeto queremos convertirlo a objeto de nuevo
							eval ("qs = "+qs);
							qs.text="";
						} catch (e) { }
						jQuery.weWindow(currWindow.appUrl, qs, options)
					}
					else
						jQuery.weWindow(currWindow.appUrl, {}, options)
				}
			}


			// Activamos la funcionalidad de los iconos
			jQuery('.we-button').each(function(){
				jQuery(this).weMakeAppButton();
			});

			// Nos aseguramos de que se abra el weManager.jsp
			if (!weManagerLoaded) $.weWindow("weManager.jsp");

			// Avisamos al resto de que ya esta cargada la info
			//jQuery(document.body).css("width",3500);
			//jQuery(document.body).css("height",3500);

			jQuery.event.trigger('weLoaded');
		}
	});

});

jQuery.fn.weMakeDockIcon = function(){
    var elm=jQuery(this);
    var dockIcon=this.get(0);
    dockIcon.startW=elm.width();
    dockIcon.startH=elm.height();
    dockIcon.computedW=dockIcon.startW;
    dockIcon.computedH=dockIcon.startH;
    dockIcon.aspectRatio=dockIcon.startW/dockIcon.startH;
	dockIcon.jthis = elm;
    //efectLens = Math.max(this.startW,efectLens);

    elm.width(dockIcon.startW/2);
    elm.height(dockIcon.startH/2);
	dockIcon.currW = elm.width();
	dockIcon.currH = elm.height();
};

// Esto se ejecuta cuando ya hemos cargado la información inicial del servidor

jQuery(document).bind("weLoaded", function(e) {
    var dockContent;

    // weDock
    jQuery('.we-dock').each(function(){
        var elm=jQuery(this);
        elm.hover(function(){jQuery(this).css('zIndex','999999999')},function(){jQuery(this).css('zIndex','1')})
        dockContent=jQuery('<div class="we-dock-content"></div>');
        elm.find(".we-dock-icon").appendTo(dockContent);
        elm.find(".we-dock-icon").remove();
		var loH = 25;
        elm.append(jQuery('<center></center>').append('<table cellspacing="0" cellpadding="0" border="0"><tr>'
            +'<td class="we-dock-tray-left" style="height:'+loH+'px;"></td>'
            +'<td class="we-dock-tray-center" style="height:47px;"></td>'
            +'<td class="we-dock-tray-right" style="height:47px;"></td>'
        +'</tr></table>'));
        elm.find('td.we-dock-tray-center').append(dockContent);

        dockContent.find('.we-dock-icon').each(function(){jQuery(this).weMakeDockIcon();});

    });

    jQuery('.we-dock-content').sortable({
		tolerance:'pointer',
		appendTo:'body',
		placeholder:'we-dock-placeholder',
		forcePlaceholderSize: true,
		axis:'x',
		change:function(event, ui){
			ui.item.bind('mouseup',function(e){
				this.dragged = true;
				jQuery(this).unbind('mouseup');
			});
		}
	});

    // Hacemos un polling para redimensionar los iconos del dock
    var interval;
	var maxHeight=48;
	jQuery('.we-dock').hover(
		function() {
			clearInterval(interval);
			interval = setInterval(function(){
				try {
					dockContent.children('.we-dock-icon').each(function(i){
						var calibraje = 20;
						var elm=this.jthis;
						var pos=elm.offset();
						var dx = (pos.left + this.computedW/2) - window.mousex;
						var dy = (pos.top + this.computedH/2) - window.mousey;
						var dist = Math.sqrt(dx*dx + dy*dy);
						var newH = this.startH - dist/2 + calibraje;
						if (newH>maxHeight) newH=maxHeight;
						else if (newH<this.startH/2) newH=this.startH/2;
						!(i-1) && maxHeight<96 && (maxHeight+=5);
						this.computedH = newH;
						this.computedW = newH*this.aspectRatio;
						elm.width( (this.currW + this.computedW) / 2 );
						elm.height( (this.currH + newH) / 2 );
						this.currW = this.computedW;
						this.currH = this.computedH;
					});
				} catch(e) {
					clearInterval(interval);
				}
			},1000/25);
		},
		function() {
			clearInterval(interval);
			interval = setInterval(function(){
				try {
					var max=99999, min=0;
					dockContent.children('.we-dock-icon').each(function(i){
						var jthis = jQuery(this);
						this.currW = this.computedW = (jthis.width()+this.startW/2)/2;
						maxHeight = this.currH = this.computedH = (jthis.height()+this.startH/2)/2;
						jthis.width(this.computedW);
						jthis.height(this.computedH);
						max = Math.min(jthis.height(),max);
						min = Math.max(jthis.height(),min);
					});
					if (max == min)
						clearInterval(interval);
				} catch(e) {
					clearInterval(interval);
				}
			},1000/25);
		}
	);

    // Avisamos al resto de que ya hemos renderizado lo que queríamos renderizar
    jQuery.event.trigger('weReady');
});

// Nos guardamos la posición del ratón a la mínima que se mueva
jQuery(document).bind('mousemove',function(e){
    window.mousex=e.pageX;
    window.mousey=e.pageY;
});
window.mousex=0;
window.mousey=0;

jQuery(window).unload(function (e) {
    // parece que el
    // navegador nos restringe la ejecución del evento onsbumit del formulario
    // una vez se ha iniciado la descarga de la ventana, por lo que esto no acaba de ser util.
    //jQuery("*").each(function(){
    //    this.weUnload && this.weUnload();
    //})
    try {		
		var $editors = this.find("textarea.ckeditor");
		if ($editors.length) {
			$editors.each(function() {
				var editorID = $(this).attr("id");
				var o = CKEDITOR.instances[editorID];
//				if (o) CKEDITOR.remove(editorID);//{o.destroy();}
				if (o) delete CKEDITOR.instances[editorID];//{o.destroy();}
			});
		}		
        jQuery.weSpace.save();
    } catch (error) {
        //alert(error);
    }
});

jQuery(window).resize(function(e){
	try {
		var ventanas = jQuery.weSpace.windowList;
		for (var i=0; i<ventanas.length; i++) {
			jQuery(ventanas[i]).weCheckWindowInSpace();
		}
	} catch (e) {};

	// Este evento lo usamos para notificar a los elementos de que el escritorio de ha redimensionado.
	jQuery.event.trigger("weResize");
});

jQuery.weDialogDefaults = {
	title: "Mensaje",
	width:400,
	height:300
}

// Diálogos
jQuery.weDialog = function(content, options) {
	options = options?options:{};

	// Id único para las ventanas... de momento no es necesario
	var uniqueId=new Date().getTime();
	var elm = jQuery('<div id="'+uniqueId+'" class="we-window we-window-content ui-dialog-content ui-widget-content">'+content+'</div>');

	var estiloVentana = 'we-window_theme-'+(options.style?options.style:'default');
	//var colorVentana = 'we-color-'+( options.color || jQuery.weWindowColors[Math.floor(Math.random()*jQuery.weWindowColors.length)] );
	var colorVentana = 'we-color-' + ( options.color || "gris_oscuro" );

	if (!options.title)
		options.title = '';


	var dragStyle="ui-draggable";

	var dialog = jQuery(
		'<div class="we-window '+estiloVentana+' '+colorVentana+' we-dialog-window ui-widget ui-widget-content ui-resizable '+dragStyle+'">'
			+'<div class="ui-dialog-titlebar ui-widget-header ui-helper-clearfix">'
				+'<span class="we-barra-top-right"></span>'
				+'<span class="ui-dialog-title">'+options.title+'</span>'
				+'<span class="we-generated we-close-button"></span>'
			+'</div>'
		+'</div>'
	);

	dialog.append(elm);

	var buttonText = options.buttonText ? options.buttonText : 'Aceptar';

	var buttons = options.buttons;
	if (buttons === undefined) {
		dialog.append('<div class="we-button-bar"><div style="margin:auto;width:121px;"><a class="we-widget-button we-boton-aceptar">'+buttonText+'</a></div></div>');
		dialog.find('.we-boton-aceptar').click(function(){
			dialog.close();
		});
	} else {
		var jbuttons = jQuery('<div style="margin:auto;"></div>');

		var count = 0;
		for (var i in buttons) {
			count++;
			var jbutton = jQuery('<a class="we-widget-button we-boton-aceptar" style="float:left;">'+buttons[i]+'</a>');
			jbutton[0].respuesta = i;
			jbutton.click(function(){
				dialog.close(this.respuesta);
			});
			jbuttons.append(jbutton);
		}

		jbuttons.width(121*count);

		jbuttons = jQuery('<div class="we-button-bar"></div>').append(jbuttons);

		dialog.append(jbuttons);
	}

	var o={}

	jQuery.extend(o, jQuery.weDialogDefaults, options);

	options = o;

	// Abrimos la ventana
	var bg = jQuery('<div onclick="return false;" style="background:url(recursos/negro.png);position:absolute;top:0;left:0;width:100%;height:100%;"></div>');
	dialog.get(0).bg = bg;

	if (!jQuery.browser.msie) {
		bg.css('opacity',0);
		bg.animate({opacity:1},{duration:500,queue:false});
	}
	bg.appendTo("#escritorio");
	bg.weBringDialogToFront();
	dialog.appendTo(jQuery('#escritorio'));
	dialog.weApplyDialogProperties(options);

	elm.weExtensions();

	var panel = elm.get(0);

	// A todos los elementos del dom les creamos la variable panel.
	elm.find('*').each(function(){this.panel=panel;});

	if (!jQuery.browser.msie) {
		dialog.css('opacity',0);
		dialog.animate({opacity:1},{queue:false,duration:500});
	}

	dialog.options = options;

	return dialog;
};

jQuery.fn.weApplyDialogProperties = function(options){
    var jthis=jQuery(this);
    var dialog=this;
    if (options.width)
        jthis.width(options.width);
    if (options.height)
        jthis.height(options.height);
    if (jthis.height()<options.minHeight)
        jthis.height(options.minHeight);
    if (jthis.width()<options.minWidth)
        jthis.width(options.minWidth);

	var esc = jQuery("#escritorio");
    jthis.css({
        position:'absolute',
        overflow:'hidden',
        left:(esc.width()-jthis.width())/2+'px',
        top:(esc.height()-jthis.height())/2+'px'
    });

    jthis.resizable({
        start:jQuery.fn.weBringToFront,
        handles: 'e, s, w, se, sw',
        stop:function(){
            jQuery(this).weCheckWindowInSpace();
            jQuery(this).children('.contenedor').css('height',(jQuery(this).height()-50)+'px')
        }
    });

    jthis.children('.ui-resizable-handle').css('cursor','default');
    jthis.children('.ui-resizable-handle').removeData("resizable").unbind();

    jthis.bind('mousedown',jQuery.fn.weBringDialogToFront);
    jthis.weBringDialogToFront();
    jthis.weCheckWindowInSpace();

    jthis.find('.we-generated.we-close-button').click(function(){
        dialog.close();
    });

    this.close = function(code) {
		jQuery(this).unbind();
        jQuery(this).remove();
		jQuery(this.get(0).bg).remove();
		
		if (this.options && this.options.close)
			this.options.close(code);
    }
};

jQuery.weAddMetaDataToQueryString = function(queryString) {
	var resp=queryString;
	var idPropietario = jQuery.weSpace ? jQuery.weSpace.idusuario : "";
	switch (typeof resp) {
		case "string":
			var vars = resp.split('&');
			resp = {};
			for (var i = 0; i < vars.length; i++) {
				var word = vars[i].split('=');
				var variable = unescape(word[0]);
				var valor = unescape(word[1]);
				if (variable) {
					resp[variable] = valor;
					//if (jQuery.DEBUG) console.log(" variable %s valor %s",variable,valor);
				}
			}
			//resp+="idSpace="+window.idSpace+"&contexto="+window.contexto+"&idGrupo="+window.idGrupo;
			// AQUI NO VA BREAK
		case "object":
			resp.idSpace = resp.idSpace || window.idSpace;
			// No se puede hacer override del contexto porque sinó cuando guardamos el estado de un space como administradores todas las ventanas recuerdan el estado de administrador.
			resp.contexto = window.contexto;
            resp.idGrupo = resp.idGrupo || window.idGrupo;
            resp.idPropietario = idPropietario;
			break;
		default:
			resp = {
				idSpace:window.idSpace,
				contexto:window.contexto,
                idGrupo:window.idGrupo,
				idPropietario:idPropietario
			};
			break;
	}
	//if (jQuery.DEBUG) console.log("weAddMetaDataToQueryString resp %s: ",jQuery.compactJSON(resp));
	return resp;
}

jQuery.fn.recursiveSet = function(varName, value) {
	$(this).find("*").each(function(){this[varName]=value});
}

jQuery.fn.getFormValues = function() {
	var params = {};
	jQuery(this)
		.find("input[checked], input[type='text'], input[type='password'], input[type='submit'], option[selected], textarea")
		.filter(":enabled")
		.each(function() {
			var name = this.name || this.id || this.parentNode.name || this.parentNode.id;
			if (name) params[ name ] = this.value;
		});

	jQuery(this)
		.find("input[type='hidden']")
		.each(function() {
			var name = this.name || this.id || this.parentNode.name || this.parentNode.id;
			if (name) params[ name ] = this.value;
		});

	return params;
}

jQuery.selection = function() {
	var sel;
	if (window.getSelection)
		sel = window.getSelection().getRangeAt(0);
	else if (document.getSelection)
		sel = document.getSelection();
	else if (document.selection)
		sel = document.selection.createRange().text;
	return sel;
}

jQuery.looper_ = function(loopFunction, loopsPerCicle, pausePerCicle, pauseFuncion, completeFunction, loopCount) {
	var i, r;
	for (i = 0; i < loopsPerCicle; i++) {
		r = loopFunction(loopCount)
		loopCount++;
		if (r===true)
			return completeFunction(loopCount);
		else if (r===false)
			break;
	}
	pauseFuncion(loopCount);
	setTimeout(jQuery.looper_, pausePerCicle, loopFunction, loopsPerCicle, pausePerCicle, pauseFuncion, completeFunction, loopCount);
};

jQuery.looper = function(params) {
	if (typeof params.loop != "function")
		params.loop = function(){};
	if (typeof params.pause != "function")
		params.pause = function(){};
	if (typeof params.complete != "function")
		params.complete = function(){};

	params.loopCount = params.loopCount || 0;
	jQuery.looper_(params.loop, params.loopsPerCicle, params.pausePerCicle, params.pause, params.complete, params.loopCount);
};

jQuery.maximoZIndex = jQuery.fn.maximoZIndex = function(opt) {
    var def = {inc: 10, group: "*"};
    $.extend(def, opt);
    var zmax = 0;
    $(def.group).each(function() {
        var cur = parseInt($(this).css('z-index'));
        zmax = cur > zmax ? cur : zmax;
    });
    if (!this.jquery)
        return zmax;
    return this.each(function() {
        zmax += def.inc;
        $(this).css("z-index", zmax);
    });
}

window.onbeforeunload = function() {
	jQuery.weAjaxError = undefined;
	jQuery.event.trigger("weUnload");
};

jQuery(window).bind("unload",function(){
	try {
		if ($.isGoogleMapsApiLoaded) GUnload();
		
		var $editors = this.find("textarea.ckeditor");
		if ($editors.length) {
			$editors.each(function() {
				var editorID = $(this).attr("id");
				var o = CKEDITOR.instances[editorID];
				if (o) o.destroy();
//				if (o) CKEDITOR.remove(editorID);
//				//{o.destroy();}
//				if (o) delete CKEDITOR.instances[editorID];//{o.destroy();}
			});
		}		
	} catch (e) {}
});

// No queremos que nadie nos borre el html
document.write = function(html) {
	// Simplemente inutilizamos esta funcion absurda.
	//$('body').append(html);
};

function googleMapsApiLoaded() {
	$.isGoogleMapsApiLoading = false;
	$.isGoogleMapsApiLoaded = true;
	$.event.trigger("mapaCargado");
}

$.weDebug = {};
$.weDebug.find = function(propertyName, propertyValue, depth, container, ruta, checkedlist) {
	if (depth<=0) return "";
	if (!checkedlist) checkedlist = [];
	
	// Si no especificamos donde buscar, buscamos en window
	if (!container) return "";
	if (!ruta) ruta = "?"

	var i;

	for (i = 0; i<checkedlist.length; i++) {
		if (checkedlist[i]===container) {
			return "";
		}
	}
	checkedlist.push(container);

	try {
		var resp = "";
		var valor = container[propertyName];
		// miramos si el lugar en el que miramos ya está lo que buscamos.
		if (valor === propertyValue) {
			resp += ruta+"\n";
		} else {
			// Como no está en este elemento, buscamos en sus subelementos
			depth--;
			for (i in container) {
				if (!i) continue;
				try {
					var hijo = container[i];
					if (hijo) {
						resp += $.weDebug.find(propertyName, propertyValue, depth, container[i], ruta+"."+i, checkedlist);
					}
				} catch (e) { }
			}
		}
		return resp;
	} catch (e) {
		return "";
	}
	return "";
};

/*
trim = function (txt) {
	return txt.replace(/^\\s+/g,'').replace(/\\s+$/g,'');
}
*/

copyToClipboard = function(txt) {
	if(window.clipboardData) {
		window.clipboardData.clearData();
		window.clipboardData.setData("Text", txt);
	} else if(navigator.userAgent.indexOf("Opera") != -1) {
		window.location = txt;
	} else if (window.netscape) {
		try {
			netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
		} catch (e) {
			alert("Es necesario establecer 'signed.applets.codebase_principal_support=true' en about:config'");
			return false;
		}
		var clip = Components.classes['@mozilla.org/widget/clipboard;1'].createInstance(Components.interfaces.nsIClipboard);
		if (!clip) return false;
		var trans = Components.classes['@mozilla.org/widget/transferable;1'].createInstance(Components.interfaces.nsITransferable);
		if (!trans) return false;

		trans.addDataFlavor('text/unicode');

		var str = new Object();
		var len = new Object();
		str = Components.classes["@mozilla.org/supports-string;1"].createInstance(Components.interfaces.nsISupportsString);
		var copytext = txt;

		str.data = copytext;

		trans.setTransferData("text/unicode",str,copytext.length*2);
		var clipid = Components.interfaces.nsIClipboard;

		if (!clip) return false;
		clip.setData(trans,null,clipid.kGlobalClipboard);
	}

};