//Añadimos el metodo trim al obejto String
String.prototype.trim = function()
{ 
	return this.replace(/^[\s]+|[\s]+$/g,'') 
}
//Añadimos el metodo ltrim al obejto String
String.prototype.ltrim = function() { //Trim izquierda
   return this.replace(/^[\s]+/g,"");
}
//Añadimos el metodo rtrim al obejto String
String.prototype.rtrim = function() { //Trim Derecha
   return this.replace(/[\s]+$/g,"");
}
//Ordena un array por numero
Array.prototype.sortNum = function() {
   return this.sort( function (a,b) { return a-b; } );
}
//Busca en un array
Array.prototype.find = function(searchStr) {
  var returnArray = false;
  for (i=0; i<this.length; i++) {
    if (typeof(searchStr) == 'function') {
      if (searchStr.test(this[i])) {
        if (!returnArray) { returnArray = [] }
        returnArray.push(i);
      }
    } else {
      if (this[i]===searchStr) {
        if (!returnArray) { returnArray = [] }
        returnArray.push(i);
      }
    }
  }
  return returnArray;
}
//Comprueba si un objeto es un array
Object.prototype.isArray = function() {
   return this.constructor == Array;
}

// JavaScript Document

/*
Autor: Scott Andrew. (http://www.scottandrew.com/weblog)
Referencia: http://www.anieto2k.com/2006/10/16/gestion-de-eventos-en-javascript/

Descripcion: Asigna a cualquier elemento un evento determinado, y la funcion que queremos aplicarle

elm         = id del elemento
evType      = Tipo de evento
fn          = funcion asignada al evento
userCapture = false
*/
function addEvent(elm, evType, fn, useCapture) {
	if (elm.addEventListener) {
		elm.addEventListener(evType, fn, useCapture);
		return true;
	}
	else if (elm.attachEvent) {
		var r = elm.attachEvent('on' + evType, fn);
		return r;
	}
	else {
		elm['on' + evType] = fn;
	}
}

//Elimina un eventio a un objeto
function removeEvent(obj, evType, fn, useCapture){
  if (obj.removeEventListener){
    obj.removeEventListener(evType, fn, useCapture);
    return true;
  } else if (obj.detachEvent){
    var r = obj.detachEvent("on"+evType, fn);
    return r;
  } else {
    alert("Handler could not be removed");
  }
}
/*
Autor: Simon Willison. (http://simon.incutio.com/archive/2004/05/26/addLoadEvent)
Referencia: http://www.anieto2k.com/2006/09/07/adddomloadevent-o-como-anadir-funcionalidades-a-tu-onload/

Descripcion: Añade fuincionalidad al onLoad del docuemnto.
Es igual que el AddEvent pero sin especificar el evento, ya que el evento es el onload

func          = funcion asignada al evento onLoad
*/
function addLoadEvent(func) {
	var oldonload = window.onload;
	if (typeof window.onload != 'function') {
		window.onload = func;
	}
	else {
		window.onload = function() {
			oldonload();
			func();
		}
	}
}

/*
Autor: Desconocido.

Descripcion: Mediante un nombre de class, podremos encontrar los elementos que la compongan, devolviendo un array de objetos para trabar con ellos de forma más cómoda.

searchClass = clase buscada
*/
document.getElementsByClass = function(searchClass,node,tag) {
	var classElements = new Array();
	if ( node == null ) node = document;
	if ( tag == null )  tag = '*';
	var els = node.getElementsByTagName(tag);
	var elsLen = els.length;
	var pattern = new RegExp('(^|\s)'+searchClass+'(\s|$)');
	for (i = 0, j = 0; i < elsLen; i++)
	{
		if ( pattern.test(els[i].className) )
		{
			classElements[j] = els[i];
			j++;
		}
	}
	return classElements;
}

/*
Autor: Desconocido.

Descripcion: Se trata de una función que oculta/muestra un elemento dependiendo de su estado anterior, osea mostrado lo que está oculto y viceversa.

obj = id del objeto
*/
function toggle(obj) {
	var el = document.getElementById(obj);
	if ( el.style.display != 'none' ) {
		el.style.display = 'none';
	}
	else {
		el.style.display = '';
	}
}

