/*
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.GetElementsByTagNameNotSupported = function( ) {
};

if( typeof max.nonobtrusive == "undefined" ) {
	max.nonobtrusive = function( ) {
	
		var returning = { };

		returning.isSupported = function( ) {
			return document.getElementsByTagName ? true : false;
		};

		returning.getAllChildren = function( parameters ) {
			max.common.checkParameters({
				"parameters.parent": {
						value: parameters.parent,
						type: Object
				}
			});

			return parameters.parent.all ? parameters.parent.all : parameters.parent.getElementsByTagName( "*" );
		};

		// Firefox 3, Safari 3.1, and Opera 9.5 have native support for getElmentsByClassName,
		// So if the native version is available, use it. However, return an array instead of a node list.
		if( document.getElementsByClassName ) {
			returning.getElementsByClassName = function( parameters ) {
				max.common.checkParameters({
					"parameters.parent": {
							value: parameters.parent,
							type: Object
					},
					"parameters.className": {
							value: parameters.className,
							type: String
					}
				});

				var nodes = parameters.parent.getElementsByClassName( parameters.className );
				return max.prototype.getArrayFromNodeList({ nodeList: nodes });
			}
		} else { // There is no native getElementsByName support so implement our own
			returning.getElementsByClassName = function( parameters ) {
				max.common.checkParameters({
					"parameters.parent": {
							value: parameters.parent,
							type: Object
					},
					"parameters.className": {
							value: parameters.className,
							type: String
					}
				});

				// Make sure objects are supported
				if( ! document.getElementsByTagName ) {
					throw new max.exceptions.GetElementsByTagNameNotSupported( );
				}

				var elements = [ ];
				var nodes = max.nonobtrusive.getAllChildren({ "parent": parameters.parent });

				var Length = nodes.length;
				for( var i = 0; i < Length; ++i ) {
					if( max.design.hasClass({ element: nodes[ i ], className: parameters.className }) ) {
						elements.push( nodes[ i ] );
					}
				}

				return elements;
			}
		}

		returning.getElementsBySelector = function( parameters ) {
			max.common.checkParameters({
				"parameters.parent": {
						value: parameters.parent,
						type: Object
				},
				"parameters.selector": {
						value: parameters.selector,
						type: String
				}
			});

			if( ! document.getElementsByTagName ) {
				throw new max.exceptions.GetElementsByTagNameNotSupported( );
			}

			throw new blah;
		}

		returning.getElementsByAttribute = function( parameters ) {
			max.common.checkParameters({
				"parameters.parent": {
						value: parameters.parent,
						type: Object
				},
				"parameters.attribute": {
						value: parameters.attribute,
						type: String
				}
			});

			var Children;
			var Elements = new Array( );

			if( "tagName" in parameters ) {
				max.common.checkParameters({
					"parameters.tagName": {
						value: parameters.tagName,
						type: String
					}
				});

				if( ! document.getElementsByTagName ) {
					throw new max.exceptions.GetElementsByTagNameNotSupported( );
				}

				Children = parameters.parent.getElementsByTagName( parameters.tagName );
			} else {
				Children = max.nonobstrusive.getAllChildren({ "parent": parameters.parent });
			}

			if( "value" in parameters ) {
				max.common.checkParameters({
					"parameters.value": {
						value: parameters.value,
						type: String
					}
				});
			}

			var Length = Children.length;
			for( var i = 0; i < Length; ++i ) {
				var AttributeValue = Child.getAttribute( parameters.attribute );
				if( AttributeValue != null ) {
					if( "value" in parametes && AttributeValue == parameters.value ) {
						Elements.push( Child );
					} else {
						Elements.push( Child );
					}
				}
			}

			return Elements;
		}

		return returning;
	}();
}
