var consOpenSignupClass2 = Class.create();
var consSignupInstanceList = new Array();

consOpenSignupClass2.prototype = {
	Version: "2.1.1",
	Request: function(handler,url,params,method){
		var obj = new Ajax.Request(url,{
			method: method,
			scope: this,
			parameters: params,
			onComplete: handler
		});
	},

	Reset: function(){
		this.Display("kill");
		Event.stopObserving($$("body")[0], 'click');
		this.successElement.remove();
		this.FormInstanceID.style.display = "block";
		this.FormTitleID.style.display = "block";
	},

	Display: function(killflag){
		var config = this.config;
		var formdata = this.formdata;
		var _disp = this.WidgetInstanceID.style.display;
		var _newdisp = "";
		var _duration = 1.0;
		(_disp != "none") ? _newdisp = "none" : _newdisp = "block";
		$$('.'+this.configID).each(function(instanceObj) {
			instanceObj.style.display = "none";
			$$('.consOpenSignupOverlayClass').each(function(el){
				el.visualEffect('Opacity',{to:1.0,duration:0.0})
			});
		});

		if(killflag == "kill"){
			this.WidgetInstanceID.style.display = "none";
		}else{
			this.Dimmer();
			if(_newdisp == "block"){
//				new Effect.Appear(this.WidgetInstanceID,{ delay: 0.0, duration: _duration});
				this.WidgetInstanceID.style.display = _newdisp;
			}
			else if(_newdisp == "none"){
//				new Effect.Fade(this.WidgetInstanceID,{ delay: 0.0, duration: _duration});
				this.WidgetInstanceID.style.display = _newdisp;
			}
			else{
				this.WidgetInstanceID.style.display = _newdisp;
			}
		}
	},

	Dimmer: function(){
		var _isIE = /MSIE (\d+\.\d+);/.test(navigator.userAgent);
		var config = this.config;
		var formdata = this.formdata;
		var _setOpacityTo = 1.0;
		var _duration = 0.0;

		if(this.isactive){ _setOpacityTo = 1.0; }
		else{ _setOpacityTo = 0.25; }

		this.overlay.visualEffect('Opacity',{to:_setOpacityTo,duration:_duration});
//		$(this.WidgetInstanceID).visualEffect('Opacity',{to:_setOpacityTo,duration:_duration});

		this.isactive?this.isactive=false:this.isactive=true;
	},


	UI: function(){
		var config = this.config;
		var formdata = this.formdata;
		var widgets = {
			"WidgetConfigID": formdata.configID,
			"WidgetContainerElement": formdata.container.element,
			"WidgetContainerClass": formdata.container.cssclass,
			"WidgetContainerID": formdata.container.id + "_" + config.instance,
			"ResultSuccessElement": formdata.success_container.element,
			"ResultSuccessClass": formdata.success_container.cssclass,
			"ResultSuccessID": formdata.success_container.id + "_" + config.instance,
			"ResultFailureElement": formdata.failure_container.element,
			"ResultFailureClass": formdata.failure_container.cssclass,
			"ResultFailureID": formdata.failure_container.id + "_" + config.instance,
			"FormTitle": config.title,
			"FormTitleID": formdata.form.id + "_title_" + config.instance,
			"FormTitleClass": formdata.titleclass,
			"FormName": formdata.form.name + "_" + config.instance,
			"FormID": formdata.form.id + "_" + config.instance,
			"FormAction": formdata.form.action,
			"FormMethod": formdata.form.method,
			"FormClass": formdata.form.cssclass
		};

		var formtpl =		'<#{WidgetContainerElement} id="#{WidgetContainerID}" class="#{WidgetContainerClass} #{WidgetConfigID}">' + '<#{ResultSuccessElement} id="#{ResultSuccessID}" class="#{ResultSuccessClass}"></#{ResultSuccessElement}>';
				formtpl +=	'<#{ResultFailureElement} id="#{ResultFailureID}" class="#{ResultFailureClass}"></#{ResultFailureElement}>';
				formtpl +=	'<div id="#{FormTitleID}" class="#{FormTitleClass}">#{FormTitle} - (<a href="javascript:void(0);" onclick="' + config.instance + '.Display();" id="consOpenSignupCloser_' + config.instance + '">close</a>)</div>';
				formtpl +=	'<form name="#{FormName}" id="#{FormID}" action="#{FormAction}" method="#{FormMethod}" class="#{FormClass}" onsubmit="return false;">';
				formtpl +=	'<div id="#{FormID}_div" class="#{FormClass}_div">';

		var formFields = "";
		var cssaltrow = "";
		for(var i=0; i<formdata.form.fields.length; i++){
			var _thisField = formdata.form.fields[i];
			var thisFormFieldWidgets = {
				"FormFieldElement":_thisField.element,
				"FormFieldLabel":_thisField.label,
				"FormFieldType":_thisField.type,
				"FormFieldName":_thisField.name,
				"FormFieldID":_thisField.id+ "_" + config.instance,
				"FormFieldValue":_thisField.value,
				"FormFieldClass":_thisField.cssclass,
				"FormFieldCaption":_thisField.caption,
				"FormFieldFlag":_thisField.flag,
				"FormFieldSelectOptions":_thisField.selectdata,
				"FormFieldContainerElement":_thisField.container_element,
				"FormFieldContainerClass":_thisField.container_class,
				"FormFieldContainerID":_thisField.container_id+ "_" + config.instance
			};

			var isRequired = "";
			if(_thisField.required == "t"){
				isRequired = " required";
			}

			var formfieldtpl = "";
			if(_thisField.type == "hidden"){
				formfieldtpl = '<#{FormFieldElement} type="#{FormFieldType}" name="#{FormFieldName}" id="#{FormFieldID}" class="#{FormFieldClass}" value="#{FormFieldValue}" />';
			}
			else if(_thisField.type == "text"){
				formfieldtpl = '<#{FormFieldContainerElement} id="#{FormFieldContainerID}_block" class="#{FormFieldContainerClass}_block"><#{FormFieldContainerElement} id="#{FormFieldContainerID}_label" class="#{FormFieldContainerClass}_label"><label for="#{FormFieldID}">#{FormFieldLabel}</label></#{FormFieldContainerElement}><#{FormFieldContainerElement} id="#{FormFieldContainerID}" class="#{FormFieldContainerClass}"><#{FormFieldElement} type="#{FormFieldType}" name="#{FormFieldName}" id="#{FormFieldID}" class="#{FormFieldClass}'+isRequired+'" value="#{FormFieldValue}" /></#{FormFieldContainerElement}></#{FormFieldContainerElement}>';
			}
			else if(_thisField.type == "textarea"){
				formfieldtpl = '<#{FormFieldContainerElement} id="#{FormFieldContainerID}_block" class="#{FormFieldContainerClass}_block"><#{FormFieldContainerElement} id="#{FormFieldContainerID}_label" class="#{FormFieldContainerClass}_label"><label for="#{FormFieldID}">#{FormFieldLabel}</label></#{FormFieldContainerElement}><#{FormFieldContainerElement} id="#{FormFieldContainerID}" class="#{FormFieldContainerClass}"><#{FormFieldElement} type="#{FormFieldType}" name="#{FormFieldName}" id="#{FormFieldID}" class="#{FormFieldClass}'+isRequired+'" value="#{FormFieldValue}" wrap="virtual"></#{FormFieldElement}></#{FormFieldContainerElement}></#{FormFieldContainerElement}>';
			}
			else if(_thisField.type == "checkbox"){
				var checkedvalue = "";
				var onclickscript = "";
				if(_thisField.flag == "checked"){ checkedvalue = 'checked="checked" '; }
				if(_thisField.name == "accepts_email"){
					onclickscript = " onclick=\"document.getElementById('email.accepts_email_" + config.instance + "').value = (this.checked)?'true':'false'\"";
				}
				formfieldtpl = '<#{FormFieldContainerElement} id="#{FormFieldContainerID}_block" class="#{FormFieldContainerClass}_block"><#{FormFieldContainerElement} id="#{FormFieldContainerID}_label" class="#{FormFieldContainerClass}_label"><label for="#{FormFieldID}">#{FormFieldLabel}</label></#{FormFieldContainerElement}><#{FormFieldContainerElement} id="#{FormFieldContainerID}" class="#{FormFieldContainerClass}"><#{FormFieldElement} type="#{FormFieldType}" name="#{FormFieldName}" id="#{FormFieldID}" class="#{FormFieldClass}'+isRequired+'" value="#{FormFieldValue}"'+ onclickscript + checkedvalue + '/> <label for="#{FormFieldID}">#{FormFieldCaption}</label></#{FormFieldContainerElement}></#{FormFieldContainerElement}>';
			}
			else if(_thisField.type == "submit" || _thisField.type == "button"){
				var onclickscript = ""
				if(_thisField.flag == "cancel"){
					onclickscript = ' onclick="' + config.instance + '.Display();"';
				}
				formfieldtpl = '<#{FormFieldContainerElement} id="#{FormFieldContainerID}_block" class="#{FormFieldContainerClass}_block"><#{FormFieldContainerElement} id="#{FormFieldContainerID}" class="#{FormFieldContainerClass}"><#{FormFieldElement} type="#{FormFieldType}" name="#{FormFieldName}" id="#{FormFieldID}" class="#{FormFieldClass}'+isRequired+'" value="#{FormFieldValue}"'+onclickscript+' /></#{FormFieldContainerElement}></#{FormFieldContainerElement}>';
			}
			else if(_thisField.type == "select"){
				var thisFormFieldSelectData = _thisField.selectdata;
				var selectDataSet = formdata.selectdata[thisFormFieldSelectData];
				var selectDataSetDefaultItem = selectDataSet['default'];
				var useOptGroups = selectDataSet['default'].length>0?false:true;
				var optionstpl = "";
				if(useOptGroups){
					var selectDataSetList = $A(Object.keys(selectDataSet));
					for(var s=0; s<selectDataSetList.length; s++){
						if(selectDataSetList[s] != "default"){
							optionstpl += '<optgroup label="' + selectDataSetList[s] + '">';
							for(var k=0; k<selectDataSet[selectDataSetList[s]].length; k++){
								optionstpl += '<option value="'+selectDataSet[selectDataSetList[s]][k][0]+'">' + selectDataSet[selectDataSetList[s]][k][1] + '</option>';
							}
							optionstpl += "</optgroup>";
						}
					}
					formfieldtpl = '<#{FormFieldContainerElement} id="#{FormFieldContainerID}_block" class="#{FormFieldContainerClass}_block"><#{FormFieldContainerElement} id="#{FormFieldContainerID}_label" class="#{FormFieldContainerClass}_label"><label for="#{FormFieldName}">#{FormFieldLabel}</label></#{FormFieldContainerElement}><#{FormFieldContainerElement} id="#{FormFieldContainerID}" class="#{FormFieldContainerClass}"><select name="#{FormFieldName}" id="#{FormFieldID}" class="#{FormFieldClass}'+isRequired+'"><option value=""> - Select One - </option>' +  optionstpl + '</select></#{FormFieldContainerElement}></#{FormFieldContainerElement}>';
				}
				else{
					var _thisDataSet = selectDataSet['default'];
					for(var t=0; t<_thisDataSet.length; t++){
						optionstpl += '<option value="' + selectDataSet['default'][t][0] + '">' + selectDataSet['default'][t][1] + '</option>';
					}
				}
				formfieldtpl = '<#{FormFieldContainerElement} id="#{FormFieldContainerID}_block" class="#{FormFieldContainerClass}_block"><#{FormFieldContainerElement} id="#{FormFieldContainerID}_label" class="#{FormFieldContainerClass}_label"><label for="#{FormFieldName}">#{FormFieldLabel}</label></#{FormFieldContainerElement}><#{FormFieldContainerElement} id="#{FormFieldContainerID}" class="#{FormFieldContainerClass}"><select name="#{FormFieldName}" id="#{FormFieldID}" class="#{FormFieldClass}'+isRequired+'"><option value=""> - Select One - </option>' +  optionstpl + '</select></#{FormFieldContainerElement}></#{FormFieldContainerElement}>';
			}
			else{
				formfieldtpl = "";
			}
			var _thisField = new Template(formfieldtpl);
			formFields += _thisField.evaluate(thisFormFieldWidgets);
		}
		formtpl += formFields;
		formtpl += '</div></form></#{WidgetContainerElement}>';

		var output = new Template(formtpl);
		var thisInstanceForm = output.evaluate(widgets);
		Element.insert($$("body")[0],{ top: thisInstanceForm });
		this.WidgetInstanceID = $(formdata.container.id + "_" + config.instance);
		this.WidgetInstanceID.style.display = "none"; // because display isn't accessible until JS sets it.
		this.configID = formdata.configID;

		this.FormTitleID = $(this.formdata.form.id + "_title_" + this.config.instance)
		this.FormInstanceID = $(formdata.form.id + "_" + config.instance);
		Event.observe(this.FormInstanceID, 'submit', this.Do.bind(this));

		try{
			Event.observe(this.FormInstanceID, 'submit', this.config.onsubmit.bind(this));
		}catch(e){}

		return true;
	},


	Validate: function(){
		this.Validator = new Validation(this.FormInstanceID,{
			immediate:false,
			useTitle: true
		});
    if($$('.pwconfirm').length > 0){
			Validation.add('pwconfirm', 'Your passwords do not match',{
				equalToField: 'user_password'
			});
		}
		return this.Validator.validate();
	},

	Do: function(formObj){
		if($(this.FormInstanceID.id + "_invalidnotice")){
			Element.remove($(this.FormInstanceID.id + "_invalidnotice"));
		}

		if(this.formdata.form.usevalidation == "t" && !this.Validate()){
			var invalidNotice = document.createElement('div');
			invalidNotice.id = this.FormInstanceID.id + "_invalidnotice";
			Element.insert(this.WidgetInstanceID,{ top: invalidNotice })
			invalidNotice = $(invalidNotice)
			invalidNotice.setStyle({
				"display":"block",
				"color":"#f00",
				"fontWeight":"700",
				"fontSize":"1.0em",
				"width":"100%",
				"textAlign":"center",
				"padding":"5px"
			});
			invalidNotice.innerHTML = " --- Please fill out all required fields --- ";
		}
		else{
			var _RequestParams = this.FormInstanceID.serialize(true);
			var _method = this.FormInstanceID.attributes.method.nodeValue;
			var _action = this.FormInstanceID.attributes.action.nodeValue;
			_RequestParams.http_method = _method;
			//this.Request(this.consOpenAPICallback,_action,_RequestParams,_method);
		}
	},

	consOpenAPICallback:function(http){
		var _this = http.request.options.scope;
		var _data;
		if(http.getHeader('Content-Type') == "text/plain"){
			eval("_data = " + http.responseText);
		}else{_data = http.responseJSON;}
	},

	initialize: function(config){
		var _validatorScript = document.createElement('script');
		_validatorScript.type = 'text/javascript';
		_validatorScript.src = "/modules/login/lib/validation.js";
		Element.insert($$("head")[0],{ bottom: _validatorScript })


		this.config = config; //Instance configuration data

		this.overlay = "consOpenSignupOverlay_" + config.instance;
		if(!$(this.overlay)){
			var overlaynode = new Element('div',{'id':this.overlay,'class':'consOpenSignupOverlayClass'});
			this.overlay = Element.wrap($$('body')[0].down('*'),overlaynode);
			this.overlay.setStyle({'zIndex':'1'});
			this.overlay.style.opacity = 1.0;
		}
		else{ this.overlay = $(this.overlay); }

		this.isopen = false; //an instance variable for use later on
		this.isactive = false;

		//Check to see if the instance name is already in use
		if(window.consSignupInstanceList.indexOf(config.instance) == -1){
			window.consSignupInstanceList.unshift(config.instance);
		}
		else{//If the instance name is already used, the initialization fails.
			try{ console.log("The instance name: '" +config.instance + "' is already loaded!"); }catch(e){};
			return; // die...
		}


		/*
			Load form configuation data:
			Done via AJAX, so make sure it conforms to XSS restrictions.
			Known Issue:  currently no way to prevent same config file from
				from being requested multiple times.  This causes
				some processor/memory overhead, but only a little
				because the file is cached after the first one.
		*/
		var obj = new Ajax.Request(config.formconfig,{
			method: "get",
			scope: this,
			onComplete: function(http){
				//create reference for the real object binding
				var _this = http.request.options.scope;

				//Check config file's content type to see if it can be handled natively or not.
				if(http.getHeader('Content-Type') == "text/plain"){
					eval("_this.formdata = " + http.responseText);
				}else{
					_this.formdata = http.responseJSON;
				}


				/* Begin CSS
					This block downloads and apply the stylesheet as defined in the config file
					the basic purpose of this is to make sure the same CSS file isn't added to
					the page twice, no need to add additional overhead.
				*/
				var currentLINKElements = $$("link");
				var insertCSS = true;
				for(var i=0; i < currentLINKElements.length; i++){
					if(currentLINKElements[i].getAttribute("href") == _this.formdata.stylesheet){
						insertCSS = false;
						continue;
					}
				}

				//Insert CSS file defined in form config.
				if(insertCSS){
					var _cssNode = document.createElement('link');
					_cssNode.type = 'text/css';
					_cssNode.rel = 'stylesheet';
					_cssNode.href = _this.formdata.stylesheet;
					Element.insert($$("head")[0],{ bottom: _cssNode })
				}

				//Insert custom CSS files if files are defined in instance config.
				if(_this.config.customCSS){
					var _cssNode = document.createElement('link');
					_cssNode.type = 'text/css';
					_cssNode.rel = 'stylesheet';
					_cssNode.href = _this.config.customCSS;
					Element.insert($$("head")[0],{ bottom: _cssNode })
				}


				// Assemble Form UI
					if(_this.UI()){}

				/* Begin delinker
					This block locates the trigger element and deactivates the HREF if it
						happens to be an A element */
				var Trigger = $(_this.config.triggerID);
				if(Trigger.nodeName == "A"){
					Trigger.writeAttribute("href","javascript:void(0);");
				}

				/*Attach trigger onlick event to enable this whole thing.
					create and attach click handlers for the appropraite elements */
				Event.observe(Trigger, 'click', _this.Display.bind(_this));

				// Execute custom onload event handler
				try{_this.config.onload();}catch(e){}
			}
		});
	}
}