﻿/*
 * Summary:
 * Adds a shortcut to automatically fill in all formfields with test data
 * 
 * Dependencies:
 * - Estate.Core
 * - Estate.Develop.Core
 * - /css/develop.css
 * 
 * Requirements:
 * 
 * Usage:
 * Estate.Events.AddEvent( window, Estate.Develop.FormTester.Init, "onload")
 *
 */

Estate.Develop.FormTester = ( function() {
	/* START PRIVATE */
	var ShortTestString = '#REPLACE# é الْعَرَبيّة汉语/漢語';
	var LongTestString = "#REPLACE# é. Lorem ipsum dolor sit amet, consectetuer adipiscing elit."+
						 "Curabitur leo. <` \r\n\r\n"+
						 "Nullam nisi turpis, semper nec, dapibus quis, vestibulum ac, ipsum."+
						 "Vestibulum eleifend dignissim tortor. Nunc elementum tortor condimentum diam."+
						 "Duis in quam et lectus tempor elementum. Etiam tortor justo, sodales ut, blandit"+
						 "vel, convallis ac, turpis. Nulla lacus orci, bibendum ac, ultricies vitae,"+
						 "pulvinar in, eros. Pellentesque molestie. Vestibulum ante ipsum primis in"+
						 "faucibus orci luctus et ultrices posuere cubilia Curae; Fusce eu turpis id arcu"+
						 "pharetra vehicula. Mauris feugiat malesuada erat. Donec in sapien. Donec lorem"+
						 "metus, sagittis non, egestas sed, fermentum sit amet, sem. Cras et massa. Ut"+
						 "condimentum adipiscing ipsum. Ut eu justo. Nullam eu turpis nec lorem aliquet"+
						 "dapibus. Morbi elementum viverra odio. Donec est turpis, porttitor in, varius"+
						 "at, dapibus ac, velit. `é";
	var ShortTestStringStrict = 'éالْعَرَبيّة汉语/漢語 #REPLACE# </span></div></td> <`" \' OR \'1\'=\'1 <script>var alrt; if (typeof(alrt) == "undefined") { alert("javascript injection"); alrt = 1 }</script>';
	var LongTestStringStrict = "é. Lorem ipsum dolor sit amet, consectetuer adipiscing elit."+
						 "Curabitur leo. </span></div></td> <`\" \r\n\r\n"+
						 "Nullam nisi turpis, semper nec, dapibus quis, vestibulum ac, ipsum."+
						 "Vestibulum eleifend dignissim tortor. Nunc elementum tortor condimentum diam."+
						 "Duis in quam et lectus tempor elementum. Etiam tortor justo, sodales ut, blandit"+
						 "vel, convallis ac, turpis. Nulla lacus orci, bibendum ac, ultricies vitae,"+
						 "pulvinar in, eros. Pellentesque molestie. Vestibulum ante ipsum primis in"+
						 "faucibus orci luctus et ultrices posuere cubilia Curae; Fusce eu turpis id arcu"+
						 "pharetra vehicula. Mauris feugiat malesuada erat. Donec in sapien. Donec lorem"+
						 "metus, sagittis non, egestas sed, fermentum sit amet, sem. Cras et massa. Ut"+
						 "condimentum adipiscing ipsum. Ut eu justo. Nullam eu turpis nec lorem aliquet"+
						 "dapibus. Morbi elementum viverra odio. Donec est turpis, porttitor in, varius"+
						 "at, dapibus ac, velit. `é' OR '1'='1 <script>var alrt; if (typeof(alrt) == 'undefined') { alert('javascript injection'); alrt = 1 }</script>";
	var FormTesterLinkId = "FormTester_Link";
	var FormTesterLinkHTML = "TEST<br />FORM";
	var RadioNamesCollection = new Array()
	


	function FillText( Element ) {
		var error 
		error = Estate.Check.Element( Element );
		
		
		if ( error == "" ) {
			try {
				Element.value = ShortTestString.replace("#REPLACE#", Element.name)
			}
			catch (e) {
				//
			}
		}
	}

	function FillTextarea( Element ) {
		var error 
		error = Estate.Check.Element( Element );
		
		
		if ( error == "" ) {
			try {
				if (document.all) {
					Element.innerText = LongTestString.replace("#REPLACE#", Element.name)
				} else {
					Element.innerHTML = LongTestString.replace("#REPLACE#", Element.name)
				}
			}
			catch (e) {
				//
			}
		}
	}

	function GetRadioNames( Element, NewRadioNamesCollection ) {
		var error 
		error = Estate.Check.Element( Element );
		
		
		if ( error == "" ) {
			try {
				var radioNameFound = false
				
				for ( var i=0; i < NewRadioNamesCollection.length; i++ ) {
					if ( NewRadioNamesCollection[i] == Element.name ) {
						radioNameFound = true
					}
				}
				
				if ( Element.name != "" ) {
					if ( radioNameFound == false ) {
						NewRadioNamesCollection.push( Element.name )
					}
				}
				return NewRadioNamesCollection
			}
			catch (e) {
				//
			}
		}
	}

	function FillRadioByName( lRadioNamesCollection ) {
		var error 
		error = Estate.Check.VariableType( lRadioNamesCollection, "object" );
		if ( error != "" ) throw new Error( error );
		
		
		try {
			var RadioGroupCollection = new Array
			var randomElement
			
			for ( var i=0; i < lRadioNamesCollection.length; i++ ) {
				RadioGroupCollection = document.getElementsByName( lRadioNamesCollection[i] )
				
				randomElement = Math.round( Math.random() * ( RadioGroupCollection.length - 1 ) )
				RadioGroupCollection[randomElement].checked = true
			}
		}
		catch (e) {
			//
		}
	}

	function FillCheckBox( Element ) {
		var error 
		error = Estate.Check.Element( Element );
		
		
		if ( error == "" ) {
			try {
				var randomChecked = Math.round( Math.random() )

				if ( randomChecked == 0 ) {
					Element.checked = ""
				} else {
					Element.checked = "checked"
				}
			}
			catch (e) {
				//
			}
		}
	}

	function FillSelect( Element ) {
		var error 
		error = Estate.Check.Element( Element );
		
		
		if ( error == "" ) {
			try {
				var randomOption = Math.floor( Math.random() * ( Element.length - 1 ) )
				
				if ( randomOption == 0 && Element.length > 1 && Element.options[0].value == "" ) {
					randomOption = 1
				}
				
				Element.options[randomOption].selected = true
			}
			catch (e) {
				//
			}
		}
	}

	function PlaceFormTesterHTML() {
		Estate.Develop.TesterButtonHolder.Add()
		var TesterButtonHolderElement = Estate.Develop.TesterButtonHolder.GetTesterButtonHolderElement()

		var FormTestLink = document.createElement("div")
		FormTestLink.id = FormTesterLinkId
		FormTestLink.title = "Click here or Press '=' to fill the form fields."
		FormTestLink.innerHTML = FormTesterLinkHTML
		TesterButtonHolderElement.appendChild(FormTestLink)
	}
	/* END PRIVATE */
	
	
	
	/* START PUBLIC */
	return {
		Init: function( e ) {
			PlaceFormTesterHTML()
			Estate.Events.AddEvent( document.getElementById( FormTesterLinkId ), Estate.Develop.FormTester.AddDataToFormFields, "onclick")
			Estate.Events.AddEvent( document, 
									function(e) { var KeyID = (window.event) ? event.keyCode : e.which;
												  Estate.Develop.FormTester.KeyPressEvent( KeyID )
												},
									"onkeypress")
		},

		KeyPressEvent: function( KeyID ) {
			var error 
			error = Estate.Check.ArgumentsCount( arguments.length, 1 );
			if ( error != "" ) throw new Error( error );
			error = Estate.Check.VariableType( KeyID, "number" );
			if ( error != "" ) throw new Error( error );
			
			
			if ( KeyID == 61 ) {
				Estate.Develop.FormTester.AddDataToFormFields()
			}
		},

		AddDataToFormFields: function() {
			var FormFieldsCollection = document.getElementsByTagName( 'input' )
			for ( var i=0; i < FormFieldsCollection.length; i++ ) {
				switch(FormFieldsCollection[i].type) {
					case "text":
						FillText( FormFieldsCollection[i] )
						break;
					case "password":
						FillText( FormFieldsCollection[i] )
						break;
					case "radio":
						RadioNamesCollection = GetRadioNames( FormFieldsCollection[i], RadioNamesCollection )
						break;
					case "checkbox":
						FillCheckBox( FormFieldsCollection[i] )
						break;
				}
			}
			FillRadioByName( RadioNamesCollection )
			
			var FormFieldsCollection = document.getElementsByTagName( 'select' )
			for ( var i=0; i < FormFieldsCollection.length; i++ ) {
				FillSelect( FormFieldsCollection[i] )
			}

			var FormFieldsCollection = document.getElementsByTagName( 'textarea' )
			for ( var i=0; i < FormFieldsCollection.length; i++ ) {
				FillTextarea( FormFieldsCollection[i] )
			}
		}
	};
	/* END PUBLIC */
})();

