var imageExts = 'png|jpe?g|gif';

/**********************************************
 *
 * Data manipulation
 * 
 **********************************************/

$.extend({
	jYoutube: function(url, size ) {
		if (url === null) { return ""; }

		size = (size === null) ? "big" : size;
		var vid;
		var results;

		results = url.match("[\\?&]v=([^&#]*)");

		vid = ( results === null ) ? url : results[1];

		if (size == "small") 
		{
			return "http://img.youtube.com/vi/"+vid+"/2.jpg";
		} 
		else 
		{
			return "http://img.youtube.com/vi/"+vid+"/0.jpg";
		}
	},

	unserialize: function(data) {
		data = data.split('&');
	
		for (var i = 0; i < data.length; i++)
		{
			var datum = data[i].split('=');
			var field = datum[0];
			var value = datum[1].replace(/[+]/g, ' ');
			value = $.URLDecode(value);
		
			if ($('*[name="' + field + '"]').length > 0)
			{	
				$('*[name="' + field + '"]').val(value);
			}
		}
	},
	
	formReset: function(id) {
		$('#' + id).each(function() {
			this.reset();
		});
	},
	
	strLPad: function(i,l,s) {
		var o = i.toString();
		
		if ( ! s) s = '0'; 
		while (o.length < l) o = s + o;
		return o;
	},
	
	isNumber: function(s, decimal) {
		decimal = decimal || false;
		
		var validChars = "0123456789";
		var isNumber = true;
		var digit;
		
		if (decimal) validChars += '.';
		
		for (i = 0; i < s.length && isNumber == true; i++) 
		{ 
			digit = s.charAt(i); 
			if (validChars.indexOf(digit) == -1) isNumber = false;
		}
		
		return isNumber;	
	},
	
	validDateFormat: function(s, expr) {
		expr = expr || /^\d{2}\/\d{2}\/\d{4}$/; 
		
		if ( ! expr.test(s)) return false;
		return true;
	},
	
	validDate: function(value, element) {
		// from validation additional methods
		var check = false;
		var re = /^\d{1,2}\/\d{1,2}\/\d{4}$/
		if (re.test(value)) 
		{
			var adata = value.split('/');
			var gg = parseInt(adata[1],10);
			var mm = parseInt(adata[0],10);
			var aaaa = parseInt(adata[2],10);
			var xdata = new Date(aaaa,mm-1,gg);
			if ( ( xdata.getFullYear() == aaaa ) && ( xdata.getMonth () == mm - 1 ) && ( xdata.getDate() == gg ) )
				check = true;
			else
				check = false;
		} 
		else check = false;
		
		return check;
	},
	
	isURL: function(value) {
		return /^(https?|ftp):\/\/(((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:)*@)?(((\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5]))|((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)+(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.?)(:\d*)?)(\/((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)+(\/(([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)*)*)?)?(\?((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|[\uE000-\uF8FF]|\/|\?)*)?(\#((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|\/|\?)*)?$/i.test(value);
	}
});
	


/********************************************
 * 
 * Additional codes downloaded from all over
 * 
 ********************************************/
var monNames = new Array ('',
				'January','February','March',
				'April','May','June',
				'July','August','September',
				'October','November','December');

function current_date_time()
{
	var now=new Date();
	var hrs=now.getHours();
	var mins=now.getMinutes();
	var secs=now.getSeconds();
	var date = now.getDate();
	var daynum = now.getDay();
	var monnum = now.getMonth() + 1;
	var year = now.getYear();
	var don="am"
	
	if ( year < 200 ) {
		year += 1900;
	}
	
	if (hrs>=12){ don="pm" }
	if (hrs>12) { hrs-=12 }
	if (hrs==0) { hrs=12 }
	if (hrs<10) { hrs="0"+hrs }
	if (mins<10) { mins="0"+mins }
	if (secs<10) { secs="0"+secs }
	document.getElementById("clock").innerHTML = monNames[monnum] + "&nbsp;" + date + ",&nbsp;" + year + "&nbsp;" + hrs + ":" + mins + ":" + secs + "&nbsp;" + don
	setTimeout("current_date_time()",1000)
}

$.extend({
	URLEncode: function(c){
				var o='';var x=0;c=c.toString();var r=/(^[a-zA-Z0-9_.]*)/;
				while(x<c.length){var m=r.exec(c.substr(x));
				if(m!=null && m.length>1 && m[1]!=''){o+=m[1];x+=m[1].length;
				}else{if(c[x]==' ')o+='+';else{var d=c.charCodeAt(x);var h=d.toString(16);
				o+='%'+(h.length<2?'0':'')+h.toUpperCase();}x++;}}return o;},
	URLDecode: function(s){
				var o=s;var binVal,t;var r=/(%[^%]{2})/;
				while((m=r.exec(o))!=null && m.length>1 && m[1]!=''){b=parseInt(m[1].substr(1),16);
				t=String.fromCharCode(b);o=o.replace(m[1],t);}return o;}
});

/********************************************
 * 
 * For Prices (block non-numeric values, format to 2 decimal places)
 * 
 ********************************************/
function blockNonNumbers(obj, e, allowDecimal, allowNegative)
{
	var key;
	var isCtrl = false;
	var keychar;
	var reg;
		
	if(window.event) {
		key = e.keyCode;
		isCtrl = window.event.ctrlKey
	}
	else if(e.which) {
		key = e.which;
		isCtrl = e.ctrlKey;
	}
	
	if (isNaN(key)) return true;
	
	keychar = String.fromCharCode(key);
	
	// check for backspace or delete, or if Ctrl was pressed
	if (key == 8 || isCtrl)
	{
		return true;
	}

	reg = /\d/;
	var isFirstN = allowNegative ? keychar == '-' && obj.value.indexOf('-') == -1 : false;
	var isFirstD = allowDecimal ? keychar == '.' && obj.value.indexOf('.') == -1 : false;
	
	return isFirstN || isFirstD || reg.test(keychar);
}

function extractNumber(obj, decimalPlaces, allowNegative)
{
	var temp = obj.value;
	
	// avoid changing things if already formatted correctly
	var reg0Str = '[0-9]*';
	if (decimalPlaces > 0) {
		reg0Str += '\\.?[0-9]{0,' + decimalPlaces + '}';
	} else if (decimalPlaces < 0) {
		reg0Str += '\\.?[0-9]*';
	}
	reg0Str = allowNegative ? '^-?' + reg0Str : '^' + reg0Str;
	reg0Str = reg0Str + '$';
	var reg0 = new RegExp(reg0Str);
	if (reg0.test(temp)) return true;

	// first replace all non numbers
	var reg1Str = '[^0-9' + (decimalPlaces != 0 ? '.' : '') + (allowNegative ? '-' : '') + ']';
	var reg1 = new RegExp(reg1Str, 'g');
	temp = temp.replace(reg1, '');

	if (allowNegative) {
		// replace extra negative
		var hasNegative = temp.length > 0 && temp.charAt(0) == '-';
		var reg2 = /-/g;
		temp = temp.replace(reg2, '');
		if (hasNegative) temp = '-' + temp;
	}
	
	if (decimalPlaces != 0) {
		var reg3 = /\./g;
		var reg3Array = reg3.exec(temp);
		if (reg3Array != null) {
			// keep only first occurrence of .
			//  and the number of places specified by decimalPlaces or the entire string if decimalPlaces < 0
			var reg3Right = temp.substring(reg3Array.index + reg3Array[0].length);
			reg3Right = reg3Right.replace(reg3, '');
			reg3Right = decimalPlaces > 0 ? reg3Right.substring(0, decimalPlaces) : reg3Right;
			temp = temp.substring(0,reg3Array.index) + '.' + reg3Right;
		}
	}
	
	obj.value = temp;
}

function formatInteger(num)
{
    if (Trim(num) == "")
        num = "0"
	if(isNaN(num))
		num = "0";
	if (num != "0") {
		while (num.charAt(0) == '0') {
			num = num.substr(1);
		}
	}
    if (Trim(num) == "")
        num = "0"
	return parseInt(num);
}

function formatCurrency(num) {
    num = num.toString().replace(/\$|\,/g,'');
	if(isNaN(num))
        num = "0";
	sign = (num == (num = Math.abs(num)));
	num = Math.floor(num*100+0.50000000001);
	cents = num%100;
	num = Math.floor(num/100).toString();
	if(cents<10)
		cents = "0" + cents;
	for (var i = 0; i < Math.floor((num.length-(1+i))/3); i++)
		num = num.substring(0,num.length-(4*i+3)) + num.substring(num.length-(4*i+3));
		return (((sign)?'':'-') + num + '.' + cents);
}

function formatPercent(num) {
	num = num.toString().replace(/\$|\,|\%/g,'');
	if(isNaN(num))
        num = "0";
	num = Math.floor(num*100+0.50000000001);
	dec = num%100;
	num = Math.floor(num/100).toString();
	if(dec == 0)
		dec = "";
	else if(dec<10)
		dec = ".0" + dec;
	else
		dec = "." + dec;
	for (var i = 0; i < Math.floor((num.length-(1+i))/3); i++)
		num = num.substring(0,num.length-(4*i+3)) + num.substring(num.length-(4*i+3));
		return (num + dec);
}

/********************************************
 * Trim functions
 * Returns string with whitespace trimmed
 * 
 ********************************************/
function LTrim(str){
	if(str==null) return null;
	for(var i=0;str.charAt(i)==" ";i++);
		return str.substring(i,str.length);
}
function RTrim(str){
	if(str==null) return null;
	for(var i=str.length-1;str.charAt(i)==" ";i--);
		return str.substring(0,i+1);
}
function Trim(str){return LTrim(RTrim(str));}
function LTrimAll(str){
	if(str==null) return str;
	for(var i=0; str.charAt(i)==" " || str.charAt(i)=="\n" || str.charAt(i)=="\t"; i++);
		return str.substring(i,str.length);
}
function RTrimAll(str) {
	if(str==null) return str;
	for (var i=str.length-1; str.charAt(i)==" " || str.charAt(i)=="\n" || str.charAt(i)=="\t"; i--);
		return str.substring(0,i+1);
}
function TrimAll(str){
	return LTrimAll(RTrimAll(str));
}

/**
 * addGridTrigger
 * 
 * Add marker that grid has changes in pagination or sorting
 */
function addGridTrigger(myGrid)
{
	$('#' + myGrid).setGridParam({
		postData: {
			page_sort_t: 'Y'
		}
	});
}

$.extend({
	formatCurrency: function(num) {
		num = num.toString().replace(/\$|\,/g,'');
		if (isNaN(num)) num = "0";
		sign = (num == (num = Math.abs(num)));
		num = Math.floor(num*100+0.50000000001);
		cents = num%100;
		num = Math.floor(num/100).toString();
		if (cents < 10) cents = "0" + cents;
		
		for (var i = 0; i < Math.floor((num.length - (1 + i)) / 3); i++)
			num = num.substring(0,num.length-(4*i+3)) + num.substring(num.length-(4*i+3));
		
		return (((sign)?'':'-') + num + '.' + cents);
	},
	
	commaFormattedCurrency: function(amount) {
		var delimiter = ","; 
		
		amount = String(amount);
		if (amount.indexOf(delimiter) != -1) amount = $.formatCurrency(amount);
		if (amount.indexOf('.') == -1) amount += '.00';
		
		var a = amount.split('.', 2);
		var d = a[1];
		var i = parseInt(a[0]);
		
		if (isNaN(i)) return '';
		
		var minus = '';
		if (i < 0) minus = '-';
		
		i = Math.abs(i);
		var n = new String(i);
		var a = [];
		
		while(n.length > 3)
		{
			var nn = n.substr(n.length-3);
			a.unshift(nn);
			n = n.substr(0,n.length-3);
		}
		
		if (n.length > 0) a.unshift(n);
		n = a.join(delimiter);
		
		if (d.length < 1) amount = n;
		else amount = n + '.' + d;
		
		amount = minus + amount;
		
		return amount;
	}
});

