var myalertF=1;
var mytagalertF=1;
var username_min = 2;  var username_max = 25; var icon_error   = "<img src='templates/default/images/error.gif' alt='' width='16' height='16' align='absmiddle' /> ";
var icon_ok      = "";
var user_errorF=0;
var email_errorF=0;
var captcha_errorF=0;

	function show_text_form(type){
		
		if (type=="logged"){
			__$("#textsDivForm").hide();
			__$("#textsDivLogged").show();
		
			__$("#texto_tab_2").addClass("seleccionado");
			__$("#texto_tab_1").removeClass("seleccionado");
			return login_window();
		}else{
			__$("#textsDivLogged").hide();
			__$("#textsDivForm").show();	
	
			__$("#texto_tab_1").addClass("seleccionado");
			__$("#texto_tab_2").removeClass("seleccionado");
			
		}
		
	}

	function cambio_autor(opcion) {
		if (document.getElementById('capa_autor')){
			if(opcion==1) {
				document.getElementById('capa_autor').style.display = "none";
			} else {
				document.getElementById('capa_autor').style.display = "inline";
			}
		}
		__$('#es_autor').attr({"value":opcion});
	}
	
	function confirmar() {
		var agree=confirm("¿Estas seguro de querer eliminar este pregunta?");
		if (agree)
			return true ;
		else
			return false ;
	}
	
	function crear_ajax() {
		var ro;
		var browser = navigator.appName;
		if(browser == "Microsoft Internet Explorer"){
			ro = new ActiveXObject("Microsoft.XMLHTTP");
		}else{
			ro = new XMLHttpRequest();
		}
		return ro;
	}
	
	var http = crear_ajax();
	
	function enviar(url) {
		http.open('get', url);
		http.setRequestHeader("If-Modified-Since", "Sat, 1 Jan 2000 00:00:00 GMT");
		http.onreadystatechange = respuesta;
		http.send(null);
	}
	
	function respuesta() {
		if(http.readyState == 4){
			var response = http.responseText;
			var update = new Array();
	
			if(response.indexOf('|' != -1)) {
				update = response.split('|');
				document.getElementById(update[0]).innerHTML = update[1];
			}
		}
	}
	
	function cambiar_categoria() {
		
		document.getElementById("capa_subcategoria").innerHTML =  "<div align=\"center\"><img src=\"images/loading.gif\" width=\"32\" height=\"32\">";
		
		id = document.getElementById("categoria").value;
			
		enviar("includes/lista_categorias.php?id=" + id);
			
	}
	
	function isBlank(val){
		if(val==null){return true;}
		for(var i=0;i<val.length;i++) {
			if ((val.charAt(i)!=' ')&&(val.charAt(i)!="\t")&&(val.charAt(i)!="\n")&&(val.charAt(i)!="\r")){return false;}
			}
		return true;
	}
		function show_loader(origin){
		
		__$(origin).html("<div id='progress_indic_small'>&nbsp;&nbsp;&nbsp;&nbsp;</div>");
	
	}
	
	function hide_loader(){
		__$('#progress_indic_small').remove();
	}
	
	function check_email()
	{
	  email=__$("#uemail").attr("value");
	  if (!email){
	  	if (!__$("#subscr").attr("checked") || __$("#subscr").attr("checked")==false)return true; 
		myerralert("Por favor, introduce tu e-mail si quieres suscribirte a este pregunta","uemail","");
		email_errorF=1;
		return false;
	  }
	  if (/^[a-z0-9_\.\-]+@[a-z0-9_\.\-]+(\.[a-z0-9_]{2,3})+$/i.test(email)){
		if (email_errorF==1)__$("#err_uemail").html("");
		email_errorF=0;
		noerralert('uemail');
		return true;
	  }else{
		myerralert("La direcci&oacute;n e-mail que has introducido es incorrecta.","uemail","");
		email_errorF=1;
		return false;
	  }
	}	
	
	function check_username()
	{
	  username=__$("#uname").attr("value");
	  if (!username){
	  			myerralert("Por favor, introduce tu alias","uname","");
		user_errorF=1;
		return false;
			  }
	  	  if (new RegExp ("^([a-zA-ZçñáéíóúàèìòùüïöüÁÉÍÓÚÀÈÌÒÙÜÏÖÜ\\s0-9-]{"+username_min+","+username_max+"})$","i").test(username)){
		if (user_errorF==1)__$("#err_uname").html("");
		user_errorF=0;
		return true;
	  }else{
		myerralert("Por favor, introduce un nombre de usuario v&aacute;lido. S&oacute;lo se admiten a-z, A-Z, 0-9, entre 2 y 25 caracteres.","uname","");
		user_errorF=1;
		return false;
	  }
	}
	
	function check_user_onChange(){
		
		if (check_username()){
			check_user_availability();
		}
	}
	
	function check_user_availability(){
		username=__$("#uname").attr("value");
		if (!username)return false;
		__$.ajax({
		  url: "registrarse_ajax_username_check.php?username="+username,
		  cache: false,
		  beforeSend: function (req){
		
			show_loader('#err_uname');
			
			return req;
		  },
		  complete: function (req,status){
			hide_loader();
			return req;
		  },  
		  success: function(html){
			
			
			__$('#err_uname').html(html);
			
			if (__$('#username_result').attr ("value")=='available'){
								noerralert('uname');
				user_errorF=0;
			} 
			 
			if(__$('#username_result').attr("value")=='taken'){
				myerralert("Este nombre de usuario ya est&aacute; siendo utilizado por un usuario registrado. Por favor, escoge otro diferente.","uname","");
				user_errorF=1;
				
			}
			
		  }
		});
	}
	
	function check_captcha_truth(com_id){
		captch=__$("#captcha_"+com_id).attr("value");
		if (!captch)return false; // || captcha_errorF
		__$.ajax({
		  url: "/includes/check_captcha.php",
		  type:"post",
		  data:"captcha_ingresado="+captch,
		  cache: false,
		  beforeSend: function (req){
		
			show_loader('#err_captcha_'+com_id);
			
			return req;
		  },
		  complete: function (req,status){
			hide_loader();
			return req;
		  },  
		  success: function(html){
			
			
			if (html){
								myerralert(html,"captcha_"+com_id,""); 
				captcha_errorF=1;		
			}else{
				__$('#err_captcha_'+com_id).removeClass("form_error");
								noerralert('captcha_'+com_id);
				captcha_errorF=0;
			}
			
		  }
		});
	}
	
	function check_captcha_test(com_id){
		
		if (!__$("#captcha_"+com_id).attr("value")){ 
						myerralert("El c&oacute;digo introducido no coincide con el de la imagen.","captcha_"+com_id,"br"); 
			captcha_errorF=1;
			return false;
		}else{
						clearerralert("captcha_"+com_id);
			captcha_errorF=0;
			return true;
		}
	}	
		
	function validar() {
			errores = false;
			
			if (!check_title()){
				errores = true;
			}
			
			if (!check_texto()){
				errores = true;
			}			
			
							 
				//if (!errores){
					if (!check_username()){
						errores = true;
					}
				//}

				//if (!errores){
					if (!check_email()){
						errores = true;
					}
				//}
			
						
				
			if (document.getElementById("subcategoria")){
				if((document.getElementById("subcategoria").selectedIndex==-1) && !errores) {
					myerralert("Por favor, seleciona una subcategoria","subcategoria","br");
					errores = true;
				}else{
					noerralert("subcategoria");
				}
			}
	
			if (!check_tags()){
				errores=true;
			}
			
			check_community();
			
					
			
			if (!check_author()){
				errores=true;
			}
			if (!check_category()){
				errores=true;
			}
			
			if (!errores){
			
			}
			
			return !errores;
	}
	
