/*
* ww.utilities.js
*
*/

// usage: log('inside coolFunc',this,arguments);
// http://paulirish.com/2009/log-a-lightweight-wrapper-for-consolelog/
window.log = function(){
  log.history = log.history || [];   
  log.history.push(arguments);
  if(this.console){
    console.log( Array.prototype.slice.call(arguments) );
  }
};
(function(doc){
  var write = doc.write;
  doc.write = function(q){ 
    log('document.write(): ',arguments); 
    if (/docwriteregexwhitelist/.test(q)) write.apply(doc,arguments);  
  };
})(document);



var Utilities = (function() {
	//Private members
	var _log = "";
	var _logerrors = "";
	
	//Priveleged members
	var self = {
		"values": {
			"isPresent": function(element) {
				return typeof element !== "undefined" && element !== null && element !== "";
			}
		},
		"message": {
			"alert": function(output) {
				if( self.values.isPresent(output) ) {
					switch (typeof output) {
						case "string":
							_log += output;
							break;
						case "object":
							for (alertitem in output) {
								_log += alertitem + ": " + output[alertitem] + "\n";
							}
							break;
					}
					alert(_log);
					//Reset the message log
					_log = "";
				}
			},
			"display": function(displayTitle, output) {
				if ( self.values.isPresent(displayTitle) && self.values.isPresent(output) ) {
					switch (typeof output) {
						case "string":
							_log += output;
							break;
						case "object":
							for (displayitem in output){
								_log += displayitem + ": " + output[displayitem] + "<br/>";
							}
							break;
					}
					$("#dialog-message").remove();
					var dialog = $("<div>" + _log + "</div>");
					$(dialog).attr("id","dialog-message");
					$(dialog).attr("title",displayTitle);
					$("body").append(dialog);
					$("#dialog-message").dialog({
						modal: true,
						width: 500,
						buttons: {
							OK: function() {
								$(this).dialog('close');
							}
						}
					});
					//Reset the message log
					_log = "";
				}
			},
			"error": function(type, output) {
				if( self.values.isPresent(output) ) {
					var returnChar = "\n";
					if (type === "display") {
						returnChar = "<br/>";
					}
					switch (typeof output) {
						case "string":
							_logerrors += output;
							break;
						case "object":
							for (erroritem in output) {
								_logerrors += erroritem + ": " + output[erroritem] + returnChar;
							}
							break;
						default:
							break;
					}
					switch (type) {
						case "alert":
							self.message.alert("Please correct the following errors:\n" + _logerrors);
							break;
						case "display":
							self.message.display("Please correct the following errors:", _logerrors);
							break;
						default:
							break;
					}
					//Reset the error log
					_logerrors = "";
				}
			},
			"console": function(output) {
				if( self.values.isPresent(window.console) && self.values.isPresent(output) ) {
					switch (typeof output) {
						case "string":
							_log += output;
							break;
						case "object":
							for (item in output) {
								_log += item + ": " + output[item] + "\n";
							}
							break;
					}
					console.log(_log);
					//Reset the error log
					_log = "";
				}
			}
		},
		"forms": {
			//Validate the value of the input fields
			"isValid": function($elem, value, type) {
				if ( !self.values.isPresent(value) ) {
					return false;
				}
				var charpos;	
				switch (type) {
					case "checked":
						charpos = ($elem.attr('checked') == true) ? -1 : 0;
						break;
					case "alphanumeric":
						charpos = value.search("[^A-Za-z0-9\-.' ]");
						break;
					case "alpha":
						charpos = value.search("[^A-Za-z' ]");
						break;
					case "numeric":
						charpos = value.search("[^0-9']");
						break; 
					case "email":
						if ( /^\w+([\.-]?\w+)*@\w+([\.-]?\w+)*(\.\w{2,3})+$/.test(value) ) {
							charpos = -1;
						}
						break;
					case "notempty":
						if ( !self.values.isPresent(value) || value === "---" ) {
							charpos = -1;
						}
						break;
					default:
						return false;
				}
				if (charpos >= 0) {
					return false;
				}
				return true;
			},
			"validateAndSendForm": function(FormElements) {
				//reset error message if form re-submitted
				var Errors = {};
				var ErrorsFiltered = {};
				var hasErrors = false;
				for (var element in FormElements) {
					var $elem = $(FormElements[element].id);
					
					if ($elem.attr('type') === 'radio' && FormElements[element].type === 'checked') {
						if ($('[name=' + FormElements[element].name + ']:checked').length <= 0) {
								$elem.addClass(FormElements[element].errorClass);
								Errors[FormElements[element].name] = FormElements[element].message;
						} else {
								$elem.removeClass(FormElements[element].errorClass);
								Errors[FormElements[element].name] = null;
						}
					} else {
						if ( !self.forms.isValid( $elem, $elem.val(), FormElements[element].type ) ) {
							$elem.addClass(FormElements[element].errorClass );
							Errors[FormElements[element].name] = FormElements[element].message;
						}
						else {
							$elem.removeClass(FormElements[element].errorClass );
							Errors[FormElements[element].name] = null;
						}
					}
				}
				for (var error in Errors) {
					if (Errors[error] !== null){
						hasErrors = true;
						ErrorsFiltered[error] = Errors[error];
					}
				}
				if (hasErrors === true){
					self.message.error("display", ErrorsFiltered);
					return false;
				}
				return true;
			}
		}
	};
	return self;

})();
