if(!window.CustomerSchedule){
	window.CustomerSchedule = {

		init: function(step){
			switch(step){
				case "cover":
					if($("myOwnersList").innerHTML.strip() == ""){
						$("myOwnersTitle").hide();
					}
					if($("mySchedulesList").innerHTML.strip() == ""){
						$("mySchedulesTitle").hide();
					}
				break;

				case "list":
					Consulte.toggleBanner(true);
				break;
	
				case "listOwners":
					Consulte.toggleBanner(true);
				break;
	
				case "create":
					this.schedule = $F("schedule.json").evalJSON();
					this.workingPlaces = $F("ownerWorkingPlaces.json").evalJSON();
					this.bindWorkingPlaces();
	
					Mask.numberField($("schedule.scheduleDate"), Mask.DATE);
					Calendar.bindToField($("schedule.scheduleDate"));
	
					with(this.schedule){
						function valid(obj){
							return obj != null && String.isNotEmpty(obj.name) && String.isNotEmpty(String(obj.id));
						};
	
						if(valid(workingPlace)){
							$("schedule.workingPlace.name").value = workingPlace.name;
							$("schedule.workingPlace.id").value = workingPlace.id;
							this.selectWorkingPlace(this.workingPlaces.detect(this.findById.curry(workingPlace.id)));
						}
	
						if(valid(healthInsurance)){
							$("schedule.healthInsurance.name").value = healthInsurance.name;
							$("schedule.healthInsurance.id").value = healthInsurance.id;
						}
	
						if(valid(activity)){
							Consulte.setRadioValue("schedule.activity.type", activity.procedure, "content");
							this.selectProcedure(Consulte.getRadioValue("schedule.activity.type", "content"));
	
							$("schedule.activity.name").value = activity.name;
							$("schedule.activity.id").value = activity.id;
						}
					}
				break;
	
				case "chooseDate":
					function copyWidth(source, target, adjust){
						$(target).setStyle({
							width: ($(source).getWidth() + adjust) + "px"
						});
					}
					copyWidth('cabecalho.dia0', 'horarios.dia0', 0);
					copyWidth('cabecalho.dia1', 'horarios.dia1', 0);
					copyWidth('cabecalho.dia2', 'horarios.dia2', 0);
					copyWidth('cabecalho.dia3', 'horarios.dia3', 0);
					copyWidth('cabecalho.dia4', 'horarios.dia4', 0);
				break;
	
				case "detail":
					Consulte.toggleDimmer("dimmerCover", true);
					Mask.numberField("schedule.customer.cellPhoneAreaCode", Mask.AREACODE);
					Mask.numberField("schedule.customer.cellPhoneNumber", Mask.PHONE);
					
					if($("schedule.reason")){
						if($("schedule.reason").value == ""){
							$("schedule.reason").value = Bundle.getMessage("message.customer.schedule.reasons.info");
							$("schedule.reason").addClassName("disableColor");
						}
						Event.observe($("schedule.reason"), "focus", this.verifyThis.bindAsEventListener(this, "schedule.reason", 1));
						Event.observe($("schedule.reason"), "blur", this.verifyThis.bindAsEventListener(this, "schedule.reason", 1));
					}
					
					if($("schedule.customerNote")){
						if($("schedule.customerNote").value == ""){
							$("schedule.customerNote").value = Bundle.getMessage("message.customer.schedule.customerNote.info");
							$("schedule.customerNote").addClassName("disableColor");
						}
						Event.observe($("schedule.customerNote"), "focus", this.verifyThis.bindAsEventListener(this, "schedule.customerNote", 2));
						Event.observe($("schedule.customerNote"), "blur", this.verifyThis.bindAsEventListener(this, "schedule.customerNote", 2));
					}
				break;
	
				case "save":
					Consulte.toggleBanner(false);
					Consulte.toggleDimmer("dimmerCover", false);
					Consulte.hideContentRight();
				break;
			}
		},
		
		verifyThis: function(event, field, num){
			field = $(field);
			// BUG: no mozilla ao retirar o foco da janela ele nao executa focus ao voltar
			if(event.type == "focus"){
				switch(num){
					case 1: value = Bundle.getMessage("message.customer.schedule.reasons.info"); break;
					case 2: value = Bundle.getMessage("message.customer.schedule.customerNote.info"); break;
				}
				if(field.value == value){
					field.value = "";
					field.removeClassName("disableColor");
				}
				field.focus();
			}else if(event.type == "blur"){
				if(field.value.strip() == ""){
					field.value = value;
					field.addClassName("disableColor");
				}
			}
		},

		cancel: function(force){
			if(!force && !Consulte.showConfirmMessage(Bundle.getMessage("message.cancel.process"))) return;

			new Ajax.Request(window.contextPath+"/customer/schedule/cancel.action", {
				onComplete: function(response){
					if(!Consulte.hasError(response)){
						this.list.bind(this).defer();
					}
				}.bind(this)
			});
		},

		create: function(ownerId){
			new Ajax.Request(window.contextPath+"/customer/schedule/create.action", {
				parameters:{
					"schedule.owner.id": ownerId
				},
				onComplete: function(response){
					if(!Consulte.hasError(response)){
						$("content").innerHTML = response.responseText;
					}
				}
			});
		},

		step1: function(){
			new Ajax.Request(window.contextPath+"/customer/schedule/step1.action", {
				parameters:$("customerScheduleForm").serialize(),
				onComplete: function(response){
					if(!Consulte.hasError(response)){
						$("content").innerHTML = response.responseText;
					}
				}
			});
		},

		chooseDate: function(offset, shouldValidate){
			if(shouldValidate && !this.validate('create')){
				return;
			}

			if(Object.isNumber(offset)){
				var dateField = $("schedule.scheduleDate");
				var date = Date.parse_DDMMYYYY(dateField.value).addDay(offset);
				dateField.value = Date.format_DDMMYYYY(date);
			}

			var parameters = $("customerScheduleForm").serialize({hash:true});
			if(parameters["schedule.customer.phoneNumbers.phone1.number"] != null){
				parameters["schedule.customer.phoneNumbers.phone1.number"] = Mask.clear(parameters["schedule.customer.phoneNumbers.phone1.number"]);
			}

			new Ajax.Request(window.contextPath+"/customer/schedule/chooseDate.action", {
				parameters:parameters,
				onComplete: function(response){
					if(!Consulte.hasError(response)){
						$("content").innerHTML = response.responseText;
					}
				}
			});
		},

		scheduleHour: function(time){
			var date = new Date(parseInt(time, 10));
			if(date.getTime() < (new Date().getTime())){
				Consulte.showErrorMessage(Bundle.getMessage("message.schedule.begin.before.now.error"));
				return;
			}

			var scheduleDate = Date.format_DDMMYYYY(date) + " " + date.formatTime();
			$("schedule.scheduleDate").value = scheduleDate;

			new Ajax.Request(window.contextPath+"/customer/schedule/scheduleHour.action", {
				parameters:$("customerScheduleForm").serialize(),
				onComplete: function(response){
					if(!Consulte.hasError(response)){
						$("content").innerHTML = response.responseText;
					}
				}
			});
		},

		openGoogleMaps: function(address, id){
			var parameters = Object.toQueryString({ address:address, id:id });
			var width=500, height=420,
				top=(window.screen.height-height)/2, left=(window.screen.width-width)/2;
			var url = "http://"+location.hostname+":"+Bundle.getSystemProperty("server.http.port")+window.contextPath+"/googleMaps.action;"+Consulte.getSessionCookie()+"?"+parameters;
			var win = window.open(url, "GoogleMaps", "width="+width+", height="+height+", top="+top+", left="+left+", resizable=false, toolbar=no, location=no, personalbar=no, directories=no, scrollbars=yes, status=no, menubar=no, copyhistory=no");
		},

		transformCellPhone: function(){
			$("customer.cellPhone.link").hide();
			$("customer.cellPhone.container").removeClassName("lock");
			$("schedule.customer.cellPhoneAreaCode").readOnly = false;
			$("schedule.customer.cellPhoneNumber").readOnly = false;
		},
		transformEmail: function(){
			$("customer.email.link").hide();
			$("customer.email.container").removeClassName("lock");
			$("schedule.customer.email").readOnly = false;
		},

		save: function(){
			if(!this.validate("detail")) return;
			
			if($("schedule.reason").value == Bundle.getMessage("message.customer.schedule.reasons.info")){
				$("schedule.reason").value = "";
			}
			
			if($("schedule.customerNote").value == Bundle.getMessage("message.customer.schedule.customerNote.info")){
				$("schedule.customerNote").value = "";
			}

			var parameters = $("customerScheduleForm").serialize({hash:true});
			parameters["schedule.customer.phoneNumbers.phone1.number"] = Mask.clear(parameters["schedule.customer.phoneNumbers.phone1.number"]);

			if($("suggested") && !$("suggested").checked){
				parameters["schedule.suggestedByOne"] = "NOT_SUGGESTED";
				parameters["schedule.suggestedByName"] = "";
			}
			

			new Ajax.Request(window.contextPath+"/customer/schedule/save.action", {
				parameters:parameters,
				onComplete: function(response){
					if(!Consulte.hasError(response)){
						var html = String.interpret(response.responseText).strip();
						if(html != ""){
							$("content").innerHTML = html;
						}else{
							this.list.bind(this).defer();
						}
					}
				}.bind(this),
				consulteOptions: {
					handleConfirmation: function(errorJson){
						var confirmed = Consulte.showConfirmMessage(errorJson.message);
						if(confirmed){
							switch(errorJson.extraParameters["type"]){
								case "customerHealthInsurance": $("schedule.validateCustomerHealthInsurance").value = "false"; break;
								case "customerCellPhone": $("schedule.validateCustomerCellPhone").value = "false"; break;
							}
							this.save.bind(this).defer();
						}
					}.bind(this)
				}
			});
		},

		validate: function(step){
			try{
				switch(step){
				case "create":
					Consulte.mandatory("schedule.workingPlace.id", "label.workingPlace", {focus:false});
					Consulte.mandatory("schedule.activity.id", "label.activity", {focus:false});
					Consulte.mandatory("schedule.healthInsurance.id", "label.health.insurance", {focus:false});
					Consulte.mandatory("schedule.scheduleDate", "label.date.preferential");

					if(Date.parse_DDMMYYYY($F("schedule.scheduleDate")) == null){
						Consulte.showErrorMessage(Bundle.getMessage("message.invalid.field", "label.date.preferential"));
						$("schedule.scheduleDate").activate();
						throw Consulte.$error;
					}

					break;
				case "detail":
					//Indicação
					if($("suggested") && $("suggested").checked){
						Consulte.mandatory("schedule.suggestedByName", "label.schedule.suggested.name.message", {showInfoMessage:false});
					}
					
					var areaCode = $("schedule.customer.cellPhoneAreaCode"), number = $("schedule.customer.cellPhoneNumber");

					if(String.isNotEmpty(areaCode.value) ^ String.isNotEmpty(number.value)){
						Consulte.showErrorMessage(Bundle.getMessage("message.invalid.field", "label.cell.phone"));
						(String.isNotEmpty(areaCode.value) ? number : areaCode).activate();
						throw Consulte.$error;
					}

					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", "label.cell.phone"));
							areaCode.activate();
							throw Consulte.$error;
						}
						if(n.length < 8){
							Consulte.showErrorMessage(Bundle.getMessage("message.invalid.field", "label.cell.phone"));
							number.activate();
							throw Consulte.$error;
						}
					}

					//E-mail:
					var email = $("schedule.customer.email");
					if(Consulte.isEmpty(email)){
						Consulte.showErrorMessage(Bundle.getMessage("message.customer.schedule.mandatory.email"));
						email.activate();
						throw Consulte.$error;
					}
					Consulte.validateEmail(email, "label.email");

					break;
				}
			}catch(e){
				if(e != Consulte.$error) throw e;
				return false;
			}

			return true;
		},

		_checkSchedule: function(type){
			// type in ('cancel', 'confirm'):
			var ok = false;

			new Ajax.Request(window.contextPath+"/customer/schedule/check"+type.capitalize()+".action", {
				asynchronous: false,
				onComplete: function(response){
					if(!Consulte.hasError(response)){
						ok = true;
					}
				}.bind(this)
			});

			return ok;
		},

		confirmSchedule: function(){
			if(!this._checkSchedule("confirm") ||
			   !Consulte.showConfirmMessage(Bundle.getMessage("message.customer.schedule.confirm")))
				return;

			new Ajax.Request(window.contextPath+"/customer/schedule/confirm.action", {
				onComplete: function(response){
					if(!Consulte.hasError(response)){
						alert(Bundle.getMessage("message.save.success", "txt.confirmation"));
						this.list.bind(this).defer();
					}
				}.bind(this)
			});
		},

		makeScheduleCanceled: function(){
			if(!this._checkSchedule("cancel") ||
			   !Consulte.showConfirmMessage(Bundle.getMessage("message.customer.schedule.cancel")))
				return;

			new Ajax.Request(window.contextPath+"/customer/schedule/makeCanceled.action", {
				onComplete: function(response){
					if(!Consulte.hasError(response)){
						alert(Bundle.getMessage("message.save.success.male", "txt.cancel"));
						this.list.bind(this).defer();
					}
				}.bind(this)
			});
		},

		back: function(){
			if(!Consulte.back()){
				this.list();
			}
		},

		list: function(){
			window.location.href = window.contextPath+"/pages/doScheduleAppointment.jsp";
		},

		detail: function(scheduleId){
			new Ajax.Request(window.contextPath+"/customer/schedule/detail.action", {
				parameters:{
					"schedule.id": scheduleId
				},
				onComplete: function(response){
					if(!Consulte.hasError(response)){
						$("content").innerHTML = response.responseText;
					}
				}
			});
		},

		enable: function(flag){
			Consulte.getRadios("schedule.activity.type", "content").each(function(radio){
				radio.disabled = !flag;
			});
			var activity = this.enableAutoComplete("schedule.activity.name", flag);
			activity.disabled = !flag;
			if(activity.disabled){
				activity.value = Bundle.getMessage("txt.select.workingPlace");
			}else{
				activity.value = Bundle.getMessage("txt.select.activity");
			}

			var healthInsurance = this.enableAutoComplete("schedule.healthInsurance.name", flag);
			healthInsurance.disabled = !flag;
			if(healthInsurance.disabled){
				healthInsurance.value = Bundle.getMessage("txt.select.workingPlace");
			}else{
				healthInsurance.value = Bundle.getMessage("txt.select.healthInsurance");
			}
		},

		enableAutoComplete: function(field, flag){
			field = $(field);
			var image = field.next("img.comboImage");
			if(image != null && image.previous("input[type=text]") === field){
				image.setStyle({
					visibility: flag ? "visible" : "hidden"
				});
			}

			return field;
		},

		bindWorkingPlaces: function(){
			Consulte.bindAutocomplete({
				field: "schedule.workingPlace.name",
				id: "schedule.workingPlace.id",
				clearedText: Bundle.getMessage("txt.select.workingPlace"),
				autoSelectFirstIfOne: true,
				configureImage: true,
				data: this.workingPlaces,
				onSelect: this.selectWorkingPlace.bind(this),
				onClear: this.clearWorkingPlace.bind(this)
			});
			if(String.interpret($F("schedule.workingPlace.id")).strip() == ""){
				this.clearWorkingPlace();
			}
		},

		selectWorkingPlace: function(wp){
			this.enable(true);
			this.selectProcedure(Consulte.getRadioValue("schedule.activity.type", "content"));
			this.bindHealthInsurance(wp);
		},

		clearWorkingPlace: function(){
			$("schedule.healthInsurance.name").value = $("schedule.healthInsurance.id").value = "";
			Consulte.bindAutocomplete({
				field: "schedule.healthInsurance.name",
				onlyRemove: true, clearValue:true
			});
			$("schedule.activity.name").value = $("schedule.activity.id").value = "";
			Consulte.bindAutocomplete({
				field: "schedule.activity.name",
				onlyRemove: true, clearValue:true
			});
			this.enable(false);
		},

		bindHealthInsurance: function(wp){
			Consulte.bindAutocomplete({
				field: "schedule.healthInsurance.name",
				id: "schedule.healthInsurance.id",
				clearedText: Bundle.getMessage("txt.select.healthInsurance"),
				autoSelectFirstIfOne: true,
				configureImage: true,
				data: wp.healthInsurances,
				onSelect: function(){
					// Nada. TODO: remove depois
				}.bind(this)
			});
		},

		selectProcedure: function(flag){
			flag = (String.stripToEmpty(String(flag)).toLowerCase() == "true");
			var procedureRadio = Consulte.getRadios("schedule.activity.type", "content").detect(function(radio){return radio.value == "true";});
			var scheduleRadio = Consulte.getRadios("schedule.activity.type", "content").detect(function(radio){return radio.value == "false";});
			if(scheduleRadio.disabled && procedureRadio.disabled){
				// Se ambos estão desabilitados, não faz nada:
				return;
			}

			procedureRadio.disabled = false; // Habilita por default:

			// Seleciona o radio, porque o 'onclick' é no span:
			Consulte.setRadioValue("schedule.activity.type", flag, "content");

			var wp = this.workingPlaces.detect(this.findById.curry($F("schedule.workingPlace.id")));
			if(flag && Array.isEmpty(wp.procedures)){
				// Se quiser selecionar procedimento e não tiver nenhum:
				// Seleciona atividade e desabilita:
				Consulte.setRadioValue("schedule.activity.type", false, "content");
				procedureRadio.disabled = true;
				flag = false;
			}
			if(!flag && Array.isEmpty(wp.activities)){
				// Se quiser selecionar consulta e não tiver nenhuma:
				// Seleciona procedimento e desabilita:
				Consulte.setRadioValue("schedule.activity.type", true, "content");
				scheduleRadio.disabled = true;
				flag = true;
			}

			Consulte.bindAutocomplete({
				field: "schedule.activity.name",
				id: "schedule.activity.id",
				clearedText: Bundle.getMessage("txt.select.activity"),
				autoSelectFirstIfOne: true,
				configureImage: true,
				data: (flag ? wp.procedures : wp.activities),
				onSelect: function(){}.bind(this),
				onClear: function(){}.bind(this)
			});
		},

		verifySuggested: function(suggestedByOne, suggestedByName){
			if(suggestedByOne != "NOT_SUGGESTED"){
				if($("suggested")){
					$("suggested").click();
					Consulte.setRadioValue("schedule.suggestedByOne", suggestedByOne, "suggestedTable");
					$("schedule.suggestedByName").value = suggestedByName;
				}
			}
		},
		
		enableSuggested: function(elem){
			if(elem.checked){
				$("suggestedTable").show();
				$("suggestedLine").select("td").first().setStyle("background-color:#ededed");
			}else{
				$("suggestedTable").hide();
				$("suggestedLine").select("td").first().setStyle("background-color:#fff");
			}
		},
		
		selectSuggestedByOne: function(value){
			var suggestedRadio = Consulte.getRadios("schedule.suggestedByOne", "suggestedTable").detect(function(radio){return radio.value == value;});
			// Seleciona o radio, porque o 'onclick' é no span:
			Consulte.setRadioValue("schedule.suggestedByOne", value, "suggestedTable");
		},
		
		findById: function(id, obj){
			return (obj!=null && obj.id==id);
		}
	};
}