function oncheckbox(dis){
	if (__$(dis).attr('checked')!=false && __$(dis).attr('checked')){
		__$('#sub_email').show(); 
	}else {
		__$('#sub_email').hide();
	}
}

function process_community(dis){
		if (__$(dis).attr("value")!=""){
		__$("#category_options_id").hide();
	}else{
		__$("#category_options_id").show();
	}
		return;
	
}


function textos_check_files(){
	res=true;
	if (!check_files())res=false;
		if (!res){
			}else{
				clearerralert("file_attachment_div");
	}
	if (!part_valid())res=false;
	if (!res){
		__$("#err_buttons").html("El formulario contiene uno o varios errores, que han sido marcados en rojo. Por favor, corr&iacute;gelos y despu&eacute;s vuelve a pulsar sobre el bot&oacute;n Publicar<br/>");
		__$("#err_buttons").addClass("form_error");
	}
	return res;
}

function part_valid(){
	res=true;
	if (!validar())res=false;
		
	if (!check_captcha_test('1'))res=false;
	if (captcha_errorF)res=false;
		return res;
}

function check_title(){
	res = true;
	clearerralert("titulo");
	if(isBlank(document.getElementById('titulo').value)) {
		myerralert("Por favor, completa el campo titulo","titulo","");
		res = false;
	}
	res &= ta_check_extended('#titulo','title','titulo');
	if (res){
		noerralert("titulo");
	}
	return res;
}

