//This utilities.js requires JQuery
function Utilities(options) {
	options = options || new Object();
	this.loader = options.loader || '/images/loader.gif';
	this.info_img = options.info_img || '/images/info.jpg';
	this.fancy = 'undefined' != typeof options.fancy ? options.fancy : true;
}
Utilities.prototype.close_lay_over = function () {
	var _this = this;

	$(".lay-over-window").remove();
	_this.removeBlanket();
	$(".uMsgBox").remove();
	
}
Utilities.prototype.appendInMiddle = function (obj, width, z_index, height, close_link) {
	var _this = this;

	height = ( 'undefined' == typeof(height) ? false : height );
        var window_scroll = -20 + $(window).scrollTop();
        var curr_width =  ( width ? width : obj.css('width').replace('px','') );
        var margin_left = (parseInt((curr_width / 2))) * (-1);
        z_index = ( z_index ? z_index : 1000 );
        obj.css({
                'position': 'fixed',
                'margin-left': margin_left + 'px',
                'left':'50%',
                'top': '50%',
                'z-index': z_index
        });
        obj.insertBefore($('body *').get(0));
	if ( close_link ) {
		_this.insertBlanket();
		$(".blanket_div").click(utils.close_lay_over);
		obj.addClass('lay-over-window').prepend('<div style="float: right"><a href="javascript: utils.close_lay_over();">[ Close ]</a></div>');
	}
	height = ( false !== height ? height : obj.height() );
	height = parseInt(height);
        obj.css({
                'margin-top': '-' + (height/2) + 'px'
        });
	obj.bgiframe();
}
Utilities.prototype.insertBlanket = function (options) {
	var _this = this;

	options = options || new Object();
	options.opacity = options.opacity || 0.65;
	options.color = options.color || '#666';

	$(".blanket_div").remove();
	var blanket_top = $(window).scrollTop();
	var blanket = $(document.createElement('div')).addClass('blanket_div').css({
		opacity: options.opacity,
		'z-index': 800,
		height: screen.height + 250 + blanket_top + 'px',
		width: screen.width,
		position: 'fixed',
		'background-color': options.color
	});
	blanket.prependTo($("body"));
	blanket.bgiframe();
}
Utilities.prototype.removeBlanket = function () {
	$(".blanket_div").remove();
}
Utilities.prototype.loadingOn = function (options) {
	var _this = this;

	options = ( 'undefined' == typeof(options) ? new Object() : options );
	var showBlanket = ( 'undefined' == typeof(options.blanket) ? false : options.blanket );
	$("input[type=button]").attr('disabled', true);
	$("input[type=submit]").attr('disabled', true);
	if ( true === showBlanket ) {
		_this.insertBlanket();
	}
	var loading_img = utils.get_loader_img();
	var loading_div = $(document.createElement('div')).css({
		'background-color': 'white',
		'border': 'solid 1px #CCC',
		'text-align': 'center',
		'width': '250px',
		'height': '40px',
		'z-index': '7000',
		'font-size': '11pt'
	}).addClass('loading_div').append(loading_img);
	_this.appendInMiddle(loading_div, 250, 10000, 40)
}
Utilities.prototype.loadingOff = function (options) {
	var _this = this;

	options = ( 'undefined' == typeof(options) ? new Object() : options );
	var showBlanket = ( 'undefined' == typeof(options.blanket) ? false : options.blanket );
	$("select").css('visibility', 'visible');
	$("input[type=button]").attr('disabled', false);
	$("input[type=submit]").attr('disabled', false);
	$(".loading_div").remove();
	if ( false != showBlanket ) {
		_this.removeBlanket();
	}
}
Utilities.prototype.displayMessage = function (msg, options) {
	var _this = this;

	msg = msg.replace("\n", "<br />");
	var div = $(document.createElement('div')).addClass('uMsgBox');
	var options = ( 'object' == typeof(options) ? options : new Object() );
	// Setup Options
	var width = ( options.width ? options.width.replace('px','') : '300' );
	var height = ( options.height ? options.height.replace('px', '') : false );
	var zIndex = ( options.zIndex ? options.zIndex : 5000 );
	var fadeMe = ( 'undefined' != typeof(options.fadeOut) ? options.fadeOut : true );
	var blanket = ( options.blanket ? options.blanket : false );
	var userActionRequired = ( options.userActionRequired ? options.userActionRequired : false );
	var actionType = ( options.actionType ? options.actionType : 'alert' );
	var okText = options.okText || 'Ok';
	var cancelText = options.cancelText || 'Cancel';
	var autoCloseBlanket = options.autoCloseBlanket || true;
	var closeOnCancel = ( typeof options.closeOnCancel != 'undefined' ? options.closeOnCancel : true );

	if ( true === blanket ) {
		_this.insertBlanket();
		if ( true === autoCloseBlanket ) {
			$(".blanket_div").click(utils.close_lay_over);
		}
	}

	if ( options.holderClass ) {
		div.addClass(options.holderClass);
	} else {
		div.css({
			width: width+'px',
			'text-align': 'center',
			border: 'solid 1px #CCC',
			padding: '10px',
			'background-color': 'white',
			'font-size': '11pt'
		});
	}
	if ( true === _this.fancy && true === userActionRequired ) {
		var img = $(document.createElement('img')).attr({
			src: _this.info_img,
			title: 'Please Confirm',
			style: 'float: left'
		}).appendTo(div);
	}
	div.append(msg);
	if ( true === userActionRequired ) {
		var okBox = $(document.createElement('input')).attr({
			type: 'button',
			value: okText,
			'style': 'padding: 2px 15px;'
		}).attr('name', 'ok_button').click( function () {
			$("div.uMsgBox").remove();
			if ( blanket ) {
				_this.removeBlanket();
			}
			if ( 'function' == typeof(options.onConfirm) ) {
				options.onConfirm();
			}
		});
		if ( options.anchorClass ) {
			a.addClass(options.anchorClass);
		}
		if ( 'confirm' == actionType ) {
			var cancelBox = $(document.createElement('input')).attr({
				type: 'button',
				value: cancelText,
				'style': 'margin-left:10px;padding: 2px 15px;'
			}).attr('name', 'cancel_button').click( function () {
				if ( closeOnCancel === true ) {
					$("div.uMsgBox").remove();
					if ( blanket ) {
						_this.removeBlanket();
					}
				}
				if ( 'function' == typeof(options.onCancel) ) {
					options.onCancel();
				}
			});
			div.append( $("<div><br /></div>").append(okBox).append(cancelBox) );
		} else {
			div.append( $("<div><br /></div>").append(okBox) );
		}
	}
	_this.appendInMiddle(div, width, zIndex, height);
	div.find('[name=ok_button]').focus();
	if ( true === fadeMe ) {
		div.fadeOut(6000, function () {
			$("div.uMsgBox").remove();
		});
	}
	return div;
}
Utilities.prototype.ucwords = function (str) {
	var _this = this;

	var words = str.split(' ');
	var newStr = '';
	for ( var i = 0; i < words.length; i++ ) {
		var firstChar = words[i].split('')[0];
		var newWord = words[i].replace(/^./, firstChar.toUpperCase());
		newStr += newWord + ' ';
	}
	return $.trim(newStr);
}
Utilities.prototype.buildMySelect = function (json_select, id, iniVal) {
	var _this = this;

	var selectBox = $(document.createElement('select'));
	if ( 'undefined' != typeof(id) ) {
		selectBox.attr({
			'id': id,
			'name': id
		});
	}
	iniVal  = ( 'undefined' != typeof(iniVal) ? '' : iniVal );
	selectBox.addOption('', '-Please Select-');
	for ( var i = 0; i < json_select.length; i++ ) {
		var display = json_select[i].display;
		var value = json_select[i].value;
		selectBox.addOption(value, display, ( value == iniVal ? true : false ));
	}
	return selectBox;
}
Utilities.prototype.remove_row = function (obj) {
	var _this = this;

	var tr = $(obj).parents('tr').get(0);
	$(tr).remove();
}
Utilities.prototype.date_auto_cursor = function (item, e) {
	var _this = this;

	keyCode = e.keyCode;
	var year_reg = new RegExp('.*year.*');
	var day_reg = new RegExp('.*day.*');
	var month_reg = new RegExp('.*month.*');
	if(keyCode != 9 && keyCode != 16 && keyCode != 39){
		var item_length;
		if(year_reg.test(item.name)) {
			item_length = 4;
		}else {
			item_length = 2;
		}
		if(item.value.length == item_length) {
			if( month_reg.test(item.name) ) {
				$('input[name='+item.name.replace('month','day')+']').focus();
			}else if( day_reg.test(item.name) ) {
				$('input[name='+item.name.replace('day','year')+']').focus();
			}
		}
	}
}
Utilities.prototype.getDateVal = function (base_name) {
	var _this = this;

	var year = $('input[name="'+base_name+'_year"]').val();
	var month = $('input[name="'+base_name+'_month"]').val();
	var day = $('input[name="'+base_name+'_day"]').val();
	return year + '-' + month + '-' + day;
}
Utilities.prototype.is_valid_date = function (date_val) {
	var _this = this;

	var date_info = date_val.split('-');
	var year = date_info[0];
	var month = str_pad(date_info[1], 2, '0', 'STR_PAD_LEFT');
	var day = str_pad(date_info[2], 2, '0', 'STR_PAD_LEFT');
	var reg_year = new RegExp(/[0-9]{4}/);
	var reg_month = new RegExp(/0[1-9]|1[012]/);
	var reg_day = new RegExp(/0[1-9]|1[1-9]|2[1-9]|3[01]/);
	return ( reg_year.test(year) && reg_month.test(month) && reg_day.test(day) ? true : false );
}
Utilities.prototype.str_pad = function (input, pad_length, pad_string, pad_type) {
	var _this = this;

	var half = '', pad_to_go;
 
	var str_pad_repeater = function (s, len) {
		var collect = '', i;
		while (collect.length < len) {collect += s;}
		collect = collect.substr(0,len);
		return collect;
	};
 
	input += '';
 
	if (pad_type != 'STR_PAD_LEFT' && pad_type != 'STR_PAD_RIGHT' && pad_type != 'STR_PAD_BOTH') { pad_type = 'STR_PAD_RIGHT'; }
	if ((pad_to_go = pad_length - input.length) > 0) {
		if (pad_type == 'STR_PAD_LEFT') { input = str_pad_repeater(pad_string, pad_to_go) + input; }
		else if (pad_type == 'STR_PAD_RIGHT') { input = input + str_pad_repeater(pad_string, pad_to_go); }
		else if (pad_type == 'STR_PAD_BOTH') {
			half = str_pad_repeater(pad_string, Math.ceil(pad_to_go/2));
			input = half + input + half;
			input = input.substr(0, pad_length);
		}
	}
	return input;
}
Utilities.prototype.get_loader_img = function () {
	var _this = this;

	return $(document.createElement('img')).attr('src', utils.loader);
}
Utilities.prototype.getParams = function(selector, params, options) {
	var _this = this;

	var arrReg = new RegExp(/\[\]/);
	var obj = ( selector instanceof jQuery ? selector : $(selector) );

	obj.find('select, input, textarea').each(function () {
		if ( this.type == 'checkbox' ) {
			if ( this.checked ) {
				params[this.name] = this.value;
			}
		} else if ( arrReg.test(this.name) ) {
			var base_name = this.name.replace('[]','');
			if ( !$.isArray(params[this.name]) ) {
				params[this.name] = new Array();
			}
			params[this.name].push(this.value);
		} else {
			params[this.name] = this.value;
		}

		if ( options && options.mark_empty && '' == this.value ) {
			$(this).parent().css('background-color', 'red');
		} else if ( options && options.mark_empty ) {
			$(this).parent().css('background-color', 'inherit');
		}
	});
	return params;
}
Utilities.prototype.popup = function (msg, options) {
	var _this = this;

	options = typeof options == 'undefined' ? new Object() : options;
	options.fadeOut = options.fadeOut || false;
	options.userActionRequired = options.userActionRequired || true;
	options.blanket = typeof options.blanket != 'undefined' ? options.blanket :  true;
	options.actionType = options.actionType || 'alert';
	options.onConfirm = options.onConfirm || false;
	options.onCancel = options.onCancel || false;
	options.width = options.width || '300';
	options.height = options.height || false;
	options.cancelText = options.cancelText || 'Cancel';
	options.okText = options.okText || 'Ok';
	options.autoCloseBlanket = typeof options.autoCloseBlanket != 'undefined' ? options.autoCloseBlanket :  true;
	options.closeOnCancel = typeof options.closeOnCancel != 'undefined' ? options.closeOnCancel : true;
	options.holderClass = options.holderClass || false;

	return _this.displayMessage(msg, options);
}
Utilities.prototype.moveCursorUpDown = function (e, obj, field_selector, parent_selector, default_function) {
	var _this = this;

	switch ( e.keyCode ) {
		case 40:
			$(obj).parents(parent_selector+':first').next(parent_selector).find(field_selector).get(0).focus();
			break;
		case 38:
			$(obj).parents(parent_selector+':first').prev(parent_selector).find(field_selector).get(0).focus();
			break;
		default: 
			default_function();
	}
	
}

