﻿


/* ------------------------------ Utility functions ------------------------ */

function Contains(source, value)
{
	try
	{
		return (source.indexOf(value) > -1 ? true : false);
	}
	catch (e)
	{
		throwException('/functions.js : Contains()', e.lineNumber, e, e.message);
	}

	return false
}


function NameToFileName(str)
{
	str = Trim(str).toLowerCase()

	str = str.replace(/\s|&#160;|&nbsp;/g, '-');
	str = str.replace(/&|&#38;|&#038;|&amp;/g, 'and');
	str = str.replace(/%|&#37;|&#037;/g, '-per-cent');
	str = str.replace(/_/, '-');

	str = str.replace(/[^\w+]/g, '-');

	str = str.replace(/[-+]+/g, '-');
	
	str = Trim("-"+str, "-");
	
	return str;
}

function TrimLeft(str)
{
	var trim = /^\s+/;
	if(arguments[1] != null){ trim = RegExp(arguments[1] + "+", ""); }
	return str.replace(trim, '');
}
function TrimRight(str)
{	
	var trim = /\s+$/;
	if (arguments[1] != null) { trim = RegExp(arguments[1] + "+$", "g"); }
	return str.replace(trim, '');
}
function Trim(str)
{
	return TrimLeft(TrimRight(str, arguments[1]), arguments[1]);
	
	/*	for some reason, this will replace all instances of var trim in the string, not just from the front and back...
	var trim = /^\s+|\s+$/g;
	if (arguments[1] != null) { trim = RegExp(arguments[1] + "+|" + arguments[1] + "+$", "g"); }
	return str.replace(trim, '');
	*/
}


function FindControl(oSource, id)
{
	if ((oSource == null || oSource == "") || (id == null || id == "")) { return null; }
	
	var oObj = null;

	var html = (typeof (oSource) == "object")
		? oSource.innerHTML
		: oSource
	;

	
	var re = new RegExp("id=\"?[\\w]+", "g");
	var m = html.match(re);
	
	if (m != null)
	{
		var mid = "";
		var stpos = 4;
		for (var i = 0; i < m.length; i++)
		{

			if (m[i].indexOf('"') != -1)
			{
				stpos = m[i].indexOf('"') + 1;
			}
			else if (m[i].indexOf('=') != -1)
			{
				stpos = m[i].indexOf('=') + 1;
			}
			
			if (Contains(m[i], id))
			{
				mid = m[i].substring(stpos, m[i].length);
				oObj = document.getElementById(mid);
				break;
			}
		}
	}

	return oObj;
}

function FindFormField(name)
{
	var useid = (arguments[1] != null)
		? arguments[1]
		: true
	;
	
	var fct = document.forms[0].length;
	if (useid)
	{
		for (var i = fct - 1; i >= 0; i--)
		{
			if (Contains(document.forms[0][i].id, name))
			{
				return document.forms[0][i];
			}
		}
	}
	else
	{
		for (var i = fct - 1; i >= 0; i--)
		{
			if (Contains(document.forms[0][i].name, name))
			{
				return document.forms[0][i];
			}
		}
	}
}

function GetQueryParam(parameter, qs)
{
	qs = "&" + qs;
	var p = escape(unescape(parameter));
	var regex = new RegExp("[?&]" + p + "=(?:([^&]*))?", "i");

	var match = regex.exec(qs);
	var value = "";
	if (match != null)
	{
		value = match[1];
	}
	return value;
}

function RemoveNonNumbers(str)
{
	if (str == null || str == "") { return ""; }

	return Replace(str, "[^0-9]", "");
}

function Replace(source, find, replacement)
{
	if (source == "" || find == "") { return source; }

	var re = new RegExp(find, "g");
	return source.replace(re, replacement);
}

function FileNameWithoutExtention(str)
{
	str = Replace(str, ".jpg|.jpeg|.png|.gif", "");
	return str;
}

function GetFileExtention(str)
{
	var re = new RegExp(".jpg|.jpeg|.png|.gif", "g");
	var m = str.match(re);

	if(m != null)
	{
		return m[0];
	}
	else
	{
		return "";
	}
}

function AbbreviateFileSize(num)
{
	if (isNaN(num)) { return num; }

	var moniker = "kb";

	if (num >= 1073741824)
	{
		num = num / 1073741824;
		moniker = "gb";
	}
	else if (num >= 1048576)
	{
		num = num / 1048576;
		moniker = "mb";
	}
	else
	{
		num = num / 1024;
	}

	num = num + "";
	if (num.indexOf(".") > -1)
	{
		num = num.substring(0, num.indexOf(".") + 2);
		if (num.charAt(num.length - 1) == "0")
		{
			num = num.substring(0, num.indexOf("."));
		}
	}

	return num + moniker
}




function ListProperties(obj)
{
	var obj_props = "";
	for (var i in obj)
	{
		if (arguments[1]) { var msg = arguments[1] + "." + i + " : " + obj[i]; } else { var msg = i + " : " + obj[i]; }
		obj_props += msg + "\n";

		if (typeof obj[i] == "object")
		{
			if (arguments[1]) { ListProperties(obj[i], parent + "." + i); } else { ListProperties(obj[i], i); }
		}
	}
	return obj_props;
}




/* ------------------------------ Validation Functions ------------------------ */

function ValidObj(arg)
{
	if(arg == ""){ return false; }
	else if(arg == null){ return false; }
	else if(typeof(arg) == 'undefined'){ return false; }
	
	return true;
}

function ValidString(str)
{
	if(str == ""){ return false; }
	else if(str == null){ return false; }
	else if(typeof(str) == 'undefined'){ return false; }
	
	str = Trim(str);
	if(str == ""){ return false; }
	else{ return true; }
}

function ValidUSZipCode(str)
{
	return /(^\d{5}$)|(^\d{5}-\d{4}$)/.test(str);
}

function ValidEmail(str)
{
	return /^([\w]+)(\.[\w]+)*@([\w\-]+)(\.[\w]{2,7})(\.[a-z]{2})?$/i.test(str);
}

function isValidDate(date_string, format) {

    var days = [0,31,28,31,30,31,30,31,31,30,31,30,31];
    var year, month, day, date_parts = null;
    var rtrn = false;
    var decisionTree = {
        'm/d/y':{
            're':/(\d{1,2})[./-](\d{1,2})[./-](\d{2}|\d{4})/,
            'exact':/^(\d{1,2})[./-](\d{1,2})[./-](\d{2}|\d{4})$/,
            'month': 1,'day': 2, year: 3
        },
        'mm/dd/yy':{
            're':/(\d{1,2})[./-](\d{1,2})[./-](\d{2})/,
            'exact':/^(\d{1,2})[./-](\d{1,2})[./-](\d{2})$/,
            'month': 1,'day': 2, year: 3
        },
        'mm/dd/yyyy':{
            're':/(\d{1,2})[./-](\d{1,2})[./-](\d{4})/,
            'exact':/^(\d{1,2})[./-](\d{1,2})[./-](\d{4})$/,
            'month': 1,'day': 2, year: 3
        },
        'y/m/d':{
            're':/(\d{2}|\d{4})[./-](\d{1,2})[./-](\d{1,2})/,
            'exact':/^(\d{2}|\d{4})[./-](\d{1,2})[./-](\d{1,2})$/,
            'month': 2,'day': 3, year: 1
        },
        'yy/mm/dd':{
            're':/(\d{1,2})[./-](\d{1,2})[./-](\d{1,2})/,
            'exact':/^(\d{1,2})[./-](\d{1,2})[./-](\d{1,2})$/,
            'month': 2,'day': 3, year: 1
        },
        'yyyy/mm/dd':{
            're':/(\d{4})[./-](\d{1,2})[./-](\d{1,2})/,
            'exact':/^(\d{4})[./-](\d{1,2})[./-](\d{1,2})$/,
            'month': 2,'day': 3, year: 1
        }
    };
    var test = decisionTree[format];
    if (test) {
    
		var re = new RegExp(test.re);
		var m = re.exec(date_string);
		
		if(m != null)
		{
			date_string = m[0];
			date_parts = date_string.match(test.re);
			if (date_parts) {
				year = date_parts[test.year];
				month = date_parts[test.month];
				day = date_parts[test.day];

				test = (month == 2 && 
						isLeapYear() && 
						29 || 
						days[month] || 0);

				rtrn = 1 <= day && day <= test;
			}
        }
        
    }

    function isLeapYear() {
        return (year % 4 != 0 ? false : 
            ( year % 100 != 0? true: 
            ( year % 1000 != 0? false : true)));
    }
    
	if(arguments[2] === true)
	{	//return date parts: mm/dd/yyy, mm, dd, yyyy
		return m;
	}
	else
	{
		return rtrn;
	}
}//eof isValidDate


