if(!window.Operator){
	window.Operator = {
			
		lastStateId: "",
		enableCheckState: true,

		init:function(step){
			switch(step){
				case "list":
					//Consulte.toggleBanner(false);
					if($("operator.cpf")){
						Mask.numberField("operator.cpf", Mask.CPF);
						// Executa Evento do campo
						try{
							Mask.runEvent = true;
							Consulte.runEvent($("operator.cpf"), "keyup");
						}finally{
							Mask.runEvent = false;
						}
					}
					Consulte.setBackOptions({
						url:window.contextPath+"/operator/list.action",
						hadBanner:true
					});
				break;
					
				case "basic":
					Consulte.toggleDimmer("dimmerCover", true);
					Event.observe($("operator.fullName"), "blur", this.suggestShortNameUserName.bind(this));
					Mask.charNumberField("operator.login");
					if($F("operator.mode") == "new"){
						$("operatorForm").focusFirstElement();
					}
				break;
				
				case "detail":
					Consulte.toggleDimmer("dimmerCover", true);
				break;
				
				case "summary":
					Consulte.toggleDimmer("dimmerCover", false);
					Consulte.setBackOptions({
						url:window.contextPath+"/operator/summary.action",
						hadBanner:true
					});
				break;
				
				case "editStep1":
					Consulte.toggleDimmer("dimmerCover", true);
					
					// Graduacao
					/*
					if(graduations != null){
						var combo = $("combo.graduation");
						var cont = 1;
						graduations.each(function(domain){
							try{
								combo.add(new Option(domain.name, domain.id), null);
							}catch(e){
								combo.add(new Option(domain.name, domain.id));
							}
							if($F("operator.graduation") == domain.id){
								combo.options[cont].selected = true;
							}
							cont++;
						});
					}
					*/

					// Estado Civil
					if(relationshipStatus != null){
						var combo = $("combo.relationshipStatus");
						var cont = 1;
						relationshipStatus.each(function(domain){
							try{
								combo.add(new Option(domain.name, domain.id), null);
							}catch(e){
								combo.add(new Option(domain.name, domain.id));
							}
							if($F("operator.relationshipStatus") == domain.id){
								combo.options[cont].selected = true;
							}
							cont++;
						});
					}
					
					Event.observe($("operator.fullName"), "blur", this.suggestShortNameUserName.bind(this));
					Event.observe($("operator.zipCode"), "blur", this.validateCep.bind(this));
					Event.observe($("operator.login"), "blur", this.verifyUserName.bind(this));
					
					// Define Mascara ao campo
					Mask.numberField("operator.birthdate", Mask.DATE);
					Mask.numberField("operator.identityNumber");
					Mask.numberField("operator.zipCode", Mask.CEP);
					Mask.charNumberField("operator.login");
					
					// Executa Evento do campo
					try{
						Mask.runEvent = true;
						//$("divCPF").innerHTML = Mask.setMask($("divCPF").innerHTML, Mask.CPF);
						Consulte.lastValidatedCep = "";
						Consulte.runEvent($("operator.zipCode"), "blur");
					}finally{
						Mask.runEvent = false;
					}
				break;

				case "editStep2":
					this.clearDependedField();
					if(String.isEmpty($("operator.street").value) && states && jQuery){
						this.enableCheckState = true;	
						this.bindState("operator.state", states);
						this.checkState();
					}else{
						this.enableCheckState = false;
					}
					// Define Mascara ao campo
					Mask.numberField("operator.number");
					Mask.numberField("operator.cellPhoneAreaCode", Mask.AREACODE);
					Mask.numberField("operator.cellPhoneNumber"  , Mask.PHONE);
					Mask.numberField("operator.homePhoneAreaCode", Mask.AREACODE);
					Mask.numberField("operator.homePhoneNumber"  , Mask.PHONE);
					// Executa Evento do campo
					try{
						Mask.runEvent = true;
						Consulte.runEvent($("operator.cellPhoneAreaCode"), "keyup");
						Consulte.runEvent($("operator.cellPhoneNumber")  , "keyup");
						Consulte.runEvent($("operator.homePhoneAreaCode"), "keyup");
						Consulte.runEvent($("operator.homePhoneNumber")  , "keyup");
					}finally{
						Mask.runEvent = false;
					}
				break;
			}
			Consulte.enableGlossary();
		},

		editStep1: function(){
			var parameters = Form.serialize($("operatorForm"), {hash:true});
			
			if($F("operator.step") == "2"){
				parameters = this.clearMask(parameters, "editStep2");
			}
			
			new Ajax.Request(contextPath + "/operator/step1.action", {
				parameters:parameters,
				onComplete:function(response){
					if(Consulte.hasError(response) == false){
						$("content").innerHTML = response.responseText;
					}
				}
			});
		},

		editStep2: function(){
			if(this.validateMandatoryFields("editStep1")){
				var parameters = Form.serialize($("operatorForm"), {hash:true});
				parameters = this.clearMask(parameters, "editStep1");
				/*parameters["operator.graduation.id"] = $F("combo.graduation");*/
				parameters["operator.relationshipStatus.id"] = $F("combo.relationshipStatus");
				
				new Ajax.Request(contextPath + "/operator/step2.action", {
					parameters:parameters,
					onComplete:function(response){
						if(Consulte.hasError(response) == false){
							$("content").innerHTML = response.responseText;
						}
					}
				});
			}
		},

		saveEdit: function(){
			if(this.validateMandatoryFields("editStep2")){
				var parameters = Form.serialize($("operatorForm"), {hash:true});
				parameters = this.clearMask(parameters, "editStep2");
				
				new Ajax.Request(contextPath + "/operator/saveEdit.action", {
					parameters:parameters,
					onComplete:function(response){
						if(Consulte.hasError(response) == false){
							Consulte.toggleDimmer("dimmerCover", false);
							$("content").innerHTML = response.responseText;
							if($F("operator.mode") == "alter"){
								if($("saveSuccessMessage") != null){
									$("saveSuccessMessage").show();
									$("topMessage").show();
								}
							}
						}
					}
				});
			}
		},
		
		cancel: function(){
			var parameters = {};
			
			if($("ownerId")){
				parameters ={ownerId:$F("ownerId")};
			}
			
			if(Consulte.showConfirmMessage(Bundle.getMessage("message.cancel.process"))){
				new Ajax.Request(contextPath + "/operator/cancel.action", {
					parameters:parameters,
					onComplete:function(response){
						Consulte.toggleDimmer("dimmerCover", false);
						if(Consulte.hasError(response) == false){
							$("content").innerHTML = response.responseText;
						}
					}
				});
			}
		},
		
		checkSelectOwner: function(field){
			//$("ownerId").value = field.value;
		},
		
		listByOwnerId: function(){
			if(Consulte.isEmpty("selectOwners")){
				Consulte.showErrorMessage(Bundle.getMessage("message.mandatory.field", "txt.select.owner"));
				return;
			}
			var parameters = Form.serialize($("operatorFilterForm"), {hash:true});
			parameters["ownerId"] = $("selectOwners").value; //$F("ownerId");
			new Ajax.Request(contextPath + "/operator/list.action", {
				parameters:parameters,
				onComplete:function(response){
					if(Consulte.hasError(response) == false){
						$("content").innerHTML = response.responseText;
					}
				}
			});
		},
		
		list: function(saveSuccess){
			var parameters = Form.serialize($("operatorFilterForm"), {hash:true});
			new Ajax.Request(contextPath + "/operator/list.action", {
				parameters:parameters,
				onComplete:function(response){
					if(Consulte.hasError(response) == false){
						$("content").innerHTML = response.responseText;
						if(saveSuccess){
							$("saveSuccessMessage").show();
							$("topMessage").show();
						}
					}
				}
			});
		},

		step2: function(){
			var step = $("operator.step").value;
			if(step == "3" || this.validateMandatoryFields("step1")){
				var parameters = Form.serialize($("operatorForm"), {hash:true});
				
				if(step == "1"){
					parameters["operator.cpf"] = Mask.clear(parameters["operator.cpf"]);
					parameters["cpf"] = parameters["operator.cpf"];
				}
				
				new Ajax.Request(contextPath + "/operator/basic.action", {
					parameters:parameters,
					onComplete:function(response){
						if(Consulte.hasError(response) == false){
							$("content").innerHTML = response.responseText;
						}
					}
				});
			}
		},
		
		step3: function(){
			var mode = $("operator.mode").value;
			if(mode == "edit" || this.validateMandatoryFields("step2")){
				var parameters = Form.serialize($("operatorForm"), {hash:true});
				/*
				if(mode != "new")
					parameters["operator.cpf"] = Mask.clear(parameters["operator.cpf"]);
				*/
				
				new Ajax.Request(contextPath + "/operator/detail.action", {
					parameters:parameters,
					onComplete:function(response){
						if(Consulte.hasError(response) == false){
							$("content").innerHTML = response.responseText;
						}
					}
				});
			}
		},
		
		save: function(){
			var mode = $F("operator.mode");
			
			if(mode == "edit" || ($F("operator.step") == "3" && this.validateMandatoryFields("step3"))){
				var parameters = Form.serialize($("operatorForm"), {hash:true});
				//parameters["operator.cpf"] = Mask.clear(parameters["operator.cpf"]);
				
				new Ajax.Request(contextPath + "/operator/save.action", {
					parameters:parameters,
					onComplete:function(response){
						if(Consulte.hasError(response) == false){
							$("content").innerHTML = response.responseText;

							if($("saveSuccessMessage") != null){
								Consulte.toggleDimmer("dimmerCover", false);
								$("saveSuccessMessage").show();
								$("topMessage").show();
							}
						}
					}
				});
			}
		},
		
		showDetail: function(id){
			new Ajax.Request(contextPath + "/operator/showDetail.action", {
				parameters:{id:id, ownerId:$F("ownerId")},
				onComplete:function(response){
					if(Consulte.hasError(response) == false){
						$("content").innerHTML = response.responseText;
					}
				}
			});
		},
		
		doBack: function(){
			if(!Consulte.back()){
				this.list();
			}
		},

		validateMandatoryFields: function(step){
			try{
				switch(step){
					case "step1":
						//Valida CPF
						Consulte.mandatory("operator.cpf", "label.cpf", {showInfoMessage:false});
						Consulte.validateCPF("operator.cpf");
						
						//Valida Selecao de medico, quando operador administrador
						if($F("operatorPermissionType") == "2"){
							Consulte.mandatory("ownerId", "txt.select.owner", {showInfoMessage:false});
							if($("ownerId").value != $("selectOwners").value){
								Consulte.showErrorMessage(Bundle.getMessage("message.error.permission.operator.owner.operator.registration"));
								throw Consulte.$error;
							}
						}
						
						if($F("leastActiveOwnerWP") == "false"){
							Consulte.showErrorMessage(Bundle.getMessage("message.operator.no.workingPlace"));
							throw Consulte.$error;
						}
					break;

					case "step2":
						Consulte.mandatory("operator.fullName", "label.full.name");
						Consulte.mandatory("operator.shortName", "label.short.name");

						//Valida userName
						Consulte.mandatory("operator.login", "label.user.name");
						this.verifyUserName(false);
						var userNameMessage = ($("returnUserName").innerHTML||"").unescapeHTML();
						if(String.isNotEmpty(userNameMessage)){
							Consulte.showErrorMessage(userNameMessage);
							throw Consulte.$error;
						}

						//Valida Email
						Consulte.mandatory("operator.email", "label.email");
						Consulte.validateEmail("operator.email", "label.email");
					break;
					
					case "step3":
						var foundChecked = false;
						
						$$("#content .checkboxWorkingPlace").each(function(element){
							if(element.checked){
								foundChecked = true;
								throw $break;
							}
						});
						if(!foundChecked){
							Consulte.showInfoMessage(Bundle.getMessage("message.mandatory.info"));
							Consulte.showErrorMessage(Bundle.getMessage("message.mandatory.field", "label.workingPlace.plural"));
							throw Consulte.$error;
						}
					break;
					
					case "editStep1":
						Consulte.mandatory("operator.fullName", "label.full.name");
						Consulte.mandatory("operator.shortName", "label.short.name");

						//Valida Sexo
						var anyChecked = false;
						$("content").select("input[name='operator.gender.abbreviation']").each(function(obj){
							if(obj.checked){
								anyChecked = true;
								throw $break;
							}
						});
						if(!anyChecked){
							Consulte.showInfoMessage(Bundle.getMessage("message.mandatory.info"));
							Consulte.showErrorMessage(Bundle.getMessage("message.mandatory.field", "label.gender"));
							throw Consulte.$error;
						}
						
						//Valida Dt Nascimento
						if(Consulte.isNotEmpty("operator.birthdate") && Date.parse_DDMMYYYY($F("operator.birthdate")) == null){
							Consulte.showErrorMessage(Bundle.getMessage("message.invalid.field", "label.birthdate"));
							throw Consulte.$error;
						}

						//Valida o CEP
						Consulte.mandatory("operator.zipCode", "label.cep");
						this.validateCep(false);
						
						//Valida userName
						Consulte.mandatory("operator.login", "label.user.name");
						Consulte.validateLogin("operator.login");
						this.verifyUserName(false);
						var userNameMessage = ($("returnUserName").innerHTML||"").unescapeHTML();
						if(String.isNotEmpty(userNameMessage)){
							Consulte.showErrorMessage(Bundle.getMessage("message.exist.username"));
							throw Consulte.$error;
						}

						//Valida a opção de avançar mantendo o cep informado
						if(!Consulte.userWantedToKeepInvalidCep("operator.invalidCepDiv", "operator.keepInvalidCep")){
							Consulte.showInfoMessage(Bundle.getMessage("message.cep.do.something"));
							throw Consulte.$error;
						}
					break;
					
					case "editStep2":
						Consulte.mandatory("operator.state", "label.state");
						Consulte.mandatory("operator.city", "label.city");
						Consulte.mandatory("operator.neighborhood", "label.neighborhood");
						Consulte.mandatory("operator.street", "label.street");
						Consulte.mandatory("operator.number", "label.number");

						var codes = ["operator.cellPhoneAreaCode", "operator.homePhoneAreaCode"],
						    numbers = ["operator.cellPhoneNumber", "operator.homePhoneNumber"],
						    labels = ["label.cell.phone", "label.home.phone"];

						for(var phoneIndex=0, length=codes.length; phoneIndex < length; phoneIndex++){
							var areaCode = $(codes[phoneIndex]), number = $(numbers[phoneIndex]);

							if(Consulte.isNotEmpty(areaCode) || Consulte.isNotEmpty(number)){
								var c = Mask.clear(areaCode.value).strip(), n = Mask.clear(number.value).strip();
								if(c.length != 2){
									Consulte.showErrorMessage(Bundle.getMessage("message.invalid.field", labels[phoneIndex]));
									areaCode.activate();
									throw Consulte.$error;
								}
								if(n.length < 8){
									Consulte.showErrorMessage(Bundle.getMessage("message.invalid.field", labels[phoneIndex]));
									number.activate();
									throw Consulte.$error;
								}
							}
						}
						
						// Verifica se é um numero valido de celular
						if(!String.isEmpty($F("operator.cellPhoneNumber"))){
							var digit = $F("operator.cellPhoneNumber").substr(0, 1);
							if(digit < 6 && !Consulte.showConfirmMessage(Bundle.getMessage("message.invalid.cellPhone"))){
								$("operator.cellPhoneNumber").activate();
								throw Consulte.$error;
							}
						}

						//Valida email
						Consulte.mandatory("operator.email", "label.email");
						Consulte.validateEmail("operator.email", "label.email");
					break;
				}
				return true;
			}catch(e){
				if(e != Consulte.$error) throw e;
				return false;
			}
		},
		
		verifyUserName: function(async, callback){
			var userId = (Consulte.isEmpty("operator.id")) ? null : $F("operator.id");
			Consulte.processingField("operator.login", "returnUserName", /*"procUserName", */"validateUserName.action", {login:$F("operator.login"), userId:userId}, async, callback);
		},

		validateCep: function(async){
			Consulte.validateCep($F("operator.zipCode"), "operator.keepInvalidCep", "operator.invalidCepDiv", async);
		},

		suggestShortNameUserName: function(){
			Consulte.suggestShortNameUserName("operator.fullName", "operator.shortName", "operator.login", "returnUserName", this.verifyUserName.bind(this));
		},
		
		clearMask:function(parameters, step){
			switch(step){
				case "editStep1":
					parameters["operator.address.zipCode"] = Mask.clear(parameters["operator.address.zipCode"]);
				break;
				case "editStep2":
					parameters["operator.phoneNumbers.phone1.areaCode"] = Mask.clear(parameters["operator.phoneNumbers.phone1.areaCode"]);
					parameters["operator.phoneNumbers.phone1.number"]   = Mask.clear(parameters["operator.phoneNumbers.phone1.number"]);
					parameters["operator.phoneNumbers.phone2.areaCode"] = Mask.clear(parameters["operator.phoneNumbers.phone2.areaCode"]);
					parameters["operator.phoneNumbers.phone2.number"]   = Mask.clear(parameters["operator.phoneNumbers.phone2.number"]);
				break;
			}
			return parameters;
		},
		
    	checkState: function() {
			if(this.enableCheckState){
				var state = $("operator.state");
				var city = $("operator.city");
	
				jQuery(state).search();
				if (state.value == "") {
					city.readOnly = true;
					city.addClassName("disableColor");
					city.value = Bundle.getMessage("txt.select.state");
				} else {
					city.readOnly = false;
					city.removeClassName("disableColor");
					
					if(city.value == Bundle.getMessage("txt.select.state"))
						city.value = "";
						
					city.activate();
				}
				this.checkCity();
			}
        },

        checkCity: function(){
			if(this.enableCheckState){
				var city = $("operator.city");
				var neighborhood = $("operator.neighborhood");
				var address = $("operator.street");
				var number = $("operator.number");
				var complement = $("operator.complement");
	
				jQuery(city).search();
				if(city.value == "" || city.value == Bundle.getMessage("txt.select.state")){
					neighborhood.readOnly = true;
					neighborhood.addClassName("disableColor");
					neighborhood.value = Bundle.getMessage("txt.select.city");
					
					address.readOnly = true;
					address.addClassName("disableColor");
					address.value = Bundle.getMessage("txt.select.city");
					
					complement.readOnly = true;
					complement.addClassName("disableColor");
					complement.value = Bundle.getMessage("txt.select.city");
					
					number.readOnly = true;
					number.addClassName("disableColor");
					number.value = Bundle.getMessage("txt.select.city");
				}else{
					neighborhood.readOnly = false;
					neighborhood.removeClassName("disableColor");
					if(neighborhood.value == Bundle.getMessage("txt.select.city")) neighborhood.value="";
					
					address.readOnly = false;
					address.removeClassName("disableColor");
					if(address.value == Bundle.getMessage("txt.select.city")) address.value="";
					
					complement.readOnly = false;
					complement.removeClassName("disableColor");
					if(complement.value == Bundle.getMessage("txt.select.city")) complement.value="";
					
					number.readOnly = false;
					number.removeClassName("disableColor");
					if(number.value == Bundle.getMessage("txt.select.city")) number.value="";
					
					neighborhood.activate();
				}
			}
        },

		clearDependedField:function(){	
			if($("operator.city").value == Bundle.getMessage("txt.select.state"))
            	$("operator.city").value = "";

			if($("operator.neighborhood").value == Bundle.getMessage("txt.select.city"))
            	$("operator.neighborhood").value = "";

			if($("operator.street").value == Bundle.getMessage("txt.select.city"))
            	$("operator.street").value = "";

			if($("operator.number").value == Bundle.getMessage("txt.select.city"))
            	$("operator.number").value = "";

			if($("operator.complement").value == Bundle.getMessage("txt.select.city"))
            	$("operator.complement").value = "";

		},

		bindState:function(field, data){
			jQuery($(field)).autocomplete(data, {
				minChars: 0,
				delay: 100,
				width: 250,
				max:data.length,
				selectFirst: false,
				matchContains: true,
				autoFill: false,
				formatItem: function(row, i, max) {
					return row.name +" ("+ row.abbreviation +")";
				},
				formatMatch: function(row, i, max) {
					return row.name.replaceSpecialChars() +" "+ row.name + " " + row.abbreviation;
				},
				formatResult: function(row) {
					return row.abbreviation;
				}
			}).result(function(event, item){
				var id = (item != null) ? item.id : "";
				if(this.lastStateId != id){
					var city = $("operator.city");
					jQuery(city).unautocomplete();
					city.value = "";
					city.readOnly = true;
					if(item != null){
						this.listCities(item.id);
						$("operator.city").readOnly = false;
					}
					this.lastStateId = id;
					$("operator.stateId").value = id;
				}
			}.bind(this));
		},

		bindCity:function(field, data){
            jQuery($(field)).autocomplete(data, {
                minChars: 3,
                delay: 500,
                width: 250,
                max: data.length,
                selectFirst: false,
                matchContains: true,
                autoFill: false,
                formatItem: function(row, i, max) {
                    return row.name;
                },
                formatMatch: function(row, i, max) {
                    return row.name.replaceSpecialChars() + " " + row.name;
                },
                formatResult: function(row) {
                    return row.name;
                }
            }).result(function(event, item){
            	var id = (item != null) ? item.id : "";
            	$("operator.cityId").value = id;
            });
		},
		
		listStates:function(){
			jQuery($("operator.state")).showAll();
		},
		
		listCities:function(state){
            new Ajax.Request(window.contextPath + "/cities.generatedJS", {
                parameters: { stateId: state },
                onComplete: function(response) {
                    eval(response.responseText);
                    if(typeof(cities) != "undefined"){
                        this.bindCity("operator.city", cities);
                    }
                }.bind(this)
            });
		}

	};
}
