/* Friday, May 2, 2008 at 12:19:58 AM */

if (byS === undefined){
	var byS = {};
 	
}else{ document.write ("byS variable alredy used; this is a reserved keyword for the by library."); }

byS = byS.prototype = {
	version: "0.0.1",
	
	Trim: function( s ){
		 	return s.replace(/ /gi,"");
		 },
	Left: function ( s, n ){
			if (n <= 0)
				return "";
			else if (n > String(s).length)
				return s;
			else
				return String(s).substring(0,n);
		 },
	Right: function ( s, n ){
			if (n <= 0){
			   return "";
			}else if (n > String(s).length){
			   return s;
			}else{
			   var iLen = String(s).length;
			   return String(s).substring(iLen, iLen - n);
			}	
		  },
	chr: function ( s ){
			return String.fromCharCode(s);
		},
	asc: function ( s ){
			/* ----------------------------------------------------------------
			 Asc: Returns an Integer representing the character code
			      corresponding to the first letter in a string
			
			 Parameters:
			      String = The required string argument is any valid
			               string expression. If the string if not in
			               the range 32-126, the function return ZERO
			
			 Returns: Integer
			---------------------------------------------------------------- */
			
			var symbols = " !\"#$%&'()*+'-./0123456789:;<=>?@";
			var loAZ = "abcdefghijklmnopqrstuvwxyz";
			symbols += loAZ.toUpperCase();
			symbols += "[\\]^_`";
			symbols += loAZ;
			symbols += "{|}~";
			var loc;
			loc = symbols.indexOf(s);
			if (loc > -1){
			      Ascii_Decimal = 32 + loc;
			      return (32 + loc);
			}
			return (0);
		},
	isEmail: function ( s ){
			if (s == null)
			      return (false);
			
			var supported = 0;
			if (window.RegExp)
			{
			      var tempStr = "a";
			      var tempReg = new RegExp(tempStr);
			      if (tempReg.test(tempStr)) supported = 1;
			}
			if (!supported)
			      return (s.indexOf(".") > 2) && (s.indexOf("@") > 0);
			var r1 = new RegExp("(@.*@)|(\\.\\.)|(@\\.)|(^\\.)");
			var r2 = new RegExp("^.+\\@(\\[?)[a-zA-Z0-9\\-\\.]+\\.([a-zA-Z]{2,3}|[0-9]{1,3})(\\]?)$");
			return (!r1.test(s) && r2.test(s));
		    },
	stringToFloat: function ( s ){
					if(typeof(n1)=="string"){ 
						var nrMod = (n1)%1;
						if (nrMod!=0){
							return parseFloat(n1.split(",").join("."));
						}else{ return false; }
					}else{ return false; }
				},
	browser: function(a){
				// indexOf
				var valToReturn_nav = "unknown"; var valToReturn_ver = "unknown";
				var userAgent = navigator.userAgent.toLowerCase();
				// navegador
				var boolSafari = /webkit/.test( userAgent );
				var boolOpera = /opera/.test( userAgent );
				var boolMSIE = /msie/.test( userAgent ) && !/opera/.test( userAgent );
				var boolMozilla = /mozilla/.test( userAgent ) && !/(compatible|webkit)/.test( userAgent );
				if (boolSafari){ valToReturn_nav = "safari"; valToReturn_ver = userAgent.match(/safari\/(\d+(\.?\d*)*)/)[1] }
				if (boolOpera){ valToReturn_nav = "opera"; valToReturn_ver = userAgent.match(/opera[\/\s](\d+(\.?\d)*)/)[1] }
				if (boolMSIE){ valToReturn_nav = "msie"; valToReturn_ver = userAgent.match(/msie\s(\d+(\.?\d)*)/)[1] }
				if (boolMozilla){ valToReturn_nav = "firefox"; valToReturn_ver = userAgent.match(/firefox[\/\s](\d+([\.-]\d)*)/)[1] }
				
				// version search taken from: 
				//						jsBrwSniff v0.5 
				//		( A browser sniffer library - http://jsbrwsniff.sf.net )
				
				return { 
						nav: valToReturn_nav,
						ver: valToReturn_ver
					  };
			},

	reverse: function( str ) {
			    var s = "";
			    var i = str.length;
			    while (i>0) {
			        s += str.substring(i-1,i);
			        i--;
			    }
			    return s;
			},
// MATH METHODS	
	toFixed: function ( n, digits ){
				var m = Math.pow(10, digits);
				return Math.round(n * m, 0) / m;
		    },
// ELEMENTS METHODS
	getDropDownSelectedValue: function ( elemID ){
							var dropDown = document.getElementById(elemID);
							if (dropDown.selectedIndex==-1){ 
								return 0;	
							}else{
								return dropDown.options[dropDown.selectedIndex].value;
							}
						 },
	getDropDownSelectedText: function ( elemID ){
							if ( document.getElementById(elemID) != null ){
								return document.getElementById(elemID).options[document.getElementById(elemID).selectedIndex].text;
							}else{
								return false;	
							}
						},
	setDropDownSelectedValue: function ( elemID, valueToSet ){
							var dropDown = document.getElementById(elemID);
							for (var i = 0; i < dropDown.length; i++){
								if (parseInt(dropDown.options[i].value) == parseInt(valueToSet)){
									dropDown.selectedIndex = i;
									//dropDown.options[i].selected = true;
									return;
								}
							}
							dropDown.selectedIndex = 0;
							//dropDown.options[0].selected = true;
							return;
						 },
	disableBtn: function ( elemID ){
			 	document.getElementById(elemID).disabled = true;
			  },
	enableBtn: function ( elemID ){
				document.getElementById(elemID).disabled = false;
			 },
	emptyAllFieldsFromForm: function ( formName ){
					    
							if ( document.getElementsByName(formName) != null ){
									var arrayObjName = document.getElementsByName(formName);
									var objForm;
									// get form name object
									for (i=0; i <= arrayObjName.length; i++) {
											if ( arrayObjName[i] != null ){
												if ( arrayObjName[i].name == formName ){
													objForm = arrayObjName[i]
							
													if ( objForm !== undefined ){
														var count = objForm.elements.length;
														for (ii=0; ii < count; ii++) {
															var elementType;
															var elementObj = objForm.elements[ii];
															var elementType = objForm.elements[ii].type;
															
															switch (elementType){
																case "checkbox":
																			elementObj.checked = false;
																			break;
																case "text":
																			elementObj.value = "";
																			break;
																case "select-one":
																			elementObj.options[0].selected = true;
																			break;
																case "select-multiple":
																			for (var index=0; index<=elementObj.options.length-1; index++){
																				//if ( typeof(elementObj.options[index]=="object") ){
																				elementObj.options[index].selected = false;
																				//}
																				
																			}
																case "radio":
																			elementObj.checked = false;
																			break;
																case "textarea":
																			elementObj.value = "";
																break;
															}
														}
													}
												}
											}
									}
							}
					    
					    },
	disableAllFieldsFromForm: function ( formName, enableDisable ){
							// si no se le pasa nada como segundo parametro debe deshabilitar
							if ( document.getElementsByName(formName) != null ){
								var arrayObjName = document.getElementsByName(formName);
								var objForm;
								for (i=0; i <= arrayObjName.length; i++) {
									if ( arrayObjName[i] != null ){
										if ( arrayObjName[i].name == formName ){
											objForm = arrayObjName[i]
											if ( objForm !== undefined ){
												var count = objForm.elements.length;
												for (ii=0; ii < count; ii++) {
													var elementType;
													var elementObj = objForm.elements[ii];
													elementObj.disabled = enableDisable;
									
												}
											}
											
										}
									}
								}
							}
						 },
						 
	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;
					},
	inArray:  function (value) {
				var i;
				for (i=0; i < this.length; i++) {
					if (this[i] === value) {
						return true;
					}
				}
				return false;
			},
	now: function (value){
			var thisDate = new Date();
			var nHour = thisDate.getHours();
			if ( nHour <10 ){ nHour = "0"+nHour }
			var nMinutes = thisDate.getMinutes();
			if ( nMinutes <10 ){ nMinutes = "0"+nMinutes }
			var nSeconds = thisDate.getSeconds();
			if ( nSeconds <10 ){ nSeconds = "0"+nSeconds }
			return nHour+":"+nMinutes+":"+nSeconds;
			
		}			 
	
};


