/**
 * JS_NETLASH.utils.js
 * @author Bram Van Damme <bramus@netlash.com>
 */

/**
 * JS_NETLASH Object
 * -------------------------------------------------------------
 */

	if (!JS_NETLASH) { var JS_NETLASH = new Object(); }






/**
 * JS_NETLASH - Utils object
 * -------------------------------------------------------------
 */

	JS_NETLASH.utils = new Object();






/**
 * JS_NETLASH - Utils object - string
 * -------------------------------------------------------------
 */

	JS_NETLASH.utils.string = {
		
		
		/**
		 * Datamembers
		 * -------------------------------------------------------------
		 */
		 
		 	version							: '20080618',


		/**
		 * trim - trims a string
		 * @param string str
		 * @return string
		 * -------------------------------------------------------------
		 */

			trim 							: function(str) {
				return str.replace(/^\s+|\s+$/g,"");
			},


		/**
		 * ltrim - lefttrims a string
		 * @param string str
		 * @return string
		 * -------------------------------------------------------------
		 */

			ltrim 							: function(str) {
				return str.replace(/^\s+/,"");
			},


		/**
		 * rtrim - righttrims a string
		 * @param string str
		 * @return string
		 * -------------------------------------------------------------
		 */

			rtrim 							: function(str) {
				return str.replace(/\s+$/,"");
			},


		/**
		 * replaceAll - replace all occurences of one instring into a string
		 * @param string str
		 * @param string needle
		 * @param string replacement
		 * @return string
		 * -------------------------------------------------------------
		 */

			replaceAll						: function(str, needle, replacement) {
				return str.replace(new RegExp(needle, 'g'), replacement);
			},


		/**
		 * assignFromObject - kind a like "$tpl->assignFromArray($associativeArray)" ;)
		 * @param string str
		 * @param Object object
		 * @return string
		 * -------------------------------------------------------------
		 */

			assignFromObject				: function(str, object) {

				for (index in object) {

					str = JS_NETLASH.utils.string.replaceAll(str, '{' + index + '}', object[index]);

				}

				return str;

			},


		/**
		 * html_entity_decode (cfr. PHP)
		 * @author http://kevin.vanzonneveld.net/code/php_equivalents/php.js
		 * @param string str
		 * @return string
		 * -------------------------------------------------------------
		 */

			html_entity_decode				: function (str) {

				if (!str || (str == undefined))	return '';

				var ta 			= document.createElement("textarea");
				ta.innerHTML	= str.replace(/</g,"<").replace(/>/g,">");
				toReturn 		= ta.value;
				ta 				= null;
				return toReturn;
			},


		/**
		 * htmlentities (cfr. PHP)
		 * @author by Micox - elmicoxcodes.blogspot.com - www.ievolutionweb.com // expanded by Bramus! to allow spaces, dashes and periods ;)
		 * @param string str
		 * @return string
		 * -------------------------------------------------------------
		 */
			
			htmlentities					: function (str) {

				if (!str || (str == undefined))	return '';
				
				var i,carac,letra,novo='';
				for(i=0;i<str.length;i++){
					carac = str[i].charCodeAt(0);
					if( (carac > 47 && carac < 58) || (carac > 62 && carac < 127) || (carac == 32) || (carac == 45) || (carac == 46) ){
						//se for numero ou letra normal
						novo += str[i];
					}else{
						novo += "&#" + carac + ";";
					}
				}
				return novo;

				
			},


		/**
		 * ucfirst (cfr. PHP)
		 * @param string str
		 * @return string
		 * -------------------------------------------------------------
		 */
			
			ucfirst						: function(str) {
				if (!str) return '';
				return str.charAt(0).toUpperCase() + str.substr(1, str.length-1);
			},


		/**
		 * urlise (cfr. SpoonFilter)
		 * @param string str
		 * @return string
		 * @todo	backdrop from SpoonFilter!
		 * -------------------------------------------------------------
		 */
			
			urlise						: function(str) {
				
				// no value given? Return empty string!
				if (!str) return '';
				
				// redefine value
				str = JS_NETLASH.utils.string.htmlentities(str);
						
				// allowed characters
				var aCharacters 	= ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '-', '_', ' '];
		
				// letter "a"
				var aSearchA 		= ['&Agrave;', '&#192;', '&Aacute;', '&#193;', '&Acirc;', '&#194;', '&Atilde;', '&#195;', '&Auml;', '&#196;', '&Aring;', '&#197;', '&agrave;', '&#224;', '&aacute;', '&#225;', '&acirc;', '&#226;', '&atilde;', '&#227;', '&auml;', '&#228;', '&aring;', '&#229;'];
				var aReplaceA 		= 'a';
		
				// letter "c"
				var aSearchC		= ['&Ccedil;', '&#199;', '&ccedil;', '&#231;'];
				var aReplaceC 		= 'c';
		
				// letter "e"
				var aSearchE 		= ['&Egrave;', '&#200;', '&Eacute;', '&#201;', '&Ecirc;', '&#202;', '&Euml;', '&#203;', '&egrave;', '&#232;', '&eacute;', '&#233;', '&ecirc;', '&#234;', '&euml;', '&#235;'];
				var aReplaceE 		= 'e';
		
				// letter "i"
				var aSearchI 		= ['&Igrave;', '&#204;', '&Iacute;', '&#205;', '&Icirc;', '&#206;', '&Iuml;', '&#207;', '&igrave;', '&#236;', '&iacute;', '&#237;', '&icirc;', '&#238;', '&iuml;', '&#239;'];
				var aReplaceI 		= 'i';
		
				// letter "l"
				var aSearchL 		= ['&lgrave;', '&#204;', '&lacute;', '&#205;', '&lcirc;', '&#206;', '&luml;', '&#207;'];
				var aReplaceL 		= 'l';
		
				// letter "n"
				var aSearchN 		= ['&Ntilde;', '&#209;', '&ntilde;', '&#241;'];
				var aReplaceN 		= 'n';
		
				// letter "o"
				var aSearchO 		= ['&Ograve;', '&#210;', '&Oacute;', '&#211;', '&Ocirc;', '&#212;', '&Otilde;', '&#213;', '&Ouml;', '&#214;', '&ograve;', '&#242;', '&oacute;', '&#243;', '&ocirc;', '&#244;', '&otilde;', '&#245;', '&ouml;', '&#246;'];
				var aReplaceO 		= 'o';
		
				// letter "u"
				var aSearchU 		= ['&micro;', '&#181;', '&Ugrave;', '&#217;', '&Uacute;', '&#218;', '&Ucirc;', '&#219;', '&Uuml;', '&#220;', '&ugrave;', '&#249;', '&uacute;', '&#250;', '&ucirc;', '&#251;', '&uuml;', '&#252;', '&mu;', '&#956;'];
				var aReplaceU 		= 'u';
		
				// letter "y"
				var aSearchY 		= ['&Yacute;', '&#221;', '&yacute;', '&#253;', '&yuml;', '&#255;', '&Yuml;', '&#376;'];
				var aReplaceY 		= 'y';
		
				// specials
				var aSearchMisc 	= ['&trade;', '&euro;', '&copy', '@'];
				var aReplaceMisc 	= [' tm ', ' euro ', ' copyright ', ' at '];
				
				// now bundle all replacements
				var replacements	= [
					[aSearchA, aReplaceA],
					[aSearchC, aReplaceC],
					[aSearchE, aReplaceE],
					[aSearchI, aReplaceI],
					[aSearchL, aReplaceL],
					[aSearchN, aReplaceN],
					[aSearchO, aReplaceO],
					[aSearchU, aReplaceU],
					[aSearchY, aReplaceY],
					[aSearchMisc, aReplaceMisc]
				];
						
				// replace them replacements fo 'real!
				for (snp in replacements) {
				
					var aSearch 	= replacements[snp][0];
					var sReplace 	= replacements[snp][1];
					
					for (srch in aSearch) {
						str	= JS_NETLASH.utils.string.replaceAll(str, aSearch[srch], sReplace);	
					}
				
				}
				
				// replace html entities
				str = str.replace(/&[a-z0-9\#]{2,8};/ig, '');
						
				// enforce lowercase
				str = str.toLowerCase();
		
				// replace dots with spaces
				str = JS_NETLASH.utils.string.replaceAll(str, '\\.', ' ');
		
				// remove spaces at the beginning and end
				str = JS_NETLASH.utils.string.trim(str);
		
				// default endvalue
				var toReturn = '';
		
				// loop charachtesr
				for (var i = 0; i < str.length; i++)
				{
					// valid character (so add to new string)
					if (jQuery.inArray(str.substr(i, 1), aCharacters) > -1)	toReturn += str.substr(i, 1);
				}
		
				// replace spaces by dashes
				toReturn = JS_NETLASH.utils.string.replaceAll(toReturn, ' ', '-');
		
				// there IS a value
				if(toReturn.length != 0)
				{
					// convert "--" to "-"
					toReturn = toReturn.replace(/\-+/ig,'-');
				}
		
				// trim leading and trailing - signs
				toReturn = toReturn.replace(/^\-+/,"").replace(/\-+$/,"");
		
				// return it!
				return toReturn;
			},


		/**
		 * end of object
		 * -------------------------------------------------------------
		 */
			_eoo				: true

	}






/**
 * JS_NETLASH - Utils object - form
 * -------------------------------------------------------------
 */

	// 2DO - Extend shizzle from filter.php

	JS_NETLASH.utils.form = {
		
		
		/**
		 * Datamembers
		 * -------------------------------------------------------------
		 */
		 
		 	version							: '20080618',

		/**
		 * isFilled
		 * @param Object input
		 * @return bool valid
		 * -------------------------------------------------------------
		 */

			isFilled				: function(input) {
				return (JS_NETLASH.utils.string.trim(input.val()) != '');
			},

		/**
		 * isNumber
		 * @param Object input
		 * @return bool valid
		 * -------------------------------------------------------------
		 */

			isNumber				: function(input) {
				return (!isNaN(input.val()) && input.val() != '');
			},

		/**
		 * isEmail
		 * @param Object input
		 * @return bool valid
		 * -------------------------------------------------------------
		 */

			isEmail					: function(input) {
				var regexp = /^[a-z0-9_\.-]+@([a-z0-9]+([\-]+[a-z0-9]+)*\.)+[a-z]{2,7}$/i;
				return regexp.test(input.val());
			},


		/**
		 * isUrl
		 * @param Object input
		 * @return bool valid
		 * -------------------------------------------------------------
		 */

			isUrl					: function(input) {
				var regexp = /(ftp|http|https):\/\/(\w+:{0,1}\w*@)?(\S+)(:[0-9]+)?(\/|\/([\w#!:.?+=&%@!\-\/]))?/i;
				return regexp.test(input.val());
			},

		/**
		 * isDate
		 * @param Object input
		 * @return bool valid
		 * -------------------------------------------------------------
		 */

			isDate				: function(input) {
				return true; // need to find a good one with multiple dat formatting
			},

		/**
		 * isColor
		 * @param Object input
		 * @return bool valid
		 * -------------------------------------------------------------
		 */

			isColor				: function(input) {
				var regexp = /^\#?[0-9A-F]{6}$/i;
				return regexp.test(input.val().toUpperCase());
			},

		/**
		 * isChecked
		 * @param Object input
		 * @return bool valid
		 * -------------------------------------------------------------
		 */

			isChecked				: function(input) {
				// return if any other checkboxes with that same name are checked
				return ($("input[name='" + input.attr('name') + "']:checked").length >= 1);
			},

		/**
		 * isSelected
		 * @param Object select
		 * @return bool valid
		 * -------------------------------------------------------------
		 */

			isSelected				: function(select) {
				return (select.get(0).selectedIndex !== 0);
			},


		/**
		 * end of object
		 * -------------------------------------------------------------
		 */
			_eoo				: true


	}