/*
Autor: Jeremy Keith. (http://adactio.com/)

Descripcion:nos permite insertar un nodo despues de otro elemento padre.
*/
function insertAfter(parent, node, referenceNode) {
	parent.insertBefore(node, referenceNode.nextSibling);
}

/*
Autor: Desconocido

Descripcion: nos dice si un valor esta en un array
*/
Array.prototype.inArray = function (value) {
	var i;
	for (i=0; i < this.length; i++) {
		if (this[i] === value) {
			return true;
		}
	}
	return false;
};

/*
Sin comentarios, funcion de manual.
*/
function getCookie( name ) {
	var start = document.cookie.indexOf( name + "=" );
	var len = start + name.length + 1;
	if ( ( !start ) && ( name != document.cookie.substring( 0, name.length ) ) ) {
		return null;
	}
	if ( start == -1 ) return null;
	var end = document.cookie.indexOf( ';', len );
	if ( end == -1 ) end = document.cookie.length;
	return unescape( document.cookie.substring( len, end ) );
}

/*
Sin comentarios, funcion de manual.
*/
function deleteCookie( name, path, domain ) {
	if ( getCookie( name ) ) document.cookie = name + '=' +
			( ( path ) ? ';path=' + path : '') +
			( ( domain ) ? ';domain=' + domain : '' ) +
			';expires=Thu, 01-Jan-1970 00:00:01 GMT';
}

/*
LA REINA DE LA CASA

Descripcion:
Nos volverá un elemento o una serie de elementos, únicamente pasando como parametro los id’s de los elementos deseados
Ejemplo:
$('id_elemento') es lo mismo que document.GetElementById('id_elemento')
*/
function $() {
	var elements = new Array();
	for (var i = 0; i < arguments.length; i++) {
		var element = arguments[i];
		if (typeof element == 'string')
			element = document.getElementById(element);
		if (arguments.length == 1)
			return element;
		elements.push(element);
	}
	return elements;
}

function emailCheck (emailStr,id_label,msg) {
	/* Verificar si el email tiene el formato user@dominio. */
	var emailPat=/^(.+)@(.+)$/
	
	/* Verificar la existencia de caracteres. ( ) < > @ , ; : \ " . [ ] */
	var specialChars="\\(\\)<>@,;:\\\\\\\"\\.\\[\\]";
	
	/* Verifica los caracteres que son válidos en una dirección de email */
	var validChars="\[^\\s" + specialChars + "\]";
	
	var quotedUser="(\"[^\"]*\")";
	
	/* Verifica si la dirección de email está representada con una dirección IP Válida */
	
	
	var ipDomainPat=/^\[(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})\]$/
	
	/* Verificar caracteres inválidos */
	
	var atom=validChars + '+';
	var word="(" + atom + "|" + quotedUser + ")";
	var userPat=new RegExp("^" + word + "(\\." + word + ")*$");
	/* domain, as opposed to ipDomainPat, shown above. */
	var domainPat=new RegExp("^" + atom + "(\\." + atom +")*$");
	
	
	var matchArray=emailStr.match(emailPat);
	if (matchArray==null) 
	{
		$(id_label).innerHTML = msg;
		return false;
	}
	var user=matchArray[1];
	var domain=matchArray[2];
	
	// Si el user "user" es valido 
	if (user.match(userPat)==null) 
	{
		// Si no
		$(id_label).innerHTML = msg;
		return false;
	}
	
	/* Si la dirección IP es válida */
	var IPArray=domain.match(ipDomainPat);
	if (IPArray!=null)
	{
		for (var i=1;i<=4;i++) 
		{
			if (IPArray[i]>255) 
			{
				$(id_label).innerHTML = msg;
				return false;
			}
		}
		return true;
	}
	
	var domainArray=domain.match(domainPat);
	if (domainArray==null)
	{
		$(id_label).innerHTML = msg;
		return false;
	}
	
	var atomPat=new RegExp(atom,"g");
	var domArr=domain.match(atomPat);
	var len=domArr.length;
	if (domArr[domArr.length-1].length<2 || domArr[domArr.length-1].length>3)
	{
		$(id_label).innerHTML = msg;
		return false;
	}
	
	if (len<2)
	{
		$(id_label).innerHTML = msg;
		return false;
	}
	
	// La dirección de email ingresada es Válida
	return true;
}
//