// OTHERS -------------------------------------------------------------------------------------------
function chrLeft(obj,idLabel){
	if ( document.getElementById(idLabel) != null ){
		var maxCharsAllowed = 30;
		
		//var strTxt;
		var chrs = parseInt(obj.value.length);
		var totChrs = maxCharsAllowed - chrs
		if (totChrs < 0){
			obj.value = strTxt;
		}else{
			document.getElementById(idLabel).innerHTML = totChrs + " signes restant";
			strTxt = obj.value;
		}
	}
}

// HACER metodo getElementByClassName

/* usefull javascript reference
******************************************************************

==  - comparar convirtiendo tipos en caso necesario
=== - comprar sin convertir tipos

const [var] = [val]; - declarar constante; no funciona correctamente en IE6

FUNCIONES DEL LENGUAJE
*************************
typeof([var]) - tipo de datos (devuelve una cadena) - typeof(NaN) - "number"
eval(string[, object]) - Evaluates a string of JavaScript code without reference to a particular object. - eval("2+2") // 4
isNaN(var) - true si el tipo de datos en NaN
[string].indexOf(searchvalue,fromindex) - method returns the position of the first occurrence of a specified string value in a string.

STRINGS
*********
[string].charAt(int) - obtiene el caracter en la posicion especificada
[string].length - largo de la cadena
[string].toUpperCase

Arrays
*******
[array].length - cuenta los elementos de una matriz
[array].reverse() - invierte el orden de los elementos de una matriz
[array].join([separator]) - Pone todos los elementos de una matriz en una cadena, separados por "," en caso 
						de que se especifique otro separados. El separados es opcional.
[array].unshift(newelement1,newelement2,....,newelementX) - agrega elementos al comienzo de una matriz y devuelve su nuevo largo
[array].pop()  - remueve y devuelve el último elemento de una matriz
[array].shift() - remueve y devuelve el primer elemento de una matriz
[array].sort([sortby]) - ordena los elementos de una matriz. [sortby] es opcional, y debe ser una funcion.

Numbers
***********
parseInt(number, [radix]) - convierte cadena en entero, el segundo parametro es el tipo de sistema numerico al cual convertir. Devuelve NaN en caso
						de que no sea un número.
parseFloat([number]) - convierte cadena en numero flotante
Number() - convierte a un número o devuelve NaN


Objetos
************
Math.PI - Obttiene numero PI
window - Se trata del objeto más alto en la jerarquía del navegador 
			window.setTimeout('[expresion]',[tiempo en milisegundos])
document - objecto que contiene lo que se visualiza en el navegador


DECLARAR
*********
var myFun = new Function("5+2") - declarar una funcion
var myObject = { solidaridad: "mom", age:1 } - declarar un objeto


SELECTORS
*********
document.getElementsByName("checkboxArticle");


OPERATORS
**********
(expresion) ? (expr1) : (expr2) - Ternay operators. if (expresion) == true, (expr1) else (expr2)


STATEMENTS
**********
for... in..









CODE SAMPLES (only usefull things)
**********************************
Dynamic load js file and parse it
-----------------------------------
var script = document.createElement('script');
script.type = 'text/javascript';
script.src = 'snip.js';
document.getElementsByTagName('head')[0].appendChild(script);  





*/
