( function ( ) {

	window.onload = function ( ) {
		setupPage();
	}

	function setOpacity ( obj, opacity ) {
		opacity = parseInt ( opacity );
		if ( opacity >= 100 ) opacity = 99.999;
		if ( opacity < 0 ) opacity = 0;

		obj.opacity = opacity;
		obj.style.opacity = opacity / 100;
	}

	function setupPage ( ) {
		var isValidInput = function ( el ) {
			switch ( el.type.toLowerCase() ) {
				case "radio":
					return el.checked ? true : false;
					break;
				default:
					return true;
					break;
			}
		}
		StS.server.submit.prepareAll();
		var form = document.forms[0];
		if ( form ) {
			form.isValid = function ( ) {
				var valid = true;
				for ( input in this.inputs ) {
					if ( !this.inputs[input].isValid() ) {
						valid = false;
						break;
					}
				}
				return valid;
			}
			var noSubmit = true;
			form.inputs = {};
			for ( var i = 0; i < form.elements.length; i ++ ) {
				var element = form.elements[i];
				if ( element.name ) {
					if ( form.inputs[element.name] instanceof Array ) {
						form.inputs[element.name].push ( element );
					} else if ( form.inputs[element.name] !== undefined ) {
						form.inputs[element.name].isValid = null;
						form.inputs[element.name] = [ form.inputs[element.name], element ];
					} else {
						form.inputs[element.name] = element;
					}
					form.inputs[element.name].isValid = function ( ) {
						if ( this instanceof Array ) {
							var valid = false;
							for ( var i = 0; i < this.length; i ++ ) {
								valid = valid || isValidInput ( this[i] );
							}
							return valid;
						} else {
							return isValidInput ( this );
						}
					}
				}
				if ( element.type || ( element.nodeName.toLowerCase() == "textarea" ) || ( element.nodeName.toLowerCase() == "select" ) ) {
					if ( element.type.toLowerCase() == "radio" ) {
						element.onclick = function ( ) {
							if ( form.inputs[this.name] instanceof Array ) {
								for ( var i = 0; i < form.inputs[this.name].length; i ++ ) {
									form.inputs[this.name][i].parentNode.parentNode.className = "";
									form.inputs[this.name][i].checked = false;
								}
							}
							this.checked = true;
							this.parentNode.parentNode.className = "selected";
							form.onsubmit.apply(form);
						}
					} else if ( ( element.type.toLowerCase() != "hidden" ) && ( element.type.toLowerCase() != "submit" ) ) {
						noSubmit = false;
					}
				}
			}
			form.className += ( noSubmit ? " noSubmit" : " submit" );
			var nextTargetId = form.action.toHref().hash.substring(1);
			form.onsubmit = function ( ) {
				if ( this.isValid() ) {
					StS.server.submit ( form, {
						onSuccess : function ( rsp ) {
							if ( redirect = StS.utils.cookies.get("redirect") ) {
								StS.utils.cookies.remove("redirect");
								document.location = redirect;
								return;
							}
							var current = document.getElementById('current');
							current.id = null;
							var tmp = document.createElement('div');
							tmp.style.display = "none";
							document.body.appendChild ( tmp );
							rsp = rsp.response.replace(/<script .*><\/script>/g,'')
								.replace(/id="wrapper"/,'id="new_wrapper"')
								.replace(/<title>.*<\/title>/g,'')
								.replace(/<(link|meta) .*>/g,'');
							var className = rsp.match(/<body [^>]*class="([^"]+)"/);
							//console.log ( className );
							document.body.className = ( className ? className[1] : "" ) + " js";
							tmp.innerHTML = rsp;
							var divs = tmp.getElementsByTagName('div');
							for ( var i = 0, div; div = divs[i]; i ++ ) {
								if ( div.className == current.className ) {
									current.innerHTML = div.innerHTML;
								}
							}
							var latest = document.getElementById('current');
							if ( latest ) {
								var finalise = function ( ) {
									var newForm = tmp.getElementsByTagName('form')[0];
									if ( document.forms.length > 1 ) {
										form.parentNode.insertBefore(newForm,form);
									}
									if ( end = document.getElementById('end') ) {
										form.parentNode.insertBefore(end,form);
									} 
									
									form.parentNode.removeChild ( form );
									tmp.parentNode.removeChild ( tmp );
									return newForm;
								}
								if ( current.nextSibling ) {
									current.parentNode.insertBefore(latest,current.nextSibling);
								} else {
									current.parentNode.appendChild(latest);
								}
								if ( latest.className == current.className ) {
									current.parentNode.removeChild ( current );
									finalise();
									setupPage();
								} else {
									var f = finalise();
									setOpacity ( latest, 0 );
									setOpacity ( f, 0 );
									for ( var i = 1; i <= 10; i ++ ) {
										setTimeout ( ( function ( opacity ) {
											return function ( ) {
												setOpacity ( latest, opacity );
												setOpacity ( f, opacity );
											}
										} )(i*10), i * 100 );
									}
									setTimeout ( setupPage, 1100 );
								}
								var nextTarget = document.getElementById(nextTargetId) || latest;
								var pos = StS.utils.DOM.getPosition ( nextTarget );
								window.scrollTo ( 0, pos.top, true );
							}
						},
						onError : function ( err ) {
							alert ( err.response );
						}
					} );
					form.style.display = "none"; //parentNode.removeChild ( form );
					form.innerHTML = "";
					form.onsubmit = function ( ) { return false; }
				}
				return false;
			}
		}
	}

} )();