﻿String.prototype.parseURLQuery = String.prototype.parseURLQuery || function () {
	var opt = new Object();
	if( this != '' && this != null && this != undefined && this != 'undefined' )
	{
		var strObj = new String( this ).trim().replace( "\&amp;", "\&" ).split( "&" );
		for( var i=0; i<strObj.length; i++ )
		{
			var tmp = strObj[i].split( "=" );
			opt[tmp[0]] = tmp[1];
		}
	}
	
	opt.getOpt = function ( name ) {
		for( t_name in this )
		{
			if( t_name == name )
				return this[name];
		}
		return false;
	}
	
	return opt;
};

var autoFormAt = new Class({
	initialize: function () {
		this.forms = new Array();
		$ES('form').each( function ( obj ) {
			opts = String( obj.getProperty('title')).parseURLQuery();
			if( opts.getOpt( 'formAt' ) == 'on' )
				this.forms.push( new formAt( obj ) );
		}, this );
	}
});

var formAt = new Class({

	initialize: function ( formObj ) {
		this.textFields = new Array();
		this.radioBoxes = new Array();
		this.buttons = new Array();
		this.selects = new Array();
		this.optionHolders = new Array();
		this.formObj = $(formObj);
		
		this.formObj.cleanUp = true;
		
		var inputs = $ES( 'input', this.formObj );
		var selects = $ES( 'select', this.formObj );
		var textAreas = $ES('textarea', this.formObj );
		
		inputs.each(function(obj){
			var opts = String( $(obj).getProperty( 'title' ) ).trim();
			//$(obj).removeAttribute( 'title' );
			if( opts != '' && opts != false )
				opts = opts.parseURLQuery();
			switch( obj.type )
			{
				case 'password':
				case 'text':
					this.addTextField( obj, opts );
					break;
				case 'radio':
					this.addRadioboxField( obj, opts );
					break;
				case 'button':
				case 'reset':
				case 'submit':
					this.addButtonField( obj, opts );
					break;
			}
		}, this);
		
		selects.each( function ( obj ) {
			var opts = String( $(obj).getProperty( 'title' ) ).trim();
			//$(obj).removeAttribute( 'title' );
			if( opts != '' && opts != false )
				opts = opts.parseURLQuery();
			this.addSelectField( obj, opts );
		}, this );
		
		window.addEvent( 'click', this.hideAllOptions.bindAsEventListener(this));
		
		if( $chk( window.__auto_object_loader ) )
			window.__auto_object_loader.next();
	},
	
	addTextField: function ( obj, opts ) {
		this.textFields.push( obj );
	},
	
	addButtonField: function ( obj, opts ) {
		var buttonHolder = new Element('div').setProperty('class', 'button_holder').injectBefore(obj);
		new Element('div').setProperty('class', 'button_tl').injectInside(buttonHolder);
		new Element('div').setProperty('class', 'button_t').injectInside(buttonHolder);
		new Element('div').setProperty('class', 'button_tr').injectInside(buttonHolder);
		new Element('div').setProperty('class', 'clear').injectInside(buttonHolder);
		new Element('div').setProperty('class', 'button_ml').injectInside(buttonHolder);
		var buttonM = new Element('div').setProperty('class', 'button_m').injectInside(buttonHolder);
		obj.setProperty('class', 'button').injectInside(buttonM);
		new Element('div').setProperty('class', 'button_mr').injectInside(buttonHolder);
		new Element('div').setProperty('class', 'clear').injectInside(buttonHolder);
		new Element('div').setProperty('class', 'button_bl').injectInside(buttonHolder);
		new Element('div').setProperty('class', 'button_b').injectInside(buttonHolder);
		new Element('div').setProperty('class', 'button_br').injectInside(buttonHolder);
		new Element('div').setProperty('class', 'clear').injectInside(buttonHolder);
		
		obj.addEvent( 'click', function () {
				var t_name = this.name;
				this.name += "_clicked";
				var form = this.parentNode;
				if( window.ie )
					var newI = new Element( '<input type="hidden" name="'+t_name+'" />' ).injectInside( form );
				else
					var newI = new Element( 'input' ).setProperties( { type: "hidden", name: t_name } ).injectInside( form );
				newI.value = this.value;
		}.bindAsEventListener( obj ) );
		
		this.buttons.push( obj );
	},
	
	addSelectField: function ( obj, opts ) {
		var selectHolder = new Element('div').setProperty('class', 'select_holder').injectBefore(obj);
		new Element('div').setProperty('class', 'select_tl').injectInside(selectHolder);
		new Element('div').setProperty('class', 'select_t').injectInside(selectHolder);
		new Element('div').setProperty('class', 'select_drop_tl').injectInside(selectHolder);
		new Element('div').setProperty('class', 'select_drop_t').injectInside(selectHolder);
		new Element('div').setProperty('class', 'select_drop_tr').injectInside(selectHolder);
		new Element('div').setProperty('class', 'clear').	injectInside(selectHolder);
		new Element('div').setProperty('class', 'select_ml').injectInside(selectHolder);
		var selectM = new Element('div').setProperty('class', 'select_m').injectInside(selectHolder);
		this.actSelectArea = selectM;
		new Element('div').setProperty('class', 'select_drop_ml').injectInside(selectHolder);
		var btt = new Element('div').setProperty('class', 'select_drop_m').injectInside(selectHolder);
		new Element('div').setProperty('class', 'select_drop_mr').injectInside(selectHolder);
		new Element('div').setProperty('class', 'clear').injectInside(selectHolder);
		new Element('div').setProperty('class', 'select_bl').injectInside(selectHolder);
		new Element('div').setProperty('class', 'select_b').injectInside(selectHolder);
		new Element('div').setProperty('class', 'select_drop_bl').injectInside(selectHolder);
		new Element('div').setProperty('class', 'select_drop_b').injectInside(selectHolder);
		var selectDropBR = new Element('div').setProperty('class', 'select_drop_br').injectInside(selectHolder);
		var clear = new Element('div').setProperty('class', 'clear').injectInside(selectHolder);
		var optionHolder = new Element('div').setProperties({'id': 'select', 'class': 'option_holder'}).injectAfter(clear);
		btt.onclick = this.dropdown.bindAsEventListener( this, optionHolder );
		var OptionL = new Element('div').setProperty('class', 'option_l').injectInside(optionHolder);
		var OptionR = new Element('div').setProperty('class', 'option_r').injectInside(OptionL);
		var OptionC = new Element('div').setProperty('class', 'option_m').injectInside(OptionR);
		var ul = new Element('ul').injectInside(OptionC);
		var clearB = new Element('div').setProperty('class', 'clear').injectInside(optionHolder);
		new Element('div').setProperty('class', 'option_bl').injectInside(optionHolder);
		new Element('div').setProperty('class', 'option_b').injectInside(optionHolder);
		var optionBR = new Element('div').setProperty('class', 'option_br').injectInside(optionHolder);
		new Element('div').setProperty('class', 'clear').injectAfter(optionBR);
		
		var options = $$(obj.childNodes);
		var defaultValue = '';
		for( var i=0; i<options.length; i++ ) {
			if(i == 0)
			{
				this.actSelectArea.setHTML(options[i].innerHTML);
				defaultValue = options[i].value;
			}
			else {
				var opt = new Element('li').setHTML(options[i].innerHTML).injectInside(ul);
				opt.addEvent( 'mouseover', function ( event ) { event = new Event(event); event.target.addClass( 'li_hover' ); } );
				opt.addEvent( 'mouseout', function ( event ) { event = new Event(event); event.target.removeClass( 'li_hover' ); } );
				opt.nf_value = options[i].value;
				opt.targetHTML = this.actSelectArea;
				if( options[i].selected )
				{
					opt.targetHTML.setHTML( options[i].innerHTML );
					defaultValue = options[i].value;
				}
				if( $type( obj.onchange ) == 'function' )
					var fn = obj.onchange;
				else
					var fn = null;
				opt.onclick = function( event, name, fn ) {
					event = new Event(event);
					var t = '';
					for( i=0; i<this.formObj.elements.length; i++ )
						t += this.formObj.elements[i].name + "\n";
					this.formObj.elements[name].value = event.target.nf_value;
					event.target.targetHTML.setHTML(event.target.innerHTML);
					this.hideAllOptions(event);
					if( fn != null )
						fn();
				}.bindAsEventListener(this, [obj.name,fn]);
			}
		}

		optionHolder.setStyle( 'width', OptionL.getCoordinates().width+'px' );
		optionHolder.originalHeight = optionHolder.getCoordinates().height;
		optionHolder.setStyle( 'height', '0px' );
		optionHolder.opened = false;
		this.optionHolders.push( optionHolder );
		
		var t_name = obj.name;
		var t_id = obj.id;
		var p = $(obj.parentNode);
		var t_title = obj.getProperty( 'title' );
		if( window.ie )
			var newI = new Element( '<input type="hidden" name="'+t_name+'" id="'+t_id+'" title="'+t_title+'" />' ).injectInside( p );
		else
			var newI = new Element( 'input' ).setProperties( { type: "hidden", name: t_name, id: t_id, title: t_title } ).injectInside( p );
		p.replaceChild( newI, obj );
		newI.value = defaultValue;
	},
	
	addTextareaField: function ( obj, opts ) {
		var textHolder = new Element('div').setProperty('class', 'input_holder').injectBefore(obj);
		new Element('div').setProperty('class', 'text_tl').injectInside(textHolder);
		new Element('div').setProperty('class', 'text_t').injectInside(textHolder);
		new Element('div').setProperty('class', 'text_tr').injectInside(textHolder);
		new Element('div').setProperty('class', 'clear').injectInside(textHolder);
		new Element('div').setProperty('class', 'text_ml').injectInside(textHolder);
		var textM = new Element('div').setProperty('class', 'text_m').injectInside(textHolder);
		obj.injectInside(textM);
		new Element('div').setProperty('class', 'text_mr').injectInside(textHolder);
		new Element('div').setProperty('class', 'clear').injectInside(textHolder);
		new Element('div').setProperty('class', 'text_bl').injectInside(textHolder);
		new Element('div').setProperty('class', 'text_b').injectInside(textHolder);
		new Element('div').setProperty('class', 'text_br').injectInside(textHolder);
		new Element('div').setProperty('class', 'clear').injectInside(textHolder);
		
		this.textAreas.push( obj );
	},
	
	dropdown: function(event, obj){
		event = new Event(event);
		var myEffectsIn = new Fx.Style(obj, 'height', {duration: 500, transition: Fx.Transitions.bounceOut});
		var myEffectsOut = new Fx.Style(obj, 'height', {duration: 500, transition: Fx.Transitions.bounceOut});
		if( obj.opened == false )
			myEffectsIn.start(0, obj.originalHeight);
		else
			myEffectsOut.start(obj.originalHeight, 0);
		obj.opened = !obj.opened;
		event.stop();
	},
		
	hideAllOptions: function(event){
		this.optionHolders.each(function(obj){
			var myEffects2 = new Fx.Style(obj, 'height', {duration: 500, transition: Fx.Transitions.bounceOut});
			if(obj.opened == true)
				myEffects2.start(obj.originalHeight, 0);
			obj.opened = false;
		}, this );
	}
});

if( !$chk(window.__auto_object_loader) )
	window.__auto_object_loader = new AutoLoader();

window.__auto_object_loader.add( function() {
		var __auto__formAt = new autoFormAt();
} );