function check_texto(){
	res = true;
	clearerralert("texto");
	if(isBlank(document.getElementById('texto').value)) {
		myerralert("Por favor, completa el campo pregunta","texto","");
		res = false;
	}	
	res &= ta_check_extended('#texto','','texto');
	if (res){
		noerralert("texto");
	}
	return res;
}

function check_tags_chars(tags){
	ctres=false;
		var tagsArr=tags.split(",");
	for (i=0; i<tagsArr.length;i++){
		tg=tagsArr[i];
		if (tg.length<4){
		  ctres="Uno o varios de los etiquetas que has introducido es demasiado escueto. No se permiten etiquetas que tengan menos de 4 caracteres";
		}
	}
		return ctres;
}

function check_tags(){
	res = true;
	if (!document.getElementById('tags'))return res;
	clearerralert("tags");
		if (document.getElementById('tags').value)var errTxt=check_tags_chars(document.getElementById('tags').value);
	if(res && errTxt) {
		myerralert(errTxt,"tags","");
		__$("#tags-id-list ul").addClass("txt_error_reduced"); 
		__$("#tags-id-list :input").addClass("txt_error_reduced"); 			
		__$("#tags-id-list ul").removeClass("txt_ok_reduced");
		__$("#tags-id-list :input").removeClass("txt_ok_reduced"); 
		res = false;
	}	
	if (res){
		noerralert("tags");
		__$("#tags-id-list ul").removeClass("txt_error_reduced"); 
		__$("#tags-id-list :input").removeClass("txt_error_reduced"); 		
		__$("#tags-id-list ul").addClass("txt_ok_reduced");
		__$("#tags-id-list :input").addClass("txt_ok_reduced"); 
	}
	return res;
}

function check_author(){
	res = true;
	clearerralert("es_autor");
	if (__$('#es_autor').attr("value") == 0) {
		if(isBlank(document.getElementById('creditos').value)) {
			myerralert("Por favor, introduce el nombre y apellidos del autor dla pregunta","es_autor","br");
			res = false;
		}
	}
	if (res){
		noerralert("es_autor");
	}
	return res;
}

function check_category(){
	res = true;
		if (res){
		noerralert("txt_tcategories");
	}	
	return res;
}

function check_community(){
	res = true;
	if (res){
		noerralert("comunidad");
	}	
	return res;
}

function init_text_form(){
	taextended="text";
	myalertF=1;
	mytagalertF=1;
	__$("#form_upload :input").focus(function(){
			 __$(this).addClass("txt_selected_reduced");
			 clearerralert(__$(this).attr('id'));
			 __$(this).removeClass("txt_error_reduced");
			 __$(this).removeClass("txt_error");
			 __$(this).removeClass("txt_ok_reduced");		 
			 });
	__$("#form_upload :input").blur(function(){ __$(this).removeClass("txt_selected_reduced"); });
	__$("#upload_slots :input").attr({disabled:""});

		
	__$("#titulo").blur(function(){check_title();});
	__$("#texto").blur(function(){check_texto();});
	__$("#tags").blur(function(){check_tags();});
	__$("#es_autor").blur(function(){check_author();});
	__$("#txt_tcategories").blur(function(){check_category();});
	__$("#comunidad").blur(function(){check_community();});
	__$("#captcha_1").blur(function(){check_captcha_test('1');});

			__$("#uname").blur(function(){check_username();}); 
		__$("#uemail").blur(function(){check_email();});
			
}

var imgsrc='/templates/default/images/ajax-loader2.gif';
/* for IE ): */
	var preimage=new Image();
	preimage.src = imgsrc;
