/**
 * Alcaraz JS Lib
 * -----------------------------------------------------------------
 *
 * author:               Alcaraz & Estevez Consultores
 * projectId:            
 * version:              0.4
 * revision:             $Rev: 8968 $
 * creation date:        30-03-2009
 * modification date:    $Date: 2010-07-06 14:48:01 +0000 (Tue, 06 Jul 2010) $
 * description:          generic js lib
 * notes:                   
 *
 */


var ALCARAZ =
{
	/**
	 * xhtml utilities
	 */
	htmlUtils : 
	{
		/**
		 * in HTML strict the target attribute does not exist
		 */
		initExternalLinks : function()
		{
			$('a')
				.filter(function(){ return this.hostname && this.hostname !== location.hostname; })
				.add('a[href$=.pdf], a.external, a[rel=external], ')
				.filter(function()
				{
					return !$(this).hasClass("full");
				})
				.bind("click", function()
				{
					window.open($(this).attr("href"));
					return false;
				}
			);
		},
		
		imgPreloader :
		{
			elements : [],
			active	 : false,
			callback : null,
			
			preload : function(imgsArray, callbackFunc)
			{
				if(this.active)
				{
					for(var i = 0; i < imgsArray.length; i++)
					{
						this.elements.push(imgsArray[i]);
					}
				}
				else
				{
					this.elements = imgsArray;
					this.callback = callbackFunc;
					
					if(this.elements.length > 0)
					{
						if(!document.getElementById("tmpPreloaderImg"))
						{
							$('<img id="tmpPreloaderImg" />').appendTo('body').hide();
						}
						this.loadElement();
					}
				}
				
				// security timeout, handy if the image loading stalls
				var _this = this;
				if(typeof this.callback == "function")
				{
					setTimeout( function(){ _this.callback(); }, 10000 );
				}
			},
			
			loadElement : function()
			{
				if(this.elements.length > 0)
				{
					var imgSrc = this.elements.shift();
					var loaded = false;
					var _this  = this;
					
					$("img#tmpPreloaderImg").attr("src", imgSrc).load(function()
					{
						if(!loaded)
						{
							_this.loadElement();
							loaded = true;
						}
					});
				}
				else
				{
					$('img#tmpPreloaderImg').remove();
					
					this.active = false;
					
					if(typeof this.callback == "function")
					{
						this.callback();
					}
				}
			}
		}
		
	},
	
	
	
	
	/**
	 * cookies utilities
	 * based on Peter-Paul Koch scripts, based on Scott Andrew scripts
	 * http://www.quirksmode.org/js/cookies.html
	 */
	cookies :
	{
		create : function(name,value,days)
		{
			if (days)
			{
				var date = new Date();
				date.setTime(date.getTime()+(days*24*60*60*1000));
				var expires = "; expires="+date.toGMTString();
			}
			else var expires = "";
			document.cookie = name+"="+value+expires+"; path=/";
		},

		read : function(name)
		{
			var nameEQ = name + "=";
			var ca = document.cookie.split(';');
			for(var i=0;i < ca.length;i++)
			{
				var c = ca[i];
				while (c.charAt(0)==' ') c = c.substring(1,c.length);
				if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length,c.length);
			}
			return null;
		},

		erase : function(name)
		{
			ALCARAZ.cookies.create(name,"",-1);
		}
	},
	
	
	
	/**
	 * form utilities
	 */
	forms :
	{
		/**
		 * valor per defecte dels camps de formulari:
		 * segons les WCAG tots els camps editables (inputs i textareas)
		 * han de tenir un valor per defecte (checkpoint 10.4)
		 * la funció elimina el contingut per defecte quan rep el focus i el
		 * restaura quan el perd si el camp està buit
		 */
		initDefaultValues : function()
		{
			$.each($("input[type=text], input[type=password], textarea").not(".color"), function(i, n)
			{
				$(n).data("val", (($(n).attr("id") !== "") && ( !$(n).is("textarea") )) ? document.getElementById($(n).attr("id")).getAttribute("value") : $(n).val() );
				$(n).focus( function()
				{
					if($(this).val() == $(this).data("val")){ $(this).val(""); }
				});
				$(n).blur( function()
				{
					if($(this).val() === ""){ $(this).val($(this).data("val")); }
				});
				
				
			});
		},


		/**
		 * generic form validator
		 */
		Validator : function()
		{
			var errors			= Array;
			var erroneousFields = Array;
			var returnVal		= true;
			
			this.init = function()
			{
				this.errors			 = [];
				this.erroneousFields = [];
				this.returnVal		 = true;	
			};
			
			this.checkRequired = function(el)
			{
				if( (el.val() === "") || (el.val() === null) || (el.val() == el.data("val")) )
				{
					this.errors.push("El campo " + String(el.attr("id")).replace(/^f/,"") + " es obligatorio");
					this.returnVal = false;
					this.erroneousFields.push(el);
				}
			};
			
			this.checkMaxLength = function(els, length)
			{
				for(var i=0; i<els.length; i++)
				{
					if(String(els[i].val()).length > length)
					{
						this.errors.push("El campo " + String(els[i].attr("id")).replace(/^f/,"") + " no puede contener mas de " + length + " dígitos");
						this.returnVal = false;
						this.erroneousFields.push(els[i]);
					}
				}
			};
			
			this.checkMinLength = function(els, length)
			{
				for(var i=0; i<els.length; i++)
				{
					if(String(els[i].val()).length < length)
					{
						this.errors.push("El campo " + String(els[i].attr("id")).replace(/^f/,"") + " debe contener como mínimo " + length + " dígitos");
						this.returnVal = false;
						this.erroneousFields.push(els[i]);
					}
				}
			};
			
			this.checkValidMail = function(el)
			{
				var pattern	 = /^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$/;
				if (!pattern.test(el.val()))
				{
					this.errors.push("Debe introducir una direccion de mail correcta en el campo " + String(el.attr("id")).replace(/^f/,""));
					this.returnVal = false;
					this.erroneousFields.push(el);
				}
			};
			
			this.checkNumeric = function(el)
			{
				if(isNaN(el.val()))
				{
					this.errors.push("El campo " + String(el.attr("id")).replace(/^f/,"") + " solo puede contener números");
					this.returnVal = false;
					this.erroneousFields.push(el);
				}
			};
			
			this.checkRange = function(el, minValue, maxValue)
			{
				var val = el.val();
				if(isNaN(val) || !( (val >= minValue) && (val <= maxValue) ) )
				{
					this.errors.push("El campo " + String(el.attr("id")).replace(/^f/,"") + " debe contener un valor numérico comprendido entre " + minValue + " y " + maxValue);
					this.returnVal = false;
					this.erroneousFields.push(el);
				}
			};
			
			this.checkCp = function(el)
			{
				var cp = el.val();
				if( (cp.length > 5) || (isNaN(cp)) )
				{
					this.errors.push("El campo " + String(el.attr("id")).replace(/^f/,"") + " debe contener un código postal válido, formado por 5 núneros");
					this.returnVal = false;
					this.erroneousFields.push(el);
				}
			};
			
			this.checkFileInputExtension = function(el, ext)
			{
				if(String(el.val()).toLowerCase().substr(String(el.val()).lastIndexOf('.')) != ext)
				{
					this.errors.push("El campo " + String(el.attr("id")).replace(/^f/,"") + " solo admite archivos con la extensión " + ext);
					this.returnVal = false;
					this.erroneousFields.push(el);
				}
			};

		}// end validator

	},// end forms
	
	
	
	
	/**
	 * CSS fixes:
	 * ------------------------------------
	 * workarounds for some css related problems, especially on IE
	 * the most of this problems with Internet Exploder are fixed
	 * via additional css files linked with conditional comments,
	 * but some other problems (like some selectors) can not be fixed
	 * only with CSS or would be a PITA to fix
	 * (if you don't know what PITA means, look here... http://www.urbandictionary.com/define.php?term=PITA)
	 *
	 ***********************************************************************************************************************************/
	cssFixes :
	{
		fixLegends : function()
		{
			$("legend").each(function(i)
			{
				$(this).after("<p class='legend'>" + $(this).html() + "</p>").remove();
			});
		},
		
		fixIESelectors : function()
		{
			$("input[type=submit]").addClass("submit");
			$("input[type=text]").addClass("text");
			$("input[type=password]").addClass("password");
			$("input[type=radio]").addClass("radio");
			$("input[type=checkbox]").addClass("checkbox");
			$("input[type=file]").addClass("file");
			$("*:first-child").addClass("first");
			$("*:last-child").addClass("last");
			$("label[for=loginBtn]").addClass("loginBtn");
		}
	},
	
	
	
	
	/**
	 * altres
	 */
	misc : 
	{
		// rounded corners for webkit and gecko based browsers. Sorry IE, no fun for you...
		setCssCorners : function(elem, corner, size)
		{
			switch(corner)
			{
				case "tl":
					$(elem).css("border-top-left-radius", size);
					$(elem).css("-webkit-border-top-left-radius", size);
					$(elem).css("-moz-border-radius-topleft", size);
					break;
				case "tr":
					$(elem).css("border-top-right-radius", size);
					$(elem).css("-webkit-border-top-right-radius", size);
					$(elem).css("-moz-border-radius-topright", size);
					break;
				case "bl":
					$(elem).css("border-bottom-left-radius", size);
					$(elem).css("-webkit-border-bottom-left-radius", size);
					$(elem).css("-moz-border-radius-bottomleft", size);
					break;
				case "br":
					$(elem).css("border-bottom-right-radius", size);
					$(elem).css("-webkit-border-bottom-right-radius", size);
					$(elem).css("-moz-border-radius-bottomright", size);
					break;
				case "top":
					ALCARAZ.misc.setCssCorners(elem, "tl", size);
					ALCARAZ.misc.setCssCorners(elem, "tr", size);
					break;
				case "bottom":
					ALCARAZ.misc.setCssCorners(elem, "bl", size);
					ALCARAZ.misc.setCssCorners(elem, "br", size);
					break;
				case "left":
					ALCARAZ.misc.setCssCorners(elem, "tl", size);
					ALCARAZ.misc.setCssCorners(elem, "bl", size);
					break;
				case "right":
					ALCARAZ.misc.setCssCorners(elem, "tr", size);
					ALCARAZ.misc.setCssCorners(elem, "br", size);
					break;
			}
		},
		
		
		addPureCssShadow : function(elements, xOffset, yOffset, blurRadius, color)
		{
			var val = xOffset + " " + yOffset + " " + blurRadius + " " + color;
			
			$(elements).css("box-shadow", val);
			$(elements).css("-moz-box-shadow", val);
			$(elements).css("-webkit-box-shadow", val);
		},
		
		
		// deppends on jquery.dropshadow.js
		addShadow : function(element, params)
		{
			if(element.hasClass("shadow")){ return; }
			
			if( $.browser.msie && ($.browser.version < 7) ){ return; }
			
			var defaults = 
			{
				left:	 3,
				top:	 3,
				blur:	 2,
				opacity: 0.4,
				color:	 "#444444",
				swap:	 false
			};
			
			var getVal = function(prop)
			{
				var returnVal = defaults[prop];
				
				if(params)
				{
					if( params[prop] !== undefined )
					{
						returnVal = params[prop];
					}
				}
				
				return returnVal;
			};
			
			element.addClass("shadow").dropShadow({
				left:	 getVal('left'),
				top:	 getVal('top'),
				blur:	 getVal('blur'),
				opacity: getVal('opacity'),
				color:	 getVal('color'),
				swap:	 getVal('swap')
			});
		},
		
		// deppends on jquery.dropshadow.js
		removeShadow : function(element)
		{
			element.removeClass("shadow").removeShadow();
		},
		
		
		launchMagazine : function(url)
		{
			window.open(url, "_blank", "resizable=yes, scrollbars=yes, menubar=no, width=1024, height=768");
		},
		
		
		initFullLinks : function()
		{
			$("a.full").bind("click", function()
			{
				ALCARAZ.misc.launchMagazine( this.attr("href") );
			});
		},
		
		
		initWidgets : function()
		{
			$(".removable").live("click", function()
			{
				$(this).fadeOut("fast", function(){ $(this).remove(); });
				$(".ui-widget-overlay").fadeOut("fast", function(){ $(this).remove(); });
			});
			
			// ...
		},
		
		
		showMsg : function(msgType, msg)
		{
			var containerClassName, iconClassName, uiMsgHTML = '';
			
			switch(msgType)
			{
				case 'error':
					containerClassName = 'ui-state-error';
					iconClassName      = 'ui-icon-alert';
					title              = 'Error:';
					break;
				case 'info':
				default:
					containerClassName = 'ui-state-highlight';
					iconClassName      = 'ui-icon-info';
					title              = '';
					break;
			}
			
			uiMsgHTML += '<div class="ui-widget-overlay" style="z-index: 2;"></div>';
			uiMsgHTML += '<div class="ui-widget removable errorPopUp">';
			uiMsgHTML += '  <div class="' + containerClassName + ' ui-corner-all">';
			uiMsgHTML += '    <p><span class="ui-icon ' + iconClassName + '"></span> ';
			uiMsgHTML += '      <strong>' + title + '</strong>';
			uiMsgHTML += '      ' + msg;
			uiMsgHTML += '    </p>';
			uiMsgHTML += '  </div>';
			uiMsgHTML += '</div>';
			
			$("body").append(uiMsgHTML);
		}
	}

};
