/*
max by ProgramMax is licensed under a Creative Commons Attribution 3.0 Unported License:
http://creativecommons.org/licenses/by/3.0/

To learn more visit http://www.programmax.net/projects/max
*/

if( typeof max == "undefined" ) {
	var max = { };
}

if( typeof max.exceptions == "undefined" ) {
	max.exceptions = { };
}

max.exceptions.InvalidArguments = function( parameters ) {
	max.common.checkParameters({
		"parameters.parameterName": {
						value: parameters.parameterName,
						type: String
		},
		"parameters.reasonWhyInvalid": {
						value: parameters.reasonWhyInvalid,
						type: String
		}
	});

	this.getParameterName = function( ) {
		return parameters.parameterName;
	};

	this.getReasonWhyInvalid = function ( ) {
		return parameters.reasonWhyInvalid;
	};
};

if( typeof max.common == "undefined" ) {
	max.common = function( ){

		var returning = { };

		returning.checkParameters = function( parameters ) { /*
			if( typeof arguments == "undefined" ) {
				throw new max.exceptions.InvalidArguments({ "parameterName": "parameters", "reasonWhyInvalid": "The parameter was not specified." });
			}

			for( var parameterName in parameters ) {
				var parameterValueAndType = parameters[ parameterName ];
				if( typeof parameterValueAndType == "undefined" ) {
					throw new max.exceptions.InvalidArguments({ "parameterName": parameterName, "reasonWhyInvalid": "An object containing the parameter and it's type was expected." });
				}

				var parameterValue = parameterValueAndType.value;
				if( typeof parameterValue == "undefined" ) {
					throw new max.exceptions.InvalidArguments({ "parameterName": parameterName, "reasonWhyInvalid": "The parameter was not specified." });
				}

				var parameterType = parameterValueAndType.type;
				if( typeof parameterType == "undefined" ) {
					throw new max.exceptions.InvalidArguments({ "parameterName": parameterName, "reasonWhyInvalid": "The expected type was not specified." });
				}

				if( parameterValue.constructor != parameterType ) {
					if( ! parameterValue instanceof parameterType ) {
						alert( "parameterValue: " + parameterValue +
						"\nparameterType: " + parameterType +
						"\nparameterValue.constructor: " + parameterValue.constructor +
						"\nparameterValue instanceof parameterType: " + ( parameterValue instanceof parameterType ) );
						throw new max.exceptions.InvalidArguments({ "parameterName": parameterName, "reasonWhyInvalid": "The parameter was not of the expected type (or derived from the expected type): " + parameterType + "." });
					}
				}
			} */
		};

		return returning;
	}();
}