/* //for IE  ): */	
__$(document).ready(function()	{
	init_text_form();
	__$("<img/>").attr("src",imgsrc);
	
	
	__$("#form_upload").bind("submit",function(){ 

		if (do_less_check!=1)if (!part_valid())return false;		
//		__$("#publicar").css({display:"none"});
		__$("#texto_preview-comentario").css({display:"none"});
//		__$("#borrador").css({display:"none"});

		__$("#publicar").parent("span").css({display:"none"});
		__$("#borrador").parent("span").css({display:"none"});

		__$("#cancelar-nuevo-texto").css({display:"none"});
		__$("#cancelar-nuevo-texto").attr({disabled:"disabled"});
				__$.blockUI({ message: "<h1 align='center'><img src='/templates/default/images/ajax-loader2.gif' /><br /><br />Por favor, espera mientras se publica tu pregunta...</h1>" }); 
		
	});
	
	
	__$.clipboardReady(function(){ }, { swfpath: "http://www.colchones.com//js/jquery.clipboard.swf" } );
});

function copy_to_clipboard(dis){
	if (__$(dis).attr("type")=="text"){
			txt_val=__$(dis);
		}else{
			txt_val=__$(dis).prev();
		}
		__$(txt_val).select();
		
		if (__$.clipboard( __$(txt_val).attr("value") )){
				/*
				__$.fn.createDialog({
					html: "<h2>La URL se ha copiado al portapapeles</h2>",
					okLabel: "Ok",
					okClass:"btn",
					auto:"yes",
					progress:"yes",
					opacity: 0.9
				});
				*/
		}
		return false;
}

function clearerralert(name){
	__$("#err_"+name).html("");
}

function myerralert(txt,name,type){
	if (type=="normal"){
		alert(txt);
		return;
	}

	var br_var="";
	if (type=="br"){
		br_var="<br/>";
	}

	__$("#"+name).removeClass("txt_ok_reduced");
	__$("#err_"+name).html( " " + br_var + icon_error + txt);
	__$("#err_"+name).addClass("form_error");
	__$("#"+name).removeClass("txt_ok");
	__$("#"+name).addClass("txt_error_reduced");
	__$("#err_buttons").html("El formulario contiene uno o varios errores, que han sido marcados en rojo. Por favor, corr&iacute;gelos y despu&eacute;s vuelve a pulsar sobre el bot&oacute;n Publicar<br/>");
	__$("#err_buttons").addClass("form_error");
}

function noerralert(name){
	__$("#err_"+name).html(icon_ok);
	__$("#"+name).removeClass("txt_error_reduced");
	__$("#"+name).addClass("txt_ok_reduced");
	__$("#err_buttons").html("");
}



/*
 * jQuery blockUI plugin
 * Version 2.20 (19-MAY-2009)
 * @requires jQuery v1.2.3 or later
 *
 * Examples at: http://malsup.com/jquery/block/
 * Copyright (c) 2007-2008 M. Alsup
 * Dual licensed under the MIT and GPL licenses:
 * http://www.opensource.org/licenses/mit-license.php
 * http://www.gnu.org/licenses/gpl.html
 *
 * Thanks to Amir-Hossein Sobhi for some excellent contributions!
 */

