function Methods(){

	/*
	 * Converts a SQL style date to a JavaScript date object
	 */
	this.sqlDateToJS = function(obj) {
		//Common.tracer("Methods.sqlDateToJs", obj);
		
		if(obj == null || obj == undefined || obj._dateStr == "" || obj._dateStr == undefined) return new Date();
		
		var dateArr = obj._dateStr.split("-");
		
		var tempArr = dateArr[2].split(" ");
		
		if(tempArr.length > 1) {
			var timeArr = tempArr[1].split(":");
			
			var date = new Date(dateArr[0], dateArr[1]-1, tempArr[0], timeArr[0], timeArr[1], timeArr[2]);
		} else {
			var date = new Date(dateArr[0], dateArr[1]-1, dateArr[2]);

		}
		
		return date;
	};
	
	
	this.isiPad = function() {
		
		
		if ( (navigator.userAgent.indexOf('iPad') != -1)) {
			return true;
		}  else {
			return false;
		}
	};
	
	/*
	 * Determines if the browser can play .mp4 videos
	 */
	this.canPlayMP4 = function(obj) {
	   var canPlay = false;
	   var v = document.createElement('video');
	   
	   if(v.canPlayType && v.canPlayType('video/mp4; codecs="avc1.42E01E, mp4a.40.2"').replace(/no/, '')) {
	       canPlay = true;
	   }	
	   return canPlay;
	};
	
	this.generateInputPrompts = function(obj) {
		
		//taken from http://kyleschaeffer.com/best-practices/input-prompt-text/
		var classStr = "input-prompt";
		if(obj && obj._classStr != undefined) classStr = obj._classStr;
		
		//first remove any previously generated placeholders
		$('.Common_textInputPlaceholder').remove();
		
		$('input[type=text][title],input[type=password][title],textarea[title]').each(function(i){
			$(this).addClass(classStr+'-' + i);
			var promptSpan = $('<span class="'+classStr+' Common_textInputPlaceholder"/>');
			$(promptSpan).attr('id', classStr+'-' + i);
			$(promptSpan).append($(this).attr('title'));
			$(promptSpan).click(function(){
				$(this).hide();
				$('.' + $(this).attr('id')).focus();
			});
			if($(this).val() != ''){
				$(promptSpan).hide();
			}
			$(this).before(promptSpan);
			$(this).focus(function(){
				$('#'+classStr+'-' + i).hide();
			});
			$(this).blur(function(){
				if($(this).val() == ''){
					$('#'+classStr+'-' + i).show();
				}
			});
		});
	};	
	this.executeEvent = function(obj) {
		
		if(obj._context != undefined) {
			
			var fn = $.proxy(obj._fn, obj._context);
			
			fn(obj._paramsObj);
		} else {			
			obj._fn(obj._paramsObj);
		}
	};
	
	/*
	 * Swaps the depths of the passed in element IDs
	 */
	this.swapDepths = function (obj) {
		Common.tracer("Methods.swapDepths");
	
		//Common.tracer( $("#"+obj._idStr).css("zIndex"),  obj1.style.zIndex, obj2.style.zIndex);
		//$("#"+obj._id2Str).css("zIndex", "33");
		
		var zIndexNum = $("#"+obj._idStr).css("zIndex");
		var z2IndexNum =  $("#"+obj._id2Str).css("zIndex");
		$("#"+obj._idStr).css("zIndex",  z2IndexNum);
		$("#"+obj._id2Str).css("zIndex",  zIndexNum);
	};	
	
	/*
	 * Send an email using standard mailto function
	 */
	this.sendEmail = function(obj){
		//Common.tracer("Methods.sendEmail");
		var emailStr = "";
		var subjectStr = "";
		var bodyStr = "";
		
		if (obj._emailStr != undefined) emailStr = obj._emailStr;
		if (obj._subjectStr != undefined) subjectStr = obj._subjectStr;
		if (obj._bodyStr != undefined) bodyStr = obj._bodyStr;
		
		var mailStr = 'mailto:'+emailStr+'?subject='+subjectStr+'&body='+bodyStr;
		window.open(mailStr);
	};
	
	this.getDropDownIndexFromEvent = function(obj) {
		return obj._eventObj.currentTarget.options[obj._eventObj.currentTarget.selectedIndex].value;	
	};
	
	this.getDropDownLabelFromEvent = function(obj) {
		return obj._eventObj.currentTarget.options[obj._eventObj.currentTarget.selectedIndex].text;	
	};
	
	this.serializeObject = function(obj) {
	    var o = {};
	    var a = $(obj._idStr).serializeArray();
	    $.each(a, function() {
	        if (o[this.name] !== undefined) {
	            if (!o[this.name].push) {
	                o[this.name] = [o[this.name]];
	            }
	            o[this.name].push(this.value || '');
	        } else {
	            o[this.name] = this.value || '';
	        }
	    });
	    return o;
	   // return    $.parseJSON(o);	
	};
	
	/*
	 * Hides an element with id _hiddenIdStr from div with _containerIdStr and displays an activity indicator instead
	 */
	this.displayActivityIndicator = function(obj) {
		//Common.tracer("Common.displayActivityIndicator", obj);
		$("#"+obj._hiddenIdStr).css("display", "none");
		Common.addActivityIndicator( {	_idStr : "#"+obj._containerIdStr});
	};
	this.hideActivityIndicator = function(obj) {
		//Common.tracer("Common.hideActivityIndicator", obj);
		
		$("#"+obj._hiddenIdStr).css("display", "block");
		Common.removeActivityIndicator( {	_idStr : "#"+obj._containerIdStr});
		
	};
	
	
	this.addActivityIndicator = function(obj) {
		$(obj._idStr).append("<div id='"+obj._idStr+"tempActivityIndicator' class='activityIndicator "+obj._idStr.substring(1)+"_tempActivityIndicator'></div>");
	};
	this.removeActivityIndicator = function(obj) {
		$("."+obj._idStr.substring(1)+"_tempActivityIndicator").remove();
	};
	
	
	// ------------------------------------------------------------------------------------------
	// EVENT DISPATCH/LISTENER METHODS
	// ------------------------------------------------------------------------------------------
	
	/*
	 * Adds a listener
	 */
	this.addEventListener = function (obj) {
		//get event defaults
		obj = this.getEventDefaults(obj);
		//Common.tracer(obj);
		
		if(obj._weakBln) {
			$(obj._targetStr).bind(obj._idStr, obj, Methods.eventDispatcher );			
		} else {
			$(obj._targetStr).live(obj._idStr, obj, Methods.eventDispatcher );			
		}
	};
	
	/** Handles all event dispatching - ensures events return a single param/argument 
	 * paramsObj will ONLY be populated if an event was triggered via code and a paramsObj was passed in
	 * */
	this.eventDispatcher = function(obj, paramsObj) {
		//Common.tracer("eventDispatcher", obj);
		
		
		var eventObj;
		if(obj.data._eventObj) {
			
			eventObj = obj.data._eventObj;
			if (paramsObj != undefined) {
				eventObj._paramsObj = paramsObj;
			} else {
				eventObj._paramsObj = {};
			};
			//delete the data, we don't want to save it
			delete obj.data;
			
			eventObj._paramsObj._eventObj = obj;
			
			Methods.executeEvent(eventObj);
		};
	};
	
	this.removeEventListener = function(obj) {
		//get event defaults
		obj = this.getEventDefaults(obj);
		if(obj._weakBln) {
			$(obj._targetStr).unbind(obj._idStr, obj._fn );			
		} else {
			$(obj._targetStr).die(obj._idStr, obj._fn );			
		}
		
	};
	
	this.dispatchDynamicEvent = function(obj) {
		obj = this.getEventDefaults(obj);

		$(obj._targetStr).trigger(obj._idStr, obj._paramsObj);
	};
	
	this.getEventDefaults = function(obj) {
		
		if(obj._targetStr == undefined) obj._targetStr = "body";
		if(obj._weakBln == undefined) obj._weakBln = true;
		
		if(obj._idStr.indexOf(".") == -1) {
			if(obj._targetStr.indexOf(".") == -1) {
				
				obj._idStr += "."+obj._targetStr;
			} else {
				
				obj._idStr += obj._targetStr;
			};
		};
		
		//format the event method by switching it's context
		if(obj._eventObj != undefined) {
			obj._fn = $.proxy(obj._eventObj._fn,  obj._eventObj._context);
		};
		
		return obj;
		
	};
	
	// ------------------------------------------------------------------------------------------
	// SWF EMBED
	// ------------------------------------------------------------------------------------------
	this.embedSWF = function(obj) {
		//var obj = {};
		if(obj._wNum == undefined) obj._wNum = "100%";
		if(obj._hNum == undefined) obj._hNum = "100%";
		if(obj._nameStr == undefined) obj._nameStr = obj._idStr;
		
		var flashVarsObj = {};
		if(obj._flashVarsObj) flashVarsObj = obj._flashVarsObj;
		//Common.tracer(flashVarsObj);
		var paramsObj;
		var attributesObj; 
		
		paramsObj = {
			menu:"false",
			quality:"high",
			bgcolor:"#FFFFFF",
			allowScriptAccess:"always",
			//wmode:"gpu",
			wmode:"opaque",
			scale:"noscale",
			align:"Default"
		};
		
		attributesObj = {
			id: obj._idStr,
			name:obj._nameStr
		};
		
		if (swfobject.hasFlashPlayerVersion("9.0.45")) {
			swfobject.embedSWF(obj._swfStr, obj._idStr, obj._wNum, obj._hNum, "9.0.45", null, flashVarsObj, paramsObj, attributesObj);
			//if (swfmacmousewheel != null) swfmacmousewheel.registerObject(attributesObj.id);
		}
	};
	this.executeOnSWF = function(obj) {
		var swf = document.getElementById(obj._idStr);
		if(swf != null) {
			var result = swf[obj._methodStr]();
			return result;
		}
		return false;
	};
	// ------------------------------------------------------------------------------------------
	// SCORCH METHODS
	// ------------------------------------------------------------------------------------------
	this.scorch = function(obj) {
		//Common.tracer("Common.scorch");
		//Common.tracer(obj);
		if(obj == undefined) return;
		// accepts an object and destroys it to the best of its ability. // can be used for objects, arrays, display objects and classes.
		// if this is a class, destroy it immediately and stop action.
		if (obj.destroy!=undefined){
			obj.destroy();
		}
		
		// else, this is a generic object or array. send through scorchedEarth to clear props.
		else {
			for (var prop in obj) {
				Methods.scorchedEarth({_scopeObj:obj, _propStr:prop});
			}
		}
	};
	
	this.scorchedEarth = function(obj){
		var scopeObj=obj._scopeObj;
		//Common.tracer('scorched earth');
		
		if (typeof(scopeObj[obj._propStr]) == 'object') {
			
			// Destroy a class
			if (scopeObj[obj._propStr] != null && scopeObj[obj._propStr].destroy!=undefined){
				//Common.tracer("call destroy");
				scopeObj[obj._propStr].destroy();
			} else {
				
				// Destroy generic object or array
				this.destroyObject(scopeObj[obj._propStr]);
			};
		} 
		
		// finish off
		scopeObj[obj._propStr]=null;
		
	};
	
	this.destroyObject = function(obj){
		//Common.tracer('destroyObject');
		
		for(var i in obj){
			//Common.tracer('destroyChildObj');
			if (obj[i]!=null && obj[i]!=undefined) this.scorchedEarth({_propStr:i, _scopeObj:obj});
		}
		
	};
	
}

var Methods = new Methods();