;(function($) {

if (/1\.(0|1|2)\.(0|1|2)/.test($.fn.jquery) || /^1.1/.test($.fn.jquery)) {
    alert('blockUI requires jQuery v1.2.3 or later!  You are using v' + $.fn.jquery);
    return;
}

$.fn._fadeIn = $.fn.fadeIn;

var setExpr = (function() {
	if (!$.browser.msie) return false;
    var div = document.createElement('div');
    try { div.style.setExpression('width','0+0'); }
    catch(e) { return false; }
    return true;
})();


// global $ methods for blocking/unblocking the entire page
$.blockUI   = function(opts) { install(window, opts); };
$.unblockUI = function(opts) { remove(window, opts); };

// convenience method for quick growl-like notifications  (http://www.google.com/search?q=growl)
$.growlUI = function(title, message, timeout, onClose) {
	var $m = $('<div class="growlUI"></div>');
	if (title) $m.append('<h1>'+title+'</h1>');
	if (message) $m.append('<h2>'+message+'</h2>');
	if (timeout == undefined) timeout = 3000;
    $.blockUI({
		message: $m, fadeIn: 700, fadeOut: 1000, centerY: false,
		timeout: timeout, showOverlay: false,
		onUnblock: onClose, 
		css: $.blockUI.defaults.growlCSS
    });
};

// plugin method for blocking element content
$.fn.block = function(opts) {
    return this.unblock({ fadeOut: 0 }).each(function() {
        if ($.css(this,'position') == 'static')
            this.style.position = 'relative';
        if ($.browser.msie)
            this.style.zoom = 1; // force 'hasLayout'
        install(this, opts);
    });
};

// plugin method for unblocking element content
$.fn.unblock = function(opts) {
    return this.each(function() {
        remove(this, opts);
    });
};

$.blockUI.version = 2.20; // 2nd generation blocking at no extra cost!

// override these in your code to change the default behavior and style
$.blockUI.defaults = {
    // message displayed when blocking (use null for no message)
    message:  '<h1>Please wait...</h1>',

    // styles for the message when blocking; if you wish to disable
    // these and use an external stylesheet then do this in your code:
    // $.blockUI.defaults.css = {};
    css: {
        padding:        0,
        margin:         0,
        width:          '30%',
        top:            '40%',
        left:           '35%',
        textAlign:      'center',
        color:          '#000',
        border:         '3px solid #aaa',
        backgroundColor:'#fff',
        cursor:         'wait'
    },

    // styles for the overlay
    overlayCSS:  {
        backgroundColor: '#000',
        opacity:          0.6,
        cursor:          'wait'
    },

	// styles applied when using $.growlUI
	growlCSS: {
		width:    '350px',
		top:      '10px',
		left:     '',
		right:    '10px',
	    border:   'none',
	    padding:  '5px',
	    opacity:   0.6,
		cursor:    null,
	    color:    '#fff',
	    backgroundColor: '#000',
	    '-webkit-border-radius': '10px',
	    '-moz-border-radius':    '10px'
	},
	
	// IE issues: 'about:blank' fails on HTTPS and javascript:false is s-l-o-w
	// (hat tip to Jorge H. N. de Vasconcelos)
	iframeSrc: /^https/i.test(window.location.href || '') ? 'javascript:false' : 'about:blank',

	// force usage of iframe in non-IE browsers (handy for blocking applets)
	forceIframe: false,

    // z-index for the blocking overlay
    baseZ: 1000,

    // set these to true to have the message automatically centered
    centerX: true, // <-- only effects element blocking (page block controlled via css above)
    centerY: true,

    // allow body element to be stetched in ie6; this makes blocking look better
    // on "short" pages.  disable if you wish to prevent changes to the body height
    allowBodyStretch: true,

	// enable if you want key and mouse events to be disabled for content that is blocked
	bindEvents: true,

    // be default blockUI will supress tab navigation from leaving blocking content
    // (if bindEvents is true)
    constrainTabKey: true,

    // fadeIn time in millis; set to 0 to disable fadeIn on block
    fadeIn:  200,

    // fadeOut time in millis; set to 0 to disable fadeOut on unblock
    fadeOut:  400,

	// time in millis to wait before auto-unblocking; set to 0 to disable auto-unblock
	timeout: 0,

	// disable if you don't want to show the overlay
	showOverlay: true,

    // if true, focus will be placed in the first available input field when
    // page blocking
    focusInput: true,

    // suppresses the use of overlay styles on FF/Linux (due to performance issues with opacity)
    applyPlatformOpacityRules: true,

    // callback method invoked when unblocking has completed; the callback is
    // passed the element that has been unblocked (which is the window object for page
    // blocks) and the options that were passed to the unblock call:
    //     onUnblock(element, options)
    onUnblock: null,

    // don't ask; if you really must know: http://groups.google.com/group/jquery-en/browse_thread/thread/36640a8730503595/2f6a79a77a78e493#2f6a79a77a78e493
    quirksmodeOffsetHack: 4
};

// private data and functions follow...

var ie6 = $.browser.msie && /MSIE 6.0/.test(navigator.userAgent);
var pageBlock = null;
var pageBlockEls = [];

function install(el, opts) {
    var full = (el == window);
    var msg = opts && opts.message !== undefined ? opts.message : undefined;
    opts = $.extend({}, $.blockUI.defaults, opts || {});
    opts.overlayCSS = $.extend({}, $.blockUI.defaults.overlayCSS, opts.overlayCSS || {});
    var css = $.extend({}, $.blockUI.defaults.css, opts.css || {});
    msg = msg === undefined ? opts.message : msg;

    // remove the current block (if there is one)
    if (full && pageBlock)
        remove(window, {fadeOut:0});

    // if an existing element is being used as the blocking content then we capture
    // its current place in the DOM (and current display style) so we can restore
    // it when we unblock
    if (msg && typeof msg != 'string' && (msg.parentNode || msg.jquery)) {
        var node = msg.jquery ? msg[0] : msg;
        var data = {};
        $(el).data('blockUI.history', data);
        data.el = node;
        data.parent = node.parentNode;
        data.display = node.style.display;
        data.position = node.style.position;
		if (data.parent)
			data.parent.removeChild(node);
    }

    var z = opts.baseZ;

    // blockUI uses 3 layers for blocking, for simplicity they are all used on every platform;
    // layer1 is the iframe layer which is used to supress bleed through of underlying content
    // layer2 is the overlay layer which has opacity and a wait cursor (by default)
    // layer3 is the message content that is displayed while blocking

    var lyr1 = ($.browser.msie || opts.forceIframe) 
    	? $('<iframe class="blockUI" style="z-index:'+ (z++) +';display:none;border:none;margin:0;padding:0;position:absolute;width:100%;height:100%;top:0;left:0" src="'+opts.iframeSrc+'"></iframe>')
        : $('<div class="blockUI" style="display:none"></div>');
    var lyr2 = $('<div class="blockUI blockOverlay" style="z-index:'+ (z++) +';display:none;border:none;margin:0;padding:0;width:100%;height:100%;top:0;left:0"></div>');
    var lyr3 = full ? $('<div class="blockUI blockMsg blockPage" style="z-index:'+z+';display:none;position:fixed"></div>')
                    : $('<div class="blockUI blockMsg blockElement" style="z-index:'+z+';display:none;position:absolute"></div>');

    // if we have a message, style it
    if (msg)
        lyr3.css(css);

    // style the overlay
    if (!opts.applyPlatformOpacityRules || !($.browser.mozilla && /Linux/.test(navigator.platform)))
        lyr2.css(opts.overlayCSS);
    lyr2.css('position', full ? 'fixed' : 'absolute');

    // make iframe layer transparent in IE
    if ($.browser.msie || opts.forceIframe)
        lyr1.css('opacity',0.0);

    $([lyr1[0],lyr2[0],lyr3[0]]).appendTo(full ? 'body' : el);

    // ie7 must use absolute positioning in quirks mode and to account for activex issues (when scrolling)
    var expr = $.browser.msie && ($.browser.version < 8 || !$.boxModel) && (!$.boxModel || $('object,embed', full ? null : el).length > 0);
    if (ie6 || (expr && setExpr)) {
        // give body 100% height
        if (full && opts.allowBodyStretch && $.boxModel)
            $('html,body').css('height','100%');

        // fix ie6 issue when blocked element has a border width
        if ((ie6 || !$.boxModel) && !full) {
            var t = sz(el,'borderTopWidth'), l = sz(el,'borderLeftWidth');
            var fixT = t ? '(0 - '+t+')' : 0;
            var fixL = l ? '(0 - '+l+')' : 0;
        }

        // simulate fixed position
        $.each([lyr1,lyr2,lyr3], function(i,o) {
            var s = o[0].style;
            s.position = 'absolute';
            if (i < 2) {
                full ? s.setExpression('height','Math.max(document.body.scrollHeight, document.body.offsetHeight) - (jQuery.boxModel?0:'+opts.quirksmodeOffsetHack+') + "px"')
                     : s.setExpression('height','this.parentNode.offsetHeight + "px"');
                full ? s.setExpression('width','jQuery.boxModel && document.documentElement.clientWidth || document.body.clientWidth + "px"')
                     : s.setExpression('width','this.parentNode.offsetWidth + "px"');
                if (fixL) s.setExpression('left', fixL);
                if (fixT) s.setExpression('top', fixT);
            }
            else if (opts.centerY) {
                if (full) s.setExpression('top','(document.documentElement.clientHeight || document.body.clientHeight) / 2 - (this.offsetHeight / 2) + (blah = document.documentElement.scrollTop ? document.documentElement.scrollTop : document.body.scrollTop) + "px"');
                s.marginTop = 0;
            }
			else if (!opts.centerY && full) {
				var top = (opts.css && opts.css.top) ? parseInt(opts.css.top) : 0;
				var expression = '((document.documentElement.scrollTop ? document.documentElement.scrollTop : document.body.scrollTop) + '+top+') + "px"';
                s.setExpression('top',expression);
			}
        });
    }

    // show the message
	if (msg) {
		lyr3.append(msg);
		if (msg.jquery || msg.nodeType)
			$(msg).show();
	}

	if (($.browser.msie || opts.forceIframe) && opts.showOverlay)
		lyr1.show(); // opacity is zero
	if (opts.fadeIn) {
		if (opts.showOverlay)
			lyr2._fadeIn(opts.fadeIn);
		if (msg)
			lyr3.fadeIn(opts.fadeIn);
	}
	else {
		if (opts.showOverlay)
			lyr2.show();
		if (msg)
			lyr3.show();
	}

    // bind key and mouse events
    bind(1, el, opts);

    if (full) {
        pageBlock = lyr3[0];
        pageBlockEls = $(':input:enabled:visible',pageBlock);
        if (opts.focusInput)
            setTimeout(focus, 20);
    }
    else
        center(lyr3[0], opts.centerX, opts.centerY);

	if (opts.timeout) {
		// auto-unblock
		var to = setTimeout(function() {
			full ? $.unblockUI(opts) : $(el).unblock(opts);
		}, opts.timeout);
		$(el).data('blockUI.timeout', to);
	}
};

// remove the block
function remove(el, opts) {
    var full = el == window;
	var $el = $(el);
    var data = $el.data('blockUI.history');
	var to = $el.data('blockUI.timeout');
	if (to) {
		clearTimeout(to);
		$el.removeData('blockUI.timeout');
	}
    opts = $.extend({}, $.blockUI.defaults, opts || {});
    bind(0, el, opts); // unbind events
    var els = full ? $('body').children().filter('.blockUI') : $('.blockUI', el);

    if (full)
        pageBlock = pageBlockEls = null;

    if (opts.fadeOut) {
        els.fadeOut(opts.fadeOut);
        setTimeout(function() { reset(els,data,opts,el); }, opts.fadeOut);
    }
    else
        reset(els, data, opts, el);
};

// move blocking element back into the DOM where it started
function reset(els,data,opts,el) {
    els.each(function(i,o) {
        // remove via DOM calls so we don't lose event handlers
        if (this.parentNode)
            this.parentNode.removeChild(this);
    });

    if (data && data.el) {
        data.el.style.display = data.display;
        data.el.style.position = data.position;
		if (data.parent)
			data.parent.appendChild(data.el);
        $(data.el).removeData('blockUI.history');
    }

    if (typeof opts.onUnblock == 'function')
        opts.onUnblock(el,opts);
};

// bind/unbind the handler
function bind(b, el, opts) {
    var full = el == window, $el = $(el);

    // don't bother unbinding if there is nothing to unbind
    if (!b && (full && !pageBlock || !full && !$el.data('blockUI.isBlocked')))
        return;
    if (!full)
        $el.data('blockUI.isBlocked', b);

	// don't bind events when overlay is not in use or if bindEvents is false
    if (!opts.bindEvents || (b && !opts.showOverlay)) 
		return;

    // bind anchors and inputs for mouse and key events
    var events = 'mousedown mouseup keydown keypress';
    b ? $(document).bind(events, opts, handler) : $(document).unbind(events, handler);

// former impl...
//    var $e = $('a,:input');
//    b ? $e.bind(events, opts, handler) : $e.unbind(events, handler);
};

// event handler to suppress keyboard/mouse events when blocking
function handler(e) {
    // allow tab navigation (conditionally)
    if (e.keyCode && e.keyCode == 9) {
        if (pageBlock && e.data.constrainTabKey) {
            var els = pageBlockEls;
            var fwd = !e.shiftKey && e.target == els[els.length-1];
            var back = e.shiftKey && e.target == els[0];
            if (fwd || back) {
                setTimeout(function(){focus(back)},10);
                return false;
            }
        }
    }
    // allow events within the message content
    if ($(e.target).parents('div.blockMsg').length > 0)
        return true;

    // allow events for content that is not being blocked
    return $(e.target).parents().children().filter('div.blockUI').length == 0;
};

function focus(back) {
    if (!pageBlockEls)
        return;
    var e = pageBlockEls[back===true ? pageBlockEls.length-1 : 0];
    if (e)
        e.focus();
};

function center(el, x, y) {
    var p = el.parentNode, s = el.style;
    var l = ((p.offsetWidth - el.offsetWidth)/2) - sz(p,'borderLeftWidth');
    var t = ((p.offsetHeight - el.offsetHeight)/2) - sz(p,'borderTopWidth');
    if (x) s.left = l > 0 ? (l+'px') : '0';
    if (y) s.top  = t > 0 ? (t+'px') : '0';
};

function sz(el, p) {
    return parseInt($.css(el,p))||0;
};

})(jQuery